ropav 0.1.6 → 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 (310) hide show
  1. package/README.md +7 -1
  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/ancestry.js +136 -0
  7. package/dist/aria.js +14 -0
  8. package/dist/aspect-ratio.js +1 -1
  9. package/dist/attributes.js +9 -0
  10. package/dist/attributes2.js +29 -0
  11. package/dist/avatar.css +19 -19
  12. package/dist/avatar.js +9 -17
  13. package/dist/badge.css +16 -16
  14. package/dist/badge.js +5 -5
  15. package/dist/button-group.js +1 -1
  16. package/dist/button-link.js +4 -3
  17. package/dist/button.js +4 -3
  18. package/dist/button.scss_vue_type_style_index_0_src_true_lang.js +1 -1
  19. package/dist/calendar.css +173 -0
  20. package/dist/calendar.js +714 -0
  21. package/dist/calendar2.js +37 -0
  22. package/dist/card.js +1 -1
  23. package/dist/checkbox.css +32 -32
  24. package/dist/checkbox.js +22 -28
  25. package/dist/chevron-left.js +12 -0
  26. package/dist/collapse.css +6 -6
  27. package/dist/collapse.js +7 -6
  28. package/dist/collectionNavigation.js +2 -99
  29. package/dist/color-input.css +19 -19
  30. package/dist/color-input.js +14 -13
  31. package/dist/color-picker.css +40 -40
  32. package/dist/color-picker.js +247 -276
  33. package/dist/color-picker2.js +1 -9
  34. package/dist/color-swatch.css +4 -4
  35. package/dist/color-swatch.js +6 -8
  36. package/dist/color.js +5 -10
  37. package/dist/combobox.css +251 -0
  38. package/dist/combobox.js +410 -0
  39. package/dist/componentColors.js +125 -84
  40. package/dist/componentRef.js +26 -0
  41. package/dist/components/accordion/accordionContext.d.ts +3 -0
  42. package/dist/components/accordion/accordionModel.d.ts +14 -0
  43. package/dist/components/accordion/index.d.ts +2 -1
  44. package/dist/components/accordion/index.js +1 -1
  45. package/dist/components/accordion/types.d.ts +1 -2
  46. package/dist/components/accordion/useAccordion.d.ts +2 -2
  47. package/dist/components/accordion/useAccordionItem.d.ts +2 -0
  48. package/dist/components/calendar/calendar.d.ts +30 -0
  49. package/dist/components/calendar/calendarBehavior.d.ts +49 -0
  50. package/dist/components/calendar/index.d.ts +3 -0
  51. package/dist/components/calendar/index.js +3 -0
  52. package/dist/components/calendar/types.d.ts +53 -0
  53. package/dist/components/calendar/useCalendar.d.ts +24 -0
  54. package/dist/components/checkbox/useCheckbox.d.ts +1 -2
  55. package/dist/components/color-picker/index.js +2 -2
  56. package/dist/components/color-picker/types.d.ts +2 -2
  57. package/dist/components/color-picker/useColorPickerDrag.d.ts +1 -1
  58. package/dist/components/color-picker/useColorPickerSaturation.d.ts +22 -0
  59. package/dist/components/color-picker/useColorPickerSlider.d.ts +20 -0
  60. package/dist/components/color-picker/useColorPickerValue.d.ts +1 -1
  61. package/dist/components/combobox/combobox.d.ts +29 -0
  62. package/dist/components/combobox/comboboxModel.d.ts +4 -0
  63. package/dist/components/combobox/index.d.ts +3 -0
  64. package/dist/components/combobox/index.js +2 -0
  65. package/dist/components/combobox/types.d.ts +43 -0
  66. package/dist/components/combobox/useCombobox.d.ts +45 -0
  67. package/dist/components/date-picker/date-picker.d.ts +33 -0
  68. package/dist/components/date-picker/datePickerModel.d.ts +10 -0
  69. package/dist/components/date-picker/index.d.ts +4 -0
  70. package/dist/components/date-picker/index.js +2 -0
  71. package/dist/components/date-picker/types.d.ts +57 -0
  72. package/dist/components/date-picker/useDatePicker.d.ts +29 -0
  73. package/dist/components/date-picker/useDatePickerValueState.d.ts +21 -0
  74. package/dist/components/dialog/{dialog-core.d.ts → dialogContext.d.ts} +1 -5
  75. package/dist/components/dialog/useDialogContentInteractions.d.ts +18 -0
  76. package/dist/components/dialog/useDialogRootState.d.ts +19 -0
  77. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +2 -2
  78. package/dist/components/dropdown-menu/dropdown-menu-item-row.d.ts +1 -1
  79. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +1 -1
  80. package/dist/components/dropdown-menu/dropdown-menu-model.d.ts +8 -0
  81. package/dist/components/dropdown-menu/dropdown-menu-root.d.ts +2 -2
  82. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
  83. package/dist/components/dropdown-menu/dropdown-menu-sub-trigger.d.ts +1 -1
  84. package/dist/components/dropdown-menu/dropdown-menu-sub.d.ts +1 -1
  85. package/dist/components/dropdown-menu/dropdown-menu.d.ts +2 -2
  86. package/dist/components/dropdown-menu/{dropdown-menu-primitive-core.d.ts → dropdownMenuContext.d.ts} +17 -30
  87. package/dist/components/dropdown-menu/dropdownMenuDataModel.d.ts +20 -0
  88. package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -0
  89. package/dist/components/dropdown-menu/dropdownMenuInteractionNavigation.d.ts +24 -0
  90. package/dist/components/dropdown-menu/dropdownMenuInteractionRegistry.d.ts +42 -0
  91. package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +114 -0
  92. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +11 -11
  93. package/dist/components/dropdown-menu/useDropdownMenuContextTrigger.d.ts +9 -0
  94. package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +35 -0
  95. package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +24 -0
  96. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +6 -5
  97. package/dist/components/dropdown-menu/useDropdownMenuInteractionDismissal.d.ts +17 -0
  98. package/dist/components/dropdown-menu/useDropdownMenuInteractionKeyboard.d.ts +19 -0
  99. package/dist/components/dropdown-menu/useDropdownMenuPortalPosition.d.ts +0 -1
  100. package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +28 -0
  101. package/dist/components/dropdown-menu/useDropdownMenuPrimitiveContent.d.ts +2 -2
  102. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +1 -1
  103. package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +19 -0
  104. package/dist/components/dropzone/dropzone.d.ts +31 -0
  105. package/dist/components/dropzone/dropzoneModel.d.ts +16 -0
  106. package/dist/components/dropzone/index.d.ts +3 -0
  107. package/dist/components/dropzone/index.js +2 -0
  108. package/dist/components/dropzone/types.d.ts +56 -0
  109. package/dist/components/dropzone/useDropzone.d.ts +25 -0
  110. package/dist/components/file-input/file-input.d.ts +29 -0
  111. package/dist/components/file-input/index.d.ts +3 -0
  112. package/dist/components/file-input/index.js +2 -0
  113. package/dist/components/file-input/types.d.ts +37 -0
  114. package/dist/components/file-input/useFileInput.d.ts +15 -0
  115. package/dist/components/floating/index.js +2 -2
  116. package/dist/components/floating/useFloatingPosition.d.ts +1 -14
  117. package/dist/components/floating/useFloatingTargetLifecycle.d.ts +32 -0
  118. package/dist/components/floating/useHoverDisclosure.d.ts +10 -0
  119. package/dist/components/hover-card/hover-card.d.ts +25 -0
  120. package/dist/components/hover-card/index.d.ts +3 -0
  121. package/dist/components/hover-card/index.js +2 -0
  122. package/dist/components/hover-card/types.d.ts +45 -0
  123. package/dist/components/hover-card/useHoverCard.d.ts +22 -0
  124. package/dist/components/hover-card/useHoverCardDisclosure.d.ts +19 -0
  125. package/dist/components/multi-select/index.d.ts +3 -0
  126. package/dist/components/multi-select/index.js +2 -0
  127. package/dist/components/multi-select/multi-select.d.ts +30 -0
  128. package/dist/components/multi-select/multiSelectModel.d.ts +3 -0
  129. package/dist/components/multi-select/types.d.ts +49 -0
  130. package/dist/components/multi-select/useMultiSelect.d.ts +46 -0
  131. package/dist/components/number-input/numberInputModel.d.ts +15 -0
  132. package/dist/components/number-input/useNumberInput.d.ts +3 -19
  133. package/dist/components/pagination/index.d.ts +1 -1
  134. package/dist/components/pagination/index.js +1 -1
  135. package/dist/components/pagination/paginationModel.d.ts +4 -0
  136. package/dist/components/pagination/types.d.ts +15 -0
  137. package/dist/components/pagination/usePagination.d.ts +3 -19
  138. package/dist/components/popover/usePopoverBindings.d.ts +13 -0
  139. package/dist/components/progress/progressModel.d.ts +8 -0
  140. package/dist/components/progress/useProgress.d.ts +0 -6
  141. package/dist/components/radio/useRadio.d.ts +1 -2
  142. package/dist/components/scroll-area/scroll-area.d.ts +1 -1
  143. package/dist/components/scroll-area/scrollAreaModel.d.ts +64 -0
  144. package/dist/components/scroll-area/useScrollArea.d.ts +70 -53
  145. package/dist/components/scroll-area/{useScrollAreaPresentation.d.ts → useScrollAreaAttributes.d.ts} +37 -17
  146. package/dist/components/scroll-area/useScrollAreaDerivedState.d.ts +8 -0
  147. package/dist/components/scroll-area/useScrollAreaMeasurement.d.ts +35 -0
  148. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +11 -9
  149. package/dist/components/scroll-area/useScrollAreaVisibility.d.ts +15 -20
  150. package/dist/components/segmented-control/index.d.ts +3 -0
  151. package/dist/components/segmented-control/index.js +2 -0
  152. package/dist/components/segmented-control/segmented-control.d.ts +26 -0
  153. package/dist/components/segmented-control/types.d.ts +47 -0
  154. package/dist/components/segmented-control/useSegmentedControl.d.ts +15 -0
  155. package/dist/components/select/useSelect.d.ts +31 -19
  156. package/dist/components/slider/rangeSliderModel.d.ts +41 -0
  157. package/dist/components/slider/{sliderCore.d.ts → sliderModel.d.ts} +0 -1
  158. package/dist/components/slider/useRangeSlider.d.ts +9 -17
  159. package/dist/components/slider/useRangeSliderPointer.d.ts +1 -1
  160. package/dist/components/slider/useRangeSliderValueState.d.ts +40 -0
  161. package/dist/components/slider/useSlider.d.ts +7 -13
  162. package/dist/components/slider/useSliderPointerPreview.d.ts +22 -0
  163. package/dist/components/slider/useSliderTooltipState.d.ts +40 -0
  164. package/dist/components/slider/useSliderValueState.d.ts +33 -0
  165. package/dist/components/tags-input/index.d.ts +3 -0
  166. package/dist/components/tags-input/index.js +2 -0
  167. package/dist/components/tags-input/tags-input.d.ts +27 -0
  168. package/dist/components/tags-input/tagsInputModel.d.ts +12 -0
  169. package/dist/components/tags-input/types.d.ts +37 -0
  170. package/dist/components/tags-input/useTagsInput.d.ts +23 -0
  171. package/dist/components/teleport-provider/index.js +1 -1
  172. package/dist/components/teleport-provider/useTeleportTarget.d.ts +1 -2
  173. package/dist/components/toast/useToastLifecycle.d.ts +19 -0
  174. package/dist/components/tooltip/useTooltip.d.ts +1 -2
  175. package/dist/components/tooltip/useTooltipTargetBindings.d.ts +12 -0
  176. package/dist/css.js +12 -0
  177. package/dist/date-picker.css +49 -0
  178. package/dist/date-picker.js +809 -0
  179. package/dist/dialog.js +215 -218
  180. package/dist/direction.js +6 -0
  181. package/dist/dropdown-menu.css +21 -3
  182. package/dist/dropdown-menu.js +1626 -1185
  183. package/dist/dropzone.css +135 -0
  184. package/dist/dropzone.js +431 -0
  185. package/dist/events.js +59 -0
  186. package/dist/field.css +8 -8
  187. package/dist/field.js +13 -25
  188. package/dist/file-input.css +135 -0
  189. package/dist/file-input.js +198 -0
  190. package/dist/floatingOffset.js +11 -0
  191. package/dist/focus-trap.js +7 -5
  192. package/dist/focusNavigation.js +37 -0
  193. package/dist/hover-card.css +80 -0
  194. package/dist/hover-card.js +402 -0
  195. package/dist/icon-button.css +8 -8
  196. package/dist/icon-button.js +7 -6
  197. package/dist/index.d.ts +9 -0
  198. package/dist/index.js +20 -9
  199. package/dist/input.css +24 -24
  200. package/dist/input.js +19 -31
  201. package/dist/interactive.js +18 -0
  202. package/dist/internal/composables/useOverlayLayer.d.ts +12 -0
  203. package/dist/modal.js +2 -2
  204. package/dist/multi-select.css +316 -0
  205. package/dist/multi-select.js +481 -0
  206. package/dist/nativeChoice.js +169 -0
  207. package/dist/number-input.css +18 -18
  208. package/dist/number-input.js +44 -44
  209. package/dist/number.js +22 -0
  210. package/dist/overlay.js +3 -2
  211. package/dist/pagination.css +28 -28
  212. package/dist/pagination.js +66 -73
  213. package/dist/pointerSession.js +130 -0
  214. package/dist/popover.css +55 -37
  215. package/dist/popover.js +75 -101
  216. package/dist/progress.js +10 -13
  217. package/dist/query.js +40 -0
  218. package/dist/radio.css +18 -18
  219. package/dist/radio.js +30 -36
  220. package/dist/rafScheduler.js +34 -0
  221. package/dist/scroll-area.css +28 -28
  222. package/dist/scroll-area.js +540 -554
  223. package/dist/segmented-control.css +176 -0
  224. package/dist/segmented-control.js +382 -0
  225. package/dist/select.css +50 -48
  226. package/dist/select.js +131 -289
  227. package/dist/slider.css +191 -191
  228. package/dist/slider.js +720 -706
  229. package/dist/styles-api.d.ts +0 -1
  230. package/dist/styles-api.js +1 -4
  231. package/dist/switch.css +17 -17
  232. package/dist/switch.js +14 -15
  233. package/dist/tabs.css +43 -43
  234. package/dist/tabs.js +29 -56
  235. package/dist/tags-input.css +197 -0
  236. package/dist/tags-input.js +380 -0
  237. package/dist/text.js +17 -0
  238. package/dist/textarea.css +26 -26
  239. package/dist/textarea.js +21 -32
  240. package/dist/toast.css +26 -26
  241. package/dist/toast.js +141 -118
  242. package/dist/tooltip.css +12 -12
  243. package/dist/tooltip.js +64 -63
  244. package/dist/useCollapse.js +8 -11
  245. package/dist/useControlState.js +3 -6
  246. package/dist/useEditableOptionList.js +216 -0
  247. package/dist/useFlatOptionCollection.js +134 -0
  248. package/dist/useFloatingPosition.js +14 -40
  249. package/dist/useFloatingTargetLifecycle.js +127 -0
  250. package/dist/useFormControl.js +1 -0
  251. package/dist/useHoverDisclosure.js +561 -0
  252. package/dist/useNativeChoiceTransaction.js +46 -0
  253. package/dist/useNativeFileSelection.js +86 -0
  254. package/dist/useOverlayZIndex.js +246 -19
  255. package/dist/useTeleportTarget.js +3 -14
  256. package/dist/useTypeahead.js +94 -0
  257. package/dist/utils/aria.d.ts +3 -0
  258. package/dist/utils/attributes.d.ts +2 -0
  259. package/dist/utils/bem.d.ts +3 -0
  260. package/dist/utils/collectionNavigation.d.ts +2 -0
  261. package/dist/utils/color.d.ts +7 -0
  262. package/dist/{components/color-picker/color-picker-utils.d.ts → utils/colorPicker.d.ts} +5 -4
  263. package/dist/utils/componentColors.d.ts +7 -0
  264. package/dist/utils/css.d.ts +3 -0
  265. package/dist/utils/date.d.ts +13 -0
  266. package/dist/utils/dateAvailability.d.ts +7 -0
  267. package/dist/utils/dom/ancestry.d.ts +8 -0
  268. package/dist/utils/dom/attributes.d.ts +16 -0
  269. package/dist/utils/dom/componentRef.d.ts +4 -0
  270. package/dist/utils/dom/direction.d.ts +2 -0
  271. package/dist/utils/dom/events.d.ts +5 -0
  272. package/dist/utils/dom/files.d.ts +3 -0
  273. package/dist/utils/dom/focusNavigation.d.ts +7 -0
  274. package/dist/utils/dom/interactive.d.ts +2 -0
  275. package/dist/utils/dom/nativeChoice.d.ts +17 -0
  276. package/dist/utils/dom/pointerSession.d.ts +20 -0
  277. package/dist/utils/dom/query.d.ts +4 -0
  278. package/dist/utils/dom/scroll.d.ts +24 -0
  279. package/dist/utils/floatingOffset.d.ts +10 -0
  280. package/dist/utils/geometry.d.ts +14 -0
  281. package/dist/utils/indexPath.d.ts +6 -0
  282. package/dist/utils/number.d.ts +4 -0
  283. package/dist/utils/optionFilter.d.ts +5 -0
  284. package/dist/utils/rafScheduler.d.ts +4 -0
  285. package/dist/utils/text.d.ts +2 -0
  286. package/docs/code-architecture.md +118 -0
  287. package/docs/public-floating-api.md +13 -9
  288. package/docs/public-styles-api.md +25 -12
  289. package/package.json +51 -14
  290. package/src/styles/_mixins.scss +26 -0
  291. package/src/styles/styles-manifest.json +1 -2
  292. package/dist/components/dropdown-menu/dropdown-menu-outside.d.ts +0 -3
  293. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +0 -21
  294. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +0 -36
  295. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +0 -29
  296. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +0 -52
  297. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +0 -17
  298. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +0 -18
  299. package/dist/components/scroll-area/scrollAreaCore.d.ts +0 -30
  300. package/dist/components/scroll-area/useScrollAreaControls.d.ts +0 -25
  301. package/dist/components/scroll-area/useScrollAreaMetrics.d.ts +0 -38
  302. package/dist/components/select/useSelectNativeControl.d.ts +0 -9
  303. package/dist/components/select/useSelectNativeValue.d.ts +0 -9
  304. package/dist/floating.js +0 -415
  305. /package/dist/components/alert/{useAlertColor.d.ts → alertColor.d.ts} +0 -0
  306. /package/dist/components/avatar/{useAvatarColor.d.ts → avatarColor.d.ts} +0 -0
  307. /package/dist/components/badge/{useBadgeColor.d.ts → badgeColor.d.ts} +0 -0
  308. /package/dist/components/button/{useButtonColor.d.ts → buttonColor.d.ts} +0 -0
  309. /package/dist/components/color-swatch/{useColorSwatchColor.d.ts → colorSwatchColor.d.ts} +0 -0
  310. /package/dist/components/toast/{useToastColor.d.ts → toastColor.d.ts} +0 -0
