ropav 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/README.md +6 -0
  2. package/dist/accordion.css +17 -17
  3. package/dist/accordion.js +123 -155
  4. package/dist/alert.css +18 -18
  5. package/dist/alert.js +10 -11
  6. package/dist/aria.js +14 -0
  7. package/dist/aspect-ratio.js +1 -1
  8. package/dist/attributes.js +9 -0
  9. package/dist/attributes2.js +29 -0
  10. package/dist/avatar.css +19 -19
  11. package/dist/avatar.js +9 -17
  12. package/dist/badge.css +16 -16
  13. package/dist/badge.js +5 -5
  14. package/dist/button-group.js +1 -1
  15. package/dist/button-link.js +4 -3
  16. package/dist/button.js +4 -3
  17. package/dist/button.scss_vue_type_style_index_0_src_true_lang.js +1 -1
  18. package/dist/card.js +1 -1
  19. package/dist/checkbox.css +32 -32
  20. package/dist/checkbox.js +22 -28
  21. package/dist/collapse.css +6 -6
  22. package/dist/collapse.js +7 -6
  23. package/dist/collectionNavigation.js +2 -99
  24. package/dist/color-input.css +19 -19
  25. package/dist/color-input.js +14 -13
  26. package/dist/color-picker.css +40 -40
  27. package/dist/color-picker.js +221 -200
  28. package/dist/color-picker2.js +1 -9
  29. package/dist/color-swatch.css +4 -4
  30. package/dist/color-swatch.js +6 -8
  31. package/dist/color.js +5 -10
  32. package/dist/componentColors.js +125 -84
  33. package/dist/componentRef.js +26 -0
  34. package/dist/components/accordion/accordionContext.d.ts +3 -0
  35. package/dist/components/accordion/accordionModel.d.ts +14 -0
  36. package/dist/components/accordion/index.d.ts +2 -1
  37. package/dist/components/accordion/index.js +1 -1
  38. package/dist/components/accordion/types.d.ts +1 -2
  39. package/dist/components/accordion/useAccordion.d.ts +2 -2
  40. package/dist/components/accordion/useAccordionItem.d.ts +2 -0
  41. package/dist/components/checkbox/useCheckbox.d.ts +1 -2
  42. package/dist/components/color-picker/index.js +2 -2
  43. package/dist/components/color-picker/types.d.ts +2 -2
  44. package/dist/components/color-picker/useColorPickerSaturation.d.ts +22 -0
  45. package/dist/components/color-picker/useColorPickerSlider.d.ts +20 -0
  46. package/dist/components/color-picker/useColorPickerValue.d.ts +1 -1
  47. package/dist/components/dialog/{dialog-core.d.ts → dialogContext.d.ts} +1 -5
  48. package/dist/components/dialog/useDialogContentInteractions.d.ts +18 -0
  49. package/dist/components/dialog/useDialogRootState.d.ts +19 -0
  50. package/dist/components/dropdown-menu/dropdown-menu-item-row.d.ts +1 -1
  51. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +1 -1
  52. package/dist/components/dropdown-menu/dropdown-menu-model.d.ts +8 -0
  53. package/dist/components/dropdown-menu/dropdown-menu-root.d.ts +2 -2
  54. package/dist/components/dropdown-menu/dropdown-menu-sub-trigger.d.ts +1 -1
  55. package/dist/components/dropdown-menu/dropdown-menu-sub.d.ts +1 -1
  56. package/dist/components/dropdown-menu/{dropdown-menu-primitive-core.d.ts → dropdownMenuContext.d.ts} +16 -18
  57. package/dist/components/dropdown-menu/dropdownMenuDataModel.d.ts +20 -0
  58. package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -0
  59. package/dist/components/dropdown-menu/dropdownMenuInteractionNavigation.d.ts +24 -0
  60. package/dist/components/dropdown-menu/dropdownMenuInteractionRegistry.d.ts +42 -0
  61. package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +85 -0
  62. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +11 -11
  63. package/dist/components/dropdown-menu/useDropdownMenuContextTrigger.d.ts +9 -0
  64. package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +34 -0
  65. package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +22 -0
  66. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +6 -5
  67. package/dist/components/dropdown-menu/useDropdownMenuInteractionDismissal.d.ts +17 -0
  68. package/dist/components/dropdown-menu/useDropdownMenuInteractionKeyboard.d.ts +19 -0
  69. package/dist/components/dropdown-menu/useDropdownMenuPortalPosition.d.ts +0 -1
  70. package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +29 -0
  71. package/dist/components/dropdown-menu/useDropdownMenuPrimitiveContent.d.ts +2 -2
  72. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +1 -1
  73. package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +19 -0
  74. package/dist/components/floating/hoverDisclosureInteractionModel.d.ts +42 -0
  75. package/dist/components/floating/index.js +1 -1
  76. package/dist/components/floating/useFloatingPosition.d.ts +0 -1
  77. package/dist/components/floating/useHoverDisclosureInteractions.d.ts +32 -0
  78. package/dist/components/floating/useHoverDisclosureOpenState.d.ts +25 -0
  79. package/dist/components/floating/useHoverDisclosureTargetBinding.d.ts +27 -0
  80. package/dist/components/number-input/numberInputModel.d.ts +15 -0
  81. package/dist/components/number-input/useNumberInput.d.ts +3 -17
  82. package/dist/components/pagination/index.d.ts +1 -1
  83. package/dist/components/pagination/index.js +1 -1
  84. package/dist/components/pagination/paginationModel.d.ts +4 -0
  85. package/dist/components/pagination/types.d.ts +15 -0
  86. package/dist/components/pagination/usePagination.d.ts +3 -19
  87. package/dist/components/popover/usePopoverBindings.d.ts +16 -0
  88. package/dist/components/progress/progressModel.d.ts +8 -0
  89. package/dist/components/progress/useProgress.d.ts +0 -6
  90. package/dist/components/radio/useRadio.d.ts +1 -2
  91. package/dist/components/scroll-area/scroll-area.d.ts +1 -1
  92. package/dist/components/scroll-area/scrollAreaModel.d.ts +64 -0
  93. package/dist/components/scroll-area/useScrollArea.d.ts +70 -53
  94. package/dist/components/scroll-area/{useScrollAreaPresentation.d.ts → useScrollAreaAttributes.d.ts} +37 -17
  95. package/dist/components/scroll-area/useScrollAreaDerivedState.d.ts +8 -0
  96. package/dist/components/scroll-area/useScrollAreaMeasurement.d.ts +35 -0
  97. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +10 -8
  98. package/dist/components/scroll-area/useScrollAreaVisibility.d.ts +15 -20
  99. package/dist/components/slider/rangeSliderModel.d.ts +41 -0
  100. package/dist/components/slider/{sliderCore.d.ts → sliderModel.d.ts} +0 -1
  101. package/dist/components/slider/useRangeSlider.d.ts +8 -16
  102. package/dist/components/slider/useRangeSliderValueState.d.ts +40 -0
  103. package/dist/components/slider/useSlider.d.ts +7 -13
  104. package/dist/components/slider/useSliderPointerPreview.d.ts +22 -0
  105. package/dist/components/slider/useSliderTooltipState.d.ts +40 -0
  106. package/dist/components/slider/useSliderValueState.d.ts +33 -0
  107. package/dist/components/teleport-provider/index.js +1 -1
  108. package/dist/components/teleport-provider/useTeleportTarget.d.ts +1 -2
  109. package/dist/components/toast/useToastLifecycle.d.ts +19 -0
  110. package/dist/components/tooltip/useTooltip.d.ts +1 -2
  111. package/dist/css.js +12 -0
  112. package/dist/dialog.js +226 -218
  113. package/dist/dropdown-menu.js +1458 -1097
  114. package/dist/events.js +59 -0
  115. package/dist/field.css +8 -8
  116. package/dist/field.js +13 -25
  117. package/dist/floating.js +548 -319
  118. package/dist/floatingOffset.js +11 -0
  119. package/dist/focus-trap.js +7 -5
  120. package/dist/focusNavigation.js +37 -0
  121. package/dist/icon-button.css +8 -8
  122. package/dist/icon-button.js +7 -6
  123. package/dist/index.js +6 -6
  124. package/dist/input.css +24 -24
  125. package/dist/input.js +19 -31
  126. package/dist/interactive.js +18 -0
  127. package/dist/modal.js +1 -1
  128. package/dist/number-input.css +18 -18
  129. package/dist/number-input.js +14 -12
  130. package/dist/number.js +22 -0
  131. package/dist/overlay.js +3 -2
  132. package/dist/pagination.css +28 -28
  133. package/dist/pagination.js +65 -63
  134. package/dist/pointer.js +9 -0
  135. package/dist/popover.css +34 -34
  136. package/dist/popover.js +85 -86
  137. package/dist/progress.js +10 -13
  138. package/dist/query.js +40 -0
  139. package/dist/radio.css +18 -18
  140. package/dist/radio.js +30 -36
  141. package/dist/rafScheduler.js +34 -0
  142. package/dist/scroll-area.css +28 -28
  143. package/dist/scroll-area.js +512 -516
  144. package/dist/select.css +45 -45
  145. package/dist/select.js +36 -44
  146. package/dist/slider.css +191 -191
  147. package/dist/slider.js +691 -618
  148. package/dist/styles-api.d.ts +0 -1
  149. package/dist/styles-api.js +1 -4
  150. package/dist/switch.css +17 -17
  151. package/dist/switch.js +14 -15
  152. package/dist/tabs.css +43 -43
  153. package/dist/tabs.js +29 -56
  154. package/dist/text.js +17 -0
  155. package/dist/textarea.css +26 -26
  156. package/dist/textarea.js +21 -32
  157. package/dist/toast.css +26 -26
  158. package/dist/toast.js +141 -118
  159. package/dist/tooltip.css +12 -12
  160. package/dist/tooltip.js +36 -40
  161. package/dist/useCollapse.js +8 -11
  162. package/dist/useControlState.js +3 -6
  163. package/dist/useFloatingPosition.js +140 -10
  164. package/dist/useOverlayZIndex.js +1 -5
  165. package/dist/useTeleportTarget.js +3 -14
  166. package/dist/useTypeahead.js +94 -0
  167. package/dist/utils/aria.d.ts +3 -0
  168. package/dist/utils/attributes.d.ts +2 -0
  169. package/dist/utils/bem.d.ts +3 -0
  170. package/dist/utils/collectionNavigation.d.ts +2 -0
  171. package/dist/utils/color.d.ts +7 -0
  172. package/dist/{components/color-picker/color-picker-utils.d.ts → utils/colorPicker.d.ts} +5 -4
  173. package/dist/utils/componentColors.d.ts +7 -0
  174. package/dist/utils/css.d.ts +3 -0
  175. package/dist/utils/dom/ancestry.d.ts +7 -0
  176. package/dist/utils/dom/attributes.d.ts +16 -0
  177. package/dist/utils/dom/componentRef.d.ts +4 -0
  178. package/dist/utils/dom/events.d.ts +5 -0
  179. package/dist/utils/dom/focusNavigation.d.ts +7 -0
  180. package/dist/utils/dom/interactive.d.ts +2 -0
  181. package/dist/utils/dom/pointer.d.ts +2 -0
  182. package/dist/utils/dom/query.d.ts +4 -0
  183. package/dist/utils/dom/scroll.d.ts +23 -0
  184. package/dist/utils/floatingOffset.d.ts +10 -0
  185. package/dist/utils/geometry.d.ts +14 -0
  186. package/dist/utils/indexPath.d.ts +6 -0
  187. package/dist/utils/number.d.ts +4 -0
  188. package/dist/utils/rafScheduler.d.ts +4 -0
  189. package/dist/utils/text.d.ts +2 -0
  190. package/docs/code-architecture.md +118 -0
  191. package/docs/public-floating-api.md +6 -5
  192. package/package.json +13 -12
  193. package/dist/components/dropdown-menu/dropdown-menu-outside.d.ts +0 -3
  194. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +0 -21
  195. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +0 -36
  196. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +0 -29
  197. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +0 -52
  198. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +0 -17
  199. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +0 -18
  200. package/dist/components/scroll-area/scrollAreaCore.d.ts +0 -30
  201. package/dist/components/scroll-area/useScrollAreaControls.d.ts +0 -25
  202. package/dist/components/scroll-area/useScrollAreaMetrics.d.ts +0 -38
  203. /package/dist/components/alert/{useAlertColor.d.ts → alertColor.d.ts} +0 -0
  204. /package/dist/components/avatar/{useAvatarColor.d.ts → avatarColor.d.ts} +0 -0
  205. /package/dist/components/badge/{useBadgeColor.d.ts → badgeColor.d.ts} +0 -0
  206. /package/dist/components/button/{useButtonColor.d.ts → buttonColor.d.ts} +0 -0
  207. /package/dist/components/color-swatch/{useColorSwatchColor.d.ts → colorSwatchColor.d.ts} +0 -0
  208. /package/dist/components/toast/{useToastColor.d.ts → toastColor.d.ts} +0 -0
