tui: global navigation — sidebar, status bar, layout #17

Closed
opened 2026-04-11 13:02:08 +00:00 by charles · 0 comments
Owner

User story

As a user, I want a persistent sidebar for screen navigation and a status bar showing app state, so that I always know which screen I'm on, which backend is active, and what the app is doing.

Acceptance criteria

Layout

  • Top-level frame split: collapsible sidebar (configurable width %, default 25), main content area, 1-row status bar at the bottom
  • Ctrl+B toggles sidebar visibility
  • Tab / Shift+Tab cycles focus between sidebar and main area
  • Layout remains stable across resize

Sidebar

  • Lists screens per spec §3.1: Gallery g, Generate n, Model Browser m, Entities e, Presets p, Settings s
  • Each item shows its mnemonic key binding
  • j/k and arrow keys move selection; Enter navigates
  • Highlighted item reflects the active screen

Status bar

  • Shows (left → right): active backend name, queue depth (Q: n), current keybind mode (normal / insert / command), last action notification (placeholder hook)
  • Polls loom-core queue state at the tick rate defined in the event-loop ticket
  • Right-aligned clock (HH:MM)

Global keybindings

  • q / Ctrl+C quit (confirmation prompt if a generation is running)
  • ? pushes the help overlay (stub call — the overlay itself is another ticket)
  • All screen mnemonics above route through AppAction::Navigate(...)

Tests

  • Snapshot-style test: sidebar renders expected layout for an 80×24 terminal
  • Unit test: pressing g while on the Generate screen navigates to Gallery

Out of scope

  • Command palette (separate ticket)
  • Configurable keybinds (separate ticket)
  • Help overlay implementation (separate ticket)
  • Notification bar widget (separate ticket — notifications & error handling)

References

  • Spec §2.3 "Layout System"
  • Spec §3.1 "Global Key Bindings"
## User story As a user, I want a persistent sidebar for screen navigation and a status bar showing app state, so that I always know which screen I'm on, which backend is active, and what the app is doing. ## Acceptance criteria ### Layout - [ ] Top-level frame split: collapsible sidebar (configurable width %, default 25), main content area, 1-row status bar at the bottom - [ ] `Ctrl+B` toggles sidebar visibility - [ ] `Tab` / `Shift+Tab` cycles focus between sidebar and main area - [ ] Layout remains stable across resize ### Sidebar - [ ] Lists screens per spec §3.1: Gallery `g`, Generate `n`, Model Browser `m`, Entities `e`, Presets `p`, Settings `s` - [ ] Each item shows its mnemonic key binding - [ ] `j`/`k` and arrow keys move selection; `Enter` navigates - [ ] Highlighted item reflects the active screen ### Status bar - [ ] Shows (left → right): active backend name, queue depth (`Q: n`), current keybind mode (`normal` / `insert` / `command`), last action notification (placeholder hook) - [ ] Polls `loom-core` queue state at the tick rate defined in the event-loop ticket - [ ] Right-aligned clock (`HH:MM`) ### Global keybindings - [ ] `q` / `Ctrl+C` quit (confirmation prompt if a generation is running) - [ ] `?` pushes the help overlay (stub call — the overlay itself is another ticket) - [ ] All screen mnemonics above route through `AppAction::Navigate(...)` ### Tests - [ ] Snapshot-style test: sidebar renders expected layout for an 80×24 terminal - [ ] Unit test: pressing `g` while on the Generate screen navigates to Gallery ## Out of scope - Command palette (separate ticket) - Configurable keybinds (separate ticket) - Help overlay implementation (separate ticket) - Notification bar widget (separate ticket — notifications & error handling) ## References - Spec §2.3 "Layout System" - Spec §3.1 "Global Key Bindings"
charles added this to the loom-tui v0.1.0 milestone 2026-04-11 13:02:08 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/loom#17
No description provided.