diff --git a/apps/desktop/src/lib/keybinds/actions.ts b/apps/desktop/src/lib/keybinds/actions.ts index e25008286b..9751818ec5 100644 --- a/apps/desktop/src/lib/keybinds/actions.ts +++ b/apps/desktop/src/lib/keybinds/actions.ts @@ -85,8 +85,8 @@ export const KEYBIND_ACTIONS: readonly KeybindActionMeta[] = [ { id: 'session.newWindow', category: 'session', defaults: ['mod+shift+n'] }, // ⌃Tab / ⌃⇧Tab — the universal tab-cycle chord. Literally Control, not Cmd // (macOS reserves Cmd+Tab for app switching); see `ctrl` in combo.ts. - { id: 'session.next', category: 'session', defaults: ['ctrl+tab'] }, - { id: 'session.prev', category: 'session', defaults: ['ctrl+shift+tab'] }, + { id: 'session.next', category: 'session', defaults: ['ctrl+tab', 'ctrl+pagedown'] }, + { id: 'session.prev', category: 'session', defaults: ['ctrl+shift+tab', 'ctrl+pageup'] }, ...SESSION_SLOT_ACTIONS, { id: 'session.focusSearch', category: 'session', defaults: ['mod+shift+f'] }, { id: 'session.togglePin', category: 'session', defaults: [] }, diff --git a/apps/desktop/src/lib/keybinds/combo.test.ts b/apps/desktop/src/lib/keybinds/combo.test.ts index 192107251a..e7d66b5909 100644 --- a/apps/desktop/src/lib/keybinds/combo.test.ts +++ b/apps/desktop/src/lib/keybinds/combo.test.ts @@ -82,6 +82,13 @@ describe('comboFromEvent — ctrl as a distinct modifier on macOS', () => { expect(comboFromEvent(keydown({ code: 'Tab', ctrlKey: true }))).toBe('mod+tab') expect(comboFromEvent(keydown({ code: 'Tab', ctrlKey: true, shiftKey: true }))).toBe('mod+shift+tab') }) + + it('recognizes PageUp and PageDown chords', async () => { + const { comboFromEvent } = await loadCombo('MacIntel') + + expect(comboFromEvent(keydown({ code: 'PageUp', ctrlKey: true }))).toBe('ctrl+pageup') + expect(comboFromEvent(keydown({ code: 'PageDown', ctrlKey: true }))).toBe('ctrl+pagedown') + }) }) describe('canonicalizeCombo', () => { @@ -116,6 +123,13 @@ describe('formatCombo — honest Control labels', () => { expect(formatCombo('ctrl+tab')).toBe('Ctrl+⇥') expect(formatCombo('ctrl+shift+tab')).toBe('Ctrl+Shift+⇥') }) + + it('renders PageUp and PageDown with compact labels', async () => { + const { formatCombo } = await loadCombo('Win32') + + expect(formatCombo('ctrl+pageup')).toBe('Ctrl+PgUp') + expect(formatCombo('ctrl+pagedown')).toBe('Ctrl+PgDn') + }) }) describe('actionAllowedInInput', () => { diff --git a/apps/desktop/src/lib/keybinds/combo.ts b/apps/desktop/src/lib/keybinds/combo.ts index 97f1a51d22..75b025a9c8 100644 --- a/apps/desktop/src/lib/keybinds/combo.ts +++ b/apps/desktop/src/lib/keybinds/combo.ts @@ -33,6 +33,8 @@ const CODE_TO_KEY: Record = { Escape: 'escape', Backspace: 'backspace', Tab: 'tab', + PageUp: 'pageup', + PageDown: 'pagedown', ArrowUp: 'up', ArrowDown: 'down', ArrowLeft: 'left', @@ -169,6 +171,8 @@ const TOKEN_LABELS: Record = { escape: 'Esc', backspace: '⌫', tab: '⇥', + pageup: 'PgUp', + pagedown: 'PgDn', space: 'Space', up: '↑', down: '↓',