From 79434c514b14e59076d566098ba45086f7dd9d50 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Thu, 20 Aug 2026 19:14:40 +0200 Subject: [PATCH] chat : add close-tab keyboard shortcut Assisted-by: pi --- tools/ui/src/lib/enums/keyboard.enums.ts | 4 ++- .../hooks/use-keyboard-shortcuts.svelte.ts | 25 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/tools/ui/src/lib/enums/keyboard.enums.ts b/tools/ui/src/lib/enums/keyboard.enums.ts index fb47fcf3e8..b5749211d3 100644 --- a/tools/ui/src/lib/enums/keyboard.enums.ts +++ b/tools/ui/src/lib/enums/keyboard.enums.ts @@ -16,5 +16,7 @@ export enum KeyboardKey { O_LOWER = 'o', O_UPPER = 'O', SPACE = ' ', - TAB = 'Tab' + TAB = 'Tab', + X_LOWER = 'x', + X_UPPER = 'X' } diff --git a/tools/ui/src/lib/hooks/use-keyboard-shortcuts.svelte.ts b/tools/ui/src/lib/hooks/use-keyboard-shortcuts.svelte.ts index 4a2fd0af8c..eb67b378d8 100644 --- a/tools/ui/src/lib/hooks/use-keyboard-shortcuts.svelte.ts +++ b/tools/ui/src/lib/hooks/use-keyboard-shortcuts.svelte.ts @@ -1,5 +1,6 @@ +import { page } from '$app/state'; import { KeyboardKey } from '$lib/enums'; -import { conversationsStore } from '$lib/stores'; +import { conversationsStore, NEW_CHAT_TAB_ID, settingsStore, tabsStore } from '$lib/stores'; interface KeyboardShortcutsCallbacks { activateSearchMode?: () => void; @@ -41,6 +42,28 @@ export function useKeyboardShortcuts(callbacks: KeyboardShortcutsCallbacks) { callbacks.editActiveConversation?.(); } + if ( + event.shiftKey && + isCmdOrCtrl && + (event.key === KeyboardKey.X_LOWER || event.key === KeyboardKey.X_UPPER) + ) { + // several components register this shortcut; only let the first handler + // act so the synchronous navigation does not cascade-close every tab + if (event.defaultPrevented) return; + + event.preventDefault(); + + // close-tab only makes sense with conversation tabs enabled + if (!settingsStore.config.conversationTabs) return; + + const activeId = + page.params.id ?? (page.route.id === '/(chat)' ? NEW_CHAT_TAB_ID : undefined); + + if (activeId) { + void tabsStore.close(activeId, activeId); + } + } + if ( isCmdOrCtrl && event.shiftKey &&