@@ -5,11 +5,11 @@ import {
55 ParentProps ,
66 Show ,
77 createEffect ,
8- createSignal ,
98 onCleanup ,
109 splitProps ,
1110 ValidComponent ,
1211} from "solid-js"
12+ import { createStore } from "solid-js/store"
1313import { useI18n } from "../context/i18n"
1414import { IconButton } from "./icon-button"
1515
@@ -46,39 +46,40 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T>
4646 "modal" ,
4747 ] )
4848
49- const [ contentRef , setContentRef ] = createSignal < HTMLElement | undefined > ( undefined )
50- const [ triggerRef , setTriggerRef ] = createSignal < HTMLElement | undefined > ( undefined )
51- const [ dismiss , setDismiss ] = createSignal < "escape" | "outside" | null > ( null )
52-
53- const [ uncontrolledOpen , setUncontrolledOpen ] = createSignal < boolean > ( local . defaultOpen ?? false )
49+ const [ state , setState ] = createStore ( {
50+ contentRef : undefined as HTMLElement | undefined ,
51+ triggerRef : undefined as HTMLElement | undefined ,
52+ dismiss : null as "escape" | "outside" | null ,
53+ uncontrolledOpen : local . defaultOpen ?? false ,
54+ } )
5455
5556 const controlled = ( ) => local . open !== undefined
5657 const opened = ( ) => {
5758 if ( controlled ( ) ) return local . open ?? false
58- return uncontrolledOpen ( )
59+ return state . uncontrolledOpen
5960 }
6061
6162 const onOpenChange = ( next : boolean ) => {
62- if ( next ) setDismiss ( null )
63+ if ( next ) setState ( "dismiss" , null )
6364 if ( local . onOpenChange ) local . onOpenChange ( next )
6465 if ( controlled ( ) ) return
65- setUncontrolledOpen ( next )
66+ setState ( "uncontrolledOpen" , next )
6667 }
6768
6869 createEffect ( ( ) => {
6970 if ( ! opened ( ) ) return
7071
7172 const inside = ( node : Node | null | undefined ) => {
7273 if ( ! node ) return false
73- const content = contentRef ( )
74+ const content = state . contentRef
7475 if ( content && content . contains ( node ) ) return true
75- const trigger = triggerRef ( )
76+ const trigger = state . triggerRef
7677 if ( trigger && trigger . contains ( node ) ) return true
7778 return false
7879 }
7980
8081 const close = ( reason : "escape" | "outside" ) => {
81- setDismiss ( reason )
82+ setState ( "dismiss" , reason )
8283 onOpenChange ( false )
8384 }
8485
@@ -116,16 +117,16 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T>
116117
117118 const content = ( ) => (
118119 < Kobalte . Content
119- ref = { ( el : HTMLElement | undefined ) => setContentRef ( el ) }
120+ ref = { ( el : HTMLElement | undefined ) => setState ( "contentRef" , el ) }
120121 data-component = "popover-content"
121122 classList = { {
122123 ...( local . classList ?? { } ) ,
123124 [ local . class ?? "" ] : ! ! local . class ,
124125 } }
125126 style = { local . style }
126127 onCloseAutoFocus = { ( event : Event ) => {
127- if ( dismiss ( ) === "outside" ) event . preventDefault ( )
128- setDismiss ( null )
128+ if ( state . dismiss === "outside" ) event . preventDefault ( )
129+ setState ( "dismiss" , null )
129130 } }
130131 >
131132 { /* <Kobalte.Arrow data-slot="popover-arrow" /> */ }
@@ -151,7 +152,7 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T>
151152 return (
152153 < Kobalte gutter = { 4 } { ...rest } open = { opened ( ) } onOpenChange = { onOpenChange } modal = { local . modal ?? false } >
153154 < Kobalte . Trigger
154- ref = { ( el : HTMLElement ) => setTriggerRef ( el ) }
155+ ref = { ( el : HTMLElement ) => setState ( "triggerRef" , el ) }
155156 as = { local . triggerAs ?? "div" }
156157 data-slot = "popover-trigger"
157158 { ...( local . triggerProps as any ) }
0 commit comments