codeburn/app/renderer/lib
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
..
budget.ts feat(app): daily budget alert (USD or token cap) 2026-07-16 03:16:07 -07:00
build.ts fix: hydration completeness markers, cold-only splash, honest switching, prefetch 2026-07-16 14:05:11 -07:00
format.test.ts fix(app): real currency conversion, provider ids in picker, yield provider scoping 2026-07-16 01:36:59 -07:00
format.ts fix(app): real currency conversion, provider ids in picker, yield provider scoping 2026-07-16 01:36:59 -07:00
ipc.ts feat(app): T8 integration + cleanup — single refresh, ⌘-nav, shared error/format/period/series, README 2026-07-10 19:35:41 -07:00
modelSeries.ts polish(app): shared empty states, type ladder, AA contrast, honest affordances, a11y semantics 2026-07-16 02:27:41 -07:00
motion.test.tsx polish(app): consistency review nits 2026-07-16 05:11:10 -07:00
motion.ts feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
pageVisibility.test.ts fix(app): zero background work when hidden; currency applies instantly 2026-07-16 18:41:28 -07:00
pageVisibility.ts fix(app): zero background work when hidden; currency applies instantly 2026-07-16 18:41:28 -07:00
period.test.ts app,dash: render pre-history days as no data, not a currency zero (#765) 2026-07-20 08:03:24 -07:00
period.ts app,dash: render pre-history days as no data, not a currency zero (#765) 2026-07-20 08:03:24 -07:00
platform.ts fix(desktop): make keyboard shortcuts work on Windows and Linux 2026-08-04 22:48:39 +03:00
refreshCadence.test.ts fix(app): zero background work when hidden; currency applies instantly 2026-07-16 18:41:28 -07:00
refreshCadence.tsx fix(app): zero background work when hidden; currency applies instantly 2026-07-16 18:41:28 -07:00
testMatchMedia.ts polish(app): consistency review nits 2026-07-16 05:11:10 -07:00
toast.ts feat(app): motion layer (gsap) — count-ups, chart grow-in, section fade, skeletons, toasts 2026-07-16 04:39:09 -07:00
types.ts feat(dashboard): add combined-device scope to desktop app and menubar badge 2026-07-31 15:12:29 -06:00