ropav 0.1.7 → 0.1.8

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 (153) hide show
  1. package/README.md +1 -1
  2. package/dist/ancestry.js +136 -0
  3. package/dist/calendar.css +173 -0
  4. package/dist/calendar.js +714 -0
  5. package/dist/calendar2.js +37 -0
  6. package/dist/chevron-left.js +12 -0
  7. package/dist/color-picker.js +38 -88
  8. package/dist/combobox.css +251 -0
  9. package/dist/combobox.js +410 -0
  10. package/dist/components/calendar/calendar.d.ts +30 -0
  11. package/dist/components/calendar/calendarBehavior.d.ts +49 -0
  12. package/dist/components/calendar/index.d.ts +3 -0
  13. package/dist/components/calendar/index.js +3 -0
  14. package/dist/components/calendar/types.d.ts +53 -0
  15. package/dist/components/calendar/useCalendar.d.ts +24 -0
  16. package/dist/components/color-picker/useColorPickerDrag.d.ts +1 -1
  17. package/dist/components/color-picker/useColorPickerSaturation.d.ts +1 -1
  18. package/dist/components/color-picker/useColorPickerSlider.d.ts +1 -1
  19. package/dist/components/combobox/combobox.d.ts +29 -0
  20. package/dist/components/combobox/comboboxModel.d.ts +4 -0
  21. package/dist/components/combobox/index.d.ts +3 -0
  22. package/dist/components/combobox/index.js +2 -0
  23. package/dist/components/combobox/types.d.ts +43 -0
  24. package/dist/components/combobox/useCombobox.d.ts +45 -0
  25. package/dist/components/date-picker/date-picker.d.ts +33 -0
  26. package/dist/components/date-picker/datePickerModel.d.ts +10 -0
  27. package/dist/components/date-picker/index.d.ts +4 -0
  28. package/dist/components/date-picker/index.js +2 -0
  29. package/dist/components/date-picker/types.d.ts +57 -0
  30. package/dist/components/date-picker/useDatePicker.d.ts +29 -0
  31. package/dist/components/date-picker/useDatePickerValueState.d.ts +21 -0
  32. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +2 -2
  33. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
  34. package/dist/components/dropdown-menu/dropdown-menu.d.ts +2 -2
  35. package/dist/components/dropdown-menu/dropdownMenuContext.d.ts +7 -18
  36. package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -3
  37. package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +58 -29
  38. package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +4 -3
  39. package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +6 -4
  40. package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +3 -4
  41. package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +5 -5
  42. package/dist/components/dropzone/dropzone.d.ts +31 -0
  43. package/dist/components/dropzone/dropzoneModel.d.ts +16 -0
  44. package/dist/components/dropzone/index.d.ts +3 -0
  45. package/dist/components/dropzone/index.js +2 -0
  46. package/dist/components/dropzone/types.d.ts +56 -0
  47. package/dist/components/dropzone/useDropzone.d.ts +25 -0
  48. package/dist/components/file-input/file-input.d.ts +29 -0
  49. package/dist/components/file-input/index.d.ts +3 -0
  50. package/dist/components/file-input/index.js +2 -0
  51. package/dist/components/file-input/types.d.ts +37 -0
  52. package/dist/components/file-input/useFileInput.d.ts +15 -0
  53. package/dist/components/floating/index.js +1 -1
  54. package/dist/components/floating/useFloatingPosition.d.ts +1 -13
  55. package/dist/components/floating/useFloatingTargetLifecycle.d.ts +32 -0
  56. package/dist/components/floating/useHoverDisclosure.d.ts +10 -0
  57. package/dist/components/hover-card/hover-card.d.ts +25 -0
  58. package/dist/components/hover-card/index.d.ts +3 -0
  59. package/dist/components/hover-card/index.js +2 -0
  60. package/dist/components/hover-card/types.d.ts +45 -0
  61. package/dist/components/hover-card/useHoverCard.d.ts +22 -0
  62. package/dist/components/hover-card/useHoverCardDisclosure.d.ts +19 -0
  63. package/dist/components/multi-select/index.d.ts +3 -0
  64. package/dist/components/multi-select/index.js +2 -0
  65. package/dist/components/multi-select/multi-select.d.ts +30 -0
  66. package/dist/components/multi-select/multiSelectModel.d.ts +3 -0
  67. package/dist/components/multi-select/types.d.ts +49 -0
  68. package/dist/components/multi-select/useMultiSelect.d.ts +46 -0
  69. package/dist/components/number-input/useNumberInput.d.ts +1 -3
  70. package/dist/components/popover/usePopoverBindings.d.ts +3 -6
  71. package/dist/components/scroll-area/useScrollArea.d.ts +4 -4
  72. package/dist/components/scroll-area/useScrollAreaAttributes.d.ts +3 -3
  73. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +1 -1
  74. package/dist/components/segmented-control/index.d.ts +3 -0
  75. package/dist/components/segmented-control/index.js +2 -0
  76. package/dist/components/segmented-control/segmented-control.d.ts +26 -0
  77. package/dist/components/segmented-control/types.d.ts +47 -0
  78. package/dist/components/segmented-control/useSegmentedControl.d.ts +15 -0
  79. package/dist/components/select/useSelect.d.ts +31 -19
  80. package/dist/components/slider/useRangeSlider.d.ts +1 -1
  81. package/dist/components/slider/useRangeSliderPointer.d.ts +1 -1
  82. package/dist/components/tags-input/index.d.ts +3 -0
  83. package/dist/components/tags-input/index.js +2 -0
  84. package/dist/components/tags-input/tags-input.d.ts +27 -0
  85. package/dist/components/tags-input/tagsInputModel.d.ts +12 -0
  86. package/dist/components/tags-input/types.d.ts +37 -0
  87. package/dist/components/tags-input/useTagsInput.d.ts +23 -0
  88. package/dist/components/tooltip/useTooltipTargetBindings.d.ts +12 -0
  89. package/dist/date-picker.css +49 -0
  90. package/dist/date-picker.js +809 -0
  91. package/dist/dialog.js +9 -20
  92. package/dist/direction.js +6 -0
  93. package/dist/dropdown-menu.css +21 -3
  94. package/dist/dropdown-menu.js +341 -261
  95. package/dist/dropzone.css +135 -0
  96. package/dist/dropzone.js +431 -0
  97. package/dist/file-input.css +135 -0
  98. package/dist/file-input.js +198 -0
  99. package/dist/hover-card.css +80 -0
  100. package/dist/hover-card.js +402 -0
  101. package/dist/index.d.ts +9 -0
  102. package/dist/index.js +14 -3
  103. package/dist/internal/composables/useOverlayLayer.d.ts +12 -0
  104. package/dist/modal.js +1 -1
  105. package/dist/multi-select.css +316 -0
  106. package/dist/multi-select.js +481 -0
  107. package/dist/nativeChoice.js +169 -0
  108. package/dist/number-input.css +18 -18
  109. package/dist/number-input.js +36 -38
  110. package/dist/pagination.js +1 -10
  111. package/dist/pointerSession.js +130 -0
  112. package/dist/popover.css +21 -3
  113. package/dist/popover.js +37 -62
  114. package/dist/scroll-area.js +52 -62
  115. package/dist/segmented-control.css +176 -0
  116. package/dist/segmented-control.js +382 -0
  117. package/dist/select.css +50 -48
  118. package/dist/select.js +121 -271
  119. package/dist/slider.js +70 -129
  120. package/dist/tags-input.css +197 -0
  121. package/dist/tags-input.js +380 -0
  122. package/dist/tooltip.js +35 -30
  123. package/dist/useEditableOptionList.js +216 -0
  124. package/dist/useFlatOptionCollection.js +134 -0
  125. package/dist/useFloatingPosition.js +4 -160
  126. package/dist/useFloatingTargetLifecycle.js +127 -0
  127. package/dist/useFormControl.js +1 -0
  128. package/dist/{floating.js → useHoverDisclosure.js} +338 -421
  129. package/dist/useNativeChoiceTransaction.js +46 -0
  130. package/dist/useNativeFileSelection.js +86 -0
  131. package/dist/useOverlayZIndex.js +246 -15
  132. package/dist/utils/date.d.ts +13 -0
  133. package/dist/utils/dateAvailability.d.ts +7 -0
  134. package/dist/utils/dom/ancestry.d.ts +1 -0
  135. package/dist/utils/dom/direction.d.ts +2 -0
  136. package/dist/utils/dom/files.d.ts +3 -0
  137. package/dist/utils/dom/nativeChoice.d.ts +17 -0
  138. package/dist/utils/dom/pointerSession.d.ts +20 -0
  139. package/dist/utils/dom/scroll.d.ts +2 -1
  140. package/dist/utils/optionFilter.d.ts +5 -0
  141. package/docs/public-floating-api.md +7 -4
  142. package/docs/public-styles-api.md +25 -12
  143. package/package.json +39 -3
  144. package/src/styles/_mixins.scss +26 -0
  145. package/src/styles/styles-manifest.json +1 -2
  146. package/dist/components/floating/hoverDisclosureInteractionModel.d.ts +0 -42
  147. package/dist/components/floating/useHoverDisclosureInteractions.d.ts +0 -32
  148. package/dist/components/floating/useHoverDisclosureOpenState.d.ts +0 -25
  149. package/dist/components/floating/useHoverDisclosureTargetBinding.d.ts +0 -27
  150. package/dist/components/select/useSelectNativeControl.d.ts +0 -9
  151. package/dist/components/select/useSelectNativeValue.d.ts +0 -9
  152. package/dist/pointer.js +0 -9
  153. package/dist/utils/dom/pointer.d.ts +0 -2
