Problem
The keyboard model is one of the app's strongest features (customizable registry, conflict detection, live help dialog, spatial nav) — these are the remaining gaps that break the "mouse optional" promise:
Panel resizing is mouse-only. ResizablePanel.tsx:316-321 — divider has only onMouseDown/onDblClick; no role="separator", no tabIndex, no arrow-key resize. A keyboard-first user can never adjust the AI-terminal/diff/notes split.
Zoom in/out are invisible and non-rebindable. src/lib/shortcuts.ts:49-98 registers them imperatively outside the keybinding registry, so unlike everything else they don't appear in the Keyboard Shortcuts dialog and can't be customized; only app.reset-zoom is registered (defaults.ts:350-357). The AZERTY-variant rationale justifies hiding duplicate bindings, not the canonical zoom rows.
No visible focus indicator outside dialogs. The comprehensive :focus-visible rule is scoped to .dialog-panel (styles.css:73-95 — the comment says so explicitly). .icon-btn (:920-931) has hover/active but no focus-visible; .new-task-placeholder:focus-visible { outline: none } (:1506-1508) while its accent border is driven by store focus, which DOM-Tab focus doesn't set — tabbing to it shows nothing.
Keyboard-unreachable click targets: diff hunk expanders (ScrollingDiffView.tsx:489-501, clickable div), review-comment editing (ReviewSidebar.tsx:142-151, ReviewCommentCard.tsx:130), overall-comment card (ReviewSidebar.tsx:44-45).
Proposed fix
From a full design/UX audit (2026-07-07); adversarially verified. Line numbers as of b342bbd (v1.12.0).
Problem
The keyboard model is one of the app's strongest features (customizable registry, conflict detection, live help dialog, spatial nav) — these are the remaining gaps that break the "mouse optional" promise:
Panel resizing is mouse-only.
ResizablePanel.tsx:316-321— divider has onlyonMouseDown/onDblClick; norole="separator", notabIndex, no arrow-key resize. A keyboard-first user can never adjust the AI-terminal/diff/notes split.Zoom in/out are invisible and non-rebindable.
src/lib/shortcuts.ts:49-98registers them imperatively outside the keybinding registry, so unlike everything else they don't appear in the Keyboard Shortcuts dialog and can't be customized; onlyapp.reset-zoomis registered (defaults.ts:350-357). The AZERTY-variant rationale justifies hiding duplicate bindings, not the canonical zoom rows.No visible focus indicator outside dialogs. The comprehensive
:focus-visiblerule is scoped to.dialog-panel(styles.css:73-95— the comment says so explicitly)..icon-btn(:920-931) has hover/active but no focus-visible;.new-task-placeholder:focus-visible { outline: none }(:1506-1508) while its accent border is driven by store focus, which DOM-Tab focus doesn't set — tabbing to it shows nothing.Keyboard-unreachable click targets: diff hunk expanders (
ScrollingDiffView.tsx:489-501, clickable div), review-comment editing (ReviewSidebar.tsx:142-151,ReviewCommentCard.tsx:130), overall-comment card (ReviewSidebar.tsx:44-45).Proposed fix
role="separator"+tabIndex={0}+ arrow keys on dividers (reusesetPanelUserSize).app.zoom-in/app.zoom-outregistry entries; keep layout variants hidden as today.:focus-visibleselector list to a global rule; delete theoutline: noneatstyles.css:1506.<button>; add Enter-to-edit on review comments.From a full design/UX audit (2026-07-07); adversarially verified. Line numbers as of b342bbd (v1.12.0).