fix(app): escape should always close dialogs

This commit is contained in:
adamelmore
2026-01-25 12:16:31 -06:00
parent fc57c074ae
commit 14b00f64a7

View File

@@ -1,8 +1,10 @@
import { import {
createContext, createContext,
createEffect,
createRoot, createRoot,
createSignal, createSignal,
getOwner, getOwner,
onCleanup,
type Owner, type Owner,
type ParentProps, type ParentProps,
runWithOwner, runWithOwner,
@@ -34,6 +36,20 @@ function init() {
setActive(undefined) 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) => { const show = (element: DialogElement, owner: Owner, onClose?: () => void) => {
close() close()
@@ -41,13 +57,13 @@ function init() {
let dispose: (() => void) | undefined let dispose: (() => void) | undefined
const node = runWithOwner(owner, () => const node = runWithOwner(owner, () =>
createRoot((d) => { createRoot((d: () => void) => {
dispose = d dispose = d
return ( return (
<Kobalte <Kobalte
modal modal
open={true} open={true}
onOpenChange={(open) => { onOpenChange={(open: boolean) => {
if (open) return if (open) return
close() close()
}} }}