feat: find any action by typing, with Ctrl+K - #86
Merged
Conversation
Settles the questions issue #26 left open: what the palette contains, that commands and keyboard shortcuts are separate things, and that searching todos stays with the Search view.
Groundwork for the command palette (#26). A shortcut now names a command rather than describing itself, so an action is called the same thing wherever it appears.
One field that reaches everything: create a todo or a list, jump to any view or any list by name, open Settings or Help. Type to filter, arrow or Ctrl+N/P to choose, Enter to run.
JackCuthbert
force-pushed
the
feat/command-palette
branch
from
August 21, 2026 00:34
3205d95 to
1ad3697
Compare
The two things done most often were behind the nav — a drawer on a phone, a collapsed sidebar on desktop. They now sit at the foot of the list whenever the nav is not showing.
Commands sits beside New todo at the top of the nav. New list moves to the foot of the lists it creates, which is where you look when you want another one.
The lists lose their boxed-in look and now match the views above them: one shared row shape, a soft wash for hover and selection, and group headings for Views and Lists. New list sits at the foot of the lists it adds to, and the filter moved up into the Lists heading. Long list names now shorten with an ellipsis instead of running past the edge. The filter and the command palette button name themselves on hover.
JackCuthbert
force-pushed
the
feat/command-palette
branch
from
August 21, 2026 01:12
1ad3697 to
3ef5540
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #26.
Adds a command palette (
Ctrl+K) that finds any action by typing, plus the nav and floating-button work that grew out of putting it on screen.The palette
Navigation and app actions only — no per-todo actions, and no todo search, since the Search view already owns that. Results are grouped (Create / Go to view / Go to list / App) and each entry shows its chord where it has one.
Ctrl+N/Ctrl+Pmove the selection as well as the arrows.Commands are now a registry of their own (
commands/lib/commands.ts) rather than an extension of the shortcut table. Not everything deserves a keybinding, and the previous shape forced one on anything that wanted to be listed. Shortcuts now reference aCommandId, so the two stay in sync without the registry dictating the keymap. Sign-out is deliberately excluded — it's in the footer, and a fuzzy match away from "Search" is not where you want to land.Floating buttons
+ New todoand the palette square, reachable without opening the nav — on touch always, on desktop whenever the sidebar is collapsed. They sit insidemainScrollInnerso they stay centred on the list while the sidebar animates, and sticky at the foot of the scroll port so a short list keeps them at the bottom of the screen rather than floating mid-page.The palette button uses a terminal prompt rather than
LuCommand: that glyph is ⌘, and this app binds Ctrl on every platform and refusesmetaKeyoutright. An icon naming the one modifier the app never uses would be wrong on a Mac and meaningless everywhere else.Sidebar rebalance
Adding a fourth button at the top made the nav read as three unrelated zones — chrome, then ghost-text views, then boxed-in lists. So the rows were brought onto one shape:
LuEllipsisVerticalrather than the⋮character. As text it drew 7×16 of thin ink at weight 400 beside a 14px sparkle stroked at 2 — no size reconciles those, because one is type and the other a mark. Both arereact-icons/lunow, per CLAUDE.md's one-icon-set rule..linkcarriedtext-overflow: ellipsisbut is a flex container, and that property only acts on a block's own inline content, so the declaration was inert and a 617px name ran on inside a 246px button.Tooltips are new (
ui/tooltip), on the filter and the palette button.titlenever appears for a keyboard user, can't be styled, and can't show a chord in the app's own type.Notes for review
+ New listtoNew list, which broke 69 e2e tests —createListis used almost everywhere. The six call sites were updated rather than re-adding the label, since the accessible name should match the visible text.bun run test:e2e78 passed,bun run test751 passed, lint / typecheck / knip / fmt clean. Each commit typechecks and passes knip standalone.Still open
The user guide (
apps/docs/guide) has no command palette page yet. Happy to add it here or as a follow-up.