@@ -1,52 +1,57 @@
1
1
  import { t as useControllableValue } from "./useControllableValue.js";
2
- import { i as querySelectorSafe, t as isElement } from "./query.js";
2
+ import { t as isElement } from "./query.js";
3
3
  import { r as normalizeDelay } from "./number.js";
4
- import { i as isNodeWithinElement, r as isEventWithinTargets } from "./events.js";
4
+ import { i as isNodeWithinElement, n as isEventWithinElement, r as isEventWithinTargets } from "./events.js";
5
+ import { t as useFloatingTargetLifecycle } from "./useFloatingTargetLifecycle.js";
5
6
  import { computed, onBeforeUnmount, onMounted, shallowRef, toValue, watch } from "vue";
6
- //#region src/components/floating/hoverDisclosureInteractionModel.ts
7
- function createHoverDisclosureInteractionModel() {
8
- let state = createInteractionState();
7
+ //#region src/components/floating/useHoverDisclosure.ts
8
+ var DEFAULT_OPEN_DELAY = 0;
9
+ var DEFAULT_CLOSE_DELAY = 0;
10
+ var TOUCH_CLICK_EXPIRY_DELAY = 500;
11
+ function useHoverDisclosure(options = {}) {
12
+ return useHoverDisclosureImplementation(options).disclosure;
13
+ }
14
+ function useHoverDisclosureWithExternalDismissal(options) {
15
+ return useHoverDisclosureImplementation(options, true);
16
+ }
17
+ function useHoverDisclosureImplementation(options, dismissalRouted = false) {
18
+ const interaction = createInteractionState();
19
+ const targets = createTargetState();
20
+ const commands = useHoverDisclosureOpenState(options, interaction, () => {
21
+ targets.contentElement = null;
22
+ });
23
+ const runtime = useHoverDisclosureInteractions({
24
+ commands,
25
+ dismissalRouted,
26
+ interaction,
27
+ options,
28
+ state: commands.state,
29
+ targets
30
+ });
31
+ useHoverDisclosureTargetBinding({
32
+ commands,
33
+ options,
34
+ runtime,
35
+ targets,
36
+ useDocumentDismissal: !dismissalRouted
37
+ });
9
38
  return {
10
- read: () => state,
11
- send(action) {
12
- state = reduceHoverDisclosureInteraction(state, action);
13
- return state;
39
+ disclosure: {
40
+ isOpen: commands.isOpen,
41
+ isDisabled: commands.isDisabled,
42
+ state: commands.state,
43
+ triggerProps: runtime.triggerProps,
44
+ contentProps: runtime.contentProps,
45
+ open: commands.open,
46
+ close: commands.close,
47
+ toggle: commands.toggle
48
+ },
49
+ dismissalHandlers: {
50
+ escapeKeyDown: runtime.onDocumentKeydown,
51
+ pointerDownOutside: runtime.onOutsidePointerdown
14
52
  }
15
53
  };
16
54
  }
17
- function hasActiveHoverDisclosureInteraction(state) {
18
- return state.triggerHovered || state.contentHovered || state.triggerFocused || state.contentFocused || state.touchPinned;
19
- }
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
- }
49
- }
50
55
  function createInteractionState() {
51
56
  return {
52
57
  contentFocused: false,
@@ -58,40 +63,214 @@ function createInteractionState() {
58
63
  triggerHovered: false
59
64
  };
60
65
  }
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
- };
66
+ function createTargetState() {
74
67
  return {
75
- ...state,
76
- contentFocused: active
68
+ contentElement: null,
69
+ resolvedContentTarget: shallowRef(null),
70
+ resolvedInteractionTarget: shallowRef(null),
71
+ triggerElement: null
77
72
  };
78
73
  }
