name: keyboard-shortcuts description: How keyboard shortcuts are wired globally and per-panel in this repo.
Keyboard Shortcuts
Overview (registry + services)
- Registry implementation:
packages/web-client/src/utils/keyboardShortcuts.ts. - Registry is created in
packages/web-client/src/index.tsand wired with:-
isEnabled()(respects the keyboard shortcuts preference + open dialogs) -
getActivePanel()(for scope resolution) - binding overrides (from local storage via
clientPreferences)
-
- Core panel services expose
services.keyboardShortcuts.register(...)so plugins can register panel-scoped shortcuts.
Global shortcuts (app-level)
- Register in
KeyboardNavigationControllerviaKeyboardShortcutRegistry.register(...). - Registry attaches a single
documentkeydownlistener (capture phase) and dispatches by key. - Handlers should still guard on editable targets (e.g.,
isEditableTargetpattern inKeyboardNavigationController). - Examples: panel navigation (Ctrl+P / Ctrl+H), command palette (Cmd/Ctrl+K), panel cycling.
- Split placement uses
Ctrl+S(seesplit-panelshortcut inKeyboardNavigationController).
Focus history shortcuts
- Focus history is tracked in
PanelWorkspaceControllerand persisted in local storage (aiAssistantPanelFocusHistory). -
Ctrl+A/C/D/F/L/N/Tfocus the last-used artifacts/chat/diff/files/lists/notes/time-tracker panel. - If none exist, the shortcut opens a modal panel of that type.
Panel/plugin shortcuts (panel-scoped)
- Use
services.keyboardShortcuts.register(...)from the panel module (see lists/notes/time-tracker). - Set scope explicitly:
-
scope: 'panelType'+panelTypefor a shared binding across all instances of a panel. -
scope: 'panelInstance'+panelIdfor instance-specific bindings.
-
- Always provide a stable
bindingIdto support user-configurable overrides (defaults toidif omitted). - If a handler consumes the event, call
event.preventDefault()andevent.stopPropagation()before returningtrue.
Panel focus awareness
- Panels subscribe to
panel.activecontext and cacheisPanelSelected. - This is the de-facto signal for whether panel shortcuts should run.
Other global listeners to be aware of
-
CommandPaletteControllerattaches akeydownlistener while open and consumes keys like Escape. -
PanelWorkspaceControllerlistens for Escape to close modal panels, but blocks when certain overlays are open.
Common options on KeyboardShortcut
-
allowShift: match even when Shift is pressed but not part of the modifiers. -
allowWhenDisabled: allow handling even when global shortcuts are disabled (useful for dialogs). -
priority: resolve conflicts within the same scope. -
platform: restrict tomac,win,linux, orall.
When adding new shortcuts
- Prefer global shortcuts for true app-level actions.
- For panel behavior, register through
services.keyboardShortcutsso bindings can be overridden later. - Avoid stealing keys from text inputs; always check editable targets before acting.
chat Comments (0)
Sign in to join the discussion and leave a comment.
Skill Details
GitHub Stars
22
GitHub Forks
2
Created
Mar 2026
Last Updated
il y a 3 mois
tools
tools system admin
Related Skills
Build your own?
Join 12,000+ developers contributing to the Claude ecosystem.
No comments yet. Be the first to share your thoughts!