Skip to content

feat!: replace the boo ui bottom bar with modals and a command palette#13

Closed
kylecarbs wants to merge 1 commit into
mainfrom
feat/ui-modals
Closed

feat!: replace the boo ui bottom bar with modals and a command palette#13
kylecarbs wants to merge 1 commit into
mainfrom
feat/ui-modals

Conversation

@kylecarbs

Copy link
Copy Markdown
Member

Replaces every bottom-bar interaction in boo ui with centered modals and removes the status bar entirely; the viewport now fills the full terminal height.

What changed

  • Palette (C-a): a modal that fuzzy-finds sessions (case-insensitive subsequence match) and runs commands (new session, kill <name>, rename <name>, quit ui, redraw, send a literal C-a). Type to filter, up/down or C-n/C-p to move, enter to run, esc to close.
  • Kill (C-a C-k, sidebar x, or palette): confirmation modal, still answered with y/n. Targets are tracked by session name, so a sidebar refresh can no longer redirect a confirmation to a different index.
  • Rename (C-a C-r or palette): input modal pre-filled with the current name.
  • New session (C-a C-c, + new session, or palette): every create path now opens a name prompt; an empty name keeps the automatic boo new naming (shown as a dim (automatic name) placeholder).
  • Bottom bar removed: transient messages (created x, copied 42 characters, errors) render as a self-expiring toast overlaid on the last row instead of occupying a reserved row.
  • Docs updated: boo help ui and the README keybinding section.

Breaking change

Printable keys after C-a now feed the palette filter, so C-a k searches for "k" instead of killing. This is what makes fuzzy-find possible, and it removes the old timing dependence (previously the byte after C-a was a command regardless of how stale the prefix was). The GNU-screen-style control variants already documented for boo (C-a C-c/C-a C-k/C-a C-r/C-a C-n/C-a C-p/C-a C-d/C-a C-l, C-a C-a toggle) keep working as direct commands, and a literal C-a is available as a palette command. Plain boo attach bindings are untouched.

Testing

  • zig build test-all passes (63 unit + 43 integration tests).
  • New unit tests: fuzzy matching, palette filtering, session-gated commands, modal box rendering, updated layout geometry.
  • New/updated integration tests: palette open/close + fuzzy attach + palette kill command, rename modal, named and automatic creation via the modal, control-variant bindings, full-height viewport (stty size now reports all rows).
  • Manually exercised by driving a nested boo ui with boo send/boo peek: palette, filter, kill/rename/create modals, placeholder, and toasts all render correctly.
Design notes
  • Modals are composed per screen row after the normal sidebar/viewport content, the same way the selection highlight already repaints rows, so the existing row-cache diffing handles overlay appearance and disappearance without special cases.
  • The palette opens when the C-a prefix arms with no command byte in the same read, mirroring when the old keybind bar appeared. A lone Esc cancelling the armed prefix is swallowed by the input parser, so readTty detects the silent disarm and closes the palette.
  • Escape sequences typed while a modal is open are swallowed (Up/Down navigate the palette); previously an arrow key pressed during a rename leaked its final byte into the input buffer.
  • Kill/rename modals store the target session name rather than an index into the once-a-second-refreshed session list.

This PR was generated by Coder Agents on behalf of @kylecarbs.

The status bar is gone; the viewport now fills the full terminal
height. Kill confirmation, rename, and session creation open as
centered modals, and pressing C-a opens a palette that fuzzy-finds
sessions and runs commands (new, kill, rename, quit, redraw,
literal C-a).

BREAKING CHANGE: printable keys after C-a feed the palette filter,
so the single-letter ui bindings (C-a c/k/r/n/p/d/l/a) no longer run
commands directly; use the GNU screen style control variants
(C-a C-c, C-a C-k, C-a C-r, C-a C-n, C-a C-p, C-a C-d, C-a C-l) or
the palette. Creating a session now always prompts for a name; an
empty name keeps the automatic naming.
@kylecarbs kylecarbs closed this Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant