Skip to main content

void/ui/
help.rs

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}