74
+ function hasActiveInteraction(state) {
75
+ return state.triggerHovered || state.contentHovered || state.triggerFocused || state.contentFocused || state.touchPinned;
76
+ }
77
+ function hasPendingTouchInteraction(state) {
78
+ return state.touchPointerActive || state.touchClickPending;
79
+ }
80
+ function setPartInteraction(state, part, kind, active) {
81
+ if (part === "trigger" && kind === "hover") {
82
+ state.triggerHovered = active;
83
+ return;
84
+ }
85
+ if (part === "trigger") {
86
+ state.triggerFocused = active;
87
+ return;
88
+ }
89
+ if (kind === "hover") {
90
+ state.contentHovered = active;
91
+ return;
92
+ }
93
+ state.contentFocused = active;
94
+ }
79
95
  function resetInteraction(state, part) {
80
- if (part === "all") return createInteractionState();
81
- if (part === "trigger") return {
82
- ...state,
83
- triggerFocused: false,
84
- triggerHovered: false
85
- };
96
+ if (part === "all" || part === "trigger") {
97
+ state.triggerFocused = false;
98
+ state.triggerHovered = false;
99
+ }
100
+ if (part === "all" || part === "content") {
101
+ state.contentFocused = false;
102
+ state.contentHovered = false;
103
+ }
104
+ if (part === "all") {
105
+ state.touchClickPending = false;
106
+ state.touchPinned = false;
107
+ state.touchPointerActive = false;
108
+ }
109
+ }
110
+ function useHoverDisclosureOpenState(options, interaction, onContentClosed) {
111
+ const controlledOpen = computed(() => toValue(options.open));
112
+ const isDisabled = computed(() => Boolean(toValue(options.disabled)));
113
+ let pendingChangeDetails;
114
+ const controllableOpen = useControllableValue({
115
+ modelValue: () => controlledOpen.value,
116
+ defaultValue: () => options.defaultOpen === true && !isDisabled.value,
117
+ onChange: (nextOpen) => {
118
+ if (pendingChangeDetails) options.onOpenChange?.(nextOpen, pendingChangeDetails);
119
+ }
120
+ });
121
+ const openState = controllableOpen.value;
122
+ const isOpen = computed(() => !isDisabled.value && openState.value);
123
+ const state = computed(() => isOpen.value ? "open" : "closed");
124
+ let requestedOpen = openState.value;
125
+ let openTimer;
126
+ let closeTimer;
127
+ let disposed = false;
128
+ function request(change) {
129
+ if (change.open) requestOpen(change);
130
+ else requestClose(change);
131
+ }
132
+ function requestOpen(change) {
133
+ if (change.timing === "immediate") {
134
+ clearTimers();
135
+ setOpen(true, change.reason, change.event);
136
+ return;
137
+ }
138
+ if (disposed || isDisabled.value) return;
139
+ clearCloseTimer();
140
+ clearOpenTimer();
141
+ if (requestedOpen) return;
142
+ const delay = normalizeDelay(toValue(options.openDelay), DEFAULT_OPEN_DELAY);
143
+ if (delay === 0) {
144
+ setOpen(true, change.reason, change.event);
145
+ return;
146
+ }
147
+ openTimer = setTimeout(() => {
148
+ openTimer = void 0;
149
+ if (!interaction.triggerHovered || isDisabled.value) return;
150
+ setOpen(true, change.reason, change.event);
151
+ }, delay);
152
+ }
153
+ function requestClose(change) {
154
+ if (change.timing === "immediate") {
155
+ clearTimers();
156
+ setOpen(false, change.reason, change.event);
157
+ return;
158
+ }
159
+ clearOpenTimer();
160
+ clearCloseTimer();
161
+ if (disposed || hasActiveInteraction(interaction)) return;
162
+ closeTimer = setTimeout(() => {
163
+ closeTimer = void 0;
164
+ if (hasActiveInteraction(interaction)) return;
165
+ setOpen(false, change.reason, change.event);
166
+ }, normalizeDelay(toValue(options.closeDelay), DEFAULT_CLOSE_DELAY));
167
+ }
168
+ function setOpen(nextOpen, reason, event) {
169
+ if (disposed || nextOpen && isDisabled.value || requestedOpen === nextOpen) return;
170
+ requestedOpen = nextOpen;
171
+ pendingChangeDetails = {
172
+ reason,
173
+ event
174
+ };
175
+ try {
176
+ controllableOpen.setValue(nextOpen);
177
+ } finally {
178
+ pendingChangeDetails = void 0;
179
+ }
180
+ }
181
+ function cancelScheduledClose() {
182
+ clearCloseTimer();
183
+ }
184
+ function isRequestedOpen() {
185
+ return requestedOpen;
186
+ }
187
+ function open() {
188
+ request({
189
+ open: true,
190
+ reason: "programmatic",
191
+ timing: "immediate"
192
+ });
193
+ }
194
+ function close() {
195
+ interaction.touchPinned = false;
196
+ request({
197
+ open: false,
198
+ reason: "programmatic",
199
+ timing: "immediate"
200
+ });
201
+ }
202
+ function toggle() {
203
+ if (requestedOpen || isOpen.value) close();
204
+ else open();
205
+ }
206
+ function clearOpenTimer() {
207
+ if (openTimer === void 0) return;
208
+ clearTimeout(openTimer);
209
+ openTimer = void 0;
210
+ }
211
+ function clearCloseTimer() {
212
+ if (closeTimer === void 0) return;
213
+ clearTimeout(closeTimer);
214
+ closeTimer = void 0;
215
+ }
216
+ function clearTimers() {
217
+ clearOpenTimer();
218
+ clearCloseTimer();
219
+ }
220
+ watch([openState, controllableOpen.isControlled], ([value]) => {
221
+ requestedOpen = value;
222
+ if (value) return;
223
+ resetInteraction(interaction, "content");
224
+ interaction.touchPinned = false;
225
+ onContentClosed();
226
+ }, { flush: "sync" });
227
+ watch(isDisabled, (disabled) => {
228
+ if (!disabled) return;
229
+ resetInteraction(interaction, "all");
230
+ request({
231
+ open: false,
232
+ reason: "disabled",
233
+ timing: "immediate"
234
+ });
235
+ });
236
+ onBeforeUnmount(() => {
237
+ disposed = true;
238
+ clearTimers();
239
+ });
86
240
  return {
87
- ...state,
88
- contentFocused: false,
89
- contentHovered: false
241
+ cancelScheduledClose,
242
+ close,
243
+ isDisabled,
244
+ isOpen,
245
+ isRequestedOpen,
246
+ open,
247
+ request,
248
+ state,
249
+ toggle
90
250
  };
91
251
  }
