void-focus 0.3.0-alpha.3

A feature-rich terminal focus timer with task tracking
Documentation
use super::*;

pub(crate) fn draw_help(f: &mut Frame, app: &App, area: Rect) {
    let theme = &app.theme;
    let text = vec![
        Line::from(Span::styled(
            "Void - keyboard shortcuts",
            Style::default()
                .fg(theme.accent)
                .add_modifier(Modifier::BOLD),
        )),
        Line::from(""),
        Line::from(Span::styled("Global", Style::default().fg(theme.accent))),
        Line::from("  Tab / 1-5   Switch tab (Dashboard, Tasks, Stats, Settings, Help)"),
        Line::from("  q / Esc     Quit (auto-saves)"),
        Line::from("  Ctrl-S      Export JSON backup"),
        Line::from(""),
        Line::from(Span::styled("Timer", Style::default().fg(theme.accent))),
        Line::from("  s / Space   Start / resume timer"),
        Line::from("  p           Pause timer"),
        Line::from("  r           Reset timer"),
        Line::from("  n           Skip (logs elapsed; does not advance pomodoro cycle)"),
        Line::from("  E           End session (pause + summary)"),
        Line::from("  m           Cycle mode (Focus / Short / Long / Custom)"),
        Line::from("  + / =       Increase duration by 1 min"),
        Line::from("  -           Decrease duration by 1 min"),
        Line::from("  z           Toggle zen mode (distraction-free timer)"),
        Line::from("  Enter       Cycle active task status (Todo → Active → Done)"),
        Line::from("  x           Mark active task done"),
        Line::from(""),
        Line::from(Span::styled("Pomodoro", Style::default().fg(theme.accent))),
        Line::from("  Cycle position persists across restarts"),
        Line::from("  After focus, auto-switches to break (enable auto-start in Settings)"),
        Line::from("  Long break every N focus sessions (configurable)"),
        Line::from("  All tasks done → free focus, pause, or prompt (Settings)"),
        Line::from(""),
        Line::from(Span::styled("Stats", Style::default().fg(theme.accent))),
        Line::from("  j / k       Select recent session"),
        Line::from("  d           Delete selected session"),
        Line::from("  + / -       Adjust session minutes"),
        Line::from("  E           End session"),
        Line::from(""),
        Line::from(Span::styled("Tasks", Style::default().fg(theme.accent))),
        Line::from("  a           Add task (title, notes, estimate, due, tags)"),
        Line::from("  e           Edit selected task"),
        Line::from("  d           Delete selected task (with confirmation)"),
        Line::from("  Enter       Cycle status: Pending → In Progress → Done"),
        Line::from("  Space       Set as active task for timer"),
        Line::from("  f           Start focus on selected task"),
        Line::from("  t           Toggle today-queue flag"),
        Line::from("  g           Cycle filter (All / Open / Done / Today)"),
        Line::from("  /           Search tasks by title, notes, or tags"),
        Line::from("  1 / 2 / 3   Set priority Low / Med / High"),
        Line::from("  j / k       Navigate list"),
        Line::from("  Ctrl+j/k    Reorder task in queue"),
        Line::from(""),
        Line::from(Span::styled("Settings", Style::default().fg(theme.accent))),
        Line::from("  Up / Down   Navigate"),
        Line::from("  Enter / +-  Increment value"),
        Line::from("  Left / -    Decrement value"),
        Line::from("  Theme       Cycle Dark / Light / Polaris / Matrix in Settings"),
        Line::from(""),
        Line::from(Span::styled("Data", Style::default().fg(theme.accent))),
        Line::from("  Data persists locally in SQLite (~/.local/share/void/)."),
        Line::from("  Ctrl-S or Settings exports a JSON backup."),
        Line::from("  Void never sends your tasks anywhere — fully offline."),
    ];
    let block = Block::default()
        .title(Span::styled(
            format!(" {} Help ", app.icons.help),
            Style::default().fg(theme.accent),
        ))
        .borders(Borders::ALL)
        .border_type(BorderType::Rounded)
        .border_style(Style::default().fg(theme.dim));
    f.render_widget(
        Paragraph::new(text).block(block).wrap(Wrap { trim: false }),
        area,
    );
}