ropav 0.1.5 → 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 (235) hide show
  1. package/README.md +10 -0
  2. package/dist/accordion.css +17 -17
  3. package/dist/accordion.js +125 -154
  4. package/dist/alert.css +18 -18
  5. package/dist/alert.js +20 -20
  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 +10 -18
  12. package/dist/badge.css +16 -16
  13. package/dist/badge.js +6 -6
  14. package/dist/base.css +18 -13
  15. package/dist/button-group.js +1 -1
  16. package/dist/button-link.js +13 -14
  17. package/dist/button.css +32 -27
  18. package/dist/button.js +13 -14
  19. package/dist/{useButtonColor.js → button.scss_vue_type_style_index_0_src_true_lang.js} +3 -2
  20. package/dist/card.js +1 -1
  21. package/dist/checkbox.css +32 -32
  22. package/dist/checkbox.js +23 -29
  23. package/dist/collapse.css +6 -6
  24. package/dist/collapse.js +8 -7
  25. package/dist/collectionNavigation.js +2 -99
  26. package/dist/color-input.css +19 -19
  27. package/dist/color-input.js +15 -14
  28. package/dist/color-picker.css +40 -40
  29. package/dist/color-picker.js +222 -202
  30. package/dist/color-picker2.js +1 -9
  31. package/dist/color-swatch.css +4 -4
  32. package/dist/color-swatch.js +7 -9
  33. package/dist/color.js +5 -10
  34. package/dist/componentColors.js +165 -84
  35. package/dist/componentRef.js +26 -0
  36. package/dist/components/accordion/accordionContext.d.ts +3 -0
  37. package/dist/components/accordion/accordionModel.d.ts +14 -0
  38. package/dist/components/accordion/index.d.ts +2 -1
  39. package/dist/components/accordion/index.js +1 -1
  40. package/dist/components/accordion/types.d.ts +1 -2
  41. package/dist/components/accordion/useAccordion.d.ts +2 -2
  42. package/dist/components/accordion/useAccordionItem.d.ts +2 -0
  43. package/dist/components/checkbox/useCheckbox.d.ts +2 -3
  44. package/dist/components/color-input/color-input.d.ts +2 -2
  45. package/dist/components/color-input/useColorInput.d.ts +1 -1
  46. package/dist/components/color-picker/index.js +2 -2
  47. package/dist/components/color-picker/types.d.ts +2 -2
  48. package/dist/components/color-picker/useColorPickerSaturation.d.ts +22 -0
  49. package/dist/components/color-picker/useColorPickerSlider.d.ts +20 -0
  50. package/dist/components/color-picker/useColorPickerValue.d.ts +1 -1
  51. package/dist/components/dialog/{dialog-core.d.ts → dialogContext.d.ts} +2 -6
  52. package/dist/components/dialog/useDialogContentInteractions.d.ts +18 -0
  53. package/dist/components/dialog/useDialogRootState.d.ts +19 -0
  54. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +2 -2
  55. package/dist/components/dropdown-menu/dropdown-menu-item-row.d.ts +1 -1
  56. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +1 -1
  57. package/dist/components/dropdown-menu/dropdown-menu-model.d.ts +8 -0
  58. package/dist/components/dropdown-menu/dropdown-menu-root.d.ts +2 -2
  59. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
  60. package/dist/components/dropdown-menu/dropdown-menu-sub-trigger.d.ts +1 -1
  61. package/dist/components/dropdown-menu/dropdown-menu-sub.d.ts +1 -1
  62. package/dist/components/dropdown-menu/dropdown-menu.d.ts +3 -3
  63. package/dist/components/dropdown-menu/{dropdown-menu-primitive-core.d.ts → dropdownMenuContext.d.ts} +17 -19
  64. package/dist/components/dropdown-menu/dropdownMenuDataModel.d.ts +20 -0
  65. package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -0
  66. package/dist/components/dropdown-menu/dropdownMenuInteractionNavigation.d.ts +24 -0
  67. package/dist/components/dropdown-menu/dropdownMenuInteractionRegistry.d.ts +42 -0
  68. package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +85 -0
  69. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +11 -11
  70. package/dist/components/dropdown-menu/useDropdownMenuContextTrigger.d.ts +9 -0
  71. package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +34 -0
  72. package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +22 -0
  73. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +6 -5
  74. package/dist/components/dropdown-menu/useDropdownMenuInteractionDismissal.d.ts +17 -0
  75. package/dist/components/dropdown-menu/useDropdownMenuInteractionKeyboard.d.ts +19 -0
  76. package/dist/components/dropdown-menu/useDropdownMenuPortalPosition.d.ts +0 -1
  77. package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +29 -0
  78. package/dist/components/dropdown-menu/useDropdownMenuPrimitiveContent.d.ts +2 -2
  79. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +1 -1
  80. package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +19 -0
  81. package/dist/components/floating/hoverDisclosureInteractionModel.d.ts +42 -0
  82. package/dist/components/floating/index.js +1 -1
  83. package/dist/components/floating/useFloatingPosition.d.ts +0 -1
  84. package/dist/components/floating/useHoverDisclosureInteractions.d.ts +32 -0
  85. package/dist/components/floating/useHoverDisclosureOpenState.d.ts +25 -0
  86. package/dist/components/floating/useHoverDisclosureTargetBinding.d.ts +27 -0
  87. package/dist/components/input/useInput.d.ts +1 -1
  88. package/dist/components/number-input/numberInputModel.d.ts +15 -0
  89. package/dist/components/number-input/useNumberInput.d.ts +4 -18
  90. package/dist/components/pagination/index.d.ts +1 -1
  91. package/dist/components/pagination/index.js +1 -1
  92. package/dist/components/pagination/paginationModel.d.ts +4 -0
  93. package/dist/components/pagination/types.d.ts +15 -0
  94. package/dist/components/pagination/usePagination.d.ts +3 -19
  95. package/dist/components/popover/usePopoverBindings.d.ts +16 -0
  96. package/dist/components/progress/progressModel.d.ts +8 -0
  97. package/dist/components/progress/useProgress.d.ts +1 -7
  98. package/dist/components/radio/useRadio.d.ts +3 -4
  99. package/dist/components/scroll-area/scroll-area.d.ts +1 -1
  100. package/dist/components/scroll-area/scrollAreaModel.d.ts +64 -0
  101. package/dist/components/scroll-area/types.d.ts +4 -0
  102. package/dist/components/scroll-area/useScrollArea.d.ts +70 -52
  103. package/dist/components/scroll-area/{useScrollAreaPresentation.d.ts → useScrollAreaAttributes.d.ts} +37 -14
  104. package/dist/components/scroll-area/useScrollAreaDerivedState.d.ts +8 -0
  105. package/dist/components/scroll-area/useScrollAreaMeasurement.d.ts +35 -0
  106. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +10 -8
  107. package/dist/components/scroll-area/useScrollAreaVisibility.d.ts +15 -20
  108. package/dist/components/select/useSelect.d.ts +2 -1
  109. package/dist/components/select/useSelectNativeValue.d.ts +1 -7
  110. package/dist/components/slider/rangeSliderModel.d.ts +41 -0
  111. package/dist/components/slider/{sliderCore.d.ts → sliderModel.d.ts} +2 -2
  112. package/dist/components/slider/useRangeSlider.d.ts +9 -17
  113. package/dist/components/slider/useRangeSliderValueState.d.ts +40 -0
  114. package/dist/components/slider/useSlider.d.ts +8 -14
  115. package/dist/components/slider/useSliderPointerPreview.d.ts +22 -0
  116. package/dist/components/slider/useSliderTooltipState.d.ts +40 -0
  117. package/dist/components/slider/useSliderValueState.d.ts +33 -0
  118. package/dist/components/switch/useSwitch.d.ts +1 -1
  119. package/dist/components/teleport-provider/index.js +1 -1
  120. package/dist/components/teleport-provider/useTeleportTarget.d.ts +1 -2
  121. package/dist/components/textarea/useTextarea.d.ts +1 -1
  122. package/dist/components/toast/useToastLifecycle.d.ts +19 -0
  123. package/dist/components/tooltip/useTooltip.d.ts +1 -2
  124. package/dist/composables/index.d.ts +2 -0
  125. package/dist/composables/index.js +2 -0
  126. package/dist/composables/useControllableValue.d.ts +14 -0
  127. package/dist/css.js +12 -0
  128. package/dist/dialog.js +227 -216
  129. package/dist/dropdown-menu.js +1493 -1118
  130. package/dist/events.js +59 -0
  131. package/dist/field.css +8 -8
  132. package/dist/field.js +13 -25
  133. package/dist/floating.js +553 -312
  134. package/dist/floatingOffset.js +11 -0
  135. package/dist/focus-trap.js +7 -5
  136. package/dist/focusNavigation.js +37 -0
  137. package/dist/icon-button.css +12 -173
  138. package/dist/icon-button.js +8 -7
  139. package/dist/index.d.ts +5 -4
  140. package/dist/index.js +13 -11
  141. package/dist/input.css +24 -24
  142. package/dist/input.js +20 -32
  143. package/dist/interactive.js +18 -0
  144. package/dist/modal.js +11 -7
  145. package/dist/number-input.css +18 -18
  146. package/dist/number-input.js +15 -13
  147. package/dist/number.js +22 -0
  148. package/dist/overlay.js +3 -2
  149. package/dist/pagination.css +28 -28
  150. package/dist/pagination.js +67 -65
  151. package/dist/pointer.js +9 -0
  152. package/dist/popover.css +34 -34
  153. package/dist/popover.js +93 -91
  154. package/dist/progress.css +29 -21
  155. package/dist/progress.js +25 -21
  156. package/dist/query.js +40 -0
  157. package/dist/radio.css +18 -18
  158. package/dist/radio.js +31 -37
  159. package/dist/rafScheduler.js +34 -0
  160. package/dist/scroll-area.css +35 -26
  161. package/dist/scroll-area.js +553 -500
  162. package/dist/select.css +45 -45
  163. package/dist/select.js +70 -56
  164. package/dist/slider.css +191 -191
  165. package/dist/slider.js +695 -628
  166. package/dist/styles-api.d.ts +0 -1
  167. package/dist/styles-api.js +1 -4
  168. package/dist/switch.css +17 -17
  169. package/dist/switch.js +15 -16
  170. package/dist/tabs.css +46 -46
  171. package/dist/tabs.js +51 -68
  172. package/dist/text.js +17 -0
  173. package/dist/textarea.css +26 -26
  174. package/dist/textarea.js +22 -33
  175. package/dist/toast.css +26 -26
  176. package/dist/toast.js +157 -129
  177. package/dist/tooltip.css +12 -12
  178. package/dist/tooltip.js +46 -47
  179. package/dist/useCollapse.js +19 -17
  180. package/dist/useControlState.js +4 -7
  181. package/dist/useControllableValue.js +8 -2
  182. package/dist/useFloatingPosition.js +122 -1128
  183. package/dist/useFormControl.js +3 -2
  184. package/dist/useOverlayZIndex.js +2 -6
  185. package/dist/useRequiredInject.js +1 -1
  186. package/dist/useTeleportTarget.js +3 -14
  187. package/dist/useTypeahead.js +94 -0
  188. package/dist/utils/aria.d.ts +3 -0
  189. package/dist/utils/attributes.d.ts +2 -0
  190. package/dist/utils/bem.d.ts +3 -0
  191. package/dist/utils/collectionNavigation.d.ts +2 -0
  192. package/dist/utils/color.d.ts +7 -0
  193. package/dist/{components/color-picker/color-picker-utils.d.ts → utils/colorPicker.d.ts} +5 -4
  194. package/dist/utils/componentColors.d.ts +7 -0
  195. package/dist/utils/css.d.ts +3 -0
  196. package/dist/utils/dom/ancestry.d.ts +7 -0
  197. package/dist/utils/dom/attributes.d.ts +16 -0
  198. package/dist/utils/dom/componentRef.d.ts +4 -0
  199. package/dist/utils/dom/events.d.ts +5 -0
  200. package/dist/utils/dom/focusNavigation.d.ts +7 -0
  201. package/dist/utils/dom/interactive.d.ts +2 -0
  202. package/dist/utils/dom/pointer.d.ts +2 -0
  203. package/dist/utils/dom/query.d.ts +4 -0
  204. package/dist/utils/dom/scroll.d.ts +23 -0
  205. package/dist/utils/floatingOffset.d.ts +10 -0
  206. package/dist/utils/geometry.d.ts +14 -0
  207. package/dist/utils/indexPath.d.ts +6 -0
  208. package/dist/utils/number.d.ts +4 -0
  209. package/dist/utils/rafScheduler.d.ts +4 -0
  210. package/dist/utils/text.d.ts +2 -0
  211. package/docs/code-architecture.md +118 -0
  212. package/docs/public-composables-api.md +52 -0
  213. package/docs/public-floating-api.md +6 -5
  214. package/package.json +54 -46
  215. package/src/styles/_mixins.scss +4 -0
  216. package/src/styles/_tokens.scss +12 -12
  217. package/src/styles/_variables.scss +1 -1
  218. package/dist/button-link.css +0 -167
  219. package/dist/components/dropdown-menu/dropdown-menu-outside.d.ts +0 -3
  220. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +0 -21
  221. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +0 -37
  222. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +0 -29
  223. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +0 -52
  224. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +0 -17
  225. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +0 -18
  226. package/dist/components/scroll-area/scrollAreaCore.d.ts +0 -25
  227. package/dist/components/scroll-area/useScrollAreaControls.d.ts +0 -25
  228. package/dist/components/scroll-area/useScrollAreaMetrics.d.ts +0 -35
  229. /package/dist/components/alert/{useAlertColor.d.ts → alertColor.d.ts} +0 -0
  230. /package/dist/components/avatar/{useAvatarColor.d.ts → avatarColor.d.ts} +0 -0
  231. /package/dist/components/badge/{useBadgeColor.d.ts → badgeColor.d.ts} +0 -0
  232. /package/dist/components/button/{useButtonColor.d.ts → buttonColor.d.ts} +0 -0
  233. /package/dist/components/color-swatch/{useColorSwatchColor.d.ts → colorSwatchColor.d.ts} +0 -0
  234. /package/dist/components/toast/{useToastColor.d.ts → toastColor.d.ts} +0 -0
  235. /package/dist/{composables → internal/composables}/useOverlayLayer.d.ts +0 -0