92
- //#endregion
93
- //#region src/components/floating/useHoverDisclosureInteractions.ts
94
- function useHoverDisclosureInteractions({ commands, interaction, options, state, targets }) {
252
+ function useHoverDisclosureInteractions({ commands, dismissalRouted, interaction, options, state, targets }) {
253
+ let touchClickExpiryTimer;
254
+ function clearTouchClickExpiryTimer() {
255
+ if (touchClickExpiryTimer === void 0) return;
256
+ clearTimeout(touchClickExpiryTimer);
257
+ touchClickExpiryTimer = void 0;
258
+ }
259
+ function clearPendingTouchClick() {
260
+ clearTouchClickExpiryTimer();
261
+ interaction.touchClickPending = false;
262
+ }
263
+ function scheduleTouchClickExpiry() {
264
+ clearTouchClickExpiryTimer();
265
+ touchClickExpiryTimer = setTimeout(() => {
266
+ touchClickExpiryTimer = void 0;
267
+ interaction.touchClickPending = false;
268
+ }, TOUCH_CLICK_EXPIRY_DELAY);
269
+ }
270
+ function originatesInContent(event) {
271
+ const contentTarget = targets.resolvedContentTarget.value;
272
+ return contentTarget !== null && contentTarget !== targets.resolvedInteractionTarget.value && isEventWithinElement(event, contentTarget);
273
+ }
95
274
  function rememberTarget(part, event) {
96
275
  const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
97
276
  if (part === "trigger") {
@@ -103,146 +282,112 @@ function useHoverDisclosureInteractions({ commands, interaction, options, state,
103
282
  function onTriggerPointerenter(event) {
104
283
  rememberTarget("trigger", event);
105
284
  if (event.pointerType === "touch" || commands.isDisabled.value) return;
106
- interaction.send({
107
- type: "hover",
108
- part: "trigger",
109
- active: true
110
- });
285
+ setPartInteraction(interaction, "trigger", "hover", true);
111
286
  requestOpen("hover", event, "delayed");
112
287
  }
113
288
  function onTriggerPointerleave(event) {
114
289
  rememberTarget("trigger", event);
115
290
  if (event.pointerType === "touch") return;
116
- interaction.send({
117
- type: "hover",
118
- part: "trigger",
119
- active: false
120
- });
291
+ setPartInteraction(interaction, "trigger", "hover", false);
121
292
  requestClose("hover", event, "delayed");
122
293
  }
123
294
  function onContentPointerenter(event) {
124
295
  rememberTarget("content", event);
125
296
  if (event.pointerType === "touch" || commands.isDisabled.value) return;
126
- interaction.send({
127
- type: "hover",
128
- part: "content",
129
- active: true
130
- });
297
+ setPartInteraction(interaction, "content", "hover", true);
131
298
  commands.cancelScheduledClose();
132
299
  }
133
300
  function onContentPointerleave(event) {
134
301
  rememberTarget("content", event);
135
302
  if (event.pointerType === "touch") return;
136
- interaction.send({
137
- type: "hover",
138
- part: "content",
139
- active: false
140
- });
303
+ setPartInteraction(interaction, "content", "hover", false);
141
304
  requestClose("hover", event, "delayed");
142
305
  }
143
306
  function onTriggerFocusin(event) {
144
307
  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
- });
308
+ if (commands.isDisabled.value || toValue(options.openOnFocus) === false || hasPendingTouchInteraction(interaction)) return;
309
+ setPartInteraction(interaction, "trigger", "focus", true);
151
310
  requestOpen("focus", event, "immediate");
152
311
  }
153
312
  function onTriggerFocusout(event) {
154
313
  rememberTarget("trigger", event);
155
314
  if (!focusLeavesCurrentTarget(event)) return;
156
- interaction.send({
157
- type: "focus",
158
- part: "trigger",
159
- active: false
160
- });
315
+ setPartInteraction(interaction, "trigger", "focus", false);
161
316
  requestClose("focus", event, "delayed");
162
317
  }
163
318
  function onContentFocusin(event) {
164
319
  rememberTarget("content", event);
165
320
  if (commands.isDisabled.value) return;
166
- interaction.send({
167
- type: "focus",
168
- part: "content",
169
- active: true
170
- });
321
+ setPartInteraction(interaction, "content", "focus", true);
171
322
  commands.cancelScheduledClose();
172
323
  }
173
324
  function onContentFocusout(event) {
174
325
  rememberTarget("content", event);
175
326
  if (!focusLeavesCurrentTarget(event)) return;
176
- interaction.send({
177
- type: "focus",
178
- part: "content",
179
- active: false
180
- });
327
+ setPartInteraction(interaction, "content", "focus", false);
181
328
  requestClose("focus", event, "delayed");
182
329
  }
183
330
  function onTriggerPointerdown(event) {
331
+ if (originatesInContent(event)) return;
184
332
  rememberTarget("trigger", event);
185
- interaction.send({
186
- type: "pointer-down",
187
- touch: event.pointerType === "touch"
188
- });
333
+ clearPendingTouchClick();
334
+ interaction.touchPointerActive = event.pointerType === "touch";
189
335
  }
190
336
  function onTriggerPointerup(event) {
337
+ if (originatesInContent(event)) return;
191
338
  rememberTarget("trigger", event);
192
- interaction.send({
193
- type: "pointer-up",
194
- touch: event.pointerType === "touch"
195
- });
339
+ interaction.touchClickPending = event.pointerType === "touch" && interaction.touchPointerActive;
340
+ interaction.touchPointerActive = false;
341
+ if (interaction.touchClickPending) scheduleTouchClickExpiry();
196
342
  }
197
343
  function onTriggerPointercancel(event) {
344
+ if (originatesInContent(event)) return;
198
345
  rememberTarget("trigger", event);
199
- interaction.send({ type: "pointer-cancel" });
346
+ clearTouchClickExpiryTimer();
347
+ interaction.touchClickPending = false;
348
+ interaction.touchPointerActive = false;
200
349
  }
201
350
  function onTriggerClick(event) {
351
+ if (originatesInContent(event)) return;
202
352
  rememberTarget("trigger", event);
203
- const interactionState = interaction.read();
204
- if (!interactionState.touchClickPending) return;
205
- interaction.send({ type: "consume-touch-click" });
353
+ clearTouchClickExpiryTimer();
354
+ if (!interaction.touchClickPending) return;
355
+ interaction.touchClickPending = false;
206
356
  if (getTouchBehavior() !== "toggle" || commands.isDisabled.value) return;
207
357
  event.preventDefault();
208
- if (interactionState.touchPinned || commands.isRequestedOpen()) {
209
- interaction.send({
210
- type: "set-touch-pinned",
211
- pinned: false
212
- });
358
+ if (interaction.touchPinned || commands.isRequestedOpen()) {
359
+ interaction.touchPinned = false;
213
360
  requestClose("touch", event, "immediate");
214
361
  return;
215
362
  }
216
- interaction.send({
217
- type: "set-touch-pinned",
218
- pinned: true
219
- });
363
+ interaction.touchPinned = true;
220
364
  requestOpen("touch", event, "immediate");
221
365
  }
222
366
  function onContentPointerdown(event) {
223
367
  rememberTarget("content", event);
224
368
  }
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
- });
369
+ function requestEscapeClose(event) {
370
+ if (event.key !== "Escape" || toValue(options.closeOnEscape) === false || !commands.isOpen.value) return false;
371
+ interaction.touchPinned = false;
231
372
  requestClose("escape", event, "immediate");
373
+ return true;
374
+ }
375
+ function onKeydown(event) {
376
+ if (dismissalRouted || !requestEscapeClose(event)) return;
377
+ event.stopPropagation();
378
+ }
379
+ function onDocumentKeydown(event) {
380
+ requestEscapeClose(event);
232
381
  }
233
382
  function onOutsidePointerdown(event) {
234
- if (!interaction.read().touchPinned) return;
235
- interaction.send({
236
- type: "set-touch-pinned",
237
- pinned: false
238
- });
383
+ if (!interaction.touchPinned) return;
384
+ interaction.touchPinned = false;
239
385
  requestClose("outside", event, "immediate");
240
386
  }
241
387
  function onTargetDetached(part) {
242
- interaction.send({
243
- type: "reset",
244
- part
245
- });
388
+ clearPendingTouchClick();
389
+ if (part === "trigger") interaction.touchPointerActive = false;
390
+ resetInteraction(interaction, part);
246
391
  requestClose("hover", void 0, "delayed");
247
392
  }
248
393
  function requestOpen(reason, event, timing) {
@@ -286,23 +431,19 @@ function useHoverDisclosureInteractions({ commands, interaction, options, state,
286
431
  }
287
432
  });
288
433
  watch(() => getTouchBehavior(), (behavior) => {
289
- if (behavior === "toggle" || !interaction.read().touchPinned) return;
290
- interaction.send({
291
- type: "set-touch-pinned",
292
- pinned: false
293
- });
434
+ if (behavior === "toggle" || !interaction.touchPinned) return;
435
+ interaction.touchPinned = false;
294
436
  requestClose("touch", void 0, "immediate");
295
437
  });
438
+ onBeforeUnmount(clearTouchClickExpiryTimer);
296
439
  return {
297
- bindingAdapter: {
298
- contentListeners: presentation.contentListeners,
299
- isOutsideDismissalActive: () => interaction.read().touchPinned,
300
- onDocumentKeydown: onKeydown,
301
- onOutsidePointerdown,
302
- onTargetDetached,
303
- triggerListeners: presentation.triggerListeners
304
- },
440
+ contentListeners: presentation.contentListeners,
305
441
  contentProps: presentation.contentProps,
442
+ isOutsideDismissalActive: () => interaction.touchPinned,
443
+ onDocumentKeydown,
444
+ onOutsidePointerdown,
445
+ onTargetDetached,
446
+ triggerListeners: presentation.triggerListeners,
306
447
  triggerProps: presentation.triggerProps
307
448
  };
308
449
  }
@@ -344,195 +485,8 @@ function focusLeavesCurrentTarget(event) {
344
485
  const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
345
486
  return !isNodeWithinElement(event.relatedTarget, currentTarget);
346
487
  }
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;
427
- }
428
- function open() {
429
- request({
430
- open: true,
431
- reason: "programmatic",
432
- timing: "immediate"
433
- });
434
- }
435
- function close() {
436
- interaction.send({
437
- type: "set-touch-pinned",
438
- pinned: false
439
- });
440
- request({
441
- open: false,
442
- reason: "programmatic",
443
- timing: "immediate"
444
- });
445
- }
446
- function toggle() {
447
- if (requestedOpen || isOpen.value) close();
448
- else open();
449
- }
450
- function clearOpenTimer() {
451
- if (openTimer === void 0) return;
452
- clearTimeout(openTimer);
453
- openTimer = void 0;
454
- }
455
- function clearCloseTimer() {
456
- if (closeTimer === void 0) return;
457
- clearTimeout(closeTimer);
458
- closeTimer = void 0;
459
- }
460
- function clearTimers() {
461
- clearOpenTimer();
462
- clearCloseTimer();
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 }) {
488
+ function useHoverDisclosureTargetBinding({ commands, options, runtime, targets, useDocumentDismissal }) {
516
489
  let documentListenersActive = false;
517
- function syncInteractionTarget() {
518
- targets.resolvedInteractionTarget.value = resolveInteractionTarget(toValue(options.interactionTarget));
519
- }
520
- function syncContentTarget() {
521
- targets.resolvedContentTarget.value = resolveContentTarget(toValue(options.contentTarget));
522
- }
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);
530
- cleanup(() => {
531
- for (const [type, listener] of listeners) target.removeEventListener(type, listener);
532
- clearCurrentTarget(part, target);
533
- adapter.onTargetDetached(part);
534
- });
535
- }
536
490
  function setCurrentTarget(part, target) {
537
491
  if (part === "trigger") targets.triggerElement = target;
538
492
  else targets.contentElement = target;
@@ -541,60 +495,59 @@ function useHoverDisclosureTargetBinding({ adapter, isOpen, options, targets })
541
495
  if (part === "trigger" && targets.triggerElement === target) targets.triggerElement = null;
542
496
  if (part === "content" && targets.contentElement === target) targets.contentElement = null;
543
497
  }