package/dist/floating.js CHANGED
@@ -1,44 +1,354 @@
1
1
  import { t as useControllableValue } from "./useControllableValue.js";
2
+ import { i as querySelectorSafe, t as isElement } from "./query.js";
3
+ import { r as normalizeDelay } from "./number.js";
4
+ import { i as isNodeWithinElement, r as isEventWithinTargets } from "./events.js";
2
5
  import { computed, onBeforeUnmount, onMounted, shallowRef, toValue, watch } from "vue";
3
- //#region src/components/floating/useHoverDisclosure.ts
4
- var DEFAULT_OPEN_DELAY = 0;
5
- var DEFAULT_CLOSE_DELAY = 0;
6
- function isElement(value) {
7
- return typeof Element !== "undefined" && value instanceof Element;
6
+ //#region src/components/floating/hoverDisclosureInteractionModel.ts
7
+ function createHoverDisclosureInteractionModel() {
8
+ let state = createInteractionState();
9
+ return {
10
+ read: () => state,
11
+ send(action) {
12
+ state = reduceHoverDisclosureInteraction(state, action);
13
+ return state;
14
+ }
15
+ };
16
+ }
17
+ function hasActiveHoverDisclosureInteraction(state) {
18
+ return state.triggerHovered || state.contentHovered || state.triggerFocused || state.contentFocused || state.touchPinned;
8
19
  }
9
- function resolveSelector(selector) {
10
- if (typeof document === "undefined") return null;
11
- try {
12
- return document.querySelector(selector);
13
- } catch {
14
- return null;
20
+ function reduceHoverDisclosureInteraction(state, action) {
21
+ switch (action.type) {
22
+ case "hover": return setPartInteraction(state, action.part, "hover", action.active);
23
+ case "focus": return setPartInteraction(state, action.part, "focus", action.active);
24
+ case "pointer-down": return {
25
+ ...state,
26
+ touchClickPending: false,
27
+ touchPointerActive: action.touch
28
+ };
29
+ case "pointer-up": return {
30
+ ...state,
31
+ touchClickPending: action.touch && state.touchPointerActive,
32
+ touchPointerActive: false
33
+ };
34
+ case "pointer-cancel": return {
35
+ ...state,
36
+ touchClickPending: false,
37
+ touchPointerActive: false
38
+ };
39
+ case "consume-touch-click": return {
40
+ ...state,
41
+ touchClickPending: false
42
+ };
43
+ case "set-touch-pinned": return {
44
+ ...state,
45
+ touchPinned: action.pinned
46
+ };
47
+ case "reset": return resetInteraction(state, action.part);
15
48
  }
16
49
  }
17
- function resolveInteractionTarget(target) {
18
- if (!target) return null;
19
- if (typeof target === "string") return resolveSelector(target);
20
- if (isElement(target)) return target;
21
- return isElement(target.contextElement) ? target.contextElement : null;
50
+ function createInteractionState() {
51
+ return {
52
+ contentFocused: false,
53
+ contentHovered: false,
54
+ touchClickPending: false,
55
+ touchPinned: false,
56
+ touchPointerActive: false,
57
+ triggerFocused: false,
58
+ triggerHovered: false
59
+ };
22
60
  }
23
- function resolveContentTarget(target) {
24
- if (!target) return null;
25
- return typeof target === "string" ? resolveSelector(target) : isElement(target) ? target : null;
61
+ function setPartInteraction(state, part, interaction, active) {
62
+ if (part === "trigger" && interaction === "hover") return {
63
+ ...state,
64
+ triggerHovered: active
65
+ };
66
+ if (part === "trigger") return {
67
+ ...state,
68
+ triggerFocused: active
69
+ };
70
+ if (interaction === "hover") return {
71
+ ...state,
72
+ contentHovered: active
73
+ };
74
+ return {
75
+ ...state,
76
+ contentFocused: active
77
+ };
26
78
  }
27
- function readDelay(value, fallback) {
28
- if (value == null) return fallback;
29
- return Number.isFinite(value) ? Math.max(0, value) : fallback;
79
+ function resetInteraction(state, part) {
80
+ if (part === "all") return createInteractionState();
81
+ if (part === "trigger") return {
82
+ ...state,
83
+ triggerFocused: false,
84
+ triggerHovered: false
85
+ };
86
+ return {
87
+ ...state,
88
+ contentFocused: false,
89
+ contentHovered: false
90
+ };
30
91
  }
31
- function eventElement(event) {
32
- return isElement(event.currentTarget) ? event.currentTarget : null;
92
+ //#endregion
93
+ //#region src/components/floating/useHoverDisclosureInteractions.ts
94
+ function useHoverDisclosureInteractions({ commands, interaction, options, state, targets }) {
95
+ function rememberTarget(part, event) {
96
+ const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
97
+ if (part === "trigger") {
98
+ targets.triggerElement = currentTarget ?? targets.resolvedInteractionTarget.value ?? targets.triggerElement;
99
+ return;
100
+ }
101
+ targets.contentElement = currentTarget ?? targets.resolvedContentTarget.value ?? targets.contentElement;
102
+ }
103
+ function onTriggerPointerenter(event) {
104
+ rememberTarget("trigger", event);
105
+ if (event.pointerType === "touch" || commands.isDisabled.value) return;
106
+ interaction.send({
107
+ type: "hover",
108
+ part: "trigger",
109
+ active: true
110
+ });
111
+ requestOpen("hover", event, "delayed");
112
+ }
113
+ function onTriggerPointerleave(event) {
114
+ rememberTarget("trigger", event);
115
+ if (event.pointerType === "touch") return;
116
+ interaction.send({
117
+ type: "hover",
118
+ part: "trigger",
119
+ active: false
120
+ });
121
+ requestClose("hover", event, "delayed");
122
+ }
123
+ function onContentPointerenter(event) {
124
+ rememberTarget("content", event);
125
+ if (event.pointerType === "touch" || commands.isDisabled.value) return;
126
+ interaction.send({
127
+ type: "hover",
128
+ part: "content",
129
+ active: true
130
+ });
131
+ commands.cancelScheduledClose();
132
+ }
133
+ function onContentPointerleave(event) {
134
+ rememberTarget("content", event);
135
+ if (event.pointerType === "touch") return;
136
+ interaction.send({
137
+ type: "hover",
138
+ part: "content",
139
+ active: false
140
+ });
141
+ requestClose("hover", event, "delayed");
142
+ }
143
+ function onTriggerFocusin(event) {
144
+ rememberTarget("trigger", event);
145
+ if (commands.isDisabled.value || toValue(options.openOnFocus) === false) return;
146
+ interaction.send({
147
+ type: "focus",
148
+ part: "trigger",
149
+ active: true
150
+ });
151
+ requestOpen("focus", event, "immediate");
152
+ }
153
+ function onTriggerFocusout(event) {
154
+ rememberTarget("trigger", event);
155
+ if (!focusLeavesCurrentTarget(event)) return;
156
+ interaction.send({
157
+ type: "focus",
158
+ part: "trigger",
159
+ active: false
160
+ });
161
+ requestClose("focus", event, "delayed");
162
+ }
163
+ function onContentFocusin(event) {
164
+ rememberTarget("content", event);
165
+ if (commands.isDisabled.value) return;
166
+ interaction.send({
167
+ type: "focus",
168
+ part: "content",
169
+ active: true
170
+ });
171
+ commands.cancelScheduledClose();
172
+ }
173
+ function onContentFocusout(event) {
174
+ rememberTarget("content", event);
175
+ if (!focusLeavesCurrentTarget(event)) return;
176
+ interaction.send({
177
+ type: "focus",
178
+ part: "content",
179
+ active: false
180
+ });
181
+ requestClose("focus", event, "delayed");
182
+ }
183
+ function onTriggerPointerdown(event) {
184
+ rememberTarget("trigger", event);
185
+ interaction.send({
186
+ type: "pointer-down",
187
+ touch: event.pointerType === "touch"
188
+ });
189
+ }
190
+ function onTriggerPointerup(event) {
191
+ rememberTarget("trigger", event);
192
+ interaction.send({
193
+ type: "pointer-up",
194
+ touch: event.pointerType === "touch"
195
+ });
196
+ }
197
+ function onTriggerPointercancel(event) {
198
+ rememberTarget("trigger", event);
199
+ interaction.send({ type: "pointer-cancel" });
200
+ }
201
+ function onTriggerClick(event) {
202
+ rememberTarget("trigger", event);
203
+ const interactionState = interaction.read();
204
+ if (!interactionState.touchClickPending) return;
205
+ interaction.send({ type: "consume-touch-click" });
206
+ if (getTouchBehavior() !== "toggle" || commands.isDisabled.value) return;
207
+ event.preventDefault();
208
+ if (interactionState.touchPinned || commands.isRequestedOpen()) {
209
+ interaction.send({
210
+ type: "set-touch-pinned",
211
+ pinned: false
212
+ });
213
+ requestClose("touch", event, "immediate");
214
+ return;
215
+ }
216
+ interaction.send({
217
+ type: "set-touch-pinned",
218
+ pinned: true
219
+ });
220
+ requestOpen("touch", event, "immediate");
221
+ }
222
+ function onContentPointerdown(event) {
223
+ rememberTarget("content", event);
224
+ }
225
+ function onKeydown(event) {
226
+ if (event.key !== "Escape" || toValue(options.closeOnEscape) === false || !commands.isOpen.value) return;
227
+ interaction.send({
228
+ type: "set-touch-pinned",
229
+ pinned: false
230
+ });
231
+ requestClose("escape", event, "immediate");
232
+ }
233
+ function onOutsidePointerdown(event) {
234
+ if (!interaction.read().touchPinned) return;
235
+ interaction.send({
236
+ type: "set-touch-pinned",
237
+ pinned: false
238
+ });
239
+ requestClose("outside", event, "immediate");
240
+ }
241
+ function onTargetDetached(part) {
242
+ interaction.send({
243
+ type: "reset",
244
+ part
245
+ });
246
+ requestClose("hover", void 0, "delayed");
247
+ }
248
+ function requestOpen(reason, event, timing) {
249
+ commands.request({
250
+ event,
251
+ open: true,
252
+ reason,
253
+ timing
254
+ });
255
+ }
256
+ function requestClose(reason, event, timing) {
257
+ commands.request({
258
+ event,
259
+ open: false,
260
+ reason,
261
+ timing
262
+ });
263
+ }
264
+ function getTouchBehavior() {
265
+ return toValue(options.touchBehavior) ?? "none";
266
+ }
267
+ const presentation = createInteractionPresentation(state, {
268
+ content: {
269
+ onFocusin: onContentFocusin,
270
+ onFocusout: onContentFocusout,
271
+ onKeydown,
272
+ onPointerdown: onContentPointerdown,
273
+ onPointerenter: onContentPointerenter,
274
+ onPointerleave: onContentPointerleave
275
+ },
276
+ trigger: {
277
+ onClick: onTriggerClick,
278
+ onFocusin: onTriggerFocusin,
279
+ onFocusout: onTriggerFocusout,
280
+ onKeydown,
281
+ onPointercancel: onTriggerPointercancel,
282
+ onPointerdown: onTriggerPointerdown,
283
+ onPointerenter: onTriggerPointerenter,
284
+ onPointerleave: onTriggerPointerleave,
285
+ onPointerup: onTriggerPointerup
286
+ }
287
+ });
288
+ watch(() => getTouchBehavior(), (behavior) => {
289
+ if (behavior === "toggle" || !interaction.read().touchPinned) return;
290
+ interaction.send({
291
+ type: "set-touch-pinned",
292
+ pinned: false
293
+ });
294
+ requestClose("touch", void 0, "immediate");
295
+ });
296
+ return {
297
+ bindingAdapter: {
298
+ contentListeners: presentation.contentListeners,
299
+ isOutsideDismissalActive: () => interaction.read().touchPinned,
300
+ onDocumentKeydown: onKeydown,
301
+ onOutsidePointerdown,
302
+ onTargetDetached,
303
+ triggerListeners: presentation.triggerListeners
304
+ },
305
+ contentProps: presentation.contentProps,
306
+ triggerProps: presentation.triggerProps
307
+ };
308
+ }
309
+ function createInteractionPresentation(state, handlers) {
310
+ const triggerProps = computed(() => ({
311
+ "data-state": state.value,
312
+ ...handlers.trigger
313
+ }));
314
+ const contentProps = computed(() => ({
315
+ "data-state": state.value,
316
+ ...handlers.content
317
+ }));
318
+ const triggerListeners = [
319
+ ["pointerenter", handlers.trigger.onPointerenter],
320
+ ["pointerleave", handlers.trigger.onPointerleave],
321
+ ["pointerdown", handlers.trigger.onPointerdown],
322
+ ["pointerup", handlers.trigger.onPointerup],
323
+ ["pointercancel", handlers.trigger.onPointercancel],
324
+ ["click", handlers.trigger.onClick],
325
+ ["focusin", handlers.trigger.onFocusin],
326
+ ["focusout", handlers.trigger.onFocusout],
327
+ ["keydown", handlers.trigger.onKeydown]
328
+ ];
329
+ return {
330
+ contentListeners: [
331
+ ["pointerenter", handlers.content.onPointerenter],
332
+ ["pointerleave", handlers.content.onPointerleave],
333
+ ["pointerdown", handlers.content.onPointerdown],
334
+ ["focusin", handlers.content.onFocusin],
335
+ ["focusout", handlers.content.onFocusout],
336
+ ["keydown", handlers.content.onKeydown]
337
+ ],
338
+ contentProps,
339
+ triggerListeners,
340
+ triggerProps
341
+ };
33
342
  }
34
343
  function focusLeavesCurrentTarget(event) {
35
- const currentTarget = eventElement(event);
36
- const nextTarget = event.relatedTarget;
37
- return !(currentTarget && typeof Node !== "undefined" && nextTarget instanceof Node && currentTarget.contains(nextTarget));
344
+ const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
345
+ return !isNodeWithinElement(event.relatedTarget, currentTarget);
38
346
  }
39
- function useHoverDisclosure(options = {}) {
40
- const resolvedInteractionTarget = shallowRef(null);
41
- const resolvedContentTarget = shallowRef(null);
347
+ //#endregion
348
+ //#region src/components/floating/useHoverDisclosureOpenState.ts
349
+ var defaultOpenDelay = 0;
350
+ var defaultCloseDelay = 0;
351
+ function useHoverDisclosureOpenState({ interaction, onContentClosed, options }) {
42
352
  const controlledOpen = computed(() => toValue(options.open));
43
353
  const isDisabled = computed(() => Boolean(toValue(options.disabled)));
44
354
  let pendingChangeDetails;
@@ -53,318 +363,200 @@ function useHoverDisclosure(options = {}) {
53
363
  const isOpen = computed(() => !isDisabled.value && openState.value);
54
364
  const state = computed(() => isOpen.value ? "open" : "closed");
55
365
  let requestedOpen = openState.value;
56
- let triggerHovered = false;
57
- let contentHovered = false;
58
- let triggerFocused = false;
59
- let contentFocused = false;
60
- let touchPinned = false;
61
- let touchPointerActive = false;
62
- let touchClickPending = false;
63
- let triggerElement = null;
64
- let contentElement = null;
65
366
  let openTimer;
66
367
  let closeTimer;
67
- let documentListenersActive = false;
68
368
  let disposed = false;
69
- function getOpenDelay() {
70
- return readDelay(toValue(options.openDelay), DEFAULT_OPEN_DELAY);
71
- }
72
- function getCloseDelay() {
73
- return readDelay(toValue(options.closeDelay), DEFAULT_CLOSE_DELAY);
74
- }
75
- function getTouchBehavior() {
76
- return toValue(options.touchBehavior) ?? "none";
77
- }
78
- function clearOpenTimer() {
79
- if (openTimer === void 0) return;
80
- clearTimeout(openTimer);
81
- openTimer = void 0;
82
- }
83
- function clearCloseTimer() {
84
- if (closeTimer === void 0) return;
85
- clearTimeout(closeTimer);
86
- closeTimer = void 0;
87
- }
88
- function clearTimers() {
89
- clearOpenTimer();
90
- clearCloseTimer();
91
- }
92
- function hasActiveInteraction() {
93
- return triggerHovered || contentHovered || triggerFocused || contentFocused || touchPinned;
94
- }
95
- function setOpen(nextOpen, reason, event) {
96
- if (disposed || nextOpen && isDisabled.value || requestedOpen === nextOpen) return;
97
- requestedOpen = nextOpen;
98
- pendingChangeDetails = {
99
- reason,
100
- event
101
- };
102
- try {
103
- controllableOpen.setValue(nextOpen);
104
- } finally {
105
- pendingChangeDetails = void 0;
369
+ function request(change) {
370
+ if (change.open) requestOpen(change);
371
+ else requestClose(change);
372
+ }
373
+ function requestOpen(change) {
374
+ if (change.timing === "immediate") {
375
+ clearTimers();
376
+ setOpen(true, change.reason, change.event);
377
+ return;
106
378
  }
107
- }
108
- function openImmediately(reason, event) {
109
- clearTimers();
110
- setOpen(true, reason, event);
111
- }
112
- function closeImmediately(reason, event) {
113
- clearTimers();
114
- setOpen(false, reason, event);
115
- }
116
- function scheduleOpen(reason, event) {
117
379
  if (disposed || isDisabled.value) return;
118
380
  clearCloseTimer();
119
381
  clearOpenTimer();
120
382
  if (requestedOpen) return;
121
- const delay = getOpenDelay();
383
+ const delay = normalizeDelay(toValue(options.openDelay), defaultOpenDelay);
122
384
  if (delay === 0) {
123
- setOpen(true, reason, event);
385
+ setOpen(true, change.reason, change.event);
124
386
  return;
125
387
  }
126
388
  openTimer = setTimeout(() => {
127
389
  openTimer = void 0;
128
- if (!triggerHovered || isDisabled.value) return;
129
- setOpen(true, reason, event);
390
+ if (!interaction.read().triggerHovered || isDisabled.value) return;
391
+ setOpen(true, change.reason, change.event);
130
392
  }, delay);
131
393
  }
132
- function scheduleClose(reason, event) {
394
+ function requestClose(change) {
395
+ if (change.timing === "immediate") {
396
+ clearTimers();
397
+ setOpen(false, change.reason, change.event);
398
+ return;
399
+ }
133
400
  clearOpenTimer();
134
401
  clearCloseTimer();
135
- if (disposed || hasActiveInteraction()) return;
402
+ if (disposed || hasActiveHoverDisclosureInteraction(interaction.read())) return;
136
403
  closeTimer = setTimeout(() => {
137
404
  closeTimer = void 0;
138
- if (hasActiveInteraction()) return;
139
- setOpen(false, reason, event);
140
- }, getCloseDelay());
405
+ if (hasActiveHoverDisclosureInteraction(interaction.read())) return;
406
+ setOpen(false, change.reason, change.event);
407
+ }, normalizeDelay(toValue(options.closeDelay), defaultCloseDelay));
141
408
  }
142
- function rememberTrigger(event) {
143
- triggerElement = eventElement(event) ?? resolvedInteractionTarget.value ?? triggerElement;
144
- }
145
- function rememberContent(event) {
146
- contentElement = eventElement(event) ?? resolvedContentTarget.value ?? contentElement;
147
- }
148
- function onTriggerPointerenter(event) {
149
- rememberTrigger(event);
150
- if (event.pointerType === "touch" || isDisabled.value) return;
151
- triggerHovered = true;
152
- scheduleOpen("hover", event);
153
- }
154
- function onTriggerPointerleave(event) {
155
- rememberTrigger(event);
156
- if (event.pointerType === "touch") return;
157
- triggerHovered = false;
158
- scheduleClose("hover", event);
159
- }
160
- function onContentPointerenter(event) {
161
- rememberContent(event);
162
- if (event.pointerType === "touch" || isDisabled.value) return;
163
- contentHovered = true;
164
- clearCloseTimer();
165
- }
166
- function onContentPointerleave(event) {
167
- rememberContent(event);
168
- if (event.pointerType === "touch") return;
169
- contentHovered = false;
170
- scheduleClose("hover", event);
171
- }
172
- function onTriggerFocusin(event) {
173
- rememberTrigger(event);
174
- if (isDisabled.value || toValue(options.openOnFocus) === false) return;
175
- triggerFocused = true;
176
- openImmediately("focus", event);
177
- }
178
- function onTriggerFocusout(event) {
179
- rememberTrigger(event);
180
- if (!focusLeavesCurrentTarget(event)) return;
181
- triggerFocused = false;
182
- scheduleClose("focus", event);
183
- }
184
- function onContentFocusin(event) {
185
- rememberContent(event);
186
- if (isDisabled.value) return;
187
- contentFocused = true;
188
- clearCloseTimer();
189
- }
190
- function onContentFocusout(event) {
191
- rememberContent(event);
192
- if (!focusLeavesCurrentTarget(event)) return;
193
- contentFocused = false;
194
- scheduleClose("focus", event);
195
- }
196
- function onTriggerPointerdown(event) {
197
- rememberTrigger(event);
198
- touchPointerActive = event.pointerType === "touch";
199
- touchClickPending = false;
200
- }
201
- function onTriggerPointerup(event) {
202
- rememberTrigger(event);
203
- touchClickPending = event.pointerType === "touch" && touchPointerActive;
204
- touchPointerActive = false;
205
- }
206
- function onTriggerPointercancel(event) {
207
- rememberTrigger(event);
208
- touchPointerActive = false;
209
- touchClickPending = false;
210
- }
211
- function onTriggerClick(event) {
212
- rememberTrigger(event);
213
- if (!touchClickPending) return;
214
- touchClickPending = false;
215
- if (getTouchBehavior() !== "toggle" || isDisabled.value) return;
216
- event.preventDefault();
217
- if (touchPinned || requestedOpen) {
218
- touchPinned = false;
219
- closeImmediately("touch", event);
220
- return;
409
+ function setOpen(nextOpen, reason, event) {
410
+ if (disposed || nextOpen && isDisabled.value || requestedOpen === nextOpen) return;
411
+ requestedOpen = nextOpen;
412
+ pendingChangeDetails = {
413
+ reason,
414
+ event
415
+ };
416
+ try {
417
+ controllableOpen.setValue(nextOpen);
418
+ } finally {
419
+ pendingChangeDetails = void 0;
221
420
  }
222
- touchPinned = true;
223
- openImmediately("touch", event);
224
421
  }
225
- function onContentPointerdown(event) {
226
- rememberContent(event);
422
+ function cancelScheduledClose() {
423
+ clearCloseTimer();
227
424
  }
228
- function onKeydown(event) {
229
- if (event.key !== "Escape" || toValue(options.closeOnEscape) === false || !isOpen.value) return;
230
- touchPinned = false;
231
- closeImmediately("escape", event);
425
+ function isRequestedOpen() {
426
+ return requestedOpen;
232
427
  }
233
428
  function open() {
234
- openImmediately("programmatic");
429
+ request({
430
+ open: true,
431
+ reason: "programmatic",
432
+ timing: "immediate"
433
+ });
235
434
  }
236
435
  function close() {
237
- touchPinned = false;
238
- closeImmediately("programmatic");
436
+ interaction.send({
437
+ type: "set-touch-pinned",
438
+ pinned: false
439
+ });
440
+ request({
441
+ open: false,
442
+ reason: "programmatic",
443
+ timing: "immediate"
444
+ });
239
445
  }
240
446
  function toggle() {
241
447
  if (requestedOpen || isOpen.value) close();
242
448
  else open();
243
449
  }
244
- function isEventInside(event) {
245
- const elements = [
246
- triggerElement,
247
- contentElement,
248
- resolvedInteractionTarget.value,
249
- resolvedContentTarget.value
250
- ].filter((element) => element !== null);
251
- const path = typeof event.composedPath === "function" ? event.composedPath() : [];
252
- if (elements.some((element) => path.includes(element))) return true;
253
- const target = event.target;
254
- return typeof Node !== "undefined" && target instanceof Node && elements.some((element) => element.contains(target));
450
+ function clearOpenTimer() {
451
+ if (openTimer === void 0) return;
452
+ clearTimeout(openTimer);
453
+ openTimer = void 0;
255
454
  }
256
- function onDocumentPointerdown(event) {
257
- if (!touchPinned || isEventInside(event)) return;
258
- touchPinned = false;
259
- closeImmediately("outside", event);
455
+ function clearCloseTimer() {
456
+ if (closeTimer === void 0) return;
457
+ clearTimeout(closeTimer);
458
+ closeTimer = void 0;
260
459
  }
261
- function setDocumentListeners(active) {
262
- if (typeof document === "undefined" || active === documentListenersActive) return;
263
- documentListenersActive = active;
264
- const method = active ? "addEventListener" : "removeEventListener";
265
- document[method]("keydown", onKeydown);
266
- document[method]("pointerdown", onDocumentPointerdown, true);
460
+ function clearTimers() {
461
+ clearOpenTimer();
462
+ clearCloseTimer();
267
463
  }
464
+ watch([openState, controllableOpen.isControlled], ([value]) => {
465
+ requestedOpen = value;
466
+ if (value) return;
467
+ interaction.send({
468
+ type: "reset",
469
+ part: "content"
470
+ });
471
+ interaction.send({
472
+ type: "set-touch-pinned",
473
+ pinned: false
474
+ });
475
+ onContentClosed();
476
+ }, { flush: "sync" });
477
+ watch(isDisabled, (disabled) => {
478
+ if (!disabled) return;
479
+ interaction.send({
480
+ type: "reset",
481
+ part: "all"
482
+ });
483
+ request({
484
+ open: false,
485
+ reason: "disabled",
486
+ timing: "immediate"
487
+ });
488
+ });
489
+ onBeforeUnmount(() => {
490
+ disposed = true;
491
+ clearTimers();
492
+ });
493
+ return {
494
+ cancelScheduledClose,
495
+ close,
496
+ isDisabled,
497
+ isOpen,
498
+ isRequestedOpen,
499
+ open,
500
+ request,
501
+ state,
502
+ toggle
503
+ };
504
+ }
505
+ //#endregion
506
+ //#region src/components/floating/useHoverDisclosureTargetBinding.ts
507
+ function createHoverDisclosureTargetState() {
508
+ return {
509
+ contentElement: null,
510
+ resolvedContentTarget: shallowRef(null),
511
+ resolvedInteractionTarget: shallowRef(null),
512
+ triggerElement: null
513
+ };
514
+ }
515
+ function useHoverDisclosureTargetBinding({ adapter, isOpen, options, targets }) {
516
+ let documentListenersActive = false;
268
517
  function syncInteractionTarget() {
269
- resolvedInteractionTarget.value = resolveInteractionTarget(toValue(options.interactionTarget));
518
+ targets.resolvedInteractionTarget.value = resolveInteractionTarget(toValue(options.interactionTarget));
270
519
  }
271
520
  function syncContentTarget() {
272
- resolvedContentTarget.value = resolveContentTarget(toValue(options.contentTarget));
273
- }
274
- function bindTriggerTarget(target, cleanup) {
275
- triggerElement = target;
276
- target.addEventListener("pointerenter", onTriggerPointerenter);
277
- target.addEventListener("pointerleave", onTriggerPointerleave);
278
- target.addEventListener("pointerdown", onTriggerPointerdown);
279
- target.addEventListener("pointerup", onTriggerPointerup);
280
- target.addEventListener("pointercancel", onTriggerPointercancel);
281
- target.addEventListener("click", onTriggerClick);
282
- target.addEventListener("focusin", onTriggerFocusin);
283
- target.addEventListener("focusout", onTriggerFocusout);
284
- target.addEventListener("keydown", onKeydown);
285
- cleanup(() => {
286
- target.removeEventListener("pointerenter", onTriggerPointerenter);
287
- target.removeEventListener("pointerleave", onTriggerPointerleave);
288
- target.removeEventListener("pointerdown", onTriggerPointerdown);
289
- target.removeEventListener("pointerup", onTriggerPointerup);
290
- target.removeEventListener("pointercancel", onTriggerPointercancel);
291
- target.removeEventListener("click", onTriggerClick);
292
- target.removeEventListener("focusin", onTriggerFocusin);
293
- target.removeEventListener("focusout", onTriggerFocusout);
294
- target.removeEventListener("keydown", onKeydown);
295
- if (triggerElement === target) triggerElement = null;
296
- triggerHovered = false;
297
- triggerFocused = false;
298
- scheduleClose("hover");
299
- });
521
+ targets.resolvedContentTarget.value = resolveContentTarget(toValue(options.contentTarget));
300
522
  }
301
- function bindContentTarget(target, cleanup) {
302
- contentElement = target;
303
- target.addEventListener("pointerenter", onContentPointerenter);
304
- target.addEventListener("pointerleave", onContentPointerleave);
305
- target.addEventListener("pointerdown", onContentPointerdown);
306
- target.addEventListener("focusin", onContentFocusin);
307
- target.addEventListener("focusout", onContentFocusout);
308
- target.addEventListener("keydown", onKeydown);
523
+ function syncTargets() {
524
+ syncInteractionTarget();
525
+ syncContentTarget();
526
+ }
527
+ function bindTarget(part, target, listeners, cleanup) {
528
+ setCurrentTarget(part, target);
529
+ for (const [type, listener] of listeners) target.addEventListener(type, listener);
309
530
  cleanup(() => {
310
- target.removeEventListener("pointerenter", onContentPointerenter);
311
- target.removeEventListener("pointerleave", onContentPointerleave);
312
- target.removeEventListener("pointerdown", onContentPointerdown);
313
- target.removeEventListener("focusin", onContentFocusin);
314
- target.removeEventListener("focusout", onContentFocusout);
315
- target.removeEventListener("keydown", onKeydown);
316
- if (contentElement === target) contentElement = null;
317
- contentHovered = false;
318
- contentFocused = false;
319
- scheduleClose("hover");
531
+ for (const [type, listener] of listeners) target.removeEventListener(type, listener);
532
+ clearCurrentTarget(part, target);
533
+ adapter.onTargetDetached(part);
320
534
  });
321
535
  }
322
- const triggerProps = computed(() => ({
323
- "data-state": state.value,
324
- onPointerenter: onTriggerPointerenter,
325
- onPointerleave: onTriggerPointerleave,
326
- onPointerdown: onTriggerPointerdown,
327
- onPointerup: onTriggerPointerup,
328
- onPointercancel: onTriggerPointercancel,
329
- onClick: onTriggerClick,
330
- onFocusin: onTriggerFocusin,
331
- onFocusout: onTriggerFocusout,
332
- onKeydown
333
- }));
334
- const contentProps = computed(() => ({
335
- "data-state": state.value,
336
- onPointerenter: onContentPointerenter,
337
- onPointerleave: onContentPointerleave,
338
- onPointerdown: onContentPointerdown,
339
- onFocusin: onContentFocusin,
340
- onFocusout: onContentFocusout,
341
- onKeydown
342
- }));
343
- watch([openState, controllableOpen.isControlled], ([value]) => {
344
- requestedOpen = value;
345
- if (!value) {
346
- contentHovered = false;
347
- contentFocused = false;
348
- contentElement = null;
349
- touchPinned = false;
536
+ function setCurrentTarget(part, target) {
537
+ if (part === "trigger") targets.triggerElement = target;
538
+ else targets.contentElement = target;
539
+ }
540
+ function clearCurrentTarget(part, target) {
541
+ if (part === "trigger" && targets.triggerElement === target) targets.triggerElement = null;
542
+ if (part === "content" && targets.contentElement === target) targets.contentElement = null;
543
+ }
544
+ function onDocumentPointerdown(event) {
545
+ if (!adapter.isOutsideDismissalActive()) return;
546
+ if (isEventInsideTargets(event, targets)) return;
547
+ adapter.onOutsidePointerdown(event);
548
+ }
549
+ function setDocumentListeners(active) {
550
+ if (typeof document === "undefined" || active === documentListenersActive) return;
551
+ documentListenersActive = active;
552
+ if (active) {
553
+ document.addEventListener("keydown", adapter.onDocumentKeydown);
554
+ document.addEventListener("pointerdown", onDocumentPointerdown, true);
555
+ return;
350
556
  }
351
- }, { flush: "sync" });
352
- watch(isDisabled, (disabled) => {
353
- if (!disabled) return;
354
- triggerHovered = false;
355
- contentHovered = false;
356
- triggerFocused = false;
357
- contentFocused = false;
358
- touchPinned = false;
359
- touchPointerActive = false;
360
- touchClickPending = false;
361
- closeImmediately("disabled");
362
- });
363
- watch(() => getTouchBehavior(), (behavior) => {
364
- if (behavior === "toggle" || !touchPinned) return;
365
- touchPinned = false;
366
- closeImmediately("touch");
367
- });
557
+ document.removeEventListener("keydown", adapter.onDocumentKeydown);
558
+ document.removeEventListener("pointerdown", onDocumentPointerdown, true);
559
+ }
368
560
  watch(() => toValue(options.interactionTarget), syncInteractionTarget, {
369
561
  flush: "post",
370
562
  immediate: true
@@ -373,42 +565,79 @@ function useHoverDisclosure(options = {}) {
373
565
  flush: "post",
374
566
  immediate: true
375
567
  });
376
- watch(resolvedInteractionTarget, (target, _previous, cleanup) => {
377
- if (target) bindTriggerTarget(target, cleanup);
568
+ watch(targets.resolvedInteractionTarget, (target, _previous, cleanup) => {
569
+ if (target) bindTarget("trigger", target, adapter.triggerListeners, cleanup);
378
570
  }, {
379
571
  flush: "sync",
380
572
  immediate: true
381
573
  });
382
- watch(resolvedContentTarget, (target, _previous, cleanup) => {
383
- if (target) bindContentTarget(target, cleanup);
574
+ watch(targets.resolvedContentTarget, (target, _previous, cleanup) => {
575
+ if (target) bindTarget("content", target, adapter.contentListeners, cleanup);
384
576
  }, {
385
577
  flush: "sync",
386
578
  immediate: true
387
579
  });
388
580
  watch(isOpen, setDocumentListeners, { flush: "sync" });
389
- watch(isOpen, () => {
390
- syncInteractionTarget();
391
- syncContentTarget();
392
- }, { flush: "post" });
581
+ watch(isOpen, syncTargets, { flush: "post" });
393
582
  onMounted(() => {
394
- syncInteractionTarget();
395
- syncContentTarget();
583
+ syncTargets();
396
584
  setDocumentListeners(isOpen.value);
397
585
  });
398
- onBeforeUnmount(() => {
399
- disposed = true;
400
- clearTimers();
401
- setDocumentListeners(false);
586
+ onBeforeUnmount(() => setDocumentListeners(false));
587
+ }
588
+ function resolveInteractionTarget(target) {
589
+ if (!target) return null;
590
+ if (typeof target === "string") return querySelectorSafe(target);
591
+ if (isElement(target)) return target;
592
+ return isElement(target.contextElement) ? target.contextElement : null;
593
+ }
594
+ function resolveContentTarget(target) {
595
+ if (!target) return null;
596
+ if (typeof target === "string") return querySelectorSafe(target);
597
+ return isElement(target) ? target : null;
598
+ }
599
+ function isEventInsideTargets(event, targets) {
600
+ return isEventWithinTargets(event, [
601
+ targets.triggerElement,
602
+ targets.contentElement,
603
+ targets.resolvedInteractionTarget.value,
604
+ targets.resolvedContentTarget.value
605
+ ].filter((element) => element !== null));
606
+ }
607
+ //#endregion
608
+ //#region src/components/floating/useHoverDisclosure.ts
609
+ function useHoverDisclosure(options = {}) {
610
+ const interaction = createHoverDisclosureInteractionModel();
611
+ const targets = createHoverDisclosureTargetState();
612
+ const openState = useHoverDisclosureOpenState({
613
+ interaction,
614
+ onContentClosed: () => {
615
+ targets.contentElement = null;
616
+ },
617
+ options
618
+ });
619
+ const { bindingAdapter, contentProps, triggerProps } = useHoverDisclosureInteractions({
620
+ commands: openState,
621
+ interaction,
622
+ options,
623
+ state: openState.state,
624
+ targets
625
+ });
626
+ useHoverDisclosureTargetBinding({
627
+ adapter: bindingAdapter,
628
+ isOpen: openState.isOpen,
629
+ options,
630
+ targets
402
631
  });
403
632
  return {
404
- isOpen,
405
- isDisabled,
406
- state,
633
+ isOpen: openState.isOpen,
634
+ isDisabled: openState.isDisabled,
635
+ state: openState.state,
407
636
  triggerProps,
408
637
  contentProps,
409
- open,
410
- close,
411
- toggle
638
+ open: openState.open,
639
+ close: openState.close,
640
+ toggle: openState.toggle
412
641
  };
413
642
  }
414
643
  //#endregion