ropav 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/README.md +6 -0
  2. package/dist/accordion.css +17 -17
  3. package/dist/accordion.js +123 -155
  4. package/dist/alert.css +18 -18
  5. package/dist/alert.js +10 -11
  6. package/dist/aria.js +14 -0
  7. package/dist/aspect-ratio.js +1 -1
  8. package/dist/attributes.js +9 -0
  9. package/dist/attributes2.js +29 -0
  10. package/dist/avatar.css +19 -19
  11. package/dist/avatar.js +9 -17
  12. package/dist/badge.css +16 -16
  13. package/dist/badge.js +5 -5
  14. package/dist/button-group.js +1 -1
  15. package/dist/button-link.js +4 -3
  16. package/dist/button.js +4 -3
  17. package/dist/button.scss_vue_type_style_index_0_src_true_lang.js +1 -1
  18. package/dist/card.js +1 -1
  19. package/dist/checkbox.css +32 -32
  20. package/dist/checkbox.js +22 -28
  21. package/dist/collapse.css +6 -6
  22. package/dist/collapse.js +7 -6
  23. package/dist/collectionNavigation.js +2 -99
  24. package/dist/color-input.css +19 -19
  25. package/dist/color-input.js +14 -13
  26. package/dist/color-picker.css +40 -40
  27. package/dist/color-picker.js +221 -200
  28. package/dist/color-picker2.js +1 -9
  29. package/dist/color-swatch.css +4 -4
  30. package/dist/color-swatch.js +6 -8
  31. package/dist/color.js +5 -10
  32. package/dist/componentColors.js +125 -84
  33. package/dist/componentRef.js +26 -0
  34. package/dist/components/accordion/accordionContext.d.ts +3 -0
  35. package/dist/components/accordion/accordionModel.d.ts +14 -0
  36. package/dist/components/accordion/index.d.ts +2 -1
  37. package/dist/components/accordion/index.js +1 -1
  38. package/dist/components/accordion/types.d.ts +1 -2
  39. package/dist/components/accordion/useAccordion.d.ts +2 -2
  40. package/dist/components/accordion/useAccordionItem.d.ts +2 -0
  41. package/dist/components/checkbox/useCheckbox.d.ts +1 -2
  42. package/dist/components/color-picker/index.js +2 -2
  43. package/dist/components/color-picker/types.d.ts +2 -2
  44. package/dist/components/color-picker/useColorPickerSaturation.d.ts +22 -0
  45. package/dist/components/color-picker/useColorPickerSlider.d.ts +20 -0
  46. package/dist/components/color-picker/useColorPickerValue.d.ts +1 -1
  47. package/dist/components/dialog/{dialog-core.d.ts → dialogContext.d.ts} +1 -5
  48. package/dist/components/dialog/useDialogContentInteractions.d.ts +18 -0
  49. package/dist/components/dialog/useDialogRootState.d.ts +19 -0
  50. package/dist/components/dropdown-menu/dropdown-menu-item-row.d.ts +1 -1
  51. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +1 -1
  52. package/dist/components/dropdown-menu/dropdown-menu-model.d.ts +8 -0
  53. package/dist/components/dropdown-menu/dropdown-menu-root.d.ts +2 -2
  54. package/dist/components/dropdown-menu/dropdown-menu-sub-trigger.d.ts +1 -1
  55. package/dist/components/dropdown-menu/dropdown-menu-sub.d.ts +1 -1
  56. package/dist/components/dropdown-menu/{dropdown-menu-primitive-core.d.ts → dropdownMenuContext.d.ts} +16 -18
  57. package/dist/components/dropdown-menu/dropdownMenuDataModel.d.ts +20 -0
  58. package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -0
  59. package/dist/components/dropdown-menu/dropdownMenuInteractionNavigation.d.ts +24 -0
  60. package/dist/components/dropdown-menu/dropdownMenuInteractionRegistry.d.ts +42 -0
  61. package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +85 -0
  62. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +11 -11
  63. package/dist/components/dropdown-menu/useDropdownMenuContextTrigger.d.ts +9 -0
  64. package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +34 -0
  65. package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +22 -0
  66. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +6 -5
  67. package/dist/components/dropdown-menu/useDropdownMenuInteractionDismissal.d.ts +17 -0
  68. package/dist/components/dropdown-menu/useDropdownMenuInteractionKeyboard.d.ts +19 -0
  69. package/dist/components/dropdown-menu/useDropdownMenuPortalPosition.d.ts +0 -1
  70. package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +29 -0
  71. package/dist/components/dropdown-menu/useDropdownMenuPrimitiveContent.d.ts +2 -2
  72. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +1 -1
  73. package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +19 -0
  74. package/dist/components/floating/hoverDisclosureInteractionModel.d.ts +42 -0
  75. package/dist/components/floating/index.js +1 -1
  76. package/dist/components/floating/useFloatingPosition.d.ts +0 -1
  77. package/dist/components/floating/useHoverDisclosureInteractions.d.ts +32 -0
  78. package/dist/components/floating/useHoverDisclosureOpenState.d.ts +25 -0
  79. package/dist/components/floating/useHoverDisclosureTargetBinding.d.ts +27 -0
  80. package/dist/components/number-input/numberInputModel.d.ts +15 -0
  81. package/dist/components/number-input/useNumberInput.d.ts +3 -17
  82. package/dist/components/pagination/index.d.ts +1 -1
  83. package/dist/components/pagination/index.js +1 -1
  84. package/dist/components/pagination/paginationModel.d.ts +4 -0
  85. package/dist/components/pagination/types.d.ts +15 -0
  86. package/dist/components/pagination/usePagination.d.ts +3 -19
  87. package/dist/components/popover/usePopoverBindings.d.ts +16 -0
  88. package/dist/components/progress/progressModel.d.ts +8 -0
  89. package/dist/components/progress/useProgress.d.ts +0 -6
  90. package/dist/components/radio/useRadio.d.ts +1 -2
  91. package/dist/components/scroll-area/scroll-area.d.ts +1 -1
  92. package/dist/components/scroll-area/scrollAreaModel.d.ts +64 -0
  93. package/dist/components/scroll-area/useScrollArea.d.ts +70 -53
  94. package/dist/components/scroll-area/{useScrollAreaPresentation.d.ts → useScrollAreaAttributes.d.ts} +37 -17
  95. package/dist/components/scroll-area/useScrollAreaDerivedState.d.ts +8 -0
  96. package/dist/components/scroll-area/useScrollAreaMeasurement.d.ts +35 -0
  97. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +10 -8
  98. package/dist/components/scroll-area/useScrollAreaVisibility.d.ts +15 -20
  99. package/dist/components/slider/rangeSliderModel.d.ts +41 -0
  100. package/dist/components/slider/{sliderCore.d.ts → sliderModel.d.ts} +0 -1
  101. package/dist/components/slider/useRangeSlider.d.ts +8 -16
  102. package/dist/components/slider/useRangeSliderValueState.d.ts +40 -0
  103. package/dist/components/slider/useSlider.d.ts +7 -13
  104. package/dist/components/slider/useSliderPointerPreview.d.ts +22 -0
  105. package/dist/components/slider/useSliderTooltipState.d.ts +40 -0
  106. package/dist/components/slider/useSliderValueState.d.ts +33 -0
  107. package/dist/components/teleport-provider/index.js +1 -1
  108. package/dist/components/teleport-provider/useTeleportTarget.d.ts +1 -2
  109. package/dist/components/toast/useToastLifecycle.d.ts +19 -0
  110. package/dist/components/tooltip/useTooltip.d.ts +1 -2
  111. package/dist/css.js +12 -0
  112. package/dist/dialog.js +226 -218
  113. package/dist/dropdown-menu.js +1458 -1097
  114. package/dist/events.js +59 -0
  115. package/dist/field.css +8 -8
  116. package/dist/field.js +13 -25
  117. package/dist/floating.js +548 -319
  118. package/dist/floatingOffset.js +11 -0
  119. package/dist/focus-trap.js +7 -5
  120. package/dist/focusNavigation.js +37 -0
  121. package/dist/icon-button.css +8 -8
  122. package/dist/icon-button.js +7 -6
  123. package/dist/index.js +6 -6
  124. package/dist/input.css +24 -24
  125. package/dist/input.js +19 -31
  126. package/dist/interactive.js +18 -0
  127. package/dist/modal.js +1 -1
  128. package/dist/number-input.css +18 -18
  129. package/dist/number-input.js +14 -12
  130. package/dist/number.js +22 -0
  131. package/dist/overlay.js +3 -2
  132. package/dist/pagination.css +28 -28
  133. package/dist/pagination.js +65 -63
  134. package/dist/pointer.js +9 -0
  135. package/dist/popover.css +34 -34
  136. package/dist/popover.js +85 -86
  137. package/dist/progress.js +10 -13
  138. package/dist/query.js +40 -0
  139. package/dist/radio.css +18 -18
  140. package/dist/radio.js +30 -36
  141. package/dist/rafScheduler.js +34 -0
  142. package/dist/scroll-area.css +28 -28
  143. package/dist/scroll-area.js +512 -516
  144. package/dist/select.css +45 -45
  145. package/dist/select.js +36 -44
  146. package/dist/slider.css +191 -191
  147. package/dist/slider.js +691 -618
  148. package/dist/styles-api.d.ts +0 -1
  149. package/dist/styles-api.js +1 -4
  150. package/dist/switch.css +17 -17
  151. package/dist/switch.js +14 -15
  152. package/dist/tabs.css +43 -43
  153. package/dist/tabs.js +29 -56
  154. package/dist/text.js +17 -0
  155. package/dist/textarea.css +26 -26
  156. package/dist/textarea.js +21 -32
  157. package/dist/toast.css +26 -26
  158. package/dist/toast.js +141 -118
  159. package/dist/tooltip.css +12 -12
  160. package/dist/tooltip.js +36 -40
  161. package/dist/useCollapse.js +8 -11
  162. package/dist/useControlState.js +3 -6
  163. package/dist/useFloatingPosition.js +140 -10
  164. package/dist/useOverlayZIndex.js +1 -5
  165. package/dist/useTeleportTarget.js +3 -14
  166. package/dist/useTypeahead.js +94 -0
  167. package/dist/utils/aria.d.ts +3 -0
  168. package/dist/utils/attributes.d.ts +2 -0
  169. package/dist/utils/bem.d.ts +3 -0
  170. package/dist/utils/collectionNavigation.d.ts +2 -0
  171. package/dist/utils/color.d.ts +7 -0
  172. package/dist/{components/color-picker/color-picker-utils.d.ts → utils/colorPicker.d.ts} +5 -4
  173. package/dist/utils/componentColors.d.ts +7 -0
  174. package/dist/utils/css.d.ts +3 -0
  175. package/dist/utils/dom/ancestry.d.ts +7 -0
  176. package/dist/utils/dom/attributes.d.ts +16 -0
  177. package/dist/utils/dom/componentRef.d.ts +4 -0
  178. package/dist/utils/dom/events.d.ts +5 -0
  179. package/dist/utils/dom/focusNavigation.d.ts +7 -0
  180. package/dist/utils/dom/interactive.d.ts +2 -0
  181. package/dist/utils/dom/pointer.d.ts +2 -0
  182. package/dist/utils/dom/query.d.ts +4 -0
  183. package/dist/utils/dom/scroll.d.ts +23 -0
  184. package/dist/utils/floatingOffset.d.ts +10 -0
  185. package/dist/utils/geometry.d.ts +14 -0
  186. package/dist/utils/indexPath.d.ts +6 -0
  187. package/dist/utils/number.d.ts +4 -0
  188. package/dist/utils/rafScheduler.d.ts +4 -0
  189. package/dist/utils/text.d.ts +2 -0
  190. package/docs/code-architecture.md +118 -0
  191. package/docs/public-floating-api.md +6 -5
  192. package/package.json +13 -12
  193. package/dist/components/dropdown-menu/dropdown-menu-outside.d.ts +0 -3
  194. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +0 -21
  195. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +0 -36
  196. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +0 -29
  197. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +0 -52
  198. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +0 -17
  199. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +0 -18
  200. package/dist/components/scroll-area/scrollAreaCore.d.ts +0 -30
  201. package/dist/components/scroll-area/useScrollAreaControls.d.ts +0 -25
  202. package/dist/components/scroll-area/useScrollAreaMetrics.d.ts +0 -38
  203. /package/dist/components/alert/{useAlertColor.d.ts → alertColor.d.ts} +0 -0
  204. /package/dist/components/avatar/{useAvatarColor.d.ts → avatarColor.d.ts} +0 -0
  205. /package/dist/components/badge/{useBadgeColor.d.ts → badgeColor.d.ts} +0 -0
  206. /package/dist/components/button/{useButtonColor.d.ts → buttonColor.d.ts} +0 -0
  207. /package/dist/components/color-swatch/{useColorSwatchColor.d.ts → colorSwatchColor.d.ts} +0 -0
  208. /package/dist/components/toast/{useToastColor.d.ts → toastColor.d.ts} +0 -0