498
+ function connectTarget(part, target) {
499
+ setCurrentTarget(part, target);
500
+ return () => {
501
+ clearCurrentTarget(part, target);
502
+ runtime.onTargetDetached(part);
503
+ };
504
+ }
544
505
  function onDocumentPointerdown(event) {
545
- if (!adapter.isOutsideDismissalActive()) return;
506
+ if (!runtime.isOutsideDismissalActive()) return;
546
507
  if (isEventInsideTargets(event, targets)) return;
547
- adapter.onOutsidePointerdown(event);
508
+ runtime.onOutsidePointerdown(event);
548
509
  }
549
510
  function setDocumentListeners(active) {
550
- if (typeof document === "undefined" || active === documentListenersActive) return;
511
+ if (!useDocumentDismissal || typeof document === "undefined" || active === documentListenersActive) return;
551
512
  documentListenersActive = active;
552
513
  if (active) {
553
- document.addEventListener("keydown", adapter.onDocumentKeydown);
514
+ document.addEventListener("keydown", runtime.onDocumentKeydown);
554
515
  document.addEventListener("pointerdown", onDocumentPointerdown, true);
555
516
  return;
556
517
  }
557
- document.removeEventListener("keydown", adapter.onDocumentKeydown);
518
+ document.removeEventListener("keydown", runtime.onDocumentKeydown);
558
519
  document.removeEventListener("pointerdown", onDocumentPointerdown, true);
559
520
  }
