Bottom status line: keybindings-only, context- and state-aware; add mode advanced to empty hint #27

Closed
opened 2026-06-12 11:59:51 +01:00 by claude-clouddev1 · 1 comment
Collaborator

From manual testing / UX discussion.

The bottom-most UI line currently mixes command words and keystrokes.
That's redundant: the hint panel (when no command is entered) already
teaches that help gives help and Enter submits. Repurpose the
bottom line for keyboard bindings only.

Proposed design

Context-sensitive to nav focus (the app already cycles
NavFocus: Input -> SidebarTables -> SidebarRelationships via
Ctrl-O):

  • Input focus: Ctrl-O nav · Tab complete · Up/Down history · Enter run
  • Sidebar focus (after Ctrl-O): Ctrl-O next pane · PgUp/PgDn scroll · Esc input

Drop command words (help) from the bottom line — they belong in the
hint panel, not the keybinding strip.

Include transient states (user preference): when a transient mode
is active, reflect its keys — e.g. while a Tab-completion memo is live,
show Tab/Shift-Tab cycle · Esc cancel; during history navigation,
the relevant keys; etc. So the strip is not purely static-per-focus —
it tracks the current interaction state.

Empty-input hint (simple mode): append a short pointer so advanced
mode is discoverable, e.g. … · type \mode advanced` for SQL`.

Scope / files

  • ui.rs — the status/keybinding line rendering (context- and
    state-aware).
  • The empty-input hint text (catalog string + render).

Likely warrants a short ADR if the keybinding strip becomes a
first-class, state-driven UI element. Mentions: Ctrl-O, PgUp/
PgDn, mode advanced.

**From manual testing / UX discussion.** The bottom-most UI line currently mixes command words and keystrokes. That's redundant: the hint panel (when no command is entered) already teaches that `help` gives help and `Enter` submits. Repurpose the bottom line for **keyboard bindings only**. ### Proposed design **Context-sensitive to nav focus** (the app already cycles `NavFocus`: Input -> SidebarTables -> SidebarRelationships via `Ctrl-O`): - **Input focus:** `Ctrl-O nav · Tab complete · Up/Down history · Enter run` - **Sidebar focus (after Ctrl-O):** `Ctrl-O next pane · PgUp/PgDn scroll · Esc input` Drop command words (`help`) from the bottom line — they belong in the hint panel, not the keybinding strip. **Include transient states** (user preference): when a transient mode is active, reflect its keys — e.g. while a Tab-completion memo is live, show `Tab/Shift-Tab cycle · Esc cancel`; during history navigation, the relevant keys; etc. So the strip is not purely static-per-focus — it tracks the current interaction state. **Empty-input hint (simple mode):** append a short pointer so advanced mode is discoverable, e.g. `… · type \`mode advanced\` for SQL`. ### Scope / files - `ui.rs` — the status/keybinding line rendering (context- and state-aware). - The empty-input hint text (catalog string + render). Likely warrants a short ADR if the keybinding strip becomes a first-class, state-driven UI element. Mentions: `Ctrl-O`, `PgUp`/ `PgDn`, `mode advanced`.
claude-clouddev1 added the enhancement label 2026-06-12 11:59:51 +01:00
Author
Collaborator

Implemented in eceedc1ADR-0051 (context- and state-aware keybinding strip).

The bottom status line is now a keystrokes-only, state-selected strip. A pure status_bar_bindings(app) picks the binding set by priority (first match wins):

State Strip
Sidebar focus (Ctrl-O) Ctrl-O next pane · ↑↓/PgUp/PgDn scroll · Esc input
Completion memo live Tab/Shift-Tab cycle · Esc cancel · Enter run
History navigation ↑↓ browse · Esc clear · Enter run
Editing (input has text) Esc clear · Ctrl-A/E home/end · Ctrl-W del word · Enter run
Default (empty) Ctrl-O sidebar · Tab complete · ↑ history · Enter run

The editing state surfaces the #29 readline keys (closing ADR-0049's deferred advertisement). Priority is correct because Up clears the completion memo and Tab cancels history nav, so the completion/history states never co-occur; the five are exhaustive for input focus.