package/dist/toast.js CHANGED
@@ -1,19 +1,20 @@
1
1
  import './toast.css';
2
2
  import { t as useControllableValue } from "./useControllableValue.js";
3
- import { n as useStylesApi } from "./styles-api.js";
3
+ import { t as useStylesApi } from "./styles-api.js";
4
4
  import { t as bem } from "./bem.js";
5
5
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
6
6
  import { t as x_default } from "./x.js";
7
7
  import { a as getComponentVariantColorRoles, t as componentColors } from "./componentColors.js";
8
+ import { i as isNodeWithinElement } from "./events.js";
8
9
  import { n as useOverlayZIndex } from "./useOverlayZIndex.js";
9
- import { r as useTeleportTarget } from "./useTeleportTarget.js";
10
- import { VaporTeleport, VaporTransition, VaporTransitionGroup, computed, createComponent, createFor, createIf, createInvoker, createSlot, defineVaporComponent, delegateEvents, extend, inject, nextTick, onBeforeUnmount, onMounted, provide, ref, renderEffect, setDynamicProps, setInsertionState, setText, template, toDisplayString, toValue, txt, unref, useSlots, watch } from "vue";
10
+ import { n as useTeleportTarget } from "./useTeleportTarget.js";
11
+ import { VaporTeleport, VaporTransition, VaporTransitionGroup, computed, createComponent, createFor, createIf, createSlot, defineVaporComponent, extend, inject, nextTick, on, onBeforeUnmount, onMounted, provide, ref, renderEffect, setDynamicProps, setInsertionState, setText, template, toDisplayString, toValue, txt, unref, useSlots, watch } from "vue";
11
12
  //#region src/components/toast/defaults.ts
