diff options
| author | Adam <[email protected]> | 2026-03-13 06:27:58 -0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-03-13 06:27:58 -0500 |
| commit | 270cb0b8b4265ac0965ac8b94a58a3bca86fa558 (patch) | |
| tree | 5a37c81bec1dea75b5c24f6aa8fb6a762d438f64 /packages/ui/src/components/popover.tsx | |
| parent | 46ba9c81703fc6e7db7e623a607eeaab94fcd00f (diff) | |
| download | opencode-270cb0b8b4265ac0965ac8b94a58a3bca86fa558.tar.gz opencode-270cb0b8b4265ac0965ac8b94a58a3bca86fa558.zip | |
chore: cleanup (#17284)
Diffstat (limited to 'packages/ui/src/components/popover.tsx')
| -rw-r--r-- | packages/ui/src/components/popover.tsx | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/packages/ui/src/components/popover.tsx b/packages/ui/src/components/popover.tsx index fe09a98a8..9d3da4109 100644 --- a/packages/ui/src/components/popover.tsx +++ b/packages/ui/src/components/popover.tsx @@ -5,11 +5,11 @@ import { ParentProps, Show, createEffect, - createSignal, onCleanup, splitProps, ValidComponent, } from "solid-js" +import { createStore } from "solid-js/store" import { useI18n } from "../context/i18n" import { IconButton } from "./icon-button" @@ -46,23 +46,24 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T> "modal", ]) - const [contentRef, setContentRef] = createSignal<HTMLElement | undefined>(undefined) - const [triggerRef, setTriggerRef] = createSignal<HTMLElement | undefined>(undefined) - const [dismiss, setDismiss] = createSignal<"escape" | "outside" | null>(null) - - const [uncontrolledOpen, setUncontrolledOpen] = createSignal<boolean>(local.defaultOpen ?? false) + const [state, setState] = createStore({ + contentRef: undefined as HTMLElement | undefined, + triggerRef: undefined as HTMLElement | undefined, + dismiss: null as "escape" | "outside" | null, + uncontrolledOpen: local.defaultOpen ?? false, + }) const controlled = () => local.open !== undefined const opened = () => { if (controlled()) return local.open ?? false - return uncontrolledOpen() + return state.uncontrolledOpen } const onOpenChange = (next: boolean) => { - if (next) setDismiss(null) + if (next) setState("dismiss", null) if (local.onOpenChange) local.onOpenChange(next) if (controlled()) return - setUncontrolledOpen(next) + setState("uncontrolledOpen", next) } createEffect(() => { @@ -70,15 +71,15 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T> const inside = (node: Node | null | undefined) => { if (!node) return false - const content = contentRef() + const content = state.contentRef if (content && content.contains(node)) return true - const trigger = triggerRef() + const trigger = state.triggerRef if (trigger && trigger.contains(node)) return true return false } const close = (reason: "escape" | "outside") => { - setDismiss(reason) + setState("dismiss", reason) onOpenChange(false) } @@ -116,7 +117,7 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T> const content = () => ( <Kobalte.Content - ref={(el: HTMLElement | undefined) => setContentRef(el)} + ref={(el: HTMLElement | undefined) => setState("contentRef", el)} data-component="popover-content" classList={{ ...(local.classList ?? {}), @@ -124,8 +125,8 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T> }} style={local.style} onCloseAutoFocus={(event: Event) => { - if (dismiss() === "outside") event.preventDefault() - setDismiss(null) + if (state.dismiss === "outside") event.preventDefault() + setState("dismiss", null) }} > {/* <Kobalte.Arrow data-slot="popover-arrow" /> */} @@ -151,7 +152,7 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T> return ( <Kobalte gutter={4} {...rest} open={opened()} onOpenChange={onOpenChange} modal={local.modal ?? false}> <Kobalte.Trigger - ref={(el: HTMLElement) => setTriggerRef(el)} + ref={(el: HTMLElement) => setState("triggerRef", el)} as={local.triggerAs ?? "div"} data-slot="popover-trigger" {...(local.triggerProps as any)} |
