summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/context
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-25 12:16:31 -0600
committeradamelmore <[email protected]>2026-01-25 12:17:35 -0600
commit14b00f64a7e4e834653068fe8f9f9f7cbdbde018 (patch)
tree80e92b10fa094f6855067b0a10003373619e0069 /packages/ui/src/context
parentfc57c074aea2838a7c36210ac853546179744a26 (diff)
downloadopencode-14b00f64a7e4e834653068fe8f9f9f7cbdbde018.tar.gz
opencode-14b00f64a7e4e834653068fe8f9f9f7cbdbde018.zip
fix(app): escape should always close dialogs
Diffstat (limited to 'packages/ui/src/context')
-rw-r--r--packages/ui/src/context/dialog.tsx20
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()
}}