12
13
  var DEFAULT_TOAST_DURATION = 5e3;
13
14
  var DEFAULT_TOAST_ROLE = "status";
14
15
  var DEFAULT_TOAST_CLOSE_LABEL = "Close toast";
15
16
  //#endregion
16
- //#region src/components/toast/useToastColor.ts
17
+ //#region src/components/toast/toastColor.ts
17
18
  function getToastColorStyle(color, variant, autoContrast, contrastColor) {
18
19
  if (!color && !variant) return void 0;
19
20
  const resolvedVariant = variant ?? "surface";
@@ -34,13 +35,131 @@ function getToastColorStyle(color, variant, autoContrast, contrastColor) {
34
35
  };
35
36
  }
36
37
  //#endregion
38
+ //#region src/components/toast/useToastLifecycle.ts
39
+ function useToastLifecycle(options) {
40
+ const isOpen = computed(() => toValue(options.isOpen));
41
+ const duration = computed(() => toValue(options.duration));
42
+ const pauseOnHover = computed(() => toValue(options.pauseOnHover));
43
+ const pauseOnFocus = computed(() => toValue(options.pauseOnFocus));
44
+ let isMounted = false;
45
+ let closePending = false;
46
+ let pausedByHover = false;
47
+ let pausedByFocus = false;
48
+ let timer;
49
+ let timerStartedAt = 0;
50
+ let remainingDuration = 0;
51
+ function getDuration() {
52
+ return Number.isFinite(duration.value) && duration.value > 0 ? duration.value : 0;
53
+ }
54
+ function clearTimer() {
55
+ if (timer === void 0) return;
56
+ clearTimeout(timer);
57
+ timer = void 0;
58
+ }
59
+ function scheduleTimer() {
60
+ if (!isOpen.value || remainingDuration <= 0 || pausedByHover || pausedByFocus) return;
61
+ timerStartedAt = Date.now();
62
+ timer = setTimeout(() => {
63
+ timer = void 0;
64
+ remainingDuration = 0;
65
+ close("timeout");
66
+ }, remainingDuration);
67
+ }
68
+ function resetTimer() {
69
+ clearTimer();
70
+ remainingDuration = getDuration();
71
+ scheduleTimer();
72
+ }
73
+ function pauseTimer() {
74
+ if (timer === void 0) return;
75
+ remainingDuration = Math.max(0, remainingDuration - (Date.now() - timerStartedAt));
76
+ clearTimer();
77
+ if (remainingDuration === 0) close("timeout");
78
+ }
79
+ function resumeTimer() {
80
+ if (pausedByHover || pausedByFocus) return;
81
+ scheduleTimer();
82
+ }
83
+ function resetPauseState() {
84
+ pausedByHover = false;
85
+ pausedByFocus = false;
86
+ }
87
+ function onMouseenter() {
88
+ if (!pauseOnHover.value) return;
89
+ pausedByHover = true;
90
+ pauseTimer();
91
+ }
92
+ function onMouseleave() {
93
+ if (!pauseOnHover.value) return;
94
+ pausedByHover = false;
95
+ resumeTimer();
96
+ }
97
+ function onFocusin() {
98
+ if (!pauseOnFocus.value) return;
99
+ pausedByFocus = true;
100
+ pauseTimer();
101
+ }
102
+ function onFocusout(event) {
103
+ if (!pauseOnFocus.value) return;
104
+ if (isNodeWithinElement(event.relatedTarget, event.currentTarget)) return;
105
+ pausedByFocus = false;
106
+ resumeTimer();
107
+ }
108
+ function close(reason) {
109
+ if (closePending) return;
110
+ closePending = true;
111
+ clearTimer();
112
+ options.requestClose(reason);
113
+ if (isOpen.value) {
114
+ resetTimer();
115
+ nextTick(() => {
116
+ if (isOpen.value) closePending = false;
117
+ });
118
+ }
119
+ }
120
+ watch(isOpen, (open) => {
121
+ if (open) closePending = false;
122
+ });
123
+ watch(pauseOnHover, (enabled) => {
124
+ if (enabled || !pausedByHover) return;
125
+ pausedByHover = false;
126
+ resumeTimer();
127
+ });
128
+ watch(pauseOnFocus, (enabled) => {
129
+ if (enabled || !pausedByFocus) return;
130
+ pausedByFocus = false;
131
+ resumeTimer();
132
+ });
133
+ watch([isOpen, duration], ([open], [wasOpen]) => {
134
+ if (!isMounted) return;
135
+ if (!open || !wasOpen) resetPauseState();
136
+ resetTimer();
137
+ });
138
+ onMounted(() => {
139
+ isMounted = true;
140
+ resetTimer();
141
+ });
142
+ onBeforeUnmount(() => {
143
+ isMounted = false;
144
+ clearTimer();
145
+ });
146
+ return {
147
+ close,
148
+ rootEvents: {
149
+ onMouseenter,
150
+ onMouseleave,
151
+ onFocusin,
152
+ onFocusout
153
+ }
154
+ };
155
+ }
156
+ //#endregion
37
157
  //#region src/components/toast/toast.vue?vue&type=script&setup=true&vapor=true&lang.ts
