summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/popover.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-13 06:27:58 -0500
committerGitHub <[email protected]>2026-03-13 06:27:58 -0500
commit270cb0b8b4265ac0965ac8b94a58a3bca86fa558 (patch)
tree5a37c81bec1dea75b5c24f6aa8fb6a762d438f64 /packages/ui/src/components/popover.tsx
parent46ba9c81703fc6e7db7e623a607eeaab94fcd00f (diff)
downloadopencode-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.tsx33
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)}