@@ -15,11 +15,12 @@ import {
1515 isRootElement ,
1616} from "../internal/dom.js" ;
1717import type { FloatingContext } from "./use-floating.svelte.js" ;
18- import type { FloatingTreeType } from "../types.js" ;
18+ import type { FloatingTreeType , MaybeGetter } from "../types.js" ;
1919import { useFloatingTree } from "../components/floating-tree/hooks.svelte.js" ;
2020import { getChildren } from "../internal/get-children.js" ;
2121import { on } from "svelte/events" ;
2222import { executeCallbacks } from "../internal/execute-callbacks.js" ;
23+ import { extract } from "../internal/extract.js" ;
2324
2425const bubbleHandlerKeys = {
2526 pointerdown : "onpointerdown" ,
@@ -54,27 +55,27 @@ interface UseDismissOptions {
5455 * handlers.
5556 * @default true
5657 */
57- enabled ?: boolean ;
58+ enabled ?: MaybeGetter < boolean > ;
5859 /**
5960 * Whether to dismiss the floating element upon pressing the `esc` key.
6061 * @default true
6162 */
62- escapeKey ?: boolean ;
63+ escapeKey ?: MaybeGetter < boolean > ;
6364 /**
6465 * Whether to dismiss the floating element upon pressing the reference
6566 * element. You likely want to ensure the `move` option in the `useHover()`
6667 * Hook has been disabled when this is in use.
6768 * @default false
6869 */
69- referencePress ?: boolean ;
70+ referencePress ?: MaybeGetter < boolean > ;
7071 /**
7172 * The type of event to use to determine a “press”.
7273 * - `pointerdown` is eager on both mouse + touch input.
7374 * - `mousedown` is eager on mouse input, but lazy on touch input.
7475 * - `click` is lazy on both mouse + touch input.
7576 * @default 'pointerdown'
7677 */
77- referencePressEvent ?: "pointerdown" | "mousedown" | "click" ;
78+ referencePressEvent ?: MaybeGetter < "pointerdown" | "mousedown" | "click" > ;
7879 /**
7980 * Whether to dismiss the floating element upon pressing outside of the
8081 * floating element.
@@ -96,38 +97,46 @@ interface UseDismissOptions {
9697 * - `click` is lazy on both mouse + touch input.
9798 * @default 'pointerdown'
9899 */
99- outsidePressEvent ?: "pointerdown" | "mousedown" | "click" ;
100+ outsidePressEvent ?: MaybeGetter < "pointerdown" | "mousedown" | "click" > ;
100101 /**
101102 * Whether to dismiss the floating element upon scrolling an overflow
102103 * ancestor.
103104 * @default false
104105 */
105- ancestorScroll ?: boolean ;
106+ ancestorScroll ?: MaybeGetter < boolean > ;
106107 /**
107108 * Determines whether event listeners bubble upwards through a tree of
108109 * floating elements.
109110 */
110- bubbles ?: boolean | { escapeKey ?: boolean ; outsidePress ?: boolean } ;
111+ bubbles ?: MaybeGetter <
112+ boolean | { escapeKey ?: boolean ; outsidePress ?: boolean }
113+ > ;
111114 /**
112115 * Determines whether to use capture phase event listeners.
113116 */
114- capture ?: boolean | { escapeKey ?: boolean ; outsidePress ?: boolean } ;
117+ capture ?: MaybeGetter <
118+ boolean | { escapeKey ?: boolean ; outsidePress ?: boolean }
119+ > ;
115120}
116121
117122class DismissInteraction {
118- #enabled = $derived . by ( ( ) => this . options . enabled ?? true ) ;
119- #escapeKey = $derived . by ( ( ) => this . options . escapeKey ?? true ) ;
123+ #enabled = $derived . by ( ( ) => extract ( this . options . enabled , true ) ) ;
124+ #escapeKey = $derived . by ( ( ) => extract ( this . options . escapeKey , true ) ) ;
120125 #unstable_outsidePress = $derived . by ( ( ) => this . options . outsidePress ?? true ) ;
121- #outsidePressEvent = $derived . by (
122- ( ) => this . options . outsidePressEvent ?? "pointerdown" ,
126+ #outsidePressEvent = $derived . by ( ( ) =>
127+ extract ( this . options . outsidePressEvent , "pointerdown" ) ,
123128 ) ;
124- #referencePress = $derived . by ( ( ) => this . options . referencePress ?? false ) ;
125- #referencePressEvent = $derived . by (
126- ( ) => this . options . referencePressEvent ?? "pointerdown" ,
129+ #referencePress = $derived . by ( ( ) =>
130+ extract ( this . options . referencePress , false ) ,
127131 ) ;
128- #ancestorScroll = $derived . by ( ( ) => this . options . ancestorScroll ?? false ) ;
129- #bubbles = $derived . by ( ( ) => this . options . bubbles ) ;
130- #capture = $derived . by ( ( ) => this . options . capture ) ;
132+ #referencePressEvent = $derived . by ( ( ) =>
133+ extract ( this . options . referencePressEvent , "pointerdown" ) ,
134+ ) ;
135+ #ancestorScroll = $derived . by ( ( ) =>
136+ extract ( this . options . ancestorScroll , false ) ,
137+ ) ;
138+ #bubbles = $derived . by ( ( ) => extract ( this . options . bubbles ) ) ;
139+ #capture = $derived . by ( ( ) => extract ( this . options . capture ) ) ;
131140
132141 #outsidePressFn = $derived . by ( ( ) =>
133142 typeof this . #unstable_outsidePress === "function"
@@ -184,7 +193,7 @@ class DismissInteraction {
184193 ) ;
185194 } ;
186195
187- const doc = getDocument ( this . context . elements . floating ) ;
196+ const doc = getDocument ( this . context . floating ) ;
188197
189198 const listenersToRemove : Array < ( ) => void > = [ ] ;
190199
@@ -217,25 +226,23 @@ class DismissInteraction {
217226 let ancestors : ( Element | Window | VisualViewport ) [ ] = [ ] ;
218227
219228 if ( this . #ancestorScroll) {
220- if ( isElement ( this . context . elements . domReference ) ) {
221- ancestors = getOverflowAncestors ( this . context . elements . domReference ) ;
229+ if ( isElement ( this . context . domReference ) ) {
230+ ancestors = getOverflowAncestors ( this . context . domReference ) ;
222231 }
223232
224- if ( isElement ( this . context . elements . floating ) ) {
233+ if ( isElement ( this . context . floating ) ) {
225234 ancestors = ancestors . concat (
226- getOverflowAncestors ( this . context . elements . floating ) ,
235+ getOverflowAncestors ( this . context . floating ) ,
227236 ) ;
228237 }
229238
230239 if (
231- ! isElement ( this . context . elements . reference ) &&
232- this . context . elements . reference &&
233- this . context . elements . reference . contextElement
240+ ! isElement ( this . context . reference ) &&
241+ this . context . reference &&
242+ this . context . reference . contextElement
234243 ) {
235244 ancestors = ancestors . concat (
236- getOverflowAncestors (
237- this . context . elements . reference . contextElement ,
238- ) ,
245+ getOverflowAncestors ( this . context . reference . contextElement ) ,
239246 ) ;
240247 }
241248 }
@@ -335,9 +342,9 @@ class DismissInteraction {
335342
336343 const target = getTarget ( event ) ;
337344 const inertSelector = `[${ createAttribute ( "inert" ) } ]` ;
338- const markers = getDocument (
339- this . context . elements . floating ,
340- ) . querySelectorAll ( inertSelector ) ;
345+ const markers = getDocument ( this . context . floating ) . querySelectorAll (
346+ inertSelector ,
347+ ) ;
341348
342349 let targetRootAncestor = isElement ( target ) ? target : null ;
343350
@@ -355,7 +362,7 @@ class DismissInteraction {
355362 isElement ( target ) &&
356363 ! isRootElement ( target ) &&
357364 // Clicked on a direct ancestor (e.g. FloatingOverlay).
358- ! contains ( target , this . context . elements . floating ) &&
365+ ! contains ( target , this . context . floating ) &&
359366 // If the target root element contains none of the markers, then the
360367 // element was injected after the floating element rendered.
361368 Array . from ( markers ) . every (
@@ -412,12 +419,12 @@ class DismissInteraction {
412419 const targetIsInsideChildren =
413420 children . length &&
414421 children . some ( ( node ) =>
415- isEventTargetWithin ( event , node . context ?. elements . floating ) ,
422+ isEventTargetWithin ( event , node . context ?. floating ) ,
416423 ) ;
417424
418425 if (
419- isEventTargetWithin ( event , this . context . elements . floating ) ||
420- isEventTargetWithin ( event , this . context . elements . domReference ) ||
426+ isEventTargetWithin ( event , this . context . floating ) ||
427+ isEventTargetWithin ( event , this . context . domReference ) ||
421428 targetIsInsideChildren
422429 ) {
423430 return ;
0 commit comments