38
- var t0$1 = template("<div data-v-782b93e5>");
158
+ var t0$1 = template("<div data-v-441adf44>");
39
159
  var t1 = template(" ");
40
- var t2 = template("<p data-v-782b93e5> ");
41
- var t3 = template("<div data-v-782b93e5 class=rp-toast__content>");
42
- var t4 = template("<button data-v-782b93e5>");
43
- delegateEvents("click");
160
+ var t2 = template("<p data-v-441adf44> ");
161
+ var t3 = template("<div data-v-441adf44 class=rp-toast__content>");
162
+ var t4 = template("<button data-v-441adf44>");
44
163
  //#endregion
45
164
  //#region src/components/toast/toast.vue
46
165
  var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -95,25 +214,15 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
95
214
  onChange: (open) => emit("update:open", open)
96
215
  });
97
216
  const isOpen = controllableOpen.value;
98
- const isMounted = ref(false);
99
- const pausedByHover = ref(false);
100
- const pausedByFocus = ref(false);
101
- let closePending = false;
102
- let timer;
103
- let timerStartedAt = 0;
104
- let remainingDuration = 0;
105
- watch(() => props.open, (open) => {
106
- if (open) closePending = false;
107
- });
108
- watch(() => props.pauseOnHover, (pauseOnHover) => {
109
- if (pauseOnHover || !pausedByHover.value) return;
110
- pausedByHover.value = false;
111
- resumeTimer();
112
- });
113
- watch(() => props.pauseOnFocus, (pauseOnFocus) => {
114
- if (pauseOnFocus || !pausedByFocus.value) return;
115
- pausedByFocus.value = false;
116
- resumeTimer();
217
+ const { close: closeToast, rootEvents } = useToastLifecycle({
218
+ isOpen,
219
+ duration: () => props.duration,
220
+ pauseOnHover: () => props.pauseOnHover,
221
+ pauseOnFocus: () => props.pauseOnFocus,
222
+ requestClose(reason) {
223
+ controllableOpen.setValue(false);
224
+ emit("close", reason);
225
+ }
117
226
  });
118
227
  const hasTitle = computed(() => Boolean(props.title || slots.title));
119
228
  const hasDescription = computed(() => Boolean(props.description));
@@ -130,91 +239,8 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
130
239
  class: rootClass.value,
131
240
  style: rootStyle.value,
132
241
  role: resolvedRole.value,
133
- onMouseenter,
134
- onMouseleave,
135
- onFocusin,
136
- onFocusout
242
+ ...rootEvents
137
243
  }));