package/dist/floating.js CHANGED
@@ -1,358 +1,562 @@
1
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, toValue, watch } from "vue";
2
- //#region src/components/floating/useHoverDisclosure.ts
3
- var DEFAULT_OPEN_DELAY = 0;
4
- var DEFAULT_CLOSE_DELAY = 0;
5
- function isElement(value) {
6
- return typeof Element !== "undefined" && value instanceof Element;
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";
5
+ import { computed, onBeforeUnmount, onMounted, shallowRef, toValue, watch } from "vue";
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
+ };
7
16
  }
8
- function resolveSelector(selector) {
9
- if (typeof document === "undefined") return null;
10
- try {
11
- return document.querySelector(selector);
12
- } catch {
13
- return null;
14
- }
17
+ function hasActiveHoverDisclosureInteraction(state) {
18
+ return state.triggerHovered || state.contentHovered || state.triggerFocused || state.contentFocused || state.touchPinned;
15
19
  }
16
- function resolveInteractionTarget(target) {
17
- if (!target) return null;
18
- if (typeof target === "string") return resolveSelector(target);
19
- if (isElement(target)) return target;
20
- return isElement(target.contextElement) ? target.contextElement : null;
21
- }
22
- function resolveContentTarget(target) {
23
- if (!target) return null;
24
- return typeof target === "string" ? resolveSelector(target) : isElement(target) ? target : 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);
48
+ }
25
49
  }