@@ -0,0 +1,561 @@
1
+ import { t as useControllableValue } from "./useControllableValue.js";
2
+ import { t as isElement } from "./query.js";
3
+ import { r as normalizeDelay } from "./number.js";
4
+ import { i as isNodeWithinElement, n as isEventWithinElement, r as isEventWithinTargets } from "./events.js";
5
+ import { t as useFloatingTargetLifecycle } from "./useFloatingTargetLifecycle.js";
6
+ import { computed, onBeforeUnmount, onMounted, shallowRef, toValue, watch } from "vue";
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
+ });
38
+ return {
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
52
+ }
53
+ };
54
+ }
55
+ function createInteractionState() {
56
+ return {
57
+ contentFocused: false,
58
+ contentHovered: false,
59
+ touchClickPending: false,
60
+ touchPinned: false,
61
+ touchPointerActive: false,
62
+ triggerFocused: false,
63
+ triggerHovered: false
64
+ };
65
+ }
66
+ function createTargetState() {
67
+ return {
68
+ contentElement: null,
69
+ resolvedContentTarget: shallowRef(null),
70
+ resolvedInteractionTarget: shallowRef(null),
71
+ triggerElement: null
72
+ };
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
+ }
95
+ function resetInteraction(state, part) {
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
+ });
240
+ return {
241
+ cancelScheduledClose,
242
+ close,
243
+ isDisabled,
244
+ isOpen,
245
+ isRequestedOpen,
246
+ open,
247
+ request,
248
+ state,
249
+ toggle
250
+ };
251
+ }
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
+ }
274
+ function rememberTarget(part, event) {
275
+ const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
276
+ if (part === "trigger") {
277
+ targets.triggerElement = currentTarget ?? targets.resolvedInteractionTarget.value ?? targets.triggerElement;
278
+ return;
279
+ }
280
+ targets.contentElement = currentTarget ?? targets.resolvedContentTarget.value ?? targets.contentElement;
281
+ }
282
+ function onTriggerPointerenter(event) {
283
+ rememberTarget("trigger", event);
284
+ if (event.pointerType === "touch" || commands.isDisabled.value) return;
285
+ setPartInteraction(interaction, "trigger", "hover", true);
286
+ requestOpen("hover", event, "delayed");
287
+ }
288
+ function onTriggerPointerleave(event) {
289
+ rememberTarget("trigger", event);
290
+ if (event.pointerType === "touch") return;
291
+ setPartInteraction(interaction, "trigger", "hover", false);
292
+ requestClose("hover", event, "delayed");
293
+ }
294
+ function onContentPointerenter(event) {
295
+ rememberTarget("content", event);
296
+ if (event.pointerType === "touch" || commands.isDisabled.value) return;
297
+ setPartInteraction(interaction, "content", "hover", true);
298
+ commands.cancelScheduledClose();
299
+ }
300
+ function onContentPointerleave(event) {
301
+ rememberTarget("content", event);
302
+ if (event.pointerType === "touch") return;
303
+ setPartInteraction(interaction, "content", "hover", false);
304
+ requestClose("hover", event, "delayed");
305
+ }
306
+ function onTriggerFocusin(event) {
307
+ rememberTarget("trigger", event);
308
+ if (commands.isDisabled.value || toValue(options.openOnFocus) === false || hasPendingTouchInteraction(interaction)) return;
309
+ setPartInteraction(interaction, "trigger", "focus", true);
310
+ requestOpen("focus", event, "immediate");
311
+ }
312
+ function onTriggerFocusout(event) {
313
+ rememberTarget("trigger", event);
314
+ if (!focusLeavesCurrentTarget(event)) return;
315
+ setPartInteraction(interaction, "trigger", "focus", false);
316
+ requestClose("focus", event, "delayed");
317
+ }
318
+ function onContentFocusin(event) {
319
+ rememberTarget("content", event);
320
+ if (commands.isDisabled.value) return;
321
+ setPartInteraction(interaction, "content", "focus", true);
322
+ commands.cancelScheduledClose();
323
+ }
324
+ function onContentFocusout(event) {
325
+ rememberTarget("content", event);
326
+ if (!focusLeavesCurrentTarget(event)) return;
327
+ setPartInteraction(interaction, "content", "focus", false);
328
+ requestClose("focus", event, "delayed");
329
+ }
330
+ function onTriggerPointerdown(event) {
331
+ if (originatesInContent(event)) return;
332
+ rememberTarget("trigger", event);
333
+ clearPendingTouchClick();
334
+ interaction.touchPointerActive = event.pointerType === "touch";
335
+ }
336
+ function onTriggerPointerup(event) {
337
+ if (originatesInContent(event)) return;
338
+ rememberTarget("trigger", event);
339
+ interaction.touchClickPending = event.pointerType === "touch" && interaction.touchPointerActive;
340
+ interaction.touchPointerActive = false;
341
+ if (interaction.touchClickPending) scheduleTouchClickExpiry();
342
+ }
343
+ function onTriggerPointercancel(event) {
344
+ if (originatesInContent(event)) return;
345
+ rememberTarget("trigger", event);
346
+ clearTouchClickExpiryTimer();
347
+ interaction.touchClickPending = false;
348
+ interaction.touchPointerActive = false;
349
+ }
350
+ function onTriggerClick(event) {
351
+ if (originatesInContent(event)) return;
352
+ rememberTarget("trigger", event);
353
+ clearTouchClickExpiryTimer();
354
+ if (!interaction.touchClickPending) return;
355
+ interaction.touchClickPending = false;
356
+ if (getTouchBehavior() !== "toggle" || commands.isDisabled.value) return;
357
+ event.preventDefault();
358
+ if (interaction.touchPinned || commands.isRequestedOpen()) {
359
+ interaction.touchPinned = false;
360
+ requestClose("touch", event, "immediate");
361
+ return;
362
+ }
363
+ interaction.touchPinned = true;
364
+ requestOpen("touch", event, "immediate");
365
+ }
366
+ function onContentPointerdown(event) {
367
+ rememberTarget("content", event);
368
+ }
369
+ function requestEscapeClose(event) {
370
+ if (event.key !== "Escape" || toValue(options.closeOnEscape) === false || !commands.isOpen.value) return false;
371
+ interaction.touchPinned = false;
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);
381
+ }
382
+ function onOutsidePointerdown(event) {
383
+ if (!interaction.touchPinned) return;
384
+ interaction.touchPinned = false;
385
+ requestClose("outside", event, "immediate");
386
+ }
387
+ function onTargetDetached(part) {
388
+ clearPendingTouchClick();
389
+ if (part === "trigger") interaction.touchPointerActive = false;
390
+ resetInteraction(interaction, part);
391
+ requestClose("hover", void 0, "delayed");
392
+ }
393
+ function requestOpen(reason, event, timing) {
394
+ commands.request({
395
+ event,
396
+ open: true,
397
+ reason,
398
+ timing
399
+ });
400
+ }
401
+ function requestClose(reason, event, timing) {
402
+ commands.request({
403
+ event,
404
+ open: false,
405
+ reason,
406
+ timing
407
+ });
408
+ }
409
+ function getTouchBehavior() {
410
+ return toValue(options.touchBehavior) ?? "none";
411
+ }
412
+ const presentation = createInteractionPresentation(state, {
413
+ content: {
414
+ onFocusin: onContentFocusin,
415
+ onFocusout: onContentFocusout,
416
+ onKeydown,
417
+ onPointerdown: onContentPointerdown,
418
+ onPointerenter: onContentPointerenter,
419
+ onPointerleave: onContentPointerleave
420
+ },
421
+ trigger: {
422
+ onClick: onTriggerClick,
423
+ onFocusin: onTriggerFocusin,
424
+ onFocusout: onTriggerFocusout,
425
+ onKeydown,
426
+ onPointercancel: onTriggerPointercancel,
427
+ onPointerdown: onTriggerPointerdown,
428
+ onPointerenter: onTriggerPointerenter,
429
+ onPointerleave: onTriggerPointerleave,
430
+ onPointerup: onTriggerPointerup
431
+ }
432
+ });
433
+ watch(() => getTouchBehavior(), (behavior) => {
434
+ if (behavior === "toggle" || !interaction.touchPinned) return;
435
+ interaction.touchPinned = false;
436
+ requestClose("touch", void 0, "immediate");
437
+ });
438
+ onBeforeUnmount(clearTouchClickExpiryTimer);
439
+ return {
440
+ contentListeners: presentation.contentListeners,
441
+ contentProps: presentation.contentProps,
442
+ isOutsideDismissalActive: () => interaction.touchPinned,
443
+ onDocumentKeydown,
444
+ onOutsidePointerdown,
445
+ onTargetDetached,
446
+ triggerListeners: presentation.triggerListeners,
447
+ triggerProps: presentation.triggerProps
448
+ };
449
+ }
450
+ function createInteractionPresentation(state, handlers) {
451
+ const triggerProps = computed(() => ({
452
+ "data-state": state.value,
453
+ ...handlers.trigger
454
+ }));
455
+ const contentProps = computed(() => ({
456
+ "data-state": state.value,
457
+ ...handlers.content
458
+ }));
459
+ const triggerListeners = [
460
+ ["pointerenter", handlers.trigger.onPointerenter],
461
+ ["pointerleave", handlers.trigger.onPointerleave],
462
+ ["pointerdown", handlers.trigger.onPointerdown],
463
+ ["pointerup", handlers.trigger.onPointerup],
464
+ ["pointercancel", handlers.trigger.onPointercancel],
465
+ ["click", handlers.trigger.onClick],
466
+ ["focusin", handlers.trigger.onFocusin],
467
+ ["focusout", handlers.trigger.onFocusout],
468
+ ["keydown", handlers.trigger.onKeydown]
469
+ ];
470
+ return {
471
+ contentListeners: [
472
+ ["pointerenter", handlers.content.onPointerenter],
473
+ ["pointerleave", handlers.content.onPointerleave],
474
+ ["pointerdown", handlers.content.onPointerdown],
475
+ ["focusin", handlers.content.onFocusin],
476
+ ["focusout", handlers.content.onFocusout],
477
+ ["keydown", handlers.content.onKeydown]
478
+ ],
479
+ contentProps,
480
+ triggerListeners,
481
+ triggerProps
482
+ };
483
+ }
484
+ function focusLeavesCurrentTarget(event) {
485
+ const currentTarget = isElement(event.currentTarget) ? event.currentTarget : null;
486
+ return !isNodeWithinElement(event.relatedTarget, currentTarget);
487
+ }
488
+ function useHoverDisclosureTargetBinding({ commands, options, runtime, targets, useDocumentDismissal }) {
489
+ let documentListenersActive = false;
490
+ function setCurrentTarget(part, target) {
491
+ if (part === "trigger") targets.triggerElement = target;
492
+ else targets.contentElement = target;
493
+ }
494
+ function clearCurrentTarget(part, target) {
495
+ if (part === "trigger" && targets.triggerElement === target) targets.triggerElement = null;
496
+ if (part === "content" && targets.contentElement === target) targets.contentElement = null;
497
+ }
498
+ function connectTarget(part, target) {
499
+ setCurrentTarget(part, target);
500
+ return () => {
501
+ clearCurrentTarget(part, target);
502
+ runtime.onTargetDetached(part);
503
+ };
504
+ }
505
+ function onDocumentPointerdown(event) {
506
+ if (!runtime.isOutsideDismissalActive()) return;
507
+ if (isEventInsideTargets(event, targets)) return;
508
+ runtime.onOutsidePointerdown(event);
509
+ }
510
+ function setDocumentListeners(active) {
511
+ if (!useDocumentDismissal || typeof document === "undefined" || active === documentListenersActive) return;
512
+ documentListenersActive = active;
513
+ if (active) {
514
+ document.addEventListener("keydown", runtime.onDocumentKeydown);
515
+ document.addEventListener("pointerdown", onDocumentPointerdown, true);
516
+ return;
517
+ }
518
+ document.removeEventListener("keydown", runtime.onDocumentKeydown);
519
+ document.removeEventListener("pointerdown", onDocumentPointerdown, true);
520
+ }
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
+ }
529
+ });
530
+ const contentTargetLifecycle = useFloatingTargetLifecycle({
531
+ target: () => toValue(options.contentTarget),
532
+ fallback: fallbackTarget
533
+ });
534
+ targets.resolvedInteractionTarget = interactionTargetLifecycle.targetElement;
535
+ targets.resolvedContentTarget = contentTargetLifecycle.targetElement;
536
+ interactionTargetLifecycle.bindTarget({
537
+ connect: (target) => connectTarget("trigger", target),
538
+ listeners: runtime.triggerListeners
539
+ });
540
+ contentTargetLifecycle.bindTarget({
541
+ connect: (target) => connectTarget("content", target),
542
+ listeners: runtime.contentListeners
543
+ });
544
+ watch(commands.isOpen, setDocumentListeners, { flush: "sync" });
545
+ onMounted(() => {
546
+ setDocumentListeners(commands.isOpen.value);
547
+ });
548
+ onBeforeUnmount(() => {
549
+ setDocumentListeners(false);
550
+ });
551
+ }
552
+ function isEventInsideTargets(event, targets) {
553
+ return isEventWithinTargets(event, [
554
+ targets.triggerElement,
555
+ targets.contentElement,
556
+ targets.resolvedInteractionTarget.value,
557
+ targets.resolvedContentTarget.value
558
+ ].filter((element) => element !== null));
559
+ }
560
+ //#endregion
561
+ export { useHoverDisclosureWithExternalDismissal as n, useHoverDisclosure as t };
@@ -0,0 +1,46 @@
1
+ import { t as useControllableValue } from "./useControllableValue.js";
2
+ import { i as useFormControl } from "./useFormControl.js";
3
+ import { nextTick, watchEffect } from "vue";
4
+ //#region src/internal/composables/useNativeChoiceTransaction.ts
5
+ function useNativeChoiceTransaction(options) {
6
+ const controllable = useControllableValue(options.value);
7
+ function syncNativeValue(value) {
8
+ options.adapter.syncValue(value, controllable.initialValue);
9
+ }
10
+ function restoreControlledValue() {
11
+ if (!controllable.isControlled.value) return;
12
+ queueMicrotask(() => syncNativeValue(controllable.value.value));
13
+ }
14
+ function requestValueUpdate(value) {
15
+ options.adapter.commitValue(value, controllable.initialValue, () => controllable.setValue(value));
16
+ restoreControlledValue();
17
+ }
18
+ useFormControl({
19
+ elements: options.adapter.controls,
20
+ isControlled: () => controllable.isControlled.value,
21
+ validationMessage: options.adapter.validationMessage,
22
+ readResetValue(controls) {
23
+ controllable.resetValue(options.adapter.readResetValue(controls, controllable.initialValue));
24
+ syncNativeValue(controllable.value.value);
25
+ options.onFormReset?.();
26
+ },
27
+ syncControlledValue() {
28
+ syncNativeValue(controllable.value.value);
29
+ options.onFormReset?.();
30
+ }
31
+ });
32
+ watchEffect(() => {
33
+ const currentValue = controllable.value.value;
34
+ const reconciledValue = options.adapter.reconcileValue?.(currentValue, controllable.initialValue, controllable.isControlled.value) ?? currentValue;
35
+ if (!controllable.isControlled.value && !Object.is(reconciledValue, currentValue)) controllable.resetValue(reconciledValue);
36
+ syncNativeValue(controllable.value.value);
37
+ nextTick(() => syncNativeValue(controllable.value.value));
38
+ }, { flush: "post" });
39
+ return {
40
+ isControlled: controllable.isControlled,
41
+ requestValueUpdate,
42
+ value: controllable.value
43
+ };
44
+ }
45
+ //#endregion
46
+ export { useNativeChoiceTransaction as t };
@@ -0,0 +1,86 @@
1
+ import { t as useControllableValue } from "./useControllableValue.js";
2
+ import { i as useFormControl } from "./useFormControl.js";
3
+ import { computed, nextTick, ref, watchEffect } from "vue";
4
+ //#region src/utils/dom/files.ts
5
+ function normalizeSelectedFiles(files, multiple) {
6
+ const selectedFiles = Array.from(files);
7
+ return multiple ? selectedFiles : selectedFiles.slice(0, 1);
8
+ }
9
+ function haveSameFiles(fileList, files) {
10
+ if (!fileList || fileList.length !== files.length) return false;
11
+ return files.every((file, index) => fileList.item(index) === file);
12
+ }
13
+ function replaceInputFiles(input, files) {
14
+ if (haveSameFiles(input.files, files)) return true;
15
+ if (files.length === 0) {
16
+ input.value = "";
17
+ return true;
18
+ }
19
+ const DataTransferConstructor = input.ownerDocument.defaultView?.DataTransfer;
20
+ if (!DataTransferConstructor) return false;
21
+ const transfer = new DataTransferConstructor();
22
+ for (const file of files) transfer.items.add(file);
23
+ try {
24
+ input.files = transfer.files;
25
+ return true;
26
+ } catch {
27
+ return false;
28
+ }
29
+ }
30
+ //#endregion
31
+ //#region src/internal/composables/useNativeFileSelection.ts
32
+ function useNativeFileSelection(options) {
33
+ const inputRef = ref(null);
34
+ const controllable = useControllableValue({
35
+ modelValue: options.modelValue,
36
+ defaultValue: () => [],
37
+ onChange: options.onChange
38
+ });
39
+ const files = computed(() => normalizeSelectedFiles(controllable.value.value, options.multiple()));
40
+ function syncNativeFiles(nextFiles = files.value) {
41
+ const input = inputRef.value;
42
+ if (input) replaceInputFiles(input, nextFiles);
43
+ }
44
+ function settleSelection(outcome) {
45
+ if (outcome.status === "accepted") {
46
+ const nextFiles = normalizeSelectedFiles(outcome.files, options.multiple());
47
+ syncNativeFiles(nextFiles);
48
+ controllable.setValue(nextFiles);
49
+ } else syncNativeFiles();
50
+ nextTick(() => syncNativeFiles());
51
+ }
52
+ function clear() {
53
+ settleSelection({
54
+ status: "accepted",
55
+ files: []
56
+ });
57
+ }
58
+ function focus(focusOptions) {
59
+ inputRef.value?.focus(focusOptions);
60
+ }
61
+ function open() {
62
+ if (options.disabled()) return;
63
+ inputRef.value?.click();
64
+ }
65
+ watchEffect(() => syncNativeFiles(files.value), { flush: "post" });
66
+ useFormControl({
67
+ elements: () => [inputRef.value],
68
+ isControlled: () => controllable.isControlled.value,
69
+ validationMessage: options.validationMessage,
70
+ readResetValue() {
71
+ controllable.resetValue([]);
72
+ settleSelection({ status: "rejected" });
73
+ },
74
+ syncControlledValue: () => settleSelection({ status: "rejected" })
75
+ });
76
+ return {
77
+ inputRef,
78
+ files,
79
+ settleSelection,
80
+ clear,
81
+ focus,
82
+ open
83
+ };
84
+ }
85
+ //#endregion
86
+ export { useNativeFileSelection as t };