From 1e91dffd8b6d454870a19d76d9b9c24e059da389 Mon Sep 17 00:00:00 2001 From: Aviral Shukla Date: Tue, 7 Jul 2026 21:29:44 +0530 Subject: [PATCH 1/2] refactor(keyboard-nav): share a single nav instance via KeyboardNavProvider Splits useKeyboardNav into createKeyboardNav (constructor) and useKeyboardNav (context consumer) so descendant panels can share one focus ring instead of each panel spinning up its own. main-ui wraps its tool + preview subtree in the new provider. Adds a persistent field to FocusableElement so consumers can keep long-lived focusable elements registered across effect reruns (clearElements now only drops non-persistent entries). Callers outside the provider fall through to a fresh instance, preserving current behavior for standalone components. --- src/components/main-ui.tsx | 55 +++++++++++++++------------- src/hooks/useKeyboardNav.ts | 15 +++++--- src/model/models.ts | 1 + src/provider/keyboardNavProvider.tsx | 9 +++++ 4 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 src/provider/keyboardNavProvider.tsx diff --git a/src/components/main-ui.tsx b/src/components/main-ui.tsx index 004011d..ddd8e8b 100644 --- a/src/components/main-ui.tsx +++ b/src/components/main-ui.tsx @@ -13,6 +13,7 @@ import { OrganiseUI } from "./organise"; import { HeaderLayout } from "./header-layout"; import { PDFPreviewPane } from "./pdf-preview"; import { useFileListContext } from "../provider/fileListProvider"; +import { KeyboardNavProvider } from "../provider/keyboardNavProvider"; import { Button } from "./ui/button"; interface MainUIProps { @@ -50,33 +51,35 @@ export function MainUI(props: MainUIProps) { return ( - - - - - - 0 ? "30%" : 6}> - 0} - fallback={ - -