Mode discovery moved off the strip into the empty-input hint — typed-command words (mode advanced/mode simple switch, the : one-shot) and Ctrl-C quit are gone from the keybinding line.

Refinements after a trial run (this thread):

  • Ctrl-O navCtrl-O sidebar (clearer than "nav").
  • Hint pointer drops the verb "type" → · `mode advanced` for SQL (the prompt implies typing, as with help).
  • Advanced mode shows no pointer — a user who switched into advanced mode knows how they got there, and help covers the way back; a "switch back" pointer only reads naturally right after switching.

Decisions (user-confirmed): editing state shows the #29 keys; Ctrl-C quit omitted (lean, conventional); no width-drop machinery — the longest strip (~65 cols) fits all supported widths, so a width-budget test keeps it lean by construction instead.

Out of scope: modal-aware strip (pre-existing — a modal owns the keyboard and carries its own hints; the strip under it is unchanged-in-kind); a full-key cheatsheet overlay; Ctrl-K/U advertisement (the editing strip shows the highest-value subset within the width budget).

Tests: 9 Tier-1 unit (per-state key sets — completion/history driven through real key events; width budget; mode-pointer presence/absence), 1 Tier-3 rewritten (status_bar_is_keystroke_only_and_state_aware), 15 full-panel snapshots re-accepted (each diff reviewed — strip/hint only). 2467 pass / 0 fail / 0 skip (1 ignored), clippy clean.

Implemented in `eceedc1` — **ADR-0051** (context- and state-aware keybinding strip). The bottom status line is now a **keystrokes-only, state-selected** strip. A pure `status_bar_bindings(app)` picks the binding set by priority (first match wins): | State | Strip | |---|---| | Sidebar focus (Ctrl-O) | `Ctrl-O next pane · ↑↓/PgUp/PgDn scroll · Esc input` | | Completion memo live | `Tab/Shift-Tab cycle · Esc cancel · Enter run` | | History navigation | `↑↓ browse · Esc clear · Enter run` | | Editing (input has text) | `Esc clear · Ctrl-A/E home/end · Ctrl-W del word · Enter run` | | Default (empty) | `Ctrl-O sidebar · Tab complete · ↑ history · Enter run` | The **editing state surfaces the #29 readline keys** (closing ADR-0049's deferred advertisement). Priority is correct because Up clears the completion memo and Tab cancels history nav, so the completion/history states never co-occur; the five are exhaustive for input focus. **Mode discovery moved off the strip into the empty-input hint** — typed-command words (`mode advanced`/`mode simple` switch, the `:` one-shot) and `Ctrl-C quit` are gone from the keybinding line. **Refinements after a trial run (this thread):** - `Ctrl-O nav` → **`Ctrl-O sidebar`** (clearer than "nav"). - Hint pointer drops the verb "type" → **`` · `mode advanced` for SQL``** (the prompt implies typing, as with `help`). - **Advanced mode shows no pointer** — a user who switched into advanced mode knows how they got there, and `help` covers the way back; a "switch back" pointer only reads naturally right after switching. **Decisions (user-confirmed):** editing state shows the #29 keys; `Ctrl-C quit` omitted (lean, conventional); no width-drop machinery — the longest strip (~65 cols) fits all supported widths, so a width-budget test keeps it lean by construction instead. **Out of scope:** modal-aware strip (pre-existing — a modal owns the keyboard and carries its own hints; the strip under it is unchanged-in-kind); a full-key cheatsheet overlay; Ctrl-K/U advertisement (the editing strip shows the highest-value subset within the width budget). **Tests:** 9 Tier-1 unit (per-state key sets — completion/history driven through real key events; width budget; mode-pointer presence/absence), 1 Tier-3 rewritten (`status_bar_is_keystroke_only_and_state_aware`), 15 full-panel snapshots re-accepted (each diff reviewed — strip/hint only). 2467 pass / 0 fail / 0 skip (1 ignored), clippy clean.
Sign in to join this conversation.