feat(hub-ui): assign keyboard shortcuts to dock group members - #282
Draft
SaKaNa-Y wants to merge 2 commits into
Draft
feat(hub-ui): assign keyboard shortcuts to dock group members#282SaKaNa-Y wants to merge 2 commits into
SaKaNa-Y wants to merge 2 commits into
Conversation
Every consumer of the command tree walked a single level of `children`, so anything deeper was unreachable: a dock group's members had no row in the shortcut settings to bind, no entry in the keybinding collector to fire, and no id the dispatcher could resolve. Traversal now lives in one place. `walkCommands` visits the tree depth-first with a `'skip'`/`'stop'` visitor signal, and `findCommandDeep`, `collectAllKeybindings`, the shortcut settings rows and the palette's root flatten all share it. `filterCommandsByWhen` keeps its own recursion since it rebuilds a cloned tree per level. The palette's flatten and drill-down stack move to `state/palette.ts`, where `showInPalette: 'without-children'` prunes a whole subtree rather than one level, and a row carries its full path for search while displaying only its immediate parent. Shortcut rows indent by nesting level instead of a boolean.
A group has no view of its own, so activating one by id — its shortcut, a palette pick, an RPC activation — used to fall back to whichever member happened to come first. That picked for the user, and a group whose members are peers has no member worth picking. Activating a group now opens an unambiguous target directly: the author's `defaultChildId`, or a lone visible member. With several peer members it opens the command palette drilled into that group, so the choice stays with the user and the group is reachable by keyboard alone. Pressing the same shortcut again closes the palette; stepping back to the root list unscopes it, so the shortcut drills back in rather than toggling. `CommandsContext` gains `openPalette(atCommandId?)` and `paletteScopeId`. Members hang directly off their group in the command tree — the dock bar's sub-category dividers have no counterpart there, since a category is not something you can run. A group with no visible member and no reachable `defaultChildId` registers no command at all. `switchEntry` is unchanged, so boot restore and `hub:docks:activate` behave as before.
|
@SaKaNa-Y is attempting to deploy a commit to the NuxtLabs Team on Vercel. A member of the Team first needs to authorize it. |
SaKaNa-Y
marked this pull request as draft
August 22, 2026 03:55
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.
Resolves the "dock group members can never be assigned keyboard shortcuts" problem discussed in vitejs/devtools#501, following the approach @antfu proposed there: when a shortcut hits a group entry with no
defaultChildId, the command palette offers the sub-docks so the flow stays keyboard-driven.Two independent halves, one commit each.
fix: nested commands were unbindableEvery consumer of the command tree walked a single level of
children. Dock group members sit two levels below theDockscommand, so they had no row in Settings → Shortcuts to bind, no entry in the keybinding collector to fire, and no id the dispatcher could resolve. That depth-1 ceiling is the literal cause of "can never be assigned".Traversal now lives in one place:
walkCommandsvisits the tree depth-first with a'skip'/'stop'visitor signal, shared byfindCommandDeep,collectAllKeybindings, the shortcut-settings rows, and the palette's root flatten.filterCommandsByWhenkeeps its own recursion, since it rebuilds a cloned tree per level.The palette's flatten and drill-down stack move to
state/palette.ts.showInPalette: 'without-children'now prunes a whole subtree rather than one level, and a row carries its full path for search while displaying only its immediate parent.feat: activating a group no longer guesses a memberA group has no view of its own, so activating one by id used to fall back to whichever member came first. A group whose members are peers has no member worth picking.
Activating a group now opens an unambiguous target directly — the author's
defaultChildId, or a lone visible member. With several peer members it opens the palette drilled into that group. Pressing the same shortcut again closes the palette; stepping back to the root list unscopes it, so the shortcut drills back in rather than toggling.CommandsContextgainsopenPalette(atCommandId?)andpaletteScopeId. Members hang directly off their group in the command tree — the dock bar's sub-category dividers have no counterpart there, since a category is not something you can run. A group with no visible member and no reachabledefaultChildIdregisters no command at all.switchEntryis unchanged, so boot restore andhub:docks:activatebehave as before, and clicking a group button still opens the member popover.Verification
pnpm lint,pnpm typecheck(38/38) andpnpm build(27/27) are clean. Tests: 1283 passing.Two
@devframes/plugin-code-servertests fail on my machine, before and after this branch — a test fixture's temp-file handoff (ENOENT … Temp\dcs-dump-*\hashed) that doesn't work on Windows. Unrelated to these changes.New specs:
state/keybindings.test.ts(traversal, skip/stop, deep lookup),state/palette.test.ts(showInPalettepruning, path/parent titles, scope-trail degradation), and group-activation cases instate/context.test.ts. New stories:Commands/Palette → ScopedToGroup,Views/Builtin/Settings → DeeplyNestedShortcuts.Docs: an "Activating a group" section and a "Nested commands" section in the hub guide, plus the
openPalette/paletteScopeIdsurface in the client-context table.