codeburn/app/renderer/components
ozymandiashh c10ae84e4a fix(desktop): make keyboard shortcuts work on Windows and Linux
Closes #918.

The renderer's keydown handler required event.metaKey and explicitly
rejected event.ctrlKey, so every shortcut was dead outside macOS: on
Windows and Linux metaKey is the Super key, which the OS shell takes.
Navigation (1-8), Settings (,) and Refresh (R) all did nothing. The
sidebar and footer hints also hardcoded the Cmd glyph, so a Windows
user was shown chords that could not fire.

Add app/renderer/lib/platform.ts as the single source of truth for
platform-aware shortcuts, reading the platform the preload already
exposes (window.codeburn.platform) with a user-agent fallback for the
non-Electron cases. isModifierChord accepts Cmd-without-Ctrl on darwin
and Ctrl-without-Cmd elsewhere; altKey stays rejected on both, because
AltGr on European Windows layouts arrives as Ctrl+Alt and must not
hijack a typed character. Every visible shortcut label now resolves
through shortcutLabel() at render time, so the sidebar shows Ctrl+1
where macOS shows the Cmd glyph.

The mac chord condition is unchanged: the old guard admitted
metaKey && !altKey && !ctrlKey && !shiftKey, and the new one admits
exactly the same set on darwin.

The Electron application menu is deliberately left alone. It ships no
reload/forceReload role and no CmdOrCtrl+R accelerator, which is what
leaves Ctrl+R free for the renderer to handle on Windows.

Also corrects the Settings navigation hint, which read 1-7 while the
sidebar has eight numbered destinations.

Tests cover both platforms for labels and dispatch, including the
negatives: Meta on win32, Ctrl on darwin, and the Ctrl+Alt AltGr shape.
2026-08-04 22:48:39 +03:00
..
AboutModal.test.tsx fix(app): clean build stamp, splash without hash, About checks for updates 2026-07-17 14:30:00 -07:00
AboutModal.tsx app: Download button direct-downloads the update asset (#777) 2026-07-20 10:02:43 -07:00
ActivityHeatmap.test.tsx app,dash: render pre-history days as no data, not a currency zero (#765) 2026-07-20 08:03:24 -07:00
ActivityHeatmap.tsx app,dash: render pre-history days as no data, not a currency zero (#765) 2026-07-20 08:03:24 -07:00
CliErrorPanel.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
ConnectAffordance.tsx fix(app): quota connects via macOS keychain + Connect affordance 2026-07-16 06:20:44 -07:00
Dropdown.tsx feat(app): Claude config switcher (multi-account overview scope) 2026-07-16 03:06:05 -07:00
EmptyState.tsx polish(app): spacing scale, unified insets, shared banner classes, scrollbar cues 2026-07-16 04:02:21 -07:00
ErrorBoundary.test.tsx feat(app): error boundary so a crashing screen shows the error, not a blank 2026-07-11 14:33:16 -07:00
ErrorBoundary.tsx feat(app): error boundary so a crashing screen shows the error, not a blank 2026-07-11 14:33:16 -07:00
FlameMark.tsx feat(app): exact approved flame art everywhere 2026-07-16 06:10:22 -07:00
Hint.tsx feat(app): window chrome, sidebar nav, and Overview smoke view 2026-07-10 15:17:11 -07:00
ListRow.tsx feat(app): Sessions provider quick-filter + Spend project inline expand 2026-07-16 02:49:17 -07:00
Onboarding.test.tsx feat(app): refresh cadence, instant switching, cache coherence, telemetry v1 2026-07-16 11:47:05 -07:00
Onboarding.tsx fix: audit batch — prefetch one-shot, turn-anchored day bucketing, warm-path collapse 2026-07-16 15:37:03 -07:00
Panel.tsx polish(app): spacing scale, unified insets, shared banner classes, scrollbar cues 2026-07-16 04:02:21 -07:00
ProviderLogo.test.tsx fix(app): provider logos key on internal ids + monogram fallback 2026-07-16 09:27:46 -07:00
ProviderLogo.tsx fix(app): provider logos key on internal ids + monogram fallback 2026-07-16 09:27:46 -07:00
ProviderPop.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
RangeCalendar.tsx feat(app): working periods, detected-provider dropdown, drag-select date range 2026-07-11 09:14:54 -07:00
Sankey.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
SegTabs.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
Sidebar.test.tsx fix(desktop): make keyboard shortcuts work on Windows and Linux 2026-08-04 22:48:39 +03:00
Sidebar.tsx fix(desktop): make keyboard shortcuts work on Windows and Linux 2026-08-04 22:48:39 +03:00
Skeleton.test.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Skeleton.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
Splash.test.tsx fix: hydration completeness markers, cold-only splash, honest switching, prefetch 2026-07-16 14:05:11 -07:00
Splash.tsx fix(app): clean build stamp, splash without hash, About checks for updates 2026-07-17 14:30:00 -07:00
StackedBars.test.tsx app,dash: render pre-history days as no data, not a currency zero (#765) 2026-07-20 08:03:24 -07:00
StackedBars.tsx app,dash: render pre-history days as no data, not a currency zero (#765) 2026-07-20 08:03:24 -07:00
StaleBanner.test.tsx fix(app): accuracy batch A — provider scoping, honest chart axes, range threading, stale-error banner 2026-07-16 01:14:41 -07:00
StaleBanner.tsx polish(app): spacing scale, unified insets, shared banner classes, scrollbar cues 2026-07-16 04:02:21 -07:00
Stat.tsx polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
ToastHost.test.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
ToastHost.tsx feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
TopBar.tsx fix(clients): display CLI-computed values verbatim, align period windows across app/dash/menubar 2026-07-20 06:26:15 -07:00
UpdateBanner.test.tsx feat(app): update-available notifications 2026-07-17 04:58:13 -07:00
UpdateBanner.tsx app: Download button direct-downloads the update asset (#777) 2026-07-20 10:02:43 -07:00
Window.tsx feat(app): window chrome, sidebar nav, and Overview smoke view 2026-07-10 15:17:11 -07:00