26
- function readDelay(value, fallback) {
27
- if (value == null) return fallback;
28
- return Number.isFinite(value) ? Math.max(0, value) : fallback;
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
+ };
29
60
  }
30
- function eventElement(event) {
31
- return isElement(event.currentTarget) ? event.currentTarget : 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
+ };
32
78
  }
33
- function focusLeavesCurrentTarget(event) {
34
- const currentTarget = eventElement(event);
35
- const nextTarget = event.relatedTarget;
36
- return !(currentTarget && typeof Node !== "undefined" && nextTarget instanceof Node && currentTarget.contains(nextTarget));
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
+ };
37
91
  }
38
- function useHoverDisclosure(options = {}) {
39
- const uncontrolledOpen = ref(options.defaultOpen === true && !toValue(options.disabled));
40
- const resolvedInteractionTarget = shallowRef(null);
41
- const resolvedContentTarget = shallowRef(null);
42
- const controlledOpen = computed(() => toValue(options.open));
43
- const isDisabled = computed(() => Boolean(toValue(options.disabled)));
44
- const openState = computed(() => controlledOpen.value ?? uncontrolledOpen.value);
45
- const isOpen = computed(() => !isDisabled.value && openState.value);
46
- const state = computed(() => isOpen.value ? "open" : "closed");
47
- let requestedOpen = openState.value;
48
- let triggerHovered = false;
49
- let contentHovered = false;
50
- let triggerFocused = false;
51
- let contentFocused = false;
52
- let touchPinned = false;
53
- let touchPointerActive = false;
54
- let touchClickPending = false;
55
- let triggerElement = null;
56
- let contentElement = null;
57
- let openTimer;
58
- let closeTimer;
59
- let documentListenersActive = false;
60
- let disposed = false;
61
- function getOpenDelay() {
62
- return readDelay(toValue(options.openDelay), DEFAULT_OPEN_DELAY);
63
- }
64
- function getCloseDelay() {
65
- return readDelay(toValue(options.closeDelay), DEFAULT_CLOSE_DELAY);
66
- }
67
- function getTouchBehavior() {
68
- return toValue(options.touchBehavior) ?? "none";
69
- }
70
- function clearOpenTimer() {
71
- if (openTimer === void 0) return;
72
- clearTimeout(openTimer);
73
- openTimer = void 0;
74
- }
75
- function clearCloseTimer() {
76
- if (closeTimer === void 0) return;
77
- clearTimeout(closeTimer);
78
- closeTimer = void 0;
79
- }
80
- function clearTimers() {
81
- clearOpenTimer();
82
- clearCloseTimer();
83
- }
84
- function hasActiveInteraction() {
85
- return triggerHovered || contentHovered || triggerFocused || contentFocused || touchPinned;
86
- }
87
- function setOpen(nextOpen, reason, event) {
88
- if (disposed || nextOpen && isDisabled.value || requestedOpen === nextOpen) return;
89
- requestedOpen = nextOpen;
90
- if (controlledOpen.value === void 0) uncontrolledOpen.value = nextOpen;
91
- options.onOpenChange?.(nextOpen, {
92
- reason,
93
- event
94
- });
95
- }
96
- function openImmediately(reason, event) {
97
- clearTimers();
98
- setOpen(true, reason, event);
99
- }
100
- function closeImmediately(reason, event) {
101
- clearTimers();
102
- setOpen(false, reason, event);
103
- }
104
- function scheduleOpen(reason, event) {
105
- if (disposed || isDisabled.value) return;
106
- clearCloseTimer();
107
- clearOpenTimer();
108
- if (requestedOpen) return;
109
- const delay = getOpenDelay();
110
- if (delay === 0) {
111
- setOpen(true, reason, event);
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;
112
99
  return;
113
100
  }
114
- openTimer = setTimeout(() => {
115
- openTimer = void 0;
116
- if (!triggerHovered || isDisabled.value) return;
117
- setOpen(true, reason, event);
118
- }, delay);
119
- }
120
- function scheduleClose(reason, event) {
121
- clearOpenTimer();
122
- clearCloseTimer();
123
- if (disposed || hasActiveInteraction()) return;
124
- closeTimer = setTimeout(() => {
125
- closeTimer = void 0;
126
- if (hasActiveInteraction()) return;
127
- setOpen(false, reason, event);
128
- }, getCloseDelay());
129
- }
130
- function rememberTrigger(event) {
131
- triggerElement = eventElement(event) ?? resolvedInteractionTarget.value ?? triggerElement;
132
- }
133
- function rememberContent(event) {
134
- contentElement = eventElement(event) ?? resolvedContentTarget.value ?? contentElement;
101
+ targets.contentElement = currentTarget ?? targets.resolvedContentTarget.value ?? targets.contentElement;
135
102
  }
136
103
  function onTriggerPointerenter(event) {
137
- rememberTrigger(event);
138
- if (event.pointerType === "touch" || isDisabled.value) return;
139
- triggerHovered = true;
140
- scheduleOpen("hover", 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");
141
112
  }
142
113
  function onTriggerPointerleave(event) {
143
- rememberTrigger(event);
114
+ rememberTarget("trigger", event);
144
115
  if (event.pointerType === "touch") return;
145
- triggerHovered = false;
146
- scheduleClose("hover", event);
116
+ interaction.send({
117
+ type: "hover",
118
+ part: "trigger",
119
+ active: false
120
+ });
121
+ requestClose("hover", event, "delayed");
147
122
  }
148
123
  function onContentPointerenter(event) {
149
- rememberContent(event);
150
- if (event.pointerType === "touch" || isDisabled.value) return;
151
- contentHovered = true;
152
- clearCloseTimer();
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();
153
132
  }
154
133
  function onContentPointerleave(event) {
155
- rememberContent(event);
134
+ rememberTarget("content", event);
156
135
  if (event.pointerType === "touch") return;
157
- contentHovered = false;
158
- scheduleClose("hover", event);
136
+ interaction.send({
137
+ type: "hover",
138
+ part: "content",
139
+ active: false
140
+ });
141
+ requestClose("hover", event, "delayed");
159
142
  }
160
143
  function onTriggerFocusin(event) {
161
- rememberTrigger(event);
162
- if (isDisabled.value || toValue(options.openOnFocus) === false) return;
163
- triggerFocused = true;
164
- openImmediately("focus", 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");
165
152
  }
166
153
  function onTriggerFocusout(event) {
167
- rememberTrigger(event);
154
+ rememberTarget("trigger", event);
168
155
  if (!focusLeavesCurrentTarget(event)) return;
169
- triggerFocused = false;
170
- scheduleClose("focus", event);
156
+ interaction.send({
157
+ type: "focus",
158
+ part: "trigger",
159
+ active: false
160
+ });
161
+ requestClose("focus", event, "delayed");
171
162
  }
172
163
  function onContentFocusin(event) {
173
- rememberContent(event);
174
- if (isDisabled.value) return;
175
- contentFocused = true;
176
- clearCloseTimer();
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();
177
172
  }
178
173
  function onContentFocusout(event) {
179
- rememberContent(event);
174
+ rememberTarget("content", event);
180
175
  if (!focusLeavesCurrentTarget(event)) return;
181
- contentFocused = false;
182
- scheduleClose("focus", event);
176
+ interaction.send({
177
+ type: "focus",
178
+ part: "content",
179
+ active: false
180
+ });
181
+ requestClose("focus", event, "delayed");
183
182
  }
184
183
  function onTriggerPointerdown(event) {
185
- rememberTrigger(event);
186
- touchPointerActive = event.pointerType === "touch";
187
- touchClickPending = false;
184
+ rememberTarget("trigger", event);
185
+ interaction.send({
186
+ type: "pointer-down",
187
+ touch: event.pointerType === "touch"
188
+ });
188
189
  }
189
190
  function onTriggerPointerup(event) {
190
- rememberTrigger(event);
191
- touchClickPending = event.pointerType === "touch" && touchPointerActive;
192
- touchPointerActive = false;
191
+ rememberTarget("trigger", event);
192
+ interaction.send({
193
+ type: "pointer-up",
194
+ touch: event.pointerType === "touch"
195
+ });
193
196
  }
194
197
  function onTriggerPointercancel(event) {
195
- rememberTrigger(event);
196
- touchPointerActive = false;
197
- touchClickPending = false;
198
+ rememberTarget("trigger", event);
199
+ interaction.send({ type: "pointer-cancel" });
198
200
  }
199
201
  function onTriggerClick(event) {
200
- rememberTrigger(event);
201
- if (!touchClickPending) return;
202
- touchClickPending = false;
203
- if (getTouchBehavior() !== "toggle" || isDisabled.value) return;
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;
204
207
  event.preventDefault();
205
- if (touchPinned || requestedOpen) {
206
- touchPinned = false;
207
- closeImmediately("touch", event);
208
+ if (interactionState.touchPinned || commands.isRequestedOpen()) {
209
+ interaction.send({
210
+ type: "set-touch-pinned",
211
+ pinned: false
212
+ });
213
+ requestClose("touch", event, "immediate");
208
214
  return;
209
215
  }
210
- touchPinned = true;
211
- openImmediately("touch", event);
216
+ interaction.send({
217
+ type: "set-touch-pinned",
218
+ pinned: true
219
+ });
220
+ requestOpen("touch", event, "immediate");
212
221
  }
213
222
  function onContentPointerdown(event) {
214
- rememberContent(event);
223
+ rememberTarget("content", event);
215
224
  }
216
225
  function onKeydown(event) {
217
- if (event.key !== "Escape" || toValue(options.closeOnEscape) === false || !isOpen.value) return;
218
- touchPinned = false;
219
- closeImmediately("escape", 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
+ };
342
+ }
343
+ function focusLeavesCurrentTarget(event) {
344
+ const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
345
+ return !isNodeWithinElement(event.relatedTarget, currentTarget);
346
+ }
347
+ //#endregion
348
+ //#region src/components/floating/useHoverDisclosureOpenState.ts
349
+ var defaultOpenDelay = 0;
350
+ var defaultCloseDelay = 0;
351
+ function useHoverDisclosureOpenState({ interaction, onContentClosed, options }) {
352
+ const controlledOpen = computed(() => toValue(options.open));
353
+ const isDisabled = computed(() => Boolean(toValue(options.disabled)));
354
+ let pendingChangeDetails;
355
+ const controllableOpen = useControllableValue({
356
+ modelValue: () => controlledOpen.value,
357
+ defaultValue: () => options.defaultOpen === true && !isDisabled.value,
358
+ onChange: (nextOpen) => {
359
+ if (pendingChangeDetails) options.onOpenChange?.(nextOpen, pendingChangeDetails);
360
+ }
361
+ });
362
+ const openState = controllableOpen.value;
363
+ const isOpen = computed(() => !isDisabled.value && openState.value);
364
+ const state = computed(() => isOpen.value ? "open" : "closed");
365
+ let requestedOpen = openState.value;
366
+ let openTimer;
367
+ let closeTimer;
368
+ let disposed = false;
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;
378
+ }
379
+ if (disposed || isDisabled.value) return;
380
+ clearCloseTimer();
381
+ clearOpenTimer();
382
+ if (requestedOpen) return;
383
+ const delay = normalizeDelay(toValue(options.openDelay), defaultOpenDelay);
384
+ if (delay === 0) {
385
+ setOpen(true, change.reason, change.event);
386
+ return;
387
+ }
388
+ openTimer = setTimeout(() => {
389
+ openTimer = void 0;
390
+ if (!interaction.read().triggerHovered || isDisabled.value) return;
391
+ setOpen(true, change.reason, change.event);
392
+ }, delay);
393
+ }
394
+ function requestClose(change) {
395
+ if (change.timing === "immediate") {
396
+ clearTimers();
397
+ setOpen(false, change.reason, change.event);
398
+ return;
399
+ }
400
+ clearOpenTimer();
401
+ clearCloseTimer();
402
+ if (disposed || hasActiveHoverDisclosureInteraction(interaction.read())) return;
403
+ closeTimer = setTimeout(() => {
404
+ closeTimer = void 0;
405
+ if (hasActiveHoverDisclosureInteraction(interaction.read())) return;
406
+ setOpen(false, change.reason, change.event);
407
+ }, normalizeDelay(toValue(options.closeDelay), defaultCloseDelay));
408
+ }
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;
420
+ }
421
+ }
422
+ function cancelScheduledClose() {
423
+ clearCloseTimer();
424
+ }
425
+ function isRequestedOpen() {
426
+ return requestedOpen;
220
427
  }
221
428
  function open() {
222
- openImmediately("programmatic");
429
+ request({
430
+ open: true,
431
+ reason: "programmatic",
432
+ timing: "immediate"
433
+ });
223
434
  }
224
435
  function close() {
225
- touchPinned = false;
226
- 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
+ });
227
445
  }
