From 82ea9af8b51fcb73844452b435e2449434a3e3cb Mon Sep 17 00:00:00 2001 From: Gregor Vostrak Date: Fri, 4 Sep 2026 14:55:09 +0200 Subject: [PATCH] fix radix dialog focus restore behaviour --- .../ui/src/CommandPalette/CommandPalette.vue | 7 +- .../packages/ui/src/dialog/DialogContent.vue | 9 +- .../ui/src/dialog/DialogScrollContent.vue | 7 ++ .../src/utils/useDialogFocusRestore.test.ts | 87 +++++++++++++++++++ .../ui/src/utils/useDialogFocusRestore.ts | 41 +++++++++ 5 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 resources/js/packages/ui/src/utils/useDialogFocusRestore.test.ts create mode 100644 resources/js/packages/ui/src/utils/useDialogFocusRestore.ts diff --git a/resources/js/packages/ui/src/CommandPalette/CommandPalette.vue b/resources/js/packages/ui/src/CommandPalette/CommandPalette.vue index 57317c40..55e99017 100644 --- a/resources/js/packages/ui/src/CommandPalette/CommandPalette.vue +++ b/resources/js/packages/ui/src/CommandPalette/CommandPalette.vue @@ -11,6 +11,7 @@ import { CommandShortcut, } from '../command'; import { cn } from '../utils/cn'; +import { useDialogFocusRestore } from '../utils/useDialogFocusRestore'; import type { CommandPaletteCommand, CommandPaletteGroup, @@ -36,6 +37,8 @@ const emit = defineEmits<{ select: [command: CommandPaletteCommand | EntitySearchResult]; }>(); +const { onOpenAutoFocus, onCloseAutoFocus } = useDialogFocusRestore(); + // Non-empty groups for rendering const nonEmptyGroups = computed(() => props.groups.filter((g) => g.commands.length > 0)); @@ -71,7 +74,9 @@ watch(open, (isOpen) => { ) "> + class="pointer-events-auto bg-default-background w-full max-w-lg border border-border-tertiary shadow-lg sm:rounded-lg outline-none overflow-hidden p-0 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95" + @open-auto-focus="onOpenAutoFocus" + @close-auto-focus="onCloseAutoFocus"> diff --git a/resources/js/packages/ui/src/dialog/DialogContent.vue b/resources/js/packages/ui/src/dialog/DialogContent.vue index 0ae3b68d..a63b8e79 100644 --- a/resources/js/packages/ui/src/dialog/DialogContent.vue +++ b/resources/js/packages/ui/src/dialog/DialogContent.vue @@ -1,5 +1,6 @@