1use super::*;
2
3pub(crate) fn draw_help(f: &mut Frame, app: &App, area: Rect) {
4 let theme = &app.theme;
5 let text = vec![
6 Line::from(Span::styled(
7 "Void - keyboard shortcuts",
8 Style::default()
9 .fg(theme.accent)
10 .add_modifier(Modifier::BOLD),
11 )),
12 Line::from(""),
13 Line::from(Span::styled("Global", Style::default().fg(theme.accent))),
14 Line::from(" Tab / 1-5 Switch tab (Dashboard, Tasks, Stats, Settings, Help)"),
15 Line::from(" q / Esc Quit (auto-saves)"),
16 Line::from(" Ctrl-S Export JSON backup"),
17 Line::from(""),
18 Line::from(Span::styled("Timer", Style::default().fg(theme.accent))),
19 Line::from(" s / Space Start / resume timer"),
20 Line::from(" p Pause timer"),
21 Line::from(" r Reset timer"),
22 Line::from(" n Skip (logs elapsed; does not advance pomodoro cycle)"),
23 Line::from(" E End session (pause + summary)"),
24 Line::from(" m Cycle mode (Focus / Short / Long / Custom)"),
25 Line::from(" + / = Increase duration by 1 min"),
26 Line::from(" - Decrease duration by 1 min"),
27 Line::from(" z Toggle zen mode (distraction-free timer)"),
28 Line::from(" Enter Cycle active task status (Todo → Active → Done)"),
29 Line::from(" x Mark active task done"),
30 Line::from(""),
31 Line::from(Span::styled("Pomodoro", Style::default().fg(theme.accent))),
32 Line::from(" Cycle position persists across restarts"),
33 Line::from(" After focus, auto-switches to break (enable auto-start in Settings)"),
34 Line::from(" Long break every N focus sessions (configurable)"),
35 Line::from(" All tasks done → free focus, pause, or prompt (Settings)"),
36 Line::from(""),
37 Line::from(Span::styled("Stats", Style::default().fg(theme.accent))),
38 Line::from(" j / k Select recent session"),
39 Line::from(" d Delete selected session"),
40 Line::from(" + / - Adjust session minutes"),
41 Line::from(" E End session"),
42 Line::from(""),
43 Line::from(Span::styled("Tasks", Style::default().fg(theme.accent))),
44 Line::from(" a Add task (title, estimate, due, tags)"),
45 Line::from(" e Edit selected task"),
46 Line::from(" d Delete selected task (with confirmation)"),
47 Line::from(" c Add subtask to selected task"),
48 Line::from(" Tab Focus subtask list (j/k navigate, x toggle, q back)"),
49 Line::from(" x Toggle selected subtask done/open"),
50 Line::from(" - Remove selected subtask"),
51 Line::from(" Enter Cycle status: Pending → In Progress → Done"),
52 Line::from(" Space Set as active task for timer"),
53 Line::from(" f Start focus on selected task"),
54 Line::from(" t Toggle today-queue flag"),
55 Line::from(" g Cycle filter (All / Open / Done / Today)"),
56 Line::from(" / Search tasks by title or tags"),
57 Line::from(" 1 / 2 / 3 Set priority Low / Med / High"),
58 Line::from(" j / k Navigate list"),
59 Line::from(" Ctrl+j/k Reorder task in queue"),
60 Line::from(""),
61 Line::from(Span::styled("Settings", Style::default().fg(theme.accent))),
62 Line::from(" Up / Down Navigate"),
63 Line::from(" Enter / +- Increment value"),
64 Line::from(" Left / - Decrement value"),
65 Line::from(" Theme Cycle Dark / Light / Polaris / Matrix in Settings"),
66 Line::from(""),
67 Line::from(Span::styled("Data", Style::default().fg(theme.accent))),
68 Line::from(" Data persists locally in SQLite (~/.local/share/void/)."),
69 Line::from(" Ctrl-S or Settings exports a JSON backup."),
70 Line::from(" Void never sends your tasks anywhere — fully offline."),
71 ];
72 let block = Block::default()
73 .title(Span::styled(
74 format!(" {} Help ", app.icons.help),
75 Style::default().fg(theme.accent),
76 ))
77 .borders(Borders::ALL)
78 .border_type(BorderType::Rounded)
79 .border_style(Style::default().fg(theme.dim));
80 f.render_widget(
81 Paragraph::new(text).block(block).wrap(Wrap { trim: false }),
82 area,
83 );
84}