ropav 0.0.10 → 0.0.11

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 (227) hide show
  1. package/README.md +6 -0
  2. package/dist/accordion.css +115 -111
  3. package/dist/accordion.js +60 -16
  4. package/dist/alert.css +110 -108
  5. package/dist/alert.js +48 -26
  6. package/dist/aspect-ratio.css +17 -15
  7. package/dist/aspect-ratio.js +20 -6
  8. package/dist/avatar.css +98 -96
  9. package/dist/avatar.js +27 -16
  10. package/dist/badge.css +95 -93
  11. package/dist/badge.js +29 -16
  12. package/dist/base.css +672 -671
  13. package/dist/button-group.css +39 -37
  14. package/dist/button-group.js +23 -12
  15. package/dist/button-link.css +160 -158
  16. package/dist/button-link.js +43 -24
  17. package/dist/button.css +160 -158
  18. package/dist/button.js +37 -19
  19. package/dist/card.css +109 -107
  20. package/dist/card.js +42 -17
  21. package/dist/checkbox.css +139 -137
  22. package/dist/checkbox.js +79 -28
  23. package/dist/collapse.css +29 -27
  24. package/dist/collapse.js +44 -10
  25. package/dist/color-input.css +137 -107
  26. package/dist/color-input.js +86 -17
  27. package/dist/color-picker.css +309 -303
  28. package/dist/color-picker.js +147 -54
  29. package/dist/color-picker2.js +9 -1
  30. package/dist/color-swatch.css +48 -46
  31. package/dist/color-swatch.js +15 -11
  32. package/dist/color-swatch2.js +4 -0
  33. package/dist/components/accordion/accordion-item.d.ts +13 -1
  34. package/dist/components/accordion/index.d.ts +2 -1
  35. package/dist/components/accordion/index.js +2 -2
  36. package/dist/components/accordion/types.d.ts +9 -4
  37. package/dist/components/alert/alert.d.ts +2 -2
  38. package/dist/components/alert/index.d.ts +2 -2
  39. package/dist/components/alert/index.js +2 -2
  40. package/dist/components/alert/types.d.ts +4 -1
  41. package/dist/components/aspect-ratio/index.d.ts +2 -1
  42. package/dist/components/aspect-ratio/index.js +2 -2
  43. package/dist/components/aspect-ratio/types.d.ts +4 -1
  44. package/dist/components/avatar/index.d.ts +2 -2
  45. package/dist/components/avatar/index.js +2 -2
  46. package/dist/components/avatar/types.d.ts +4 -1
  47. package/dist/components/badge/index.d.ts +2 -2
  48. package/dist/components/badge/index.js +2 -2
  49. package/dist/components/badge/types.d.ts +4 -1
  50. package/dist/components/button/index.d.ts +2 -1
  51. package/dist/components/button/index.js +2 -2
  52. package/dist/components/button/types.d.ts +4 -1
  53. package/dist/components/button-group/index.d.ts +2 -1
  54. package/dist/components/button-group/index.js +2 -2
  55. package/dist/components/button-group/types.d.ts +4 -1
  56. package/dist/components/button-link/index.d.ts +2 -1
  57. package/dist/components/button-link/index.js +2 -2
  58. package/dist/components/button-link/types.d.ts +4 -1
  59. package/dist/components/card/index.d.ts +2 -1
  60. package/dist/components/card/index.js +2 -2
  61. package/dist/components/card/types.d.ts +5 -1
  62. package/dist/components/checkbox/checkbox.d.ts +4 -1
  63. package/dist/components/checkbox/index.d.ts +2 -1
  64. package/dist/components/checkbox/index.js +2 -2
  65. package/dist/components/checkbox/types.d.ts +6 -1
  66. package/dist/components/checkbox/useCheckbox.d.ts +2 -0
  67. package/dist/components/collapse/collapse.d.ts +2 -2
  68. package/dist/components/collapse/index.d.ts +2 -1
  69. package/dist/components/collapse/index.js +2 -2
  70. package/dist/components/collapse/types.d.ts +9 -2
  71. package/dist/components/color-input/index.d.ts +2 -1
  72. package/dist/components/color-input/index.js +2 -2
  73. package/dist/components/color-input/types.d.ts +4 -1
  74. package/dist/components/color-picker/index.d.ts +2 -2
  75. package/dist/components/color-picker/index.js +2 -2
  76. package/dist/components/color-picker/types.d.ts +13 -1
  77. package/dist/components/color-swatch/index.d.ts +2 -1
  78. package/dist/components/color-swatch/index.js +2 -1
  79. package/dist/components/color-swatch/types.d.ts +4 -1
  80. package/dist/components/dropdown-menu/dropdown-menu-primitives.d.ts +724 -0
  81. package/dist/components/dropdown-menu/dropdown-menu.d.ts +3 -3
  82. package/dist/components/dropdown-menu/index.d.ts +53 -1
  83. package/dist/components/dropdown-menu/index.js +2 -2
  84. package/dist/components/dropdown-menu/types.d.ts +142 -6
  85. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +11 -3
  86. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +5 -3
  87. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +2 -1
  88. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +4 -4
  89. package/dist/components/dropdown-menu/useDropdownMenuPortalPosition.d.ts +19 -0
  90. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +14 -2
  91. package/dist/components/field/index.d.ts +2 -1
  92. package/dist/components/field/index.js +2 -2
  93. package/dist/components/field/types.d.ts +4 -1
  94. package/dist/components/floating/index.d.ts +1 -0
  95. package/dist/components/floating/index.js +0 -0
  96. package/dist/components/floating/types.d.ts +31 -0
  97. package/dist/components/floating/useFloatingPosition.d.ts +38 -0
  98. package/dist/components/focus-trap/focus-trap.d.ts +31 -0
  99. package/dist/components/focus-trap/index.d.ts +4 -0
  100. package/dist/components/focus-trap/index.js +3 -0
  101. package/dist/components/focus-trap/types.d.ts +41 -0
  102. package/dist/components/focus-trap/useFocusTrap.d.ts +2 -0
  103. package/dist/components/icon-button/index.d.ts +2 -1
  104. package/dist/components/icon-button/index.js +2 -1
  105. package/dist/components/icon-button/types.d.ts +4 -1
  106. package/dist/components/input/index.d.ts +2 -1
  107. package/dist/components/input/index.js +2 -1
  108. package/dist/components/input/types.d.ts +4 -1
  109. package/dist/components/modal/index.d.ts +2 -1
  110. package/dist/components/modal/index.js +2 -2
  111. package/dist/components/modal/types.d.ts +8 -1
  112. package/dist/components/number-input/index.d.ts +2 -1
  113. package/dist/components/number-input/index.js +2 -2
  114. package/dist/components/number-input/types.d.ts +4 -1
  115. package/dist/components/overlay/index.d.ts +2 -1
  116. package/dist/components/overlay/index.js +2 -1
  117. package/dist/components/overlay/types.d.ts +4 -1
  118. package/dist/components/popover/index.d.ts +2 -2
  119. package/dist/components/popover/index.js +2 -2
  120. package/dist/components/popover/popover.d.ts +2 -2
  121. package/dist/components/popover/types.d.ts +20 -11
  122. package/dist/components/popover/usePopover.d.ts +9 -1
  123. package/dist/components/progress/index.d.ts +2 -2
  124. package/dist/components/progress/index.js +2 -2
  125. package/dist/components/progress/types.d.ts +4 -1
  126. package/dist/components/radio/index.d.ts +2 -1
  127. package/dist/components/radio/index.js +2 -2
  128. package/dist/components/radio/radio.d.ts +8 -3
  129. package/dist/components/radio/types.d.ts +20 -3
  130. package/dist/components/radio/useRadio.d.ts +9 -4
  131. package/dist/components/select/index.d.ts +2 -1
  132. package/dist/components/select/index.js +2 -2
  133. package/dist/components/select/types.d.ts +4 -1
  134. package/dist/components/select/useSelect.d.ts +2 -1
  135. package/dist/components/slider/index.d.ts +2 -2
  136. package/dist/components/slider/index.js +2 -2
  137. package/dist/components/slider/range-slider-tooltip.d.ts +3 -0
  138. package/dist/components/slider/range-slider.d.ts +4 -1
  139. package/dist/components/slider/slider.d.ts +4 -1
  140. package/dist/components/slider/sliderCore.d.ts +4 -4
  141. package/dist/components/slider/types.d.ts +12 -2
  142. package/dist/components/slider/useRangeSlider.d.ts +1 -1
  143. package/dist/components/slider/useSlider.d.ts +1 -1
  144. package/dist/components/switch/index.d.ts +2 -1
  145. package/dist/components/switch/index.js +2 -2
  146. package/dist/components/switch/switch.d.ts +4 -1
  147. package/dist/components/switch/types.d.ts +6 -1
  148. package/dist/components/switch/useSwitch.d.ts +2 -0
  149. package/dist/components/tabs/index.d.ts +2 -1
  150. package/dist/components/tabs/index.js +2 -2
  151. package/dist/components/tabs/types.d.ts +13 -4
  152. package/dist/components/teleport-provider/index.d.ts +2 -0
  153. package/dist/components/teleport-provider/index.js +2 -0
  154. package/dist/components/teleport-provider/teleport-provider.d.ts +21 -0
  155. package/dist/components/teleport-provider/types.d.ts +4 -0
  156. package/dist/components/teleport-provider/useTeleportTarget.d.ts +5 -0
  157. package/dist/components/textarea/index.d.ts +2 -1
  158. package/dist/components/textarea/index.js +2 -2
  159. package/dist/components/textarea/textarea.d.ts +4 -1
  160. package/dist/components/textarea/types.d.ts +6 -1
  161. package/dist/components/textarea/useTextarea.d.ts +1 -0
  162. package/dist/components/toast/index.d.ts +2 -2
  163. package/dist/components/toast/index.js +2 -2
  164. package/dist/components/toast/toast.d.ts +2 -2
  165. package/dist/components/toast/types.d.ts +10 -6
  166. package/dist/components/tooltip/index.d.ts +2 -1
  167. package/dist/components/tooltip/index.js +2 -1
  168. package/dist/components/tooltip/tooltip.d.ts +2 -2
  169. package/dist/components/tooltip/types.d.ts +13 -12
  170. package/dist/components/tooltip/useTooltip.d.ts +13 -3
  171. package/dist/dropdown-menu.css +191 -107
  172. package/dist/dropdown-menu.js +1582 -81
  173. package/dist/field.css +41 -39
  174. package/dist/field.js +40 -16
  175. package/dist/focus-trap.js +80 -0
  176. package/dist/icon-button.css +193 -189
  177. package/dist/icon-button.js +23 -18
  178. package/dist/icon-button2.js +8 -0
  179. package/dist/index.d.ts +4 -0
  180. package/dist/index.js +36 -32
  181. package/dist/input.css +122 -120
  182. package/dist/input.js +47 -34
  183. package/dist/input2.js +9 -0
  184. package/dist/legacy-unlayered.css +5461 -0
  185. package/dist/modal.css +129 -127
  186. package/dist/modal.js +160 -200
  187. package/dist/number-input.css +87 -85
  188. package/dist/number-input.js +61 -17
  189. package/dist/overlay.css +26 -24
  190. package/dist/overlay.js +17 -9
  191. package/dist/overlay2.js +4 -0
  192. package/dist/popover.css +140 -107
  193. package/dist/popover.js +288 -193
  194. package/dist/popover2.js +6 -1
  195. package/dist/progress.css +101 -99
  196. package/dist/progress.js +50 -28
  197. package/dist/radio.css +114 -105
  198. package/dist/radio.js +154 -56
  199. package/dist/select.css +244 -242
  200. package/dist/select.js +92 -47
  201. package/dist/slider.css +1109 -1031
  202. package/dist/slider.js +330 -163
  203. package/dist/styles-api.d.ts +22 -0
  204. package/dist/styles-api.js +49 -0
  205. package/dist/switch.css +120 -108
  206. package/dist/switch.js +89 -33
  207. package/dist/tabs.css +286 -278
  208. package/dist/tabs.js +60 -21
  209. package/dist/teleport-provider.js +15 -0
  210. package/dist/textarea.css +132 -130
  211. package/dist/textarea.js +69 -27
  212. package/dist/toast.css +229 -225
  213. package/dist/toast.js +102 -42
  214. package/dist/tooltip.css +137 -107
  215. package/dist/tooltip.js +180 -228
  216. package/dist/tooltip2.js +8 -0
  217. package/dist/useClickOutside.js +1 -1
  218. package/dist/useFloatingPosition.js +1284 -0
  219. package/dist/useFocusTrap.js +130 -0
  220. package/dist/useTeleportTarget.js +29 -0
  221. package/docs/public-styles-api.md +133 -0
  222. package/docs/public-tokens.md +545 -0
  223. package/package.json +29 -5
  224. package/src/styles/_tokens.scss +33 -28
  225. package/src/styles/_utilities.scss +11 -9
  226. package/src/styles/styles-manifest.json +4125 -0
  227. package/dist/rafScheduler.js +0 -34