138
- watch([isOpen, () => props.duration], ([open], [wasOpen]) => {
139
- if (!isMounted.value) return;
140
- if (!open || !wasOpen) {
141
- pausedByHover.value = false;
142
- pausedByFocus.value = false;
143
- }
144
- resetTimer();
145
- });
146
- onMounted(() => {
147
- isMounted.value = true;
148
- resetTimer();
149
- });
150
- onBeforeUnmount(clearTimer);
151
- function getDuration() {
152
- return Number.isFinite(props.duration) && props.duration > 0 ? props.duration : 0;
153
- }
154
- function resetTimer() {
155
- clearTimer();
156
- remainingDuration = getDuration();
157
- scheduleTimer();
158
- }
159
- function scheduleTimer() {
160
- if (!isOpen.value || remainingDuration <= 0 || pausedByHover.value || pausedByFocus.value) return;
161
- timerStartedAt = Date.now();
162
- timer = setTimeout(() => {
163
- timer = void 0;
164
- remainingDuration = 0;
165
- closeToast("timeout");
166
- }, remainingDuration);
167
- }
168
- function clearTimer() {
169
- if (timer === void 0) return;
170
- clearTimeout(timer);
171
- timer = void 0;
172
- }
173
- function pauseTimer() {
174
- if (timer === void 0) return;
175
- remainingDuration = Math.max(0, remainingDuration - (Date.now() - timerStartedAt));
176
- clearTimer();
177
- if (remainingDuration === 0) closeToast("timeout");
178
- }
179
- function resumeTimer() {
180
- if (pausedByHover.value || pausedByFocus.value) return;
181
- scheduleTimer();
182
- }
183
- function onMouseenter() {
184
- if (!props.pauseOnHover) return;
185
- pausedByHover.value = true;
186
- pauseTimer();
187
- }
188
- function onMouseleave() {
189
- if (!props.pauseOnHover) return;
190
- pausedByHover.value = false;
191
- resumeTimer();
192
- }
193
- function onFocusin() {
194
- if (!props.pauseOnFocus) return;
195
- pausedByFocus.value = true;
196
- pauseTimer();
197
- }
198
- function onFocusout(event) {
199
- if (!props.pauseOnFocus) return;
200
- const currentTarget = event.currentTarget;
201
- if (currentTarget instanceof HTMLElement && event.relatedTarget instanceof Node && currentTarget.contains(event.relatedTarget)) return;
202
- pausedByFocus.value = false;
203
- resumeTimer();
204
- }
205
- function closeToast(reason) {
206
- if (closePending) return;
207
- closePending = true;
208
- clearTimer();
209
- controllableOpen.setValue(false);
210
- emit("close", reason);
211
- if (isOpen.value) {
212
- resetTimer();
213
- nextTick(() => {
214
- if (isOpen.value) closePending = false;
215
- });
216
- }
217
- }
218
244
  const _on_after_leave = () => emit("after-leave");
219
245
  return createComponent(VaporTransition, {
220
246
  name: "rp-toast",
@@ -283,14 +309,14 @@ var toast_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
283
309
  }]));
284
310
  setInsertionState(n29, null, 0);
285
311
  createComponent(unref(x_default), { "aria-hidden": "true" });
286
- n29.$evtclick = createInvoker(() => closeToast("dismiss"));
312
+ on(n29, "click", () => unref(closeToast)("dismiss"));
287
313
  return n29;
288
314
  });
289
315
  return n30;
290
316
  }, null, 129);
291
317
  }, { _: 8 }), true);
292
318
  }
293
- }), [["__scopeId", "data-v-782b93e5"]]);
319
+ }), [["__scopeId", "data-v-441adf44"]]);
294
320
  //#endregion
295
321
  //#region src/components/toast/toast-store.ts
296
322
  var TYPE_DEFAULTS = {
@@ -710,12 +736,9 @@ var toast_viewport_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
710
736
  }), [["__scopeId", "data-v-480d3e51"]]);
711
737
  //#endregion
712
738
  //#region src/components/toast/useToastState.ts
