From 60cea5637080655aaa466d1e5cce81af398c8636 Mon Sep 17 00:00:00 2001 From: hreyes Date: Fri, 6 Feb 2026 08:42:46 -0600 Subject: [PATCH] fix/tabs-f1-scroll --- .../keyboard/ShortcutsHelpModal.svelte | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte b/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte index e398be17..00f9a73a 100644 --- a/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte +++ b/frontend/src/lib/components/keyboard/ShortcutsHelpModal.svelte @@ -6,6 +6,41 @@ // Group local shortcuts let localShortcuts = $derived($store.shortcuts); + + let globalList: HTMLDivElement; + let localList: HTMLDivElement; + let modalRef: HTMLDivElement; + + function handleArrowScroll(event: KeyboardEvent, target: HTMLDivElement) { + if (!target) return; + if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { + event.preventDefault(); + const delta = event.key === 'ArrowDown' ? 32 : -32; + target.scrollTop += delta; + } + } + + function handleFocusTrap(event: KeyboardEvent) { + if (event.key !== 'Tab' || !modalRef) return; + const focusable = modalRef.querySelectorAll( + 'button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"])' + ); + const focusables = Array.from(focusable).filter( + (el) => !el.hasAttribute('disabled') && el.tabIndex !== -1 && el.offsetParent !== null + ); + if (focusables.length === 0) return; + const first = focusables[0]; + const last = focusables[focusables.length - 1]; + const active = document.activeElement as HTMLElement; + + if (!event.shiftKey && active === last) { + event.preventDefault(); + first.focus(); + } else if (event.shiftKey && active === first) { + event.preventDefault(); + last.focus(); + } + } {#if open} @@ -15,7 +50,9 @@ aria-modal="true" >
Global Navigation (Alt) -
+
handleArrowScroll(event, globalList)} + > {#each Object.entries(GLOBAL_CONF) as [key, route]}
No specific actions for this view.

{:else} -
+
handleArrowScroll(event, localList)} + > {#each localShortcuts as shortcut}