package/dist/tooltip.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import './tooltip.css';
2
2
  import { t as bem } from "./bem.js";
3
+ import { n as useStylesApi, t as presence } from "./styles-api.js";
3
4
  import { i as getComponentVariantColorRoles } from "./componentColors.js";
4
5
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
5
- import { t as createRafScheduler } from "./rafScheduler.js";
6
- import { VaporTransition, applyVShow, computed, createComponent, createIf, createInvoker, createSlot, defineVaporComponent, delegateEvents, extend, isRef, on, onBeforeUnmount, onMounted, ref, renderEffect, setAttr, setClass, setInsertionState, setProp, setStyle, setText, template, toDisplayString, unref, useId, useSlots, watch } from "vue";
6
+ import { n as useFloatingPosition, r as useFloatingTarget, t as isElementReference } from "./useFloatingPosition.js";
7
+ import { n as useTeleportTarget } from "./useTeleportTarget.js";
8
+ 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";
7
9
  //#region src/composables/useDelayedOpen.ts
8
10
  function readOption(value, fallback) {
9
11
  return typeof value === "function" ? value() ?? fallback : value ?? fallback;
@@ -55,29 +57,6 @@ function useDelayedOpen(options = {}) {
55
57
  }
56
58
  //#endregion
57
59
  //#region src/components/tooltip/useTooltip.ts
58
- function isHTMLElement(value) {
59
- return typeof HTMLElement !== "undefined" && value instanceof HTMLElement;
60
- }
61
- function getTargetPosition(rect, placement) {
62
- switch (placement) {
63
- case "right": return {
64
- x: rect.right,
65
- y: rect.top + rect.height / 2
66
- };
67
- case "bottom": return {
68
- x: rect.left + rect.width / 2,
69
- y: rect.bottom
70
- };
71
- case "left": return {
72
- x: rect.left,
73
- y: rect.top + rect.height / 2
74
- };
75
- default: return {
76
- x: rect.left + rect.width / 2,
77
- y: rect.top
78
- };
79
- }
80
- }
81
60
  function resolveTooltipOffsetStyle(offset) {
82
61
  if (offset == null) return void 0;
83
62
  if (typeof offset === "number") return { "--_rp-tooltip-main-axis-offset": `${offset}px` };
@@ -102,22 +81,19 @@ function resolveTooltipColorStyleWithContrast(color, autoContrast) {
102
81
  function useTooltip(props, emitOpenChange) {
103
82
  const slots = useSlots();
104
83
  const generatedId = useId();
105
- const targetElement = ref(null);
106
- const targetPosition = ref(null);
107
- const positionScheduler = createRafScheduler(updateTargetPosition, () => targetElement.value?.ownerDocument.defaultView);
108
- let isMounted = false;
109
- let removeTargetListeners;
110
- let removePositionListeners;
111
- let describedTarget = null;
112
- let previousTargetDescribedby = null;
84
+ const rootRef = ref(null);
85
+ const contentRef = ref(null);
86
+ const arrowRef = ref(null);
113
87
  const tooltipId = computed(() => props.id ?? `${generatedId}-tooltip`);
114
88
  const placement = computed(() => props.placement ?? "top");
115
- const isTargetMode = computed(() => props.target != null && props.target !== "");
116
- const hasContent = computed(() => Boolean(props.content || slots.content));
117
89
  const isDecorative = computed(() => Boolean(props.decorative));
90
+ const hasContent = computed(() => Boolean(props.content || slots.content));
118
91
  const isDisabled = computed(() => Boolean(props.disabled || !hasContent.value));
119
92
  const shouldRenderContent = computed(() => !isDisabled.value);
120
93
  const shouldDescribeContent = computed(() => shouldRenderContent.value && !isDecorative.value);
94
+ const teleportTo = useTeleportTarget(() => props.teleportTo);
95
+ const { isExplicitTarget, reference, resolvedTarget } = useFloatingTarget(() => props.target, rootRef);
96
+ const targetElement = computed(() => isElementReference(resolvedTarget.value) ? resolvedTarget.value : null);
121
97
  const { isOpen, open, closeImmediate } = useDelayedOpen({
122
98
  open: () => props.open,
123
99
  openDelay: () => props.openDelay ?? 300,
@@ -125,28 +101,36 @@ function useTooltip(props, emitOpenChange) {
125
101
  onOpenChange: emitOpenChange
126
102
  });
127
103
  const isVisible = computed(() => isOpen.value && !isDisabled.value);
104
+ const floating = useFloatingPosition({
105
+ reference,
106
+ floating: contentRef,
107
+ arrow: arrowRef,
108
+ open: isVisible,
109
+ placement: () => placement.value,
110
+ strategy: () => props.strategy ?? "absolute",
111
+ offset: () => props.offset,
112
+ flip: () => props.flip !== false,
113
+ shift: () => props.shift !== false,
114
+ collisionPadding: () => props.collisionPadding ?? 8,
115
+ arrowEnabled: () => Boolean(props.arrow),
116
+ restartKey: () => teleportTo.value
117
+ });
118
+ const placementSide = computed(() => floating.actualPlacement.value.split("-")[0]);
128
119
  const rootClass = computed(() => bem("rp-tooltip", {
129
- [`placement-${placement.value}`]: true,
120
+ [`placement-${floating.actualPlacement.value}`]: true,
130
121
  arrow: props.arrow,
131
- target: isTargetMode.value,
122
+ target: isExplicitTarget.value,
132
123
  open: isVisible.value,
133
124
  disabled: props.disabled
134
125
  }));
135
126
  const triggerProps = computed(() => ({ "aria-describedby": shouldDescribeContent.value ? tooltipId.value : void 0 }));
136
127
  const contentRole = computed(() => isDecorative.value ? void 0 : "tooltip");
137
128
  const contentAriaHidden = computed(() => isDecorative.value ? "true" : void 0);
138
- const contentStyle = computed(() => {
139
- const style = {
140
- ...resolveTooltipOffsetStyle(props.offset),
141
- ...resolveTooltipColorStyleWithContrast(props.color, props.autoContrast)
142
- };
143
- if (!isTargetMode.value || !targetPosition.value) return Object.keys(style).length > 0 ? style : void 0;
144
- return {
145
- ...style,
146
- "--_rp-tooltip-target-x": `${targetPosition.value.x}px`,
147
- "--_rp-tooltip-target-y": `${targetPosition.value.y}px`
148
- };
149
- });
129
+ const contentStyle = computed(() => ({
130
+ ...floating.floatingStyle.value,
131
+ ...resolveTooltipOffsetStyle(props.offset),
132
+ ...resolveTooltipColorStyleWithContrast(props.color, props.autoContrast)
133
+ }));
150
134
  function openTooltip() {
151
135
  open();
152
136
  }
@@ -156,155 +140,59 @@ function useTooltip(props, emitOpenChange) {
156
140
  function onKeydown(event) {
157
141
  if (event.key === "Escape") closeTooltip();
158
142
  }
159
- function readTarget() {
160
- return isRef(props.target) ? props.target.value : props.target;
161
- }
162
- function resolveTarget() {
163
- const target = readTarget();
164
- if (!target) return null;
165
- if (typeof target === "string") {
166
- if (typeof document === "undefined") return null;
167
- try {
168
- const element = document.querySelector(target);
169
- return isHTMLElement(element) ? element : null;
170
- } catch {
171
- return null;
172
- }
173
- }
174
- return isHTMLElement(target) ? target : null;
175
- }
176
- function restoreTargetDescription() {
177
- if (!describedTarget) return;
178
- if (previousTargetDescribedby) describedTarget.setAttribute("aria-describedby", previousTargetDescribedby);
179
- else describedTarget.removeAttribute("aria-describedby");
180
- describedTarget = null;
181
- previousTargetDescribedby = null;
182
- }
183
- function syncTargetDescription() {
184
- restoreTargetDescription();
185
- if (!isTargetMode.value || !shouldDescribeContent.value || !targetElement.value) return;
186
- describedTarget = targetElement.value;
187
- previousTargetDescribedby = describedTarget.getAttribute("aria-describedby");
188
- const ids = (previousTargetDescribedby ?? "").split(/\s+/).filter(Boolean);
189
- if (!ids.includes(tooltipId.value)) ids.push(tooltipId.value);
190
- describedTarget.setAttribute("aria-describedby", ids.join(" "));
191
- }
192
- function updateTargetPosition() {
193
- if (!isTargetMode.value || !targetElement.value) {
194
- targetPosition.value = null;
195
- return;
196
- }
197
- targetPosition.value = getTargetPosition(targetElement.value.getBoundingClientRect(), placement.value);
198
- }
199
- function onTargetOpen() {
200
- openTooltip();
201
- }
202
- function bindTargetListeners(element) {
203
- removeTargetListeners?.();
204
- element.addEventListener("mouseenter", onTargetOpen);
205
- element.addEventListener("mouseleave", closeTooltip);
206
- element.addEventListener("focusin", onTargetOpen);
207
- element.addEventListener("focusout", closeTooltip);
208
- element.addEventListener("keydown", onKeydown);
209
- removeTargetListeners = () => {
210
- element.removeEventListener("mouseenter", onTargetOpen);
211
- element.removeEventListener("mouseleave", closeTooltip);
212
- element.removeEventListener("focusin", onTargetOpen);
213
- element.removeEventListener("focusout", closeTooltip);
214
- element.removeEventListener("keydown", onKeydown);
215
- removeTargetListeners = void 0;
216
- };
217
- }
218
- function removeViewportListeners() {
219
- removePositionListeners?.();
220
- removePositionListeners = void 0;
221
- positionScheduler.cancel();
222
- }
223
- function bindViewportListeners() {
224
- const view = targetElement.value?.ownerDocument.defaultView;
225
- if (!view || removePositionListeners) return;
226
- view.addEventListener("resize", positionScheduler.schedule);
227
- view.addEventListener("scroll", positionScheduler.schedule, true);
228
- removePositionListeners = () => {
229
- view.removeEventListener("resize", positionScheduler.schedule);
230
- view.removeEventListener("scroll", positionScheduler.schedule, true);
231
- };
232
- }
233
- function syncTarget() {
234
- positionScheduler.cancel();
235
- if (!isTargetMode.value) {
236
- removeTargetListeners?.();
237
- removeViewportListeners();
238
- restoreTargetDescription();
239
- targetElement.value = null;
240
- targetPosition.value = null;
241
- return;
242
- }
243
- const nextTarget = resolveTarget();
244
- if (targetElement.value === nextTarget) {
245
- syncTargetDescription();
246
- updateTargetPosition();
247
- if (isVisible.value) bindViewportListeners();
248
- return;
249
- }
250
- removeTargetListeners?.();
251
- removeViewportListeners();
252
- restoreTargetDescription();
253
- targetElement.value = nextTarget;
254
- if (!nextTarget) {
255
- targetPosition.value = null;
256
- return;
257
- }
258
- bindTargetListeners(nextTarget);
259
- syncTargetDescription();
260
- updateTargetPosition();
261
- if (isVisible.value) bindViewportListeners();
262
- }
263
143
  watch(isDisabled, (disabled) => {
264
144
  if (disabled) closeTooltip();
265
145
  });
266
- watch(() => readTarget(), () => {
267
- if (isMounted) syncTarget();
268
- }, { flush: "post" });
146
+ watch([isExplicitTarget, targetElement], ([explicit, target], _previous, onCleanup) => {
147
+ if (!explicit || !target) return;
148
+ target.addEventListener("mouseenter", openTooltip);
149
+ target.addEventListener("mouseleave", closeTooltip);
150
+ target.addEventListener("focusin", openTooltip);
151
+ target.addEventListener("focusout", closeTooltip);
152
+ target.addEventListener("keydown", onKeydown);
153
+ onCleanup(() => {
154
+ target.removeEventListener("mouseenter", openTooltip);
155
+ target.removeEventListener("mouseleave", closeTooltip);
156
+ target.removeEventListener("focusin", openTooltip);
157
+ target.removeEventListener("focusout", closeTooltip);
158
+ target.removeEventListener("keydown", onKeydown);
159
+ });
160
+ }, { flush: "sync" });
269
161
  watch([
270
- isTargetMode,
162
+ isExplicitTarget,
163
+ targetElement,
271
164
  shouldDescribeContent,
272
165
  tooltipId
273
- ], () => {
274
- if (isMounted) syncTargetDescription();
275
- });
276
- watch(placement, () => {
277
- if (isMounted && isVisible.value) updateTargetPosition();
278
- });
279
- watch(isVisible, (visible) => {
280
- if (!isMounted || !isTargetMode.value) return;
281
- if (visible) {
282
- positionScheduler.cancel();
283
- updateTargetPosition();
284
- bindViewportListeners();
285
- } else removeViewportListeners();
286
- });
287
- onMounted(() => {
288
- isMounted = true;
289
- syncTarget();
290
- });
291
- onBeforeUnmount(() => {
292
- isMounted = false;
293
- removeTargetListeners?.();
294
- removeViewportListeners();
295
- restoreTargetDescription();
296
- });
166
+ ], ([explicit, target, shouldDescribe, id], _previous, onCleanup) => {
167
+ if (!explicit || !target || !shouldDescribe) return;
168
+ const previous = target.getAttribute("aria-describedby");
169
+ const ids = (previous ?? "").split(/\s+/).filter(Boolean);
170
+ if (!ids.includes(id)) ids.push(id);
171
+ target.setAttribute("aria-describedby", ids.join(" "));
172
+ onCleanup(() => {
173
+ if (previous == null) target.removeAttribute("aria-describedby");
174
+ else target.setAttribute("aria-describedby", previous);
175
+ });
176
+ }, { flush: "sync" });
297
177
  return {
178
+ rootRef,
179
+ contentRef,
180
+ arrowRef,
298
181
  tooltipId,
299
182
  isOpen,
183
+ isDisabled,
300
184
  isVisible,
301
- isTargetMode,
185
+ isTargetMode: isExplicitTarget,
302
186
  shouldRenderContent,
303
187
  rootClass,
304
188
  triggerProps,
305
189
  contentRole,
306
190
  contentAriaHidden,
307
191
  contentStyle,
192
+ actualPlacement: floating.actualPlacement,
193
+ placementSide,
194
+ arrowStyle: floating.arrowStyle,
195
+ teleportTo,
308
196
  openTooltip,
309
197
  closeTooltip,
310
198
  onKeydown
@@ -312,84 +200,148 @@ function useTooltip(props, emitOpenChange) {
312
200
  }
313
201
  //#endregion
314
202
  //#region src/components/tooltip/tooltip.vue?vue&type=script&setup=true&vapor=true&lang.ts
315
- var t0 = template(" ");
316
- var t1 = template("<span data-v-13c39164 class=rp-tooltip__content>");
317
- var t2 = template("<span data-v-13c39164>", 1);
318
- delegateEvents("focusin", "focusout", "keydown");
203
+ var t0 = template("<span data-v-38bfcb12 class=rp-tooltip__arrow aria-hidden=true>");
204
+ var t1 = template(" ");
205
+ var t2 = template("<span data-v-38bfcb12>");
206
+ var t3 = template("<span data-v-38bfcb12>", 1);
319
207
  //#endregion
320
208
  //#region src/components/tooltip/tooltip.vue
321
209
  var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
322
210
  name: "RpTooltip",
211
+ inheritAttrs: false,
323
212
  __name: "tooltip",
324
213
  props: {
325
214
  id: {},
326
215
  content: { default: "" },
327
- target: {},
328
- placement: { default: "top" },
329
216
  color: {},
330
217
  autoContrast: { type: Boolean },
331
- offset: {},
332
218
  open: {
333
219
  type: Boolean,
334
220
  default: void 0
335
221
  },
336
222
  openDelay: { default: 300 },
337
- arrow: {
223
+ disabled: {
338
224
  type: Boolean,
339
225
  default: false
340
226
  },
341
- disabled: {
227
+ decorative: {
342
228
  type: Boolean,
343
229
  default: false
344
230
  },
345
- decorative: {
231
+ target: {},
232
+ placement: { default: "top" },
233
+ strategy: { default: "absolute" },
234
+ offset: {},
235
+ flip: {
236
+ type: Boolean,
237
+ default: true
238
+ },
239
+ shift: {
240
+ type: Boolean,
241
+ default: true
242
+ },
243
+ collisionPadding: { default: 8 },
244
+ arrow: {
346
245
  type: Boolean,
347
246
  default: false
348
- }
247
+ },
248
+ teleport: {
249
+ type: Boolean,
250
+ default: true
251
+ },
252
+ teleportTo: {},
253
+ classNames: {},
254
+ styles: {}
349
255
  },
350
256
  emits: ["update:open"],
351
257
  setup(__props, { emit: __emit }) {
352
258
  const props = __props;
353
259
  const emit = __emit;
354
- const { tooltipId, isVisible, isTargetMode, shouldRenderContent, rootClass, triggerProps, contentRole, contentAriaHidden, contentStyle, openTooltip, closeTooltip, onKeydown } = useTooltip(props, (open) => {
260
+ const { rootRef, contentRef, arrowRef, tooltipId, isDisabled, isVisible, isTargetMode, shouldRenderContent, rootClass, triggerProps, contentRole, contentAriaHidden, contentStyle, actualPlacement, placementSide, arrowStyle, teleportTo, openTooltip, closeTooltip, onKeydown } = useTooltip(props, (open) => {
355
261
  emit("update:open", open);
356
262
  });
357
- const n10 = t2();
358
- renderEffect(() => setClass(n10, unref(rootClass)));
359
- setInsertionState(n10, null, 0);
263
+ const { getPartAttrs, getRootAttrs } = useStylesApi(props, "root");
264
+ const state = computed(() => isVisible.value ? "open" : "closed");
265
+ const rootAttrs = computed(() => getRootAttrs({
266
+ class: rootClass.value,
267
+ "data-state": state.value,
268
+ "data-disabled": presence(isDisabled.value),
269
+ onMouseenter: openTooltip,
270
+ onMouseleave: closeTooltip,
271
+ onFocusin: openTooltip,
272
+ onFocusout: closeTooltip,
273
+ onKeydown
274
+ }));
275
+ const publicTriggerProps = computed(() => {
276
+ const partAttrs = getPartAttrs("trigger");
277
+ return {
278
+ ...triggerProps.value,
279
+ ...props.classNames?.trigger !== void 0 ? { class: partAttrs.class } : {},
280
+ ...props.styles?.trigger !== void 0 ? { style: partAttrs.style } : {},
281
+ "data-state": state.value,
282
+ "data-disabled": presence(isDisabled.value)
283
+ };
284
+ });
285
+ const contentAttrs = computed(() => ({
286
+ ...getPartAttrs("content", {
287
+ class: "rp-tooltip__content",
288
+ style: contentStyle.value
289
+ }),
290
+ "data-state": state.value,
291
+ "data-placement": actualPlacement.value
292
+ }));
293
+ const _setTemplateRef = createTemplateRefSetter();
294
+ const n14 = t3();
295
+ renderEffect(() => setDynamicProps(n14, [rootAttrs.value]));
296
+ setInsertionState(n14, null, 0);
360
297
  createIf(() => !unref(isTargetMode), () => {
361
- return createSlot("default", { triggerProps: () => unref(triggerProps) }, null, 1);
298
+ return createSlot("default", { triggerProps: () => publicTriggerProps.value }, null, 1);
299
+ });
300
+ setInsertionState(n14, null, 1);
301
+ createComponent(VaporTeleport, {
302
+ to: () => unref(teleportTo),
303
+ disabled: () => !__props.teleport
304
+ }, () => {
305
+ return createComponent(VaporTransition, {
306
+ name: "rp-tooltip-content",
307
+ persisted: ""
308
+ }, extend(() => {
309
+ return createIf(() => unref(shouldRenderContent), () => {
310
+ const n11 = t2();
311
+ renderEffect(() => setDynamicProps(n11, [
312
+ { id: unref(tooltipId) },
313
+ contentAttrs.value,
314
+ {
315
+ role: unref(contentRole),
316
+ "aria-hidden": unref(contentAriaHidden),
317
+ "data-side": unref(placementSide)
318
+ }
319
+ ]));
320
+ setInsertionState(n11, null, 0);
321
+ createIf(() => __props.arrow, () => {
322
+ const n7 = t0();
323
+ _setTemplateRef(n7, arrowRef, null, "arrowRef");
324
+ renderEffect(() => {
325
+ setAttr(n7, "data-side", unref(placementSide));
326
+ setStyle(n7, unref(arrowStyle));
327
+ });
328
+ return n7;
329
+ });
330
+ setInsertionState(n11, null, 1);
331
+ createSlot("content", null, () => {
332
+ const n10 = t1();
333
+ renderEffect(() => setText(n10, toDisplayString(__props.content)));
334
+ return n10;
335
+ }, 1);
336
+ applyVShow(n11, () => unref(isVisible));
337
+ _setTemplateRef(n11, contentRef, null, "contentRef");
338
+ return n11;
339
+ }, null, 129);
340
+ }, { _: 8 }));
362
341
  });
363
- setInsertionState(n10, null, 1);
364
- createComponent(VaporTransition, {
365
- name: "rp-tooltip-content",
366
- persisted: ""
367
- }, extend(() => {
368
- return createIf(() => unref(shouldRenderContent), () => {
369
- const n8 = t1();
370
- renderEffect(() => {
371
- setProp(n8, "id", unref(tooltipId));
372
- setProp(n8, "role", unref(contentRole));
373
- setAttr(n8, "aria-hidden", unref(contentAriaHidden));
374
- setStyle(n8, unref(contentStyle));
375
- });
376
- setInsertionState(n8, null, 0);
377
- createSlot("content", null, () => {
378
- const n7 = t0();
379
- renderEffect(() => setText(n7, toDisplayString(__props.content)));
380
- return n7;
381
- }, 1);
382
- applyVShow(n8, () => unref(isVisible));
383
- return n8;
384
- }, null, 129);
385
- }, { _: 8 }));
386
- on(n10, "mouseenter", (e) => unref(openTooltip)(e));
387
- on(n10, "mouseleave", (e) => unref(closeTooltip)(e));
388
- n10.$evtfocusin = createInvoker((e) => unref(openTooltip)(e));
389
- n10.$evtfocusout = createInvoker((e) => unref(closeTooltip)(e));
390
- n10.$evtkeydown = createInvoker((e) => unref(onKeydown)(e));
391
- return n10;
342
+ setStaticTemplateRef(n14, rootRef, null, "rootRef");
343
+ return n14;
392
344
  }
393
- }), [["__scopeId", "data-v-13c39164"]]);
345
+ }), [["__scopeId", "data-v-38bfcb12"]]);
394
346
  //#endregion
395
347
  export { useDelayedOpen as i, resolveTooltipColorStyleWithContrast as n, resolveTooltipOffsetStyle as r, tooltip_default as t };
@@ -0,0 +1,8 @@
1
+ //#region src/components/tooltip/types.ts
2
+ var tooltipParts = [
3
+ "root",
4
+ "trigger",
5
+ "content"
6
+ ];
7
+ //#endregion
8
+ export { tooltipParts as t };
@@ -4,7 +4,7 @@ function useClickOutside(target, active, callback) {
4
4
  let isListening = false;
5
5
  let stopWatch;
6
6
  function handler(e) {
7
- if (target.value && !target.value.contains(e.target)) callback();
7
+ if (!(Array.isArray(target) ? target : [target]).some((current) => current.value?.contains(e.target))) callback(e);
8
8
  }
9
9
  function setListening(value) {
10
10
  if (typeof document === "undefined" || value === isListening) return;