713
- function optionValue(value) {
714
- return toValue(value);
715
- }
716
739
  function useToastState(options = {}) {
717
740
  const closeReason = ref(null);
718
- const controlledOpen = computed(() => optionValue(options.open));
741
+ const controlledOpen = computed(() => toValue(options.open));
719
742
  const controllableOpen = useControllableValue({
720
743
  modelValue: () => controlledOpen.value,
721
744
  defaultValue: () => options.defaultOpen ?? false,
package/dist/tooltip.css CHANGED
@@ -1,11 +1,11 @@
1
1
  @layer ropav.components {
2
- .rp-tooltip[data-v-9457a843] {
2
+ .rp-tooltip[data-v-19aad69c] {
3
3
  position: relative;
4
4
  display: inline-flex;
5
5
  font-family: var(--rp-font-family);
6
6
  vertical-align: middle;
7
7
  }
8
- .rp-tooltip__content[data-v-9457a843] {
8
+ .rp-tooltip__content[data-v-19aad69c] {
9
9
  --_rp-tooltip-main-axis-offset: var(--rp-spacing-2);
10
10
  --_rp-tooltip-cross-axis-offset: 0px;
11
11
  --_rp-tooltip-arrow-size: 0.4375rem;
@@ -29,10 +29,10 @@
29
29
  border-radius: var(--rp-radius-sm);
30
30
  box-shadow: var(--rp-shadow-md);
31
31
  }
32
- .rp-tooltip--target[data-v-9457a843] {
32
+ .rp-tooltip--target[data-v-19aad69c] {
33
33
  display: contents;
34
34
  }
35
- .rp-tooltip__arrow[data-v-9457a843] {
35
+ .rp-tooltip__arrow[data-v-19aad69c] {
36
36
  position: absolute;
37
37
  width: var(--_rp-tooltip-arrow-size);
38
38
  height: var(--_rp-tooltip-arrow-size);
@@ -40,24 +40,24 @@
40
40
  background-color: inherit;
41
41
  rotate: 45deg;
42
42
  }
43
- .rp-tooltip__arrow[data-side=top][data-v-9457a843] {
43
+ .rp-tooltip__arrow[data-side=top][data-v-19aad69c] {
44
44
  bottom: calc(-1 * var(--_rp-tooltip-arrow-size) / 2);
45
45
  }
46
- .rp-tooltip__arrow[data-side=right][data-v-9457a843] {
46
+ .rp-tooltip__arrow[data-side=right][data-v-19aad69c] {
47
47
  left: calc(-1 * var(--_rp-tooltip-arrow-size) / 2);
48
48
  }
49
- .rp-tooltip__arrow[data-side=bottom][data-v-9457a843] {
49
+ .rp-tooltip__arrow[data-side=bottom][data-v-19aad69c] {
50
50
  top: calc(-1 * var(--_rp-tooltip-arrow-size) / 2);
51
51
  }
52
- .rp-tooltip__arrow[data-side=left][data-v-9457a843] {
52
+ .rp-tooltip__arrow[data-side=left][data-v-19aad69c] {
53
53
  right: calc(-1 * var(--_rp-tooltip-arrow-size) / 2);
54
54
  }
55
- .rp-tooltip-content-enter-active[data-v-9457a843],
56
- .rp-tooltip-content-leave-active[data-v-9457a843] {
55
+ .rp-tooltip-content-enter-active[data-v-19aad69c],
56
+ .rp-tooltip-content-leave-active[data-v-19aad69c] {
57
57
  transition: opacity var(--rp-transition-fast);
58
58
  }
59
- .rp-tooltip-content-enter-from[data-v-9457a843],
60
- .rp-tooltip-content-leave-to[data-v-9457a843] {
59
+ .rp-tooltip-content-enter-from[data-v-19aad69c],
60
+ .rp-tooltip-content-leave-to[data-v-19aad69c] {
61
61
  opacity: 0;
62
62
  }
63
63
  }
package/dist/tooltip.js CHANGED
@@ -1,13 +1,19 @@
1
1
  import './tooltip.css';
2
2
  import { t as useControllableValue } from "./useControllableValue.js";
3
- import { n as useStylesApi, t as presence } from "./styles-api.js";
3
+ import { t as useStylesApi } from "./styles-api.js";
4
+ import { n as toPresenceAttribute } from "./attributes.js";
4
5
  import { t as bem } from "./bem.js";
6
+ import { t as isElement } from "./query.js";
5
7
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
8
+ import { r as normalizeDelay } from "./number.js";
6
9
  import { a as getComponentVariantColorRoles } from "./componentColors.js";
10
+ import { a as snapshotAttributes, i as restoreAttributes } from "./attributes2.js";
11
+ import { n as mergeAriaIdRefs } from "./aria.js";
7
12
  import { n as useOverlayZIndex } from "./useOverlayZIndex.js";
8
- import { n as useFloatingPosition, r as useFloatingTarget, t as isElementReference } from "./useFloatingPosition.js";
9
- import { n as useTeleportPositioningKey, r as useTeleportTarget } from "./useTeleportTarget.js";
10
- import { VaporTeleport, VaporTransition, applyVShow, computed, createComponent, createIf, createSlot, createTemplateRefSetter, defineVaporComponent, extend, onBeforeUnmount, ref, renderEffect, setAttr, setDynamicProps, setInsertionState, setStaticTemplateRef, setStyle, setText, template, toDisplayString, unref, useId, useSlots, watch } from "vue";
13
+ import { t as getFloatingOffsetStyle } from "./floatingOffset.js";
14
+ import { n as useFloatingTarget, t as useFloatingPosition } from "./useFloatingPosition.js";
15
+ import { n as useTeleportTarget } from "./useTeleportTarget.js";
16
+ import { VaporTeleport, VaporTransition, applyVShow, computed, createComponent, createIf, createSlot, createTemplateRefSetter, defineVaporComponent, extend, onBeforeUnmount, ref, renderEffect, setAttr, setDynamicProps, setInsertionState, setStyle, setTemplateRefBinding, setText, template, toDisplayString, unref, useId, useSlots, watch } from "vue";
11
17
  //#region src/internal/composables/useDelayedOpen.ts
12
18
  function readOption(value, fallback) {
13
19
  return typeof value === "function" ? value() ?? fallback : value ?? fallback;
@@ -37,7 +43,7 @@ function useDelayedOpen(options = {}) {
37
43
  }
38
44
  function open() {
39
45
  if (isDisabled()) return;
40
- const delay = readOption(options.openDelay, 0);
46
+ const delay = normalizeDelay(readOption(options.openDelay, 0));
41
47
  if (delay <= 0) {
42
48
  setOpen(true);
43
49
  return;
@@ -61,14 +67,10 @@ function useDelayedOpen(options = {}) {
61
67
  }
62
68
  //#endregion
63
69
  //#region src/components/tooltip/useTooltip.ts
64
- function resolveTooltipOffsetStyle(offset) {
65
- if (offset == null) return void 0;
66
- if (typeof offset === "number") return { "--_rp-tooltip-main-axis-offset": `${offset}px` };
67
- const style = {};
68
- if (offset.mainAxis != null) style["--_rp-tooltip-main-axis-offset"] = `${offset.mainAxis}px`;
69
- if (offset.crossAxis != null) style["--_rp-tooltip-cross-axis-offset"] = `${offset.crossAxis}px`;
70
- return Object.keys(style).length > 0 ? style : void 0;
71
- }
70
+ var TOOLTIP_OFFSET_PROPERTIES = {
71
+ mainAxis: "--_rp-tooltip-main-axis-offset",
72
+ crossAxis: "--_rp-tooltip-cross-axis-offset"
73
+ };
72
74
  function resolveTooltipColorStyleWithContrast(color, autoContrast, contrastColor) {
73
75
  if (!color) return void 0;
74
76
  const roles = getComponentVariantColorRoles({
@@ -97,9 +99,8 @@ function useTooltip(props, emitOpenChange) {
97
99
  const shouldRenderContent = computed(() => !isDisabled.value);
98
100
  const shouldDescribeContent = computed(() => shouldRenderContent.value && !isDecorative.value);
99
101
  const teleportTo = useTeleportTarget(() => props.teleportTo);
100
- const teleportPositioningKey = useTeleportPositioningKey();
101
102
  const { isExplicitTarget, reference, resolvedTarget } = useFloatingTarget(() => props.target, rootRef);
102
- const targetElement = computed(() => isElementReference(resolvedTarget.value) ? resolvedTarget.value : null);
103
+ const targetElement = computed(() => isElement(resolvedTarget.value) ? resolvedTarget.value : null);
103
104
  const zIndex = useOverlayZIndex({
104
105
  baseZIndex: () => props.baseZIndex,
105
106
  defaultBaseZIndex: 1e3
@@ -123,12 +124,7 @@ function useTooltip(props, emitOpenChange) {
123
124
  flipOptions: () => props.flipOptions,
124
125
  shift: () => props.shift !== false,
125
126
  collisionPadding: () => props.collisionPadding ?? 8,
126
- autoUpdateOptions: () => props.autoUpdateOptions,
127
- restartKey: () => [
128
- Boolean(props.teleport),
129
- teleportTo.value,
130
- teleportPositioningKey.value
131
- ]
127
+ autoUpdateOptions: () => props.autoUpdateOptions
132
128
  });
133
129
  const placementSide = computed(() => floating.actualPlacement.value.split("-")[0]);
134
130
  const rootClass = computed(() => bem("rp-tooltip", {
@@ -143,7 +139,7 @@ function useTooltip(props, emitOpenChange) {
143
139
  const contentAriaHidden = computed(() => isDecorative.value ? "true" : void 0);
144
140
  const contentStyle = computed(() => ({
145
141
  ...floating.floatingStyle.value,
146
- ...resolveTooltipOffsetStyle(props.offset),
142
+ ...getFloatingOffsetStyle(props.offset, TOOLTIP_OFFSET_PROPERTIES),
147
143
  ...resolveTooltipColorStyleWithContrast(props.color, props.autoContrast, props.contrastColor),
148
144
  zIndex: zIndex.value
149
145
  }));
@@ -181,14 +177,9 @@ function useTooltip(props, emitOpenChange) {
181
177
  tooltipId
182
178
  ], ([explicit, target, shouldDescribe, id], _previous, onCleanup) => {
183
179
  if (!explicit || !target || !shouldDescribe) return;
184
- const previous = target.getAttribute("aria-describedby");
185
- const ids = (previous ?? "").split(/\s+/).filter(Boolean);
186
- if (!ids.includes(id)) ids.push(id);
187
- target.setAttribute("aria-describedby", ids.join(" "));
188
- onCleanup(() => {
189
- if (previous == null) target.removeAttribute("aria-describedby");
190
- else target.setAttribute("aria-describedby", previous);
191
- });
180
+ const snapshot = snapshotAttributes(target, ["aria-describedby"]);
181
+ target.setAttribute("aria-describedby", mergeAriaIdRefs(snapshot.get("aria-describedby"), id) ?? "");
182
+ onCleanup(() => restoreAttributes(target, snapshot));
192
183
  }, { flush: "sync" });
193
184
  return {
194
185
  rootRef,
@@ -216,10 +207,10 @@ function useTooltip(props, emitOpenChange) {
216
207
  }
217
208
  //#endregion
218
209
  //#region src/components/tooltip/tooltip.vue?vue&type=script&setup=true&vapor=true&lang.ts
219
- var t0 = template("<span data-v-9457a843 class=rp-tooltip__arrow aria-hidden=true>");
210
+ var t0 = template("<span data-v-19aad69c class=rp-tooltip__arrow aria-hidden=true>");
220
211
  var t1 = template(" ");
221
- var t2 = template("<span data-v-9457a843>");
222
- var t3 = template("<span data-v-9457a843>", 1);
212
+ var t2 = template("<span data-v-19aad69c>");
213
+ var t3 = template("<span data-v-19aad69c>", 1);
223
214
  //#endregion
224
215
  //#region src/components/tooltip/tooltip.vue
225
216
  var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -283,12 +274,17 @@ var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
283
274
  const { rootRef, contentRef, arrowRef, tooltipId, isDisabled, isVisible, isTargetMode, shouldRenderContent, rootClass, triggerProps, contentRole, contentAriaHidden, contentStyle, actualPlacement, placementSide, arrowStyle, teleportTo, openTooltip, closeTooltip, onKeydown } = useTooltip(props, (open) => {
284
275
  emit("update:open", open);
285
276
  });
277
+ const templateRefs = {
278
+ root: rootRef,
279
+ content: contentRef,
280
+ arrow: arrowRef
281
+ };
286
282
  const { getPartAttrs, getRootAttrs } = useStylesApi(props, "root");
287
283
  const state = computed(() => isVisible.value ? "open" : "closed");
288
284
  const rootAttrs = computed(() => getRootAttrs({
289
285
  class: rootClass.value,
290
286
  "data-state": state.value,
291
- "data-disabled": presence(isDisabled.value),
287
+ "data-disabled": toPresenceAttribute(isDisabled.value),
292
288
  onMouseenter: openTooltip,
293
289
  onMouseleave: closeTooltip,
294
290
  onFocusin: openTooltip,
@@ -302,7 +298,7 @@ var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
302
298
  ...props.classNames?.trigger !== void 0 ? { class: partAttrs.class } : {},
303
299
  ...props.styles?.trigger !== void 0 ? { style: partAttrs.style } : {},
304
300
  "data-state": state.value,
305
- "data-disabled": presence(isDisabled.value)
301
+ "data-disabled": toPresenceAttribute(isDisabled.value)
306
302
  };
307
303
  });
308
304
  const contentAttrs = computed(() => ({
@@ -340,10 +336,10 @@ var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
340
336
  setInsertionState(n11, null, 0);
341
337
  createIf(() => __props.arrow, () => {
342
338
  const n7 = t0();
343
- _setTemplateRef(n7, arrowRef, null, "arrowRef");
344
339
  renderEffect(() => {
345
340
  setAttr(n7, "data-side", unref(placementSide));
346
341
  setStyle(n7, unref(arrowStyle));
342
+ _setTemplateRef(n7, templateRefs.arrow);
347
343
  });
348
344
  return n7;
349
345
  });
@@ -354,14 +350,14 @@ var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
354
350
  return n10;
355
351
  }, 1);
356
352
  applyVShow(n11, () => unref(isVisible));
357
- _setTemplateRef(n11, contentRef, null, "contentRef");
353
+ setTemplateRefBinding(n11, () => templateRefs.content, _setTemplateRef);
358
354
  return n11;
359
355
  }, null, 129);
360
356
  }, { _: 8 }));
361
357
  });
362
- setStaticTemplateRef(n14, rootRef, null, "rootRef");
358
+ setTemplateRefBinding(n14, () => templateRefs.root);
363
359
  return n14;
364
360
  }
365
- }), [["__scopeId", "data-v-9457a843"]]);
361
+ }), [["__scopeId", "data-v-19aad69c"]]);
366
362
  //#endregion
367
- export { useDelayedOpen as i, resolveTooltipColorStyleWithContrast as n, resolveTooltipOffsetStyle as r, tooltip_default as t };
363
+ export { resolveTooltipColorStyleWithContrast as n, useDelayedOpen as r, tooltip_default as t };
@@ -3,15 +3,12 @@ import { t as bem } from "./bem.js";
3
3
  import { computed, toValue, useId } from "vue";
4
4
  //#region src/components/collapse/useCollapse.ts
5
5
  var DEFAULT_ROLE = "region";
6
- function optionValue(value) {
7
- return toValue(value);
8
- }
9
6
  function useCollapse(options = {}, emitOpenChange) {
10
7
  const generatedId = useId();
11
- const id = computed(() => optionValue(options.id) ?? `${generatedId}-collapse`);
12
- const isDisabled = computed(() => Boolean(optionValue(options.disabled)));
8
+ const id = computed(() => toValue(options.id) ?? `${generatedId}-collapse`);
9
+ const isDisabled = computed(() => Boolean(toValue(options.disabled)));
13
10
  const controllableOpen = useControllableValue({
14
- modelValue: () => optionValue(options.open),
11
+ modelValue: () => toValue(options.open),
15
12
  defaultValue: () => false,
16
13
  onChange: (nextOpen) => {
17
14
  options.onOpenChange?.(nextOpen);
@@ -20,7 +17,7 @@ function useCollapse(options = {}, emitOpenChange) {
20
17
  });
21
18
  const isOpen = controllableOpen.value;
22
19
  const state = computed(() => isOpen.value ? "open" : "closed");
23
- const shouldRenderContent = computed(() => !optionValue(options.unmountOnExit) || isOpen.value);
20
+ const shouldRenderContent = computed(() => !toValue(options.unmountOnExit) || isOpen.value);
24
21
  const rootClass = computed(() => bem("rp-collapse", {
25
22
  open: isOpen.value,
26
23
  closed: !isOpen.value,
@@ -48,12 +45,12 @@ function useCollapse(options = {}, emitOpenChange) {
48
45
  const contentProps = computed(() => ({
49
46
  class: "rp-collapse__content",
50
47
  id: id.value,
51
- role: optionValue(options.role) ?? DEFAULT_ROLE,
48
+ role: toValue(options.role) ?? DEFAULT_ROLE,
52
49
  "data-state": state.value,
53
50
  "aria-hidden": isOpen.value ? void 0 : "true",
54
- "aria-label": optionValue(options.ariaLabel) || void 0,
55
- "aria-labelledby": optionValue(options.ariaLabelledby) || void 0,
56
- "aria-describedby": optionValue(options.ariaDescribedby) || void 0
51
+ "aria-label": toValue(options.ariaLabel) || void 0,
52
+ "aria-labelledby": toValue(options.ariaLabelledby) || void 0,
53
+ "aria-describedby": toValue(options.ariaDescribedby) || void 0
57
54
  }));
58
55
  const triggerSlotProps = computed(() => ({
59
56
  triggerProps: triggerProps.value,
@@ -1,9 +1,6 @@
1
+ import { n as mergeAriaIdRefs } from "./aria.js";
1
2
  import { computed } from "vue";
2
3
  //#region src/internal/composables/useControlState.ts
3
- function mergeIds(...values) {
4
- const ids = values.flatMap((value) => value?.split(/\s+/) ?? []).filter(Boolean);
5
- return ids.length > 0 ? Array.from(new Set(ids)).join(" ") : void 0;
6
- }
7
4
  function useControlState(options = {}) {
8
5
  const id = computed(() => options.id);
9
6
  const form = computed(() => options.form);
@@ -11,8 +8,8 @@ function useControlState(options = {}) {
11
8
  const required = computed(() => options.required ?? false);
12
9
  const invalid = computed(() => options.invalid ?? false);
13
10
  const valid = computed(() => options.valid ?? false);
14
- const ariaDescribedby = computed(() => mergeIds(options.describedby));
15
- const ariaLabelledby = computed(() => mergeIds(options.labelledby));
11
+ const ariaDescribedby = computed(() => mergeAriaIdRefs(options.describedby));
12
+ const ariaLabelledby = computed(() => mergeAriaIdRefs(options.labelledby));
16
13
  return {
17
14
  get id() {
18
15
  return id.value;