An AI agent built to do Ralph loops - plan mode for planning and ralph mode for implementing.
1use ratatui::{
2 Frame,
3 layout::Rect,
4 style::{Color, Modifier, Style},
5 text::{Line, Span},
6 widgets::{Block, Borders, Clear, Paragraph},
7};
8
9pub struct HelpOverlay {
10 pub visible: bool,
11}
12
13impl HelpOverlay {
14 pub fn new() -> Self {
15 Self { visible: false }
16 }
17
18 pub fn toggle(&mut self) {
19 self.visible = !self.visible;
20 }
21}
22
23impl Default for HelpOverlay {
24 fn default() -> Self {
25 Self::new()
26 }
27}
28
29pub fn draw_help(frame: &mut Frame, area: Rect) {
30 let width = 50.min(area.width.saturating_sub(4));
31 let height = 16.min(area.height.saturating_sub(4));
32 let x = (area.width - width) / 2;
33 let y = (area.height - height) / 2;
34 let help_area = Rect::new(x, y, width, height);
35
36 frame.render_widget(Clear, help_area);
37
38 let block = Block::default()
39 .borders(Borders::ALL)
40 .border_style(Style::default().fg(Color::Cyan))
41 .title(" Help (Esc to close) ");
42
43 let lines = vec![
44 Line::from(Span::styled(
45 "Global",
46 Style::default().add_modifier(Modifier::BOLD),
47 )),
48 Line::from(" q Quit"),
49 Line::from(" 1/2/3 Switch tabs"),
50 Line::from(" Tab Cycle tabs"),
51 Line::from(" [ ] Toggle side panel"),
52 Line::from(" ? Toggle help"),
53 Line::from(""),
54 Line::from(Span::styled(
55 "Dashboard",
56 Style::default().add_modifier(Modifier::BOLD),
57 )),
58 Line::from(" Shift+K/A Kanban/Activity view"),
59 Line::from(" ↑↓←→/hjkl Navigate"),
60 Line::from(" Enter Run selected spec"),
61 Line::from(""),
62 Line::from(Span::styled(
63 "Planning",
64 Style::default().add_modifier(Modifier::BOLD),
65 )),
66 Line::from(" i Enter insert mode"),
67 Line::from(" Esc Exit insert mode"),
68 Line::from(" Enter Send message"),
69 Line::from(" ↑↓/jk Scroll (not in insert)"),
70 Line::from(" PgUp/PgDn Page scroll"),
71 Line::from(" Home/End Jump to top/bottom"),
72 Line::from(""),
73 Line::from(Span::styled(
74 "Execution",
75 Style::default().add_modifier(Modifier::BOLD),
76 )),
77 Line::from(" ↑↓/jk Scroll output"),
78 Line::from(" PgUp/PgDn Page scroll"),
79 Line::from(" Home/End Jump to top/bottom"),
80 ];
81
82 let paragraph = Paragraph::new(lines).block(block);
83 frame.render_widget(paragraph, help_area);
84}