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
@@ -1,217 +1,71 @@
1
1
  import './scroll-area.css';
2
- import { n as useStylesApi, t as presence } from "./styles-api.js";
2
+ import { t as useStylesApi } from "./styles-api.js";
3
+ import { n as toPresenceAttribute } from "./attributes.js";
3
4
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
4
- import { child, computed, createIf, createInvoker, createSlot, createTemplateRefSetter, defineVaporComponent, delegateEvents, nextTick, on, onBeforeUnmount, onMounted, reactive, ref, renderEffect, setDynamicProps, setInsertionState, template, unref, useId, watch } from "vue";
5
- //#region src/components/scroll-area/scrollAreaCore.ts
6
- var minimumThumbSize = 18;
7
- function clamp(value, min, max) {
8
- return Math.min(max, Math.max(min, value));
9
- }
10
- function getScrollDirection(viewport) {
11
- return viewport.ownerDocument.defaultView?.getComputedStyle(viewport).direction === "rtl" ? "rtl" : "ltr";
5
+ import { r as normalizeDelay, t as clamp } from "./number.js";
6
+ import { o as splitCompatibilityAttributes, t as composeEventHandlers } from "./attributes2.js";
7
+ import { n as toPositiveCssLength } from "./css.js";
8
+ import { n as isMatchingPointer, t as getPointerId } from "./pointer.js";
9
+ import { t as createRafScheduler } from "./rafScheduler.js";
10
+ import { i as isNodeWithinElement } from "./events.js";
11
+ import { child, computed, createIf, createSlot, createTemplateRefSetter, defineVaporComponent, nextTick, on, onBeforeUnmount, onMounted, reactive, ref, renderEffect, setDynamicProps, setInsertionState, setTemplateRefBinding, template, unref, useId, watch } from "vue";
12
+ //#region src/utils/dom/scroll.ts
13
+ function getScrollDirection(element) {
14
+ return element.ownerDocument.defaultView?.getComputedStyle(element).direction === "rtl" ? "rtl" : "ltr";
12
15
  }
13
- function getLogicalHorizontalPosition(scrollLeft, maxPosition, direction) {
16
+ function getLogicalHorizontalScrollPosition(scrollLeft, maxPosition, direction) {
14
17
  return clamp(direction === "rtl" ? -scrollLeft : scrollLeft, 0, maxPosition);
15
18
  }
16
- function getRawHorizontalPosition(position, maxPosition, direction) {
19
+ function getRawHorizontalScrollPosition(position, maxPosition, direction) {
17
20
  const logicalPosition = clamp(position, 0, maxPosition);
18
21
  return direction === "rtl" && logicalPosition !== 0 ? -logicalPosition : logicalPosition;
19
22
  }
20
- function isAxisEnabled(scrollbars, axis) {
21
- if (scrollbars === false) return false;
22
- if (axis === "x") return scrollbars === "x" || scrollbars === "both";
23
- return scrollbars === "y" || scrollbars === "both";
24
- }
25
- function isScrollbarActive(type, enabled, overflowing) {
26
- if (!enabled || type === "never") return false;
27
- return type === "always" || overflowing;
28
- }
29
- function getThumbGeometry(trackSize, viewportSize, scrollSize) {
23
+ function getScrollThumbGeometry(trackSize, viewportSize, scrollSize, minimumSize) {
30
24
  if (trackSize <= 0 || viewportSize <= 0 || scrollSize <= viewportSize) return {
31
25
  size: 100,
32
26
  offsetRatio: 1
33
27
  };
34
- const sizeRatio = clamp(viewportSize / scrollSize * trackSize, minimumThumbSize, trackSize) / trackSize;
28
+ const sizeRatio = clamp(viewportSize / scrollSize * trackSize, minimumSize, trackSize) / trackSize;
35
29
  return {
36
30
  size: sizeRatio * 100,
37
31
  offsetRatio: sizeRatio
38
32
  };
39
33
  }
40
- function getThumbOffset(position, maxPosition, sizeRatio) {
34
+ function getScrollThumbOffset(position, maxPosition, sizeRatio) {
41
35
  if (sizeRatio >= 1 || maxPosition <= 0) return 0;
42
36
  return position / maxPosition * ((1 - sizeRatio) / sizeRatio) * 100;
43
37
  }
44
- function getLengthValue(value) {
45
- if (typeof value === "number") return Number.isFinite(value) && value > 0 ? `${value}px` : "";
46
- return value?.trim() ?? "";
47
- }
48
- //#endregion
49
- //#region src/components/scroll-area/useScrollAreaControls.ts
50
- function useScrollAreaControls(options) {
51
- let previousPosition = {
52
- x: 0,
53
- y: 0
54
- };
55
- function onViewportScroll(event) {
56
- options.metrics.updatePosition();
57
- options.showDuringScroll();
58
- const position = {
59
- x: options.metrics.getPosition("x"),
60
- y: options.metrics.getPosition("y")
61
- };
62
- const reachedBoundaries = getReachedBoundaries(position);
63
- previousPosition = position;
64
- options.emitScroll(event);
65
- options.emitPositionChange({
66
- x: options.metrics.metrics.x,
67
- y: options.metrics.metrics.y
68
- });
69
- for (const boundary of reachedBoundaries) emitReachedBoundary(boundary, event);
70
- }
71
- function getReachedBoundaries(position) {
72
- const boundaries = [];
73
- if (options.metrics.getOverflow("y")) {
74
- const maxPosition = options.metrics.getMaxPosition("y");
75
- if (position.y <= 1 && previousPosition.y > 1) boundaries.push("top");
76
- if (position.y >= maxPosition - 1 && previousPosition.y < maxPosition - 1) boundaries.push("bottom");
77
- }
78
- if (options.metrics.getOverflow("x")) {
79
- const maxPosition = options.metrics.getMaxPosition("x");
80
- const reachedStart = position.x <= 1 && previousPosition.x > 1;
81
- const reachedEnd = position.x >= maxPosition - 1 && previousPosition.x < maxPosition - 1;
82
- if (reachedStart || reachedEnd) {
83
- const rtl = options.metrics.metrics.direction === "rtl";
84
- if (reachedStart) boundaries.push(rtl ? "right" : "left");
85
- if (reachedEnd) boundaries.push(rtl ? "left" : "right");
86
- }
87
- }
88
- return boundaries;
89
- }
90
- function emitReachedBoundary(boundary, event) {
91
- switch (boundary) {
92
- case "top":
93
- options.emitReachTop(event);
94
- break;
95
- case "bottom":
96
- options.emitReachBottom(event);
97
- break;
98
- case "left":
99
- options.emitReachLeft(event);
100
- break;
101
- case "right":
102
- options.emitReachRight(event);
103
- break;
104
- }
105
- }
106
- function writeAxisPosition(axis, value) {
107
- const viewport = options.viewportRef.value;
108
- if (!viewport) return;
109
- if (axis === "x") viewport.scrollLeft = getRawHorizontalPosition(value, options.metrics.getMaxPosition("x"), options.metrics.metrics.direction);
110
- else viewport.scrollTop = clamp(value, 0, options.metrics.getMaxPosition("y"));
111
- options.metrics.updatePosition();
112
- options.showDuringScroll();
113
- }
114
- function onScrollbarKeydown(axis, event) {
115
- const viewport = options.viewportRef.value;
116
- if (!viewport || !options.metrics.getOverflow(axis)) return;
117
- options.metrics.updatePosition(viewport);
118
- const current = options.metrics.getPosition(axis);
119
- const pageSize = axis === "x" ? viewport.clientWidth : viewport.clientHeight;
120
- const nextPosition = getKeyboardPosition(axis, event.key, current, pageSize, options.metrics.getMaxPosition(axis), options.metrics.metrics.direction);
121
- if (nextPosition === void 0) return;
122
- event.preventDefault();
123
- writeAxisPosition(axis, nextPosition);
124
- }
125
- function onScrollbarWheel(axis, event) {
126
- if (!options.metrics.getOverflow(axis)) return;
127
- options.metrics.updatePosition();
128
- const delta = getWheelDelta(axis, event, options.metrics.metrics.direction);
129
- if (!delta) return;
130
- event.preventDefault();
131
- writeAxisPosition(axis, options.metrics.getPosition(axis) + delta);
132
- }
133
- function scrollTo(scrollOptions) {
134
- const viewport = options.viewportRef.value;
135
- if (!viewport) return;
136
- if (typeof viewport.scrollTo === "function") viewport.scrollTo(scrollOptions);
137
- else setFallbackPosition(viewport, scrollOptions, false);
138
- options.metrics.schedulePositionUpdate();
139
- }
140
- function scrollBy(scrollOptions) {
141
- const viewport = options.viewportRef.value;
142
- if (!viewport) return;
143
- if (typeof viewport.scrollBy === "function") viewport.scrollBy(scrollOptions);
144
- else setFallbackPosition(viewport, scrollOptions, true);
145
- options.metrics.schedulePositionUpdate();
146
- }
147
- return {
148
- onViewportScroll,
149
- onScrollbarKeydown,
150
- onScrollbarWheel,
151
- writeAxisPosition,
152
- scrollTo,
153
- scrollBy
154
- };
155
- }
156
- function getKeyboardPosition(axis, key, current, pageSize, max, direction) {
38
+ function getKeyboardScrollPosition({ axis, key, current, pageSize, maxPosition, direction, lineStep }) {
157
39
  switch (key) {
158
- case "ArrowLeft": return current + (axis === "x" && direction === "rtl" ? 40 : -40);
159
- case "ArrowUp": return current - 40;
160
- case "ArrowRight": return current + (axis === "x" && direction === "rtl" ? -40 : 40);
161
- case "ArrowDown": return current + 40;
40
+ case "ArrowLeft": return current + (axis === "x" && direction === "rtl" ? lineStep : -lineStep);
41
+ case "ArrowUp": return current - lineStep;
42
+ case "ArrowRight": return current + (axis === "x" && direction === "rtl" ? -lineStep : lineStep);
43
+ case "ArrowDown": return current + lineStep;
162
44
  case "PageUp": return current - pageSize;
163
45
  case "PageDown": return current + pageSize;
164
46
  case "Home": return 0;
165
- case "End": return max;
47
+ case "End": return maxPosition;
166
48
  default: return;
167
49
  }
168
50
  }
169
- function getWheelDelta(axis, event, direction) {
51
+ function getWheelScrollDelta(axis, event, direction) {
170
52
  if (axis === "y") return event.deltaY;
171
53
  if (!event.deltaX) return event.deltaY;
172
54
  return direction === "rtl" ? -event.deltaX : event.deltaX;
173
55
  }
174
- function setFallbackPosition(viewport, scrollOptions, relative) {
175
- if (scrollOptions.left !== void 0) viewport.scrollLeft = (relative ? viewport.scrollLeft : 0) + scrollOptions.left;
176
- if (scrollOptions.top !== void 0) viewport.scrollTop = (relative ? viewport.scrollTop : 0) + scrollOptions.top;
56
+ function applyFallbackScrollPosition(element, options, mode) {
57
+ const relative = mode === "relative";
58
+ if (options.left !== void 0) element.scrollLeft = (relative ? element.scrollLeft : 0) + options.left;
59
+ if (options.top !== void 0) element.scrollTop = (relative ? element.scrollTop : 0) + options.top;
177
60
  }
178
- //#endregion
179
- //#region src/utils/rafScheduler.ts
180
- function createRafScheduler(callback, getView) {
181
- let frameId;
182
- let frameView;
183
- let generation = 0;
184
- function cancel() {
185
- generation += 1;
186
- if (frameId !== void 0) frameView?.cancelAnimationFrame(frameId);
187
- frameId = void 0;
188
- frameView = void 0;
189
- }
190
- function schedule() {
191
- if (frameId !== void 0) return;
192
- const view = getView();
193
- if (!view?.requestAnimationFrame) {
194
- callback();
195
- return;
196
- }
197
- const scheduledGeneration = generation;
198
- frameView = view;
199
- frameId = view.requestAnimationFrame(() => {
200
- if (generation !== scheduledGeneration || frameView !== view) return;
201
- frameId = void 0;
202
- frameView = void 0;
203
- callback();
204
- });
205
- }
206
- return {
207
- cancel,
208
- schedule
209
- };
61
+ function getPointerAxisCoordinate(axis, event) {
62
+ return axis === "x" ? event.clientX : event.clientY;
210
63
  }
211
64
  //#endregion
212
- //#region src/components/scroll-area/useScrollAreaMetrics.ts
213
- function useScrollAreaMetrics(options) {
214
- const metrics = reactive({
65
+ //#region src/components/scroll-area/scrollAreaModel.ts
66
+ var boundaryTolerance = 1;
67
+ function createScrollAreaMetrics() {
68
+ return {
215
69
  direction: "ltr",
216
70
  clientWidth: 0,
217
71
  clientHeight: 0,
@@ -225,20 +79,210 @@ function useScrollAreaMetrics(options) {
225
79
  horizontalThumbOffset: 0,
226
80
  verticalThumbSize: 100,
227
81
  verticalThumbOffset: 0
82
+ };
83
+ }
84
+ function isScrollAreaAxisEnabled(scrollbars, axis) {
85
+ if (scrollbars === false) return false;
86
+ if (axis === "x") return scrollbars === "x" || scrollbars === "both";
87
+ return scrollbars === "y" || scrollbars === "both";
88
+ }
89
+ function isScrollAreaScrollbarActive(type, enabled, overflowing) {
90
+ if (!enabled || type === "never") return false;
91
+ return type === "always" || overflowing;
92
+ }
93
+ function isScrollAreaScrollbarVisible({ active, axis, draggingAxis, focusWithin, hovered, scrolling, type }) {
94
+ if (!active) return false;
95
+ switch (type) {
96
+ case "always":
97
+ case "auto": return true;
98
+ case "hover": return hovered || focusWithin || draggingAxis === axis;
99
+ case "scroll": return scrolling || draggingAxis === axis;
100
+ default: return false;
101
+ }
102
+ }
103
+ function getScrollAreaAxisPosition(metrics, axis) {
104
+ return axis === "x" ? metrics.x : metrics.y;
105
+ }
106
+ function getScrollAreaMaxPosition(metrics, axis) {
107
+ return axis === "x" ? Math.max(0, metrics.scrollWidth - metrics.clientWidth) : Math.max(0, metrics.scrollHeight - metrics.clientHeight);
108
+ }
109
+ function getScrollAreaOverflow(metrics, axis) {
110
+ return axis === "x" ? metrics.overflowX : metrics.overflowY;
111
+ }
112
+ function getScrollAreaAxisState(metrics, axis) {
113
+ return {
114
+ direction: metrics.direction,
115
+ maxPosition: getScrollAreaMaxPosition(metrics, axis),
116
+ overflow: getScrollAreaOverflow(metrics, axis),
117
+ position: getScrollAreaAxisPosition(metrics, axis)
118
+ };
119
+ }
120
+ function getReachedScrollAreaBoundaries(position, previousPosition, metrics) {
121
+ const boundaries = [];
122
+ appendVerticalBoundaries(boundaries, position, previousPosition, metrics);
123
+ appendHorizontalBoundaries(boundaries, position, previousPosition, metrics);
124
+ return boundaries;
125
+ }
126
+ function appendVerticalBoundaries(boundaries, position, previousPosition, metrics) {
127
+ if (!metrics.overflowY) return;
128
+ const maxPosition = getScrollAreaMaxPosition(metrics, "y");
129
+ if (position.y <= boundaryTolerance && previousPosition.y > boundaryTolerance) boundaries.push("top");
130
+ if (position.y >= maxPosition - boundaryTolerance && previousPosition.y < maxPosition - boundaryTolerance) boundaries.push("bottom");
131
+ }
132
+ function appendHorizontalBoundaries(boundaries, position, previousPosition, metrics) {
133
+ if (!metrics.overflowX) return;
134
+ const maxPosition = getScrollAreaMaxPosition(metrics, "x");
135
+ const reachedStart = position.x <= boundaryTolerance && previousPosition.x > boundaryTolerance;
136
+ const reachedEnd = position.x >= maxPosition - boundaryTolerance && previousPosition.x < maxPosition - boundaryTolerance;
137
+ if (reachedStart) boundaries.push(metrics.direction === "rtl" ? "right" : "left");
138
+ if (reachedEnd) boundaries.push(metrics.direction === "rtl" ? "left" : "right");
139
+ }
140
+ function getScrollAreaTrackPosition({ axis, coordinate, direction, maxPosition, thumbSize, trackSize, trackStart }) {
141
+ const travel = Math.max(0, trackSize - thumbSize);
142
+ if (travel === 0) return void 0;
143
+ const physicalRatio = clamp((coordinate - trackStart - thumbSize / 2) / travel, 0, 1);
144
+ return (axis === "x" && direction === "rtl" ? 1 - physicalRatio : physicalRatio) * maxPosition;
145
+ }
146
+ function getScrollAreaDragPosition({ coordinate, coordinateDirection, maxPosition, startCoordinate, startPosition, travel }) {
147
+ if (travel <= 0) return startPosition;
148
+ return startPosition + coordinateDirection * (coordinate - startCoordinate) * maxPosition / travel;
149
+ }
150
+ function getScrollAreaRootStyle(scrollbarSize) {
151
+ const length = toPositiveCssLength(scrollbarSize);
152
+ return length ? { "--_rp-scroll-area-scrollbar-size": length } : {};
153
+ }
154
+ //#endregion
155
+ //#region src/components/scroll-area/useScrollAreaAttributes.ts
156
+ function useScrollAreaAttributes({ metrics, onViewportScroll, props, rootHandlers, state, viewport }) {
157
+ const generatedId = useId();
158
+ const viewportId = computed(() => `${props.id || generatedId}-viewport`);
159
+ const { getPartAttrs, getRootAttrs } = useStylesApi(props, "root");
160
+ const rootAttrs = computed(() => getRootAttrs({
161
+ id: props.id,
162
+ class: "rp-scroll-area",
163
+ style: getScrollAreaRootStyle(props.scrollbarSize),
164
+ "data-type": props.type,
165
+ "data-direction": metrics.direction,
166
+ "data-scrollbars": props.scrollbars === false ? "none" : props.scrollbars,
167
+ "data-overflow-x": toPresenceAttribute(metrics.overflowX),
168
+ "data-overflow-y": toPresenceAttribute(metrics.overflowY),
169
+ "data-scrollbar-x-active": toPresenceAttribute(state.horizontalActive.value),
170
+ "data-scrollbar-y-active": toPresenceAttribute(state.verticalActive.value),
171
+ "data-scrollbar-x-visible": toPresenceAttribute(state.horizontalVisible.value),
172
+ "data-scrollbar-y-visible": toPresenceAttribute(state.verticalVisible.value),
173
+ ...rootHandlers
174
+ }));
175
+ const viewportAttrs = computed(() => {
176
+ const compatibilityAttrs = props.viewportAttrs ?? {};
177
+ const { compatibilityClass, compatibilityStyle, forwardedAttributes } = splitCompatibilityAttributes(compatibilityAttrs);
178
+ return {
179
+ ...forwardedAttributes,
180
+ ...getPartAttrs("viewport", {
181
+ class: "rp-scroll-area__viewport",
182
+ compatibilityClass,
183
+ compatibilityStyle
184
+ }),
185
+ id: viewportId.value,
186
+ role: forwardedAttributes.role ?? (hasAccessibleName(props, forwardedAttributes) ? "region" : void 0),
187
+ tabindex: forwardedAttributes.tabindex ?? 0,
188
+ "aria-label": props.ariaLabel || forwardedAttributes["aria-label"] || void 0,
189
+ "aria-labelledby": props.ariaLabelledby || forwardedAttributes["aria-labelledby"] || void 0,
190
+ "aria-describedby": props.ariaDescribedby || forwardedAttributes["aria-describedby"] || void 0,
191
+ onScroll: composeEventHandlers(onViewportScroll, compatibilityAttrs.onScroll)
192
+ };
228
193
  });
229
- const position = computed(() => ({
230
- x: metrics.x,
231
- y: metrics.y
194
+ const contentAttrs = computed(() => {
195
+ const { compatibilityClass, compatibilityStyle, forwardedAttributes } = splitCompatibilityAttributes(props.contentAttrs ?? {});
196
+ return {
197
+ ...forwardedAttributes,
198
+ ...getPartAttrs("content", {
199
+ class: "rp-scroll-area__content",
200
+ compatibilityClass,
201
+ compatibilityStyle
202
+ })
203
+ };
204
+ });
205
+ const horizontalScrollbarAttrs = computed(() => getScrollbarAttrs("x"));
206
+ const verticalScrollbarAttrs = computed(() => getScrollbarAttrs("y"));
207
+ const horizontalThumbAttrs = computed(() => getThumbAttrs("x"));
208
+ const verticalThumbAttrs = computed(() => getThumbAttrs("y"));
209
+ const cornerAttrs = computed(() => ({
210
+ ...getPartAttrs("corner", { class: "rp-scroll-area__corner" }),
211
+ "aria-hidden": true,
212
+ "data-direction": metrics.direction,
213
+ "data-visible": toPresenceAttribute(state.horizontalActive.value && state.verticalActive.value)
232
214
  }));
215
+ function getScrollbarAttrs(axis) {
216
+ const vertical = axis === "y";
217
+ const active = vertical ? state.verticalActive.value : state.horizontalActive.value;
218
+ const visible = vertical ? state.verticalVisible.value : state.horizontalVisible.value;
219
+ return {
220
+ ...getPartAttrs("scrollbar", { class: ["rp-scroll-area__scrollbar", `rp-scroll-area__scrollbar--${vertical ? "vertical" : "horizontal"}`] }),
221
+ role: "scrollbar",
222
+ tabindex: !props.embedded && active ? 0 : -1,
223
+ "aria-controls": viewport.value?.id || void 0,
224
+ "aria-orientation": vertical ? "vertical" : "horizontal",
225
+ "aria-valuemin": 0,
226
+ "aria-valuemax": getScrollAreaMaxPosition(metrics, axis),
227
+ "aria-valuenow": Math.round(getScrollAreaAxisPosition(metrics, axis)),
228
+ "aria-disabled": !getScrollAreaOverflow(metrics, axis) || void 0,
229
+ "aria-hidden": props.embedded || !active || void 0,
230
+ "data-orientation": vertical ? "vertical" : "horizontal",
231
+ "data-direction": metrics.direction,
232
+ "data-active": toPresenceAttribute(active),
233
+ "data-visible": toPresenceAttribute(visible)
234
+ };
235
+ }
236
+ function getThumbAttrs(axis) {
237
+ const horizontal = axis === "x";
238
+ return getPartAttrs("thumb", {
239
+ class: "rp-scroll-area__thumb",
240
+ style: {
241
+ "--_rp-scroll-area-thumb-size": `${horizontal ? metrics.horizontalThumbSize : metrics.verticalThumbSize}%`,
242
+ "--_rp-scroll-area-thumb-offset": `${horizontal ? metrics.horizontalThumbOffset : metrics.verticalThumbOffset}%`
243
+ }
244
+ });
245
+ }
246
+ return {
247
+ contentAttrs,
248
+ cornerAttrs,
249
+ horizontalScrollbarAttrs,
250
+ horizontalThumbAttrs,
251
+ rootAttrs,
252
+ verticalScrollbarAttrs,
253
+ verticalThumbAttrs,
254
+ viewportAttrs
255
+ };
256
+ }
257
+ function hasAccessibleName(props, attrs) {
258
+ return Boolean(props.ariaLabel || props.ariaLabelledby || attrs["aria-label"] || attrs["aria-labelledby"]);
259
+ }
260
+ //#endregion
261
+ //#region src/components/scroll-area/useScrollAreaDerivedState.ts
262
+ function useScrollAreaDerivedState(props, metrics) {
263
+ const renderHorizontalScrollbar = computed(() => isScrollAreaAxisEnabled(props.scrollbars, "x") && props.type !== "never");
264
+ const renderVerticalScrollbar = computed(() => isScrollAreaAxisEnabled(props.scrollbars, "y") && props.type !== "never");
265
+ return {
266
+ horizontalScrollbarActive: computed(() => isScrollAreaScrollbarActive(props.type ?? "hover", isScrollAreaAxisEnabled(props.scrollbars, "x"), metrics.overflowX)),
267
+ renderHorizontalScrollbar,
268
+ renderVerticalScrollbar,
269
+ verticalScrollbarActive: computed(() => isScrollAreaScrollbarActive(props.type ?? "hover", isScrollAreaAxisEnabled(props.scrollbars, "y"), metrics.overflowY))
270
+ };
271
+ }
272
+ //#endregion
273
+ //#region src/components/scroll-area/useScrollAreaMeasurement.ts
274
+ function useScrollAreaMeasurement({ elements, isAxisEnabled, minimumThumbSize }) {
275
+ const metrics = reactive(createScrollAreaMetrics());
233
276
  let resizeObserver;
234
- let mutationObserver;
277
+ let contentObserver;
235
278
  let directionObserver;
279
+ let observerView;
236
280
  let horizontalThumbSizeRatio = 1;
237
281
  let verticalThumbSizeRatio = 1;
238
- const scheduler = createRafScheduler(update, () => options.viewportRef.value?.ownerDocument.defaultView);
239
- const positionScheduler = createRafScheduler(updatePosition, () => options.viewportRef.value?.ownerDocument.defaultView);
282
+ const updateScheduler = createRafScheduler(update, () => elements.viewport.value?.ownerDocument.defaultView);
283
+ const positionScheduler = createRafScheduler(updatePosition, () => elements.viewport.value?.ownerDocument.defaultView);
240
284
  function update() {
241
- const viewport = options.viewportRef.value;
285
+ const viewport = elements.viewport.value;
242
286
  if (!viewport) return;
243
287
  readViewportGeometry(viewport);
244
288
  updateThumbGeometry(viewport);
@@ -249,46 +293,38 @@ function useScrollAreaMetrics(options) {
249
293
  metrics.clientHeight = viewport.clientHeight;
250
294
  metrics.scrollWidth = viewport.scrollWidth;
251
295
  metrics.scrollHeight = viewport.scrollHeight;
252
- metrics.overflowX = options.horizontalEnabled.value && viewport.scrollWidth > viewport.clientWidth + 1;
253
- metrics.overflowY = options.verticalEnabled.value && viewport.scrollHeight > viewport.clientHeight + 1;
296
+ metrics.overflowX = isAxisEnabled("x") && viewport.scrollWidth > viewport.clientWidth + 1;
297
+ metrics.overflowY = isAxisEnabled("y") && viewport.scrollHeight > viewport.clientHeight + 1;
254
298
  }
255
299
  function updateThumbGeometry(viewport) {
256
- const horizontalGeometry = getThumbGeometry(options.horizontalScrollbarRef.value?.clientWidth ?? viewport.clientWidth, viewport.clientWidth, viewport.scrollWidth);
257
- const verticalGeometry = getThumbGeometry(options.verticalScrollbarRef.value?.clientHeight ?? viewport.clientHeight, viewport.clientHeight, viewport.scrollHeight);
300
+ const horizontalGeometry = getScrollThumbGeometry(elements.horizontalScrollbar.value?.clientWidth ?? viewport.clientWidth, viewport.clientWidth, viewport.scrollWidth, minimumThumbSize);
301
+ const verticalGeometry = getScrollThumbGeometry(elements.verticalScrollbar.value?.clientHeight ?? viewport.clientHeight, viewport.clientHeight, viewport.scrollHeight, minimumThumbSize);
258
302
  metrics.horizontalThumbSize = horizontalGeometry.size;
259
303
  horizontalThumbSizeRatio = horizontalGeometry.offsetRatio;
260
304
  metrics.verticalThumbSize = verticalGeometry.size;
261
305
  verticalThumbSizeRatio = verticalGeometry.offsetRatio;
262
306
  }
263
- function updatePosition(viewport = options.viewportRef.value) {
307
+ function updatePosition(viewport = elements.viewport.value) {
264
308
  if (!viewport) return;
265
309
  metrics.direction = getScrollDirection(viewport);
266
- metrics.x = getLogicalHorizontalPosition(viewport.scrollLeft, getMaxPosition("x"), metrics.direction);
267
- metrics.y = clamp(viewport.scrollTop, 0, getMaxPosition("y"));
268
- metrics.horizontalThumbOffset = getThumbOffset(metrics.x, getMaxPosition("x"), horizontalThumbSizeRatio);
269
- metrics.verticalThumbOffset = getThumbOffset(metrics.y, getMaxPosition("y"), verticalThumbSizeRatio);
270
- }
271
- function getPosition(axis) {
272
- return axis === "x" ? metrics.x : metrics.y;
273
- }
274
- function getMaxPosition(axis) {
275
- return axis === "x" ? Math.max(0, metrics.scrollWidth - metrics.clientWidth) : Math.max(0, metrics.scrollHeight - metrics.clientHeight);
276
- }
277
- function getOverflow(axis) {
278
- return axis === "x" ? metrics.overflowX : metrics.overflowY;
310
+ metrics.x = getLogicalHorizontalScrollPosition(viewport.scrollLeft, getScrollAreaMaxPosition(metrics, "x"), metrics.direction);
311
+ metrics.y = clamp(viewport.scrollTop, 0, getScrollAreaMaxPosition(metrics, "y"));
312
+ metrics.horizontalThumbOffset = getScrollThumbOffset(metrics.x, getScrollAreaMaxPosition(metrics, "x"), horizontalThumbSizeRatio);
313
+ metrics.verticalThumbOffset = getScrollThumbOffset(metrics.y, getScrollAreaMaxPosition(metrics, "y"), verticalThumbSizeRatio);
279
314
  }
280
315
  function attachObservers() {
281
- const viewport = options.viewportRef.value;
316
+ const viewport = elements.viewport.value;
282
317
  if (!viewport) return;
283
- const view = viewport.ownerDocument.defaultView;
284
- const ResizeObserverConstructor = view?.ResizeObserver ?? globalThis.ResizeObserver;
318
+ observerView = viewport.ownerDocument.defaultView;
319
+ const ResizeObserverConstructor = observerView?.ResizeObserver ?? globalThis.ResizeObserver;
285
320
  if (ResizeObserverConstructor) {
286
- resizeObserver = new ResizeObserverConstructor(scheduler.schedule);
287
- resizeObserver.observe(viewport);
288
- if (options.contentRef.value) resizeObserver.observe(options.contentRef.value);
289
- } else attachMutationObserver(view);
290
- attachDirectionObserver(view, viewport);
291
- view?.addEventListener("resize", scheduler.schedule);
321
+ const observer = new ResizeObserverConstructor(updateScheduler.schedule);
322
+ observer.observe(viewport);
323
+ if (elements.content.value) observer.observe(elements.content.value);
324
+ resizeObserver = observer;
325
+ } else attachContentObserver(observerView);
326
+ attachDirectionObserver(observerView, viewport);
327
+ observerView?.addEventListener("resize", updateScheduler.schedule);
292
328
  }
293
329
  function attachDirectionObserver(view, viewport) {
294
330
  const MutationObserverConstructor = view?.MutationObserver ?? globalThis.MutationObserver;
@@ -307,13 +343,12 @@ function useScrollAreaMetrics(options) {
307
343
  element = element.parentElement;
308
344
  }
309
345
  }
310
- function attachMutationObserver(view) {
346
+ function attachContentObserver(view) {
311
347
  const MutationObserverConstructor = view?.MutationObserver ?? globalThis.MutationObserver;
312
- const content = options.contentRef.value;
348
+ const content = elements.content.value;
313
349
  if (!MutationObserverConstructor || !content) return;
314
- const observer = new MutationObserverConstructor(scheduler.schedule);
315
- mutationObserver = observer;
316
- observer.observe(content, {
350
+ contentObserver = new MutationObserverConstructor(updateScheduler.schedule);
351
+ contentObserver.observe(content, {
317
352
  attributes: true,
318
353
  childList: true,
319
354
  characterData: true,
@@ -321,34 +356,30 @@ function useScrollAreaMetrics(options) {
321
356
  });
322
357
  }
323
358
  function detachObservers() {
324
- const view = options.viewportRef.value?.ownerDocument.defaultView;
325
359
  resizeObserver?.disconnect();
326
- mutationObserver?.disconnect();
360
+ contentObserver?.disconnect();
327
361
  directionObserver?.disconnect();
328
362
  resizeObserver = void 0;
329
- mutationObserver = void 0;
363
+ contentObserver = void 0;
330
364
  directionObserver = void 0;
331
- view?.removeEventListener("resize", scheduler.schedule);
365
+ observerView?.removeEventListener("resize", updateScheduler.schedule);
366
+ observerView = void 0;
332
367
  }
333
368
  onMounted(() => {
334
369
  attachObservers();
335
- nextTick(scheduler.schedule);
370
+ nextTick(updateScheduler.schedule);
336
371
  });
337
372
  onBeforeUnmount(() => {
338
373
  detachObservers();
339
- scheduler.cancel();
374
+ updateScheduler.cancel();
340
375
  positionScheduler.cancel();
341
376
  });
342
377
  return {
343
378
  metrics,
344
- position,
345
- update,
346
- updatePosition,
347
- scheduleUpdate: scheduler.schedule,
348
379
  schedulePositionUpdate: positionScheduler.schedule,
349
- getPosition,
350
- getMaxPosition,
351
- getOverflow
380
+ scheduleUpdate: updateScheduler.schedule,
381
+ update,
382
+ updatePosition
352
383
  };
353
384
  }
354
385
  //#endregion
@@ -357,52 +388,55 @@ function useScrollAreaPointer(options) {
357
388
  let dragSession;
358
389
  function onScrollbarPointerdown(axis, event) {
359
390
  if (event.target !== event.currentTarget || event.button !== 0) return;
360
- if (!options.metrics.getOverflow(axis)) return;
361
- options.metrics.updatePosition();
391
+ const state = options.refreshAxis(axis);
392
+ if (!state.overflow) return;
362
393
  const scrollbar = event.currentTarget;
363
394
  const thumb = scrollbar.firstElementChild;
364
395
  const trackRect = scrollbar.getBoundingClientRect();
365
396
  const thumbRect = thumb?.getBoundingClientRect();
366
- const trackStart = axis === "x" ? trackRect.left : trackRect.top;
367
- const trackSize = axis === "x" ? trackRect.width : trackRect.height;
368
- const thumbSize = thumbRect ? axis === "x" ? thumbRect.width : thumbRect.height : 0;
369
- const coordinate = getPointerCoordinate(axis, event);
370
- const travel = Math.max(0, trackSize - thumbSize);
371
- if (travel === 0) return;
397
+ const horizontal = axis === "x";
398
+ const position = getScrollAreaTrackPosition({
399
+ axis,
400
+ coordinate: getPointerAxisCoordinate(axis, event),
401
+ direction: state.direction,
402
+ maxPosition: state.maxPosition,
403
+ thumbSize: thumbRect ? horizontal ? thumbRect.width : thumbRect.height : 0,
404
+ trackSize: horizontal ? trackRect.width : trackRect.height,
405
+ trackStart: horizontal ? trackRect.left : trackRect.top
406
+ });
407
+ if (position === void 0) return;
372
408
  event.preventDefault();
373
- const physicalRatio = clamp((coordinate - trackStart - thumbSize / 2) / travel, 0, 1);
374
- const logicalRatio = axis === "x" && options.metrics.metrics.direction === "rtl" ? 1 - physicalRatio : physicalRatio;
375
- options.controls.writeAxisPosition(axis, logicalRatio * options.metrics.getMaxPosition(axis));
409
+ options.writeAxisPosition(axis, position);
376
410
  }
377
411
  function onThumbPointerdown(axis, event) {
378
412
  if (event.button !== 0 || event.isPrimary === false) return;
379
- if (!options.metrics.getOverflow(axis)) return;
380
- options.metrics.updatePosition();
413
+ const state = options.refreshAxis(axis);
414
+ if (!state.overflow) return;
381
415
  const scrollbar = getScrollbar(axis);
382
416
  const thumb = event.currentTarget;
383
417
  if (!scrollbar) return;
384
418
  const trackRect = scrollbar.getBoundingClientRect();
385
419
  const thumbRect = thumb.getBoundingClientRect();
386
- const trackSize = axis === "x" ? trackRect.width : trackRect.height;
387
- const thumbSize = axis === "x" ? thumbRect.width : thumbRect.height;
420
+ const horizontal = axis === "x";
421
+ const trackSize = horizontal ? trackRect.width : trackRect.height;
422
+ const thumbSize = horizontal ? thumbRect.width : thumbRect.height;
388
423
  const travel = Math.max(0, trackSize - thumbSize);
389
424
  if (travel === 0) return;
390
425
  event.preventDefault();
391
- event.stopPropagation();
392
426
  stopDragging();
393
- if (options.shouldFocusScrollbar()) scrollbar.focus({ preventScroll: true });
394
- startDragging(axis, event, scrollbar, travel);
427
+ if (!options.isEmbedded()) scrollbar.focus({ preventScroll: true });
428
+ startDragging(axis, event, scrollbar, travel, state);
395
429
  }
396
- function startDragging(axis, event, scrollbar, travel) {
430
+ function startDragging(axis, event, scrollbar, travel, state) {
397
431
  const view = scrollbar.ownerDocument.defaultView;
398
432
  dragSession = {
399
433
  axis,
400
- pointerId: Number.isFinite(event.pointerId) ? event.pointerId : void 0,
401
- startCoordinate: getPointerCoordinate(axis, event),
402
- startPosition: options.metrics.getPosition(axis),
403
- maxPosition: options.metrics.getMaxPosition(axis),
434
+ coordinateDirection: axis === "x" && state.direction === "rtl" ? -1 : 1,
435
+ maxPosition: state.maxPosition,
436
+ pointerId: getPointerId(event),
437
+ startCoordinate: getPointerAxisCoordinate(axis, event),
438
+ startPosition: state.position,
404
439
  travel,
405
- coordinateDirection: axis === "x" && options.metrics.metrics.direction === "rtl" ? -1 : 1,
406
440
  view
407
441
  };
408
442
  options.setDraggingAxis(axis);
@@ -412,12 +446,18 @@ function useScrollAreaPointer(options) {
412
446
  }
413
447
  function onPointermove(event) {
414
448
  const session = dragSession;
415
- if (!session || !isCurrentPointer(event, session)) return;
416
- const delta = getPointerCoordinate(session.axis, event) - session.startCoordinate;
417
- options.controls.writeAxisPosition(session.axis, session.startPosition + session.coordinateDirection * delta * session.maxPosition / session.travel);
449
+ if (!session || !isMatchingPointer(event, session.pointerId)) return;
450
+ options.writeAxisPosition(session.axis, getScrollAreaDragPosition({
451
+ coordinate: getPointerAxisCoordinate(session.axis, event),
452
+ coordinateDirection: session.coordinateDirection,
453
+ maxPosition: session.maxPosition,
454
+ startCoordinate: session.startCoordinate,
455
+ startPosition: session.startPosition,
456
+ travel: session.travel
457
+ }));
418
458
  }
419
459
  function onPointerend(event) {
420
- if (!dragSession || !isCurrentPointer(event, dragSession)) return;
460
+ if (!dragSession || !isMatchingPointer(event, dragSession.pointerId)) return;
421
461
  stopDragging();
422
462
  }
423
463
  function stopDragging() {
@@ -429,7 +469,7 @@ function useScrollAreaPointer(options) {
429
469
  options.setDraggingAxis(null);
430
470
  }
431
471
  function getScrollbar(axis) {
432
- return axis === "x" ? options.horizontalScrollbarRef.value : options.verticalScrollbarRef.value;
472
+ return axis === "x" ? options.elements.horizontalScrollbar.value : options.elements.verticalScrollbar.value;
433
473
  }
434
474
  onBeforeUnmount(stopDragging);
435
475
  return {
@@ -437,260 +477,226 @@ function useScrollAreaPointer(options) {
437
477
  onThumbPointerdown
438
478
  };
439
479
  }
440
- function getPointerCoordinate(axis, event) {
441
- return axis === "x" ? event.clientX : event.clientY;
442
- }
443
- function isCurrentPointer(event, session) {
444
- return session.pointerId === void 0 || event.pointerId === session.pointerId;
445
- }
446
480
  //#endregion
447
481
  //#region src/components/scroll-area/useScrollAreaVisibility.ts
448
482
  function useScrollAreaVisibility(options) {
449
- const isHovered = ref(false);
450
- const hasFocusWithin = ref(false);
451
- const isScrolling = ref(false);
483
+ const hovered = ref(false);
484
+ const focusWithin = ref(false);
485
+ const scrolling = ref(false);
452
486
  const draggingAxis = ref(null);
453
487
  let scrollEndTimer;
454
- const renderHorizontalScrollbar = computed(() => options.horizontalEnabled.value && options.props.type !== "never");
455
- const renderVerticalScrollbar = computed(() => options.verticalEnabled.value && options.props.type !== "never");
456
- const horizontalScrollbarActive = computed(() => isScrollbarActive(options.props.type ?? "hover", options.horizontalEnabled.value, options.overflowX()));
457
- const verticalScrollbarActive = computed(() => isScrollbarActive(options.props.type ?? "hover", options.verticalEnabled.value, options.overflowY()));
458
- const horizontalScrollbarVisible = computed(() => isVisible(horizontalScrollbarActive.value, "x"));
459
- const verticalScrollbarVisible = computed(() => isVisible(verticalScrollbarActive.value, "y"));
460
- function isVisible(active, axis) {
461
- if (!active) return false;
462
- switch (options.props.type) {
463
- case "always":
464
- case "auto": return true;
465
- case "hover": return isHovered.value || hasFocusWithin.value || draggingAxis.value === axis;
466
- case "scroll": return isScrolling.value || draggingAxis.value === axis;
467
- default: return false;
488
+ const horizontalVisible = computed(() => isVisible("x"));
489
+ const verticalVisible = computed(() => isVisible("y"));
490
+ const rootHandlers = {
491
+ onPointerenter() {
492
+ hovered.value = true;
493
+ },
494
+ onPointerleave() {
495
+ hovered.value = false;
496
+ },
497
+ onFocusin() {
498
+ focusWithin.value = true;
499
+ },
500
+ onFocusout(event) {
501
+ if (isNodeWithinElement(event.relatedTarget, options.root.value)) return;
502
+ focusWithin.value = false;
468
503
  }
504
+ };
505
+ function isVisible(axis) {
506
+ return isScrollAreaScrollbarVisible({
507
+ active: options.isScrollbarActive(axis),
508
+ axis,
509
+ draggingAxis: draggingAxis.value,
510
+ focusWithin: focusWithin.value,
511
+ hovered: hovered.value,
512
+ scrolling: scrolling.value,
513
+ type: options.getType()
514
+ });
469
515
  }
470
516
  function showDuringScroll() {
471
- isScrolling.value = true;
472
- resetScrollEndTimer();
517
+ scrolling.value = true;
518
+ clearScrollEndTimer();
473
519
  scrollEndTimer = setTimeout(() => {
474
- isScrolling.value = false;
520
+ scrolling.value = false;
475
521
  scrollEndTimer = void 0;
476
- }, normalizeDelay(options.props.scrollHideDelay));
522
+ }, normalizeDelay(options.getHideDelay()));
523
+ }
524
+ function clearScrollEndTimer() {
525
+ if (scrollEndTimer === void 0) return;
526
+ clearTimeout(scrollEndTimer);
527
+ scrollEndTimer = void 0;
477
528
  }
478
529
  function setDraggingAxis(axis) {
479
530
  draggingAxis.value = axis;
480
531
  }
481
- function onPointerenter() {
482
- isHovered.value = true;
483
- }
484
- function onPointerleave() {
485
- isHovered.value = false;
486
- }
487
- function onFocusin() {
488
- hasFocusWithin.value = true;
489
- }
490
- function onFocusout(event) {
491
- const nextTarget = event.relatedTarget;
492
- if (nextTarget instanceof Node && options.rootRef.value?.contains(nextTarget)) return;
493
- hasFocusWithin.value = false;
494
- }
495
- function resetScrollEndTimer() {
496
- if (scrollEndTimer !== void 0) clearTimeout(scrollEndTimer);
497
- }
498
- watch(() => options.props.scrollHideDelay, () => {
499
- if (isScrolling.value) showDuringScroll();
532
+ watch(options.getHideDelay, () => {
533
+ if (scrolling.value) showDuringScroll();
500
534
  });
501
- onBeforeUnmount(resetScrollEndTimer);
535
+ onBeforeUnmount(clearScrollEndTimer);
502
536
  return {
503
- renderHorizontalScrollbar,
504
- renderVerticalScrollbar,
505
- horizontalScrollbarActive,
506
- verticalScrollbarActive,
507
- horizontalScrollbarVisible,
508
- verticalScrollbarVisible,
509
- showDuringScroll,
537
+ horizontalVisible,
538
+ rootHandlers,
510
539
  setDraggingAxis,
511
- onPointerenter,
512
- onPointerleave,
513
- onFocusin,
514
- onFocusout
540
+ showDuringScroll,
541
+ verticalVisible
515
542
  };
516
543
  }
517
- function normalizeDelay(delay) {
518
- return Number.isFinite(delay) ? Math.max(0, delay ?? 0) : 0;
519
- }
520
544
  //#endregion
521
545
  //#region src/components/scroll-area/useScrollArea.ts
522
- function useScrollArea(options) {
546
+ var minimumThumbSize = 18;
547
+ var keyboardScrollStep = 40;
548
+ function useScrollArea(props, emit) {
523
549
  const rootRef = ref(null);
524
550
  const viewportRef = ref(null);
525
- const contentRef = ref(null);
526
- const horizontalScrollbarRef = ref(null);
527
- const verticalScrollbarRef = ref(null);
528
- const horizontalEnabled = computed(() => isAxisEnabled(options.props.scrollbars, "x"));
529
- const verticalEnabled = computed(() => isAxisEnabled(options.props.scrollbars, "y"));
530
- const measurements = useScrollAreaMetrics({
531
- viewportRef,
532
- contentRef,
533
- horizontalScrollbarRef,
534
- verticalScrollbarRef,
535
- horizontalEnabled,
536
- verticalEnabled
551
+ const templateRefs = {
552
+ root: rootRef,
553
+ viewport: viewportRef,
554
+ content: ref(null),
555
+ horizontalScrollbar: ref(null),
556
+ verticalScrollbar: ref(null)
557
+ };
558
+ const { metrics, schedulePositionUpdate, scheduleUpdate, update, updatePosition } = useScrollAreaMeasurement({
559
+ elements: templateRefs,
560
+ isAxisEnabled: (axis) => isScrollAreaAxisEnabled(props.scrollbars, axis),
561
+ minimumThumbSize
537
562
  });
563
+ const { horizontalScrollbarActive, renderHorizontalScrollbar, renderVerticalScrollbar, verticalScrollbarActive } = useScrollAreaDerivedState(props, metrics);
538
564
  const visibility = useScrollAreaVisibility({
539
- props: options.props,
540
- rootRef,
541
- horizontalEnabled,
542
- verticalEnabled,
543
- overflowX: () => measurements.metrics.overflowX,
544
- overflowY: () => measurements.metrics.overflowY
565
+ getHideDelay: () => props.scrollHideDelay,
566
+ getType: () => props.type ?? "hover",
567
+ isScrollbarActive: (axis) => axis === "x" ? horizontalScrollbarActive.value : verticalScrollbarActive.value,
568
+ root: rootRef
545
569
  });
546
- const controls = useScrollAreaControls({
547
- viewportRef,
548
- metrics: measurements,
549
- showDuringScroll: visibility.showDuringScroll,
550
- emitScroll: options.emitScroll,
551
- emitPositionChange: options.emitPositionChange,
552
- emitReachTop: options.emitReachTop,
553
- emitReachBottom: options.emitReachBottom,
554
- emitReachLeft: options.emitReachLeft,
555
- emitReachRight: options.emitReachRight
556
- });
557
- const pointer = useScrollAreaPointer({
558
- horizontalScrollbarRef,
559
- verticalScrollbarRef,
560
- metrics: measurements,
561
- controls,
570
+ const { onScrollbarPointerdown, onThumbPointerdown } = useScrollAreaPointer({
571
+ elements: templateRefs,
572
+ isEmbedded: () => Boolean(props.embedded),
573
+ refreshAxis,
562
574
  setDraggingAxis: visibility.setDraggingAxis,
563
- shouldFocusScrollbar: () => !options.props.embedded
575
+ writeAxisPosition
564
576
  });
565
- watch([
566
- visibility.horizontalScrollbarActive,
567
- visibility.verticalScrollbarActive,
568
- visibility.renderHorizontalScrollbar,
569
- visibility.renderVerticalScrollbar
570
- ], () => void nextTick(measurements.scheduleUpdate));
571
- return {
572
- rootRef,
573
- viewportRef,
574
- contentRef,
575
- horizontalScrollbarRef,
576
- verticalScrollbarRef,
577
- metrics: measurements.metrics,
578
- position: measurements.position,
579
- update: measurements.update,
580
- getPosition: measurements.getPosition,
581
- getMaxPosition: measurements.getMaxPosition,
582
- getOverflow: measurements.getOverflow,
583
- ...visibility,
584
- ...controls,
585
- ...pointer
577
+ let previousPosition = {
578
+ x: 0,
579
+ y: 0
586
580
  };
587
- }
588
- //#endregion
589
- //#region src/components/scroll-area/useScrollAreaPresentation.ts
590
- function useScrollAreaPresentation(props, scrollArea) {
591
- const generatedId = useId();
592
- const viewportId = computed(() => `${props.id || generatedId}-viewport`);
593
- const { getPartAttrs, getRootAttrs } = useStylesApi(props, "root");
594
- const rootAttrs = computed(() => getRootAttrs({
595
- id: props.id,
596
- class: "rp-scroll-area",
597
- style: getRootStyle(props.scrollbarSize),
598
- "data-type": props.type,
599
- "data-direction": scrollArea.metrics.direction,
600
- "data-scrollbars": props.scrollbars === false ? "none" : props.scrollbars,
601
- "data-overflow-x": presence(scrollArea.metrics.overflowX),
602
- "data-overflow-y": presence(scrollArea.metrics.overflowY),
603
- "data-scrollbar-x-active": presence(scrollArea.horizontalScrollbarActive.value),
604
- "data-scrollbar-y-active": presence(scrollArea.verticalScrollbarActive.value),
605
- "data-scrollbar-x-visible": presence(scrollArea.horizontalScrollbarVisible.value),
606
- "data-scrollbar-y-visible": presence(scrollArea.verticalScrollbarVisible.value),
607
- onPointerenter: scrollArea.onPointerenter,
608
- onPointerleave: scrollArea.onPointerleave,
609
- onFocusin: scrollArea.onFocusin,
610
- onFocusout: scrollArea.onFocusout
611
- }));
612
- const viewportAttrs = computed(() => {
613
- const { class: compatibilityClass, style: compatibilityStyle, onScroll: compatibilityOnScroll, ...attrs } = props.viewportAttrs ?? {};
614
- return {
615
- ...attrs,
616
- ...getPartAttrs("viewport", {
617
- class: "rp-scroll-area__viewport",
618
- compatibilityClass,
619
- compatibilityStyle
620
- }),
621
- id: viewportId.value,
622
- role: attrs.role ?? (hasAccessibleName(props, attrs) ? "region" : void 0),
623
- tabindex: attrs.tabindex ?? 0,
624
- "aria-label": props.ariaLabel || attrs["aria-label"] || void 0,
625
- "aria-labelledby": props.ariaLabelledby || attrs["aria-labelledby"] || void 0,
626
- "aria-describedby": props.ariaDescribedby || attrs["aria-describedby"] || void 0,
627
- onScroll(event) {
628
- scrollArea.onViewportScroll(event);
629
- compatibilityOnScroll?.(event);
630
- }
631
- };
632
- });
633
- const contentAttrs = computed(() => {
634
- const { class: compatibilityClass, style: compatibilityStyle, ...attrs } = props.contentAttrs ?? {};
635
- return {
636
- ...attrs,
637
- ...getPartAttrs("content", {
638
- class: "rp-scroll-area__content",
639
- compatibilityClass,
640
- compatibilityStyle
641
- })
642
- };
581
+ const { contentAttrs, cornerAttrs, horizontalScrollbarAttrs, horizontalThumbAttrs, rootAttrs, verticalScrollbarAttrs, verticalThumbAttrs, viewportAttrs } = useScrollAreaAttributes({
582
+ metrics,
583
+ onViewportScroll,
584
+ props,
585
+ rootHandlers: visibility.rootHandlers,
586
+ state: {
587
+ horizontalActive: horizontalScrollbarActive,
588
+ horizontalVisible: visibility.horizontalVisible,
589
+ verticalActive: verticalScrollbarActive,
590
+ verticalVisible: visibility.verticalVisible
591
+ },
592
+ viewport: viewportRef
643
593
  });
644
- const horizontalScrollbarAttrs = computed(() => getScrollbarAttrs("x"));
645
- const verticalScrollbarAttrs = computed(() => getScrollbarAttrs("y"));
646
- const horizontalThumbAttrs = computed(() => getThumbAttrs("x"));
647
- const verticalThumbAttrs = computed(() => getThumbAttrs("y"));
648
- const cornerAttrs = computed(() => ({
649
- ...getPartAttrs("corner", { class: "rp-scroll-area__corner" }),
650
- "aria-hidden": true,
651
- "data-direction": scrollArea.metrics.direction,
652
- "data-visible": presence(scrollArea.horizontalScrollbarActive.value && scrollArea.verticalScrollbarActive.value)
653
- }));
654
594
  const slotProps = computed(() => ({
655
- position: scrollArea.position.value,
656
- overflowX: scrollArea.metrics.overflowX,
657
- overflowY: scrollArea.metrics.overflowY,
658
- scrollTo: scrollArea.scrollTo,
659
- scrollBy: scrollArea.scrollBy,
660
- update: scrollArea.update
595
+ position: {
596
+ x: metrics.x,
597
+ y: metrics.y
598
+ },
599
+ overflowX: metrics.overflowX,
600
+ overflowY: metrics.overflowY,
601
+ scrollTo,
602
+ scrollBy,
603
+ update
661
604
  }));
662
- function getScrollbarAttrs(axis) {
663
- const vertical = axis === "y";
664
- const active = vertical ? scrollArea.verticalScrollbarActive.value : scrollArea.horizontalScrollbarActive.value;
665
- const visible = vertical ? scrollArea.verticalScrollbarVisible.value : scrollArea.horizontalScrollbarVisible.value;
666
- return {
667
- ...getPartAttrs("scrollbar", { class: ["rp-scroll-area__scrollbar", `rp-scroll-area__scrollbar--${vertical ? "vertical" : "horizontal"}`] }),
668
- role: "scrollbar",
669
- tabindex: !props.embedded && active ? 0 : -1,
670
- "aria-controls": scrollArea.viewportRef.value?.id || void 0,
671
- "aria-orientation": vertical ? "vertical" : "horizontal",
672
- "aria-valuemin": 0,
673
- "aria-valuemax": scrollArea.getMaxPosition(axis),
674
- "aria-valuenow": Math.round(scrollArea.getPosition(axis)),
675
- "aria-disabled": !scrollArea.getOverflow(axis) || void 0,
676
- "aria-hidden": props.embedded || !active || void 0,
677
- "data-orientation": vertical ? "vertical" : "horizontal",
678
- "data-direction": scrollArea.metrics.direction,
679
- "data-active": presence(active),
680
- "data-visible": presence(visible)
605
+ function refreshAxis(axis) {
606
+ updatePosition();
607
+ return getScrollAreaAxisState(metrics, axis);
608
+ }
609
+ function onViewportScroll(event) {
610
+ updatePosition();
611
+ visibility.showDuringScroll();
612
+ const position = {
613
+ x: getScrollAreaAxisPosition(metrics, "x"),
614
+ y: getScrollAreaAxisPosition(metrics, "y")
681
615
  };
616
+ const reachedBoundaries = getReachedScrollAreaBoundaries(position, previousPosition, metrics);
617
+ previousPosition = position;
618
+ emit("scroll", event);
619
+ emit("scrollPositionChange", {
620
+ x: metrics.x,
621
+ y: metrics.y
622
+ });
623
+ for (const boundary of reachedBoundaries) emitReachedBoundary(boundary, event);
682
624
  }
683
- function getThumbAttrs(axis) {
684
- const horizontal = axis === "x";
685
- return getPartAttrs("thumb", {
686
- class: "rp-scroll-area__thumb",
687
- style: {
688
- "--_rp-scroll-area-thumb-size": `${horizontal ? scrollArea.metrics.horizontalThumbSize : scrollArea.metrics.verticalThumbSize}%`,
689
- "--_rp-scroll-area-thumb-offset": `${horizontal ? scrollArea.metrics.horizontalThumbOffset : scrollArea.metrics.verticalThumbOffset}%`
690
- }
625
+ function emitReachedBoundary(boundary, event) {
626
+ switch (boundary) {
627
+ case "top":
628
+ emit("reachTop", event);
629
+ break;
630
+ case "bottom":
631
+ emit("reachBottom", event);
632
+ break;
633
+ case "left":
634
+ emit("reachLeft", event);
635
+ break;
636
+ case "right":
637
+ emit("reachRight", event);
638
+ break;
639
+ }
640
+ }
641
+ function writeAxisPosition(axis, value) {
642
+ const viewport = viewportRef.value;
643
+ if (!viewport) return;
644
+ if (axis === "x") viewport.scrollLeft = getRawHorizontalScrollPosition(value, getScrollAreaMaxPosition(metrics, "x"), metrics.direction);
645
+ else viewport.scrollTop = clamp(value, 0, getScrollAreaMaxPosition(metrics, "y"));
646
+ updatePosition();
647
+ visibility.showDuringScroll();
648
+ }
649
+ function onScrollbarKeydown(axis, event) {
650
+ const viewport = viewportRef.value;
651
+ if (!viewport || !getScrollAreaOverflow(metrics, axis)) return;
652
+ updatePosition(viewport);
653
+ const current = getScrollAreaAxisPosition(metrics, axis);
654
+ const pageSize = axis === "x" ? viewport.clientWidth : viewport.clientHeight;
655
+ const nextPosition = getKeyboardScrollPosition({
656
+ axis,
657
+ key: event.key,
658
+ current,
659
+ pageSize,
660
+ maxPosition: getScrollAreaMaxPosition(metrics, axis),
661
+ direction: metrics.direction,
662
+ lineStep: keyboardScrollStep
691
663
  });
664
+ if (nextPosition === void 0) return;
665
+ event.preventDefault();
666
+ writeAxisPosition(axis, nextPosition);
692
667
  }
668
+ function onScrollbarWheel(axis, event) {
669
+ if (!getScrollAreaOverflow(metrics, axis)) return;
670
+ updatePosition();
671
+ const delta = getWheelScrollDelta(axis, event, metrics.direction);
672
+ if (!delta) return;
673
+ event.preventDefault();
674
+ writeAxisPosition(axis, getScrollAreaAxisPosition(metrics, axis) + delta);
675
+ }
676
+ function scrollTo(scrollOptions) {
677
+ const viewport = viewportRef.value;
678
+ if (!viewport) return;
679
+ if (typeof viewport.scrollTo === "function") viewport.scrollTo(scrollOptions);
680
+ else applyFallbackScrollPosition(viewport, scrollOptions, "absolute");
681
+ schedulePositionUpdate();
682
+ }
683
+ function scrollBy(scrollOptions) {
684
+ const viewport = viewportRef.value;
685
+ if (!viewport) return;
686
+ if (typeof viewport.scrollBy === "function") viewport.scrollBy(scrollOptions);
687
+ else applyFallbackScrollPosition(viewport, scrollOptions, "relative");
688
+ schedulePositionUpdate();
689
+ }
690
+ watch([
691
+ horizontalScrollbarActive,
692
+ verticalScrollbarActive,
693
+ renderHorizontalScrollbar,
694
+ renderVerticalScrollbar
695
+ ], () => void nextTick(scheduleUpdate));
693
696
  return {
697
+ templateRefs,
698
+ renderHorizontalScrollbar,
699
+ renderVerticalScrollbar,
694
700
  rootAttrs,
695
701
  viewportAttrs,
696
702
  contentAttrs,
@@ -699,22 +705,21 @@ function useScrollAreaPresentation(props, scrollArea) {
699
705
  horizontalThumbAttrs,
700
706
  verticalThumbAttrs,
701
707
  cornerAttrs,
702
- slotProps
708
+ slotProps,
709
+ onScrollbarKeydown,
710
+ onScrollbarWheel,
711
+ onScrollbarPointerdown,
712
+ onThumbPointerdown,
713
+ scrollTo,
714
+ scrollBy,
715
+ update
703
716
  };
704
717
  }
705
- function getRootStyle(scrollbarSize) {
706
- const length = getLengthValue(scrollbarSize);
707
- return length ? { "--_rp-scroll-area-scrollbar-size": length } : {};
708
- }
709
- function hasAccessibleName(props, attrs) {
710
- return Boolean(props.ariaLabel || props.ariaLabelledby || attrs["aria-label"] || attrs["aria-labelledby"]);
711
- }
712
718
  //#endregion
713
719
  //#region src/components/scroll-area/scroll-area.vue?vue&type=script&setup=true&vapor=true&lang.ts
714
- var t0 = template("<div data-v-f5c4e940><div data-v-f5c4e940></div>");
715
- var t1 = template("<div data-v-f5c4e940>");
716
- var t2 = template("<div data-v-f5c4e940><div data-v-f5c4e940><div data-v-f5c4e940></div></div>", 1);
717
- delegateEvents("pointerdown", "keydown");
720
+ var t0 = template("<div data-v-cd2fe353><div data-v-cd2fe353></div>");
721
+ var t1 = template("<div data-v-cd2fe353>");
722
+ var t2 = template("<div data-v-cd2fe353><div data-v-cd2fe353><div data-v-cd2fe353></div></div>", 1);
718
723
  //#endregion
719
724
  //#region src/components/scroll-area/scroll-area.vue
720
725
  var scroll_area_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -760,21 +765,9 @@ var scroll_area_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
760
765
  "reachRight"
761
766
  ],
762
767
  setup(__props, { expose: __expose, emit: __emit }) {
763
- const props = __props;
764
- const emit = __emit;
765
- const scrollArea = useScrollArea({
766
- props,
767
- emitScroll: (event) => emit("scroll", event),
768
- emitPositionChange: (position) => emit("scrollPositionChange", position),
769
- emitReachTop: (event) => emit("reachTop", event),
770
- emitReachBottom: (event) => emit("reachBottom", event),
771
- emitReachLeft: (event) => emit("reachLeft", event),
772
- emitReachRight: (event) => emit("reachRight", event)
773
- });
774
- const { rootRef, viewportRef, contentRef, horizontalScrollbarRef, verticalScrollbarRef, renderHorizontalScrollbar, renderVerticalScrollbar, onScrollbarKeydown, onScrollbarWheel, onScrollbarPointerdown, onThumbPointerdown, scrollTo, scrollBy, update } = scrollArea;
775
- const { rootAttrs, viewportAttrs, contentAttrs, horizontalScrollbarAttrs, verticalScrollbarAttrs, horizontalThumbAttrs, verticalThumbAttrs, cornerAttrs, slotProps } = useScrollAreaPresentation(props, scrollArea);
768
+ const { templateRefs, renderHorizontalScrollbar, renderVerticalScrollbar, rootAttrs, viewportAttrs, contentAttrs, horizontalScrollbarAttrs, verticalScrollbarAttrs, horizontalThumbAttrs, verticalThumbAttrs, cornerAttrs, slotProps, onScrollbarKeydown, onScrollbarWheel, onScrollbarPointerdown, onThumbPointerdown, scrollTo, scrollBy, update } = useScrollArea(__props, __emit);
776
769
  __expose({
777
- viewport: viewportRef,
770
+ viewport: templateRefs.viewport,
778
771
  scrollTo,
779
772
  scrollBy,
780
773
  update
@@ -790,20 +783,23 @@ var scroll_area_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
790
783
  });
791
784
  setInsertionState(n1, null, 0);
792
785
  createSlot("default", { $: [() => unref(slotProps)] }, null, 1);
793
- _setTemplateRef(n1, contentRef, null, "contentRef");
794
- _setTemplateRef(n2, viewportRef, null, "viewportRef");
786
+ renderEffect(() => {
787
+ const _templateRefs = unref(templateRefs);
788
+ _setTemplateRef(n1, _templateRefs.content);
789
+ _setTemplateRef(n2, _templateRefs.viewport);
790
+ });
795
791
  setInsertionState(n14, null, 1);
796
792
  createIf(() => unref(renderHorizontalScrollbar), () => {
797
793
  const n6 = t0();
798
794
  const n5 = child(n6);
799
- n5.$evtpointerdown = createInvoker(($event) => unref(onThumbPointerdown)("x", $event));
800
- n6.$evtkeydown = createInvoker(($event) => unref(onScrollbarKeydown)("x", $event));
801
- n6.$evtpointerdown = createInvoker(($event) => unref(onScrollbarPointerdown)("x", $event));
795
+ on(n5, "pointerdown", ($event) => unref(onThumbPointerdown)("x", $event));
796
+ on(n6, "keydown", ($event) => unref(onScrollbarKeydown)("x", $event));
797
+ on(n6, "pointerdown", ($event) => unref(onScrollbarPointerdown)("x", $event));
802
798
  on(n6, "wheel", ($event) => unref(onScrollbarWheel)("x", $event));
803
- _setTemplateRef(n6, horizontalScrollbarRef, null, "horizontalScrollbarRef");
804
799
  renderEffect(() => {
805
800
  setDynamicProps(n6, [unref(horizontalScrollbarAttrs)]);
806
801
  setDynamicProps(n5, [unref(horizontalThumbAttrs)]);
802
+ _setTemplateRef(n6, unref(templateRefs).horizontalScrollbar);
807
803
  });
808
804
  return n6;
809
805
  });
@@ -811,14 +807,14 @@ var scroll_area_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
811
807
  createIf(() => unref(renderVerticalScrollbar), () => {
812
808
  const n10 = t0();
813
809
  const n9 = child(n10);
814
- n9.$evtpointerdown = createInvoker(($event) => unref(onThumbPointerdown)("y", $event));
815
- n10.$evtkeydown = createInvoker(($event) => unref(onScrollbarKeydown)("y", $event));
816
- n10.$evtpointerdown = createInvoker(($event) => unref(onScrollbarPointerdown)("y", $event));
810
+ on(n9, "pointerdown", ($event) => unref(onThumbPointerdown)("y", $event));
811
+ on(n10, "keydown", ($event) => unref(onScrollbarKeydown)("y", $event));
812
+ on(n10, "pointerdown", ($event) => unref(onScrollbarPointerdown)("y", $event));
817
813
  on(n10, "wheel", ($event) => unref(onScrollbarWheel)("y", $event));
818
- _setTemplateRef(n10, verticalScrollbarRef, null, "verticalScrollbarRef");
819
814
  renderEffect(() => {
820
815
  setDynamicProps(n10, [unref(verticalScrollbarAttrs)]);
821
816
  setDynamicProps(n9, [unref(verticalThumbAttrs)]);
817
+ _setTemplateRef(n10, unref(templateRefs).verticalScrollbar);
822
818
  });
823
819
  return n10;
824
820
  });
@@ -828,9 +824,9 @@ var scroll_area_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
828
824
  renderEffect(() => setDynamicProps(n13, [unref(cornerAttrs)]));
829
825
  return n13;
830
826
  });
831
- _setTemplateRef(n14, rootRef, null, "rootRef");
827
+ setTemplateRefBinding(n14, () => unref(templateRefs).root);
832
828
  return n14;
833
829
  }
834
- }), [["__scopeId", "data-v-f5c4e940"]]);
830
+ }), [["__scopeId", "data-v-cd2fe353"]]);
835
831
  //#endregion
836
832
  export { scroll_area_default as t };