diff options
| author | adamelmore <[email protected]> | 2026-01-25 12:16:31 -0600 |
|---|---|---|
| committer | adamelmore <[email protected]> | 2026-01-25 12:17:35 -0600 |
| commit | 14b00f64a7e4e834653068fe8f9f9f7cbdbde018 (patch) | |
| tree | 80e92b10fa094f6855067b0a10003373619e0069 /packages | |
| parent | fc57c074aea2838a7c36210ac853546179744a26 (diff) | |
| download | opencode-14b00f64a7e4e834653068fe8f9f9f7cbdbde018.tar.gz opencode-14b00f64a7e4e834653068fe8f9f9f7cbdbde018.zip | |
fix(app): escape should always close dialogs
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/ui/src/context/dialog.tsx | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/packages/ui/src/context/dialog.tsx b/packages/ui/src/context/dialog.tsx index d45fe6632..a3aafa0c7 100644 --- a/packages/ui/src/context/dialog.tsx +++ b/packages/ui/src/context/dialog.tsx @@ -1,8 +1,10 @@ import { createContext, + createEffect, createRoot, createSignal, getOwner, + onCleanup, type Owner, type ParentProps, runWithOwner, @@ -34,6 +36,20 @@ function init() { setActive(undefined) } + createEffect(() => { + if (!active()) return + + const onKeyDown = (event: KeyboardEvent) => { + if (event.key !== "Escape") return + close() + event.preventDefault() + event.stopPropagation() + } + + window.addEventListener("keydown", onKeyDown, true) + onCleanup(() => window.removeEventListener("keydown", onKeyDown, true)) + }) + const show = (element: DialogElement, owner: Owner, onClose?: () => void) => { close() @@ -41,13 +57,13 @@ function init() { let dispose: (() => void) | undefined const node = runWithOwner(owner, () => - createRoot((d) => { + createRoot((d: () => void) => { dispose = d return ( <Kobalte modal open={true} - onOpenChange={(open) => { + onOpenChange={(open: boolean) => { if (open) return close() }} |