560
- watch(() => toValue(options.interactionTarget), syncInteractionTarget, {
561
- flush: "post",
562
- immediate: true
521
+ const fallbackTarget = shallowRef(null);
522
+ const interactionTargetLifecycle = useFloatingTargetLifecycle({
523
+ target: () => toValue(options.interactionTarget),
524
+ fallback: fallbackTarget,
525
+ getTargetElement: (reference) => {
526
+ if (isElement(reference)) return reference;
527
+ return isElement(reference.contextElement) ? reference.contextElement : null;
528
+ }
563
529
  });
564
- watch(() => toValue(options.contentTarget), syncContentTarget, {
565
- flush: "post",
566
- immediate: true
530
+ const contentTargetLifecycle = useFloatingTargetLifecycle({
531
+ target: () => toValue(options.contentTarget),
532
+ fallback: fallbackTarget
567
533
  });
568
- watch(targets.resolvedInteractionTarget, (target, _previous, cleanup) => {
569
- if (target) bindTarget("trigger", target, adapter.triggerListeners, cleanup);
570
- }, {
571
- flush: "sync",
572
- immediate: true
534
+ targets.resolvedInteractionTarget = interactionTargetLifecycle.targetElement;
535
+ targets.resolvedContentTarget = contentTargetLifecycle.targetElement;
536
+ interactionTargetLifecycle.bindTarget({
537
+ connect: (target) => connectTarget("trigger", target),
538
+ listeners: runtime.triggerListeners
573
539
  });
574
- watch(targets.resolvedContentTarget, (target, _previous, cleanup) => {
575
- if (target) bindTarget("content", target, adapter.contentListeners, cleanup);
576
- }, {
577
- flush: "sync",
578
- immediate: true
540
+ contentTargetLifecycle.bindTarget({
541
+ connect: (target) => connectTarget("content", target),
542
+ listeners: runtime.contentListeners
579
543
  });
580
- watch(isOpen, setDocumentListeners, { flush: "sync" });
581
- watch(isOpen, syncTargets, { flush: "post" });
544
+ watch(commands.isOpen, setDocumentListeners, { flush: "sync" });
582
545
  onMounted(() => {
583
- syncTargets();
584
- setDocumentListeners(isOpen.value);
546
+ setDocumentListeners(commands.isOpen.value);
547
+ });
548
+ onBeforeUnmount(() => {
549
+ setDocumentListeners(false);
585
550
  });
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
551
  }
599
552
  function isEventInsideTargets(event, targets) {
600
553
  return isEventWithinTargets(event, [
@@ -605,40 +558,4 @@ function isEventInsideTargets(event, targets) {
605
558
  ].filter((element) => element !== null));
606
559
  }
607
560
  //#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
631
- });
632
- return {
633
- isOpen: openState.isOpen,
634
- isDisabled: openState.isDisabled,
635
- state: openState.state,
636
- triggerProps,
637
- contentProps,
638
- open: openState.open,
639
- close: openState.close,
640
- toggle: openState.toggle
641
- };
642
- }
643
- //#endregion
644
- export { useHoverDisclosure as t };
561
+ export { useHoverDisclosureWithExternalDismissal as n, useHoverDisclosure as t };