228
446
  function toggle() {
229
447
  if (requestedOpen || isOpen.value) close();
230
448
  else open();
231
449
  }
232
- function isEventInside(event) {
233
- const elements = [
234
- triggerElement,
235
- contentElement,
236
- resolvedInteractionTarget.value,
237
- resolvedContentTarget.value
238
- ].filter((element) => element !== null);
239
- const path = typeof event.composedPath === "function" ? event.composedPath() : [];
240
- if (elements.some((element) => path.includes(element))) return true;
241
- const target = event.target;
242
- 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;
243
454
  }
244
- function onDocumentPointerdown(event) {
245
- if (!touchPinned || isEventInside(event)) return;
246
- touchPinned = false;
247
- closeImmediately("outside", event);
455
+ function clearCloseTimer() {
456
+ if (closeTimer === void 0) return;
457
+ clearTimeout(closeTimer);
458
+ closeTimer = void 0;
248
459
  }
249
- function setDocumentListeners(active) {
250
- if (typeof document === "undefined" || active === documentListenersActive) return;
251
- documentListenersActive = active;
252
- const method = active ? "addEventListener" : "removeEventListener";
253
- document[method]("keydown", onKeydown);
254
- document[method]("pointerdown", onDocumentPointerdown, true);
460
+ function clearTimers() {
461
+ clearOpenTimer();
462
+ clearCloseTimer();
255
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;
256
517
  function syncInteractionTarget() {
257
- resolvedInteractionTarget.value = resolveInteractionTarget(toValue(options.interactionTarget));
518
+ targets.resolvedInteractionTarget.value = resolveInteractionTarget(toValue(options.interactionTarget));
258
519
  }
259
520
  function syncContentTarget() {
260
- resolvedContentTarget.value = resolveContentTarget(toValue(options.contentTarget));
261
- }
262
- function bindTriggerTarget(target, cleanup) {
263
- triggerElement = target;
264
- target.addEventListener("pointerenter", onTriggerPointerenter);
265
- target.addEventListener("pointerleave", onTriggerPointerleave);
266
- target.addEventListener("pointerdown", onTriggerPointerdown);
267
- target.addEventListener("pointerup", onTriggerPointerup);
268
- target.addEventListener("pointercancel", onTriggerPointercancel);
269
- target.addEventListener("click", onTriggerClick);
270
- target.addEventListener("focusin", onTriggerFocusin);
271
- target.addEventListener("focusout", onTriggerFocusout);
272
- target.addEventListener("keydown", onKeydown);
273
- cleanup(() => {
274
- target.removeEventListener("pointerenter", onTriggerPointerenter);
275
- target.removeEventListener("pointerleave", onTriggerPointerleave);
276
- target.removeEventListener("pointerdown", onTriggerPointerdown);
277
- target.removeEventListener("pointerup", onTriggerPointerup);
278
- target.removeEventListener("pointercancel", onTriggerPointercancel);
279
- target.removeEventListener("click", onTriggerClick);
280
- target.removeEventListener("focusin", onTriggerFocusin);
281
- target.removeEventListener("focusout", onTriggerFocusout);
282
- target.removeEventListener("keydown", onKeydown);
283
- if (triggerElement === target) triggerElement = null;
284
- triggerHovered = false;
285
- triggerFocused = false;
286
- scheduleClose("hover");
287
- });
521
+ targets.resolvedContentTarget.value = resolveContentTarget(toValue(options.contentTarget));
522
+ }
523
+ function syncTargets() {
524
+ syncInteractionTarget();
525
+ syncContentTarget();
288
526
  }
289
- function bindContentTarget(target, cleanup) {
290
- contentElement = target;
291
- target.addEventListener("pointerenter", onContentPointerenter);
292
- target.addEventListener("pointerleave", onContentPointerleave);
293
- target.addEventListener("pointerdown", onContentPointerdown);
294
- target.addEventListener("focusin", onContentFocusin);
295
- target.addEventListener("focusout", onContentFocusout);
296
- target.addEventListener("keydown", onKeydown);
527
+ function bindTarget(part, target, listeners, cleanup) {
528
+ setCurrentTarget(part, target);
529
+ for (const [type, listener] of listeners) target.addEventListener(type, listener);
297
530
  cleanup(() => {
298
- target.removeEventListener("pointerenter", onContentPointerenter);
299
- target.removeEventListener("pointerleave", onContentPointerleave);
300
- target.removeEventListener("pointerdown", onContentPointerdown);
301
- target.removeEventListener("focusin", onContentFocusin);
302
- target.removeEventListener("focusout", onContentFocusout);
303
- target.removeEventListener("keydown", onKeydown);
304
- if (contentElement === target) contentElement = null;
305
- contentHovered = false;
306
- contentFocused = false;
307
- scheduleClose("hover");
531
+ for (const [type, listener] of listeners) target.removeEventListener(type, listener);
532
+ clearCurrentTarget(part, target);
533
+ adapter.onTargetDetached(part);
308
534
  });
309
535
  }
310
- const triggerProps = computed(() => ({
311
- "data-state": state.value,
312
- onPointerenter: onTriggerPointerenter,
313
- onPointerleave: onTriggerPointerleave,
314
- onPointerdown: onTriggerPointerdown,
315
- onPointerup: onTriggerPointerup,
316
- onPointercancel: onTriggerPointercancel,
317
- onClick: onTriggerClick,
318
- onFocusin: onTriggerFocusin,
319
- onFocusout: onTriggerFocusout,
320
- onKeydown
321
- }));
322
- const contentProps = computed(() => ({
323
- "data-state": state.value,
324
- onPointerenter: onContentPointerenter,
325
- onPointerleave: onContentPointerleave,
326
- onPointerdown: onContentPointerdown,
327
- onFocusin: onContentFocusin,
328
- onFocusout: onContentFocusout,
329
- onKeydown
330
- }));
331
- watch(openState, (value) => {
332
- requestedOpen = value;
333
- if (!value) {
334
- contentHovered = false;
335
- contentFocused = false;
336
- contentElement = null;
337
- 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;
338
556
  }
339
- }, { flush: "sync" });
340
- watch(isDisabled, (disabled) => {
341
- if (!disabled) return;
342
- triggerHovered = false;
343
- contentHovered = false;
344
- triggerFocused = false;
345
- contentFocused = false;
346
- touchPinned = false;
347
- touchPointerActive = false;
348
- touchClickPending = false;
349
- closeImmediately("disabled");
350
- });
351
- watch(() => getTouchBehavior(), (behavior) => {
352
- if (behavior === "toggle" || !touchPinned) return;
353
- touchPinned = false;
354
- closeImmediately("touch");
355
- });
557
+ document.removeEventListener("keydown", adapter.onDocumentKeydown);
558
+ document.removeEventListener("pointerdown", onDocumentPointerdown, true);
559
+ }
356
560
  watch(() => toValue(options.interactionTarget), syncInteractionTarget, {
357
561
  flush: "post",
358
562
  immediate: true
@@ -361,42 +565,79 @@ function useHoverDisclosure(options = {}) {
361
565
  flush: "post",
362
566
  immediate: true
363
567
  });
364
- watch(resolvedInteractionTarget, (target, _previous, cleanup) => {
365
- if (target) bindTriggerTarget(target, cleanup);
568
+ watch(targets.resolvedInteractionTarget, (target, _previous, cleanup) => {
569
+ if (target) bindTarget("trigger", target, adapter.triggerListeners, cleanup);
366
570
  }, {
367
571
  flush: "sync",
368
572
  immediate: true
369
573
  });
370
- watch(resolvedContentTarget, (target, _previous, cleanup) => {
371
- if (target) bindContentTarget(target, cleanup);
574
+ watch(targets.resolvedContentTarget, (target, _previous, cleanup) => {
575
+ if (target) bindTarget("content", target, adapter.contentListeners, cleanup);
372
576
  }, {
373
577
  flush: "sync",
374
578
  immediate: true
375
579
  });
376
580
  watch(isOpen, setDocumentListeners, { flush: "sync" });
377
- watch(isOpen, () => {
378
- syncInteractionTarget();
379
- syncContentTarget();
380
- }, { flush: "post" });
581
+ watch(isOpen, syncTargets, { flush: "post" });
381
582
  onMounted(() => {
382
- syncInteractionTarget();
383
- syncContentTarget();
583
+ syncTargets();
384
584
  setDocumentListeners(isOpen.value);
385
585
  });
386
- onBeforeUnmount(() => {
387
- disposed = true;
388
- clearTimers();
389
- 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
390
631
  });
391
632
  return {
392
- isOpen,
393
- isDisabled,
394
- state,
633
+ isOpen: openState.isOpen,
634
+ isDisabled: openState.isDisabled,
635
+ state: openState.state,
395
636
  triggerProps,
396
637
  contentProps,
397
- open,
398
- close,
399
- toggle
638
+ open: openState.open,
639
+ close: openState.close,
640
+ toggle: openState.toggle
400
641
  };
401
642
  }
402
643
  //#endregion