ropav 0.3.1 → 0.5.0

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 (277) hide show
  1. package/dist/components/autocomplete/autocomplete-root.js +3 -1
  2. package/dist/components/autocomplete/index.d.ts +3 -0
  3. package/dist/components/avatar/avatar-image.js +13 -2
  4. package/dist/components/avatar/avatar.types.d.ts +7 -1
  5. package/dist/components/breadcrumbs/breadcrumbs-item.js +1 -0
  6. package/dist/components/breadcrumbs/index.d.ts +1 -0
  7. package/dist/components/calendar/calendar-header.js +1 -1
  8. package/dist/components/calendar/index.d.ts +5 -3
  9. package/dist/components/calendar-year-picker/index.d.ts +4 -2
  10. package/dist/components/checkbox/checkbox-content.js +1 -1
  11. package/dist/components/color-field/index.d.ts +3 -2
  12. package/dist/components/color-input-group/color-input-group-root.js +2 -0
  13. package/dist/components/color-input-group/color-input-group.types.d.ts +2 -0
  14. package/dist/components/color-input-group/index.d.ts +2 -0
  15. package/dist/components/combo-box/combo-box-root.js +9 -2
  16. package/dist/components/combo-box/combo-box.types.d.ts +3 -0
  17. package/dist/components/combo-box/index.d.ts +3 -0
  18. package/dist/components/date-field/index.d.ts +1 -0
  19. package/dist/components/date-input-group/date-input-group-root.js +2 -0
  20. package/dist/components/date-input-group/date-input-group-segment.js +1 -1
  21. package/dist/components/date-input-group/date-input-group.types.d.ts +2 -0
  22. package/dist/{composables → components/date-input-group}/use-date-segment.d.ts +2 -2
  23. package/dist/{composables → components/date-input-group}/use-date-segment.js +9 -9
  24. package/dist/components/date-picker/index.d.ts +3 -2
  25. package/dist/components/date-picker/index.js +2 -2
  26. package/dist/components/date-range-picker/date-range-picker-root.js +1 -1
  27. package/dist/components/date-range-picker/index.d.ts +18 -16
  28. package/dist/components/date-range-picker/index.js +2 -2
  29. package/dist/{composables → components/date-range-picker}/use-date-range-picker.d.ts +7 -7
  30. package/dist/{composables → components/date-range-picker}/use-date-range-picker.js +10 -10
  31. package/dist/components/drawer/drawer-dialog.js +1 -1
  32. package/dist/{composables → components/drawer}/use-drawer-drag.d.ts +1 -1
  33. package/dist/{composables → components/drawer}/use-drawer-drag.js +1 -1
  34. package/dist/components/dropdown/dropdown-menu.js +3 -1
  35. package/dist/components/dropdown/dropdown-submenu-trigger.js +1 -1
  36. package/dist/components/dropdown/dropdown.types.d.ts +3 -3
  37. package/dist/components/dropdown/index.d.ts +4 -2
  38. package/dist/{composables → components/dropdown}/use-safely-mouse-to-submenu.js +1 -1
  39. package/dist/components/icons/icon-overlay-arrow.js +1 -1
  40. package/dist/components/index.d.ts +5 -0
  41. package/dist/components/input/index.d.ts +12 -4
  42. package/dist/components/input/input-root.d.ts +5 -2
  43. package/dist/components/input/input-root.js +46 -5
  44. package/dist/components/input/input.types.d.ts +11 -0
  45. package/dist/components/input-group/index.d.ts +2 -0
  46. package/dist/components/input-group/input-group-root.js +3 -0
  47. package/dist/components/input-group/input-group.types.d.ts +5 -0
  48. package/dist/components/input-otp/index.d.ts +6 -4
  49. package/dist/components/link/index.d.ts +2 -0
  50. package/dist/components/link/link-root.js +22 -5
  51. package/dist/components/link/link.types.d.ts +14 -3
  52. package/dist/{composables → components/list-box}/drag-collection.d.ts +2 -2
  53. package/dist/{composables → components/list-box}/drag-collection.js +1 -1
  54. package/dist/components/list-box/index.d.ts +4 -0
  55. package/dist/components/list-box/list-box-root.js +60 -35
  56. package/dist/components/list-box/list-box.types.d.ts +2 -0
  57. package/dist/components/menu/index.d.ts +4 -0
  58. package/dist/components/menu/menu-root.js +9 -2
  59. package/dist/components/menu/menu.types.d.ts +5 -0
  60. package/dist/components/number-field/index.d.ts +3 -0
  61. package/dist/components/number-field/number-field-root.js +2 -0
  62. package/dist/components/number-field/number-field.types.d.ts +2 -0
  63. package/dist/components/overlay/overlay-arrow.js +64 -11
  64. package/dist/components/pagination/index.d.ts +2 -0
  65. package/dist/components/pagination/pagination-root.js +8 -3
  66. package/dist/components/pagination/pagination.types.d.ts +8 -0
  67. package/dist/components/popover/popover-trigger.js +14 -7
  68. package/dist/components/radio/radio-content.js +1 -1
  69. package/dist/components/range-calendar/index.d.ts +18 -15
  70. package/dist/components/range-calendar/range-calendar-header.js +1 -1
  71. package/dist/components/router-provider/index.d.ts +5 -0
  72. package/dist/components/router-provider/index.js +3 -0
  73. package/dist/components/router-provider/router-provider.context.d.ts +40 -0
  74. package/dist/components/router-provider/router-provider.context.js +16 -0
  75. package/dist/components/router-provider/router-provider.d.ts +21 -0
  76. package/dist/components/router-provider/router-provider.js +22 -0
  77. package/dist/components/router-provider/router-provider.types.d.ts +23 -0
  78. package/dist/components/scroll-shadow/scroll-shadow-root.js +7 -1
  79. package/dist/components/scroll-shadow/use-scroll-shadow.js +25 -1
  80. package/dist/components/search-field/index.d.ts +2 -0
  81. package/dist/components/search-field/search-field-root.js +3 -1
  82. package/dist/components/search-field/search-field.types.d.ts +2 -0
  83. package/dist/{composables → components/search-field}/use-search-field.d.ts +2 -2
  84. package/dist/{composables → components/search-field}/use-search-field.js +3 -3
  85. package/dist/components/segmented-control/index.d.ts +134 -0
  86. package/dist/components/segmented-control/index.js +15 -0
  87. package/dist/components/segmented-control/segmented-control-indicator.d.ts +19 -0
  88. package/dist/components/segmented-control/segmented-control-indicator.js +36 -0
  89. package/dist/components/segmented-control/segmented-control-item.d.ts +21 -0
  90. package/dist/components/segmented-control/segmented-control-item.js +96 -0
  91. package/dist/components/segmented-control/segmented-control-root.d.ts +25 -0
  92. package/dist/components/segmented-control/segmented-control-root.js +112 -0
  93. package/dist/components/segmented-control/segmented-control-separator.d.ts +19 -0
  94. package/dist/components/segmented-control/segmented-control-separator.js +18 -0
  95. package/dist/components/segmented-control/segmented-control.context.d.ts +17 -0
  96. package/dist/components/segmented-control/segmented-control.context.js +12 -0
  97. package/dist/components/segmented-control/segmented-control.types.d.ts +67 -0
  98. package/dist/components/select/index.d.ts +3 -0
  99. package/dist/components/select/select-hidden-select.js +1 -1
  100. package/dist/components/select/select-root.js +2 -0
  101. package/dist/components/select/select.types.d.ts +2 -0
  102. package/dist/components/separator/separator-root.js +11 -5
  103. package/dist/components/separator/separator.context.d.ts +7 -0
  104. package/dist/components/sidebar/index.d.ts +544 -0
  105. package/dist/components/sidebar/index.js +47 -0
  106. package/dist/components/sidebar/sidebar-collapsible-trigger.d.ts +21 -0
  107. package/dist/components/sidebar/sidebar-collapsible-trigger.js +70 -0
  108. package/dist/components/sidebar/sidebar-collapsible.d.ts +24 -0
  109. package/dist/components/sidebar/sidebar-collapsible.js +78 -0
  110. package/dist/components/sidebar/sidebar-content.d.ts +21 -0
  111. package/dist/components/sidebar/sidebar-content.js +37 -0
  112. package/dist/components/sidebar/sidebar-footer.d.ts +21 -0
  113. package/dist/components/sidebar/sidebar-footer.js +24 -0
  114. package/dist/components/sidebar/sidebar-group-label.d.ts +21 -0
  115. package/dist/components/sidebar/sidebar-group-label.js +32 -0
  116. package/dist/components/sidebar/sidebar-group.d.ts +21 -0
  117. package/dist/components/sidebar/sidebar-group.js +48 -0
  118. package/dist/components/sidebar/sidebar-header.d.ts +21 -0
  119. package/dist/components/sidebar/sidebar-header.js +24 -0
  120. package/dist/components/sidebar/sidebar-inset.d.ts +21 -0
  121. package/dist/components/sidebar/sidebar-inset.js +24 -0
  122. package/dist/components/sidebar/sidebar-item-icon.d.ts +21 -0
  123. package/dist/components/sidebar/sidebar-item-icon.js +20 -0
  124. package/dist/components/sidebar/sidebar-item-indicator.d.ts +21 -0
  125. package/dist/components/sidebar/sidebar-item-indicator.js +48 -0
  126. package/dist/components/sidebar/sidebar-item-label.d.ts +21 -0
  127. package/dist/components/sidebar/sidebar-item-label.js +28 -0
  128. package/dist/components/sidebar/sidebar-item-tooltip.d.ts +21 -0
  129. package/dist/components/sidebar/sidebar-item-tooltip.js +38 -0
  130. package/dist/components/sidebar/sidebar-item-trailing.d.ts +21 -0
  131. package/dist/components/sidebar/sidebar-item-trailing.js +28 -0
  132. package/dist/components/sidebar/sidebar-item.d.ts +23 -0
  133. package/dist/components/sidebar/sidebar-item.js +160 -0
  134. package/dist/components/sidebar/sidebar-panel.d.ts +21 -0
  135. package/dist/components/sidebar/sidebar-panel.js +88 -0
  136. package/dist/components/sidebar/sidebar-rail.d.ts +21 -0
  137. package/dist/components/sidebar/sidebar-rail.js +210 -0
  138. package/dist/components/sidebar/sidebar-root.d.ts +31 -0
  139. package/dist/components/sidebar/sidebar-root.js +138 -0
  140. package/dist/components/sidebar/sidebar-separator.d.ts +19 -0
  141. package/dist/components/sidebar/sidebar-separator.js +16 -0
  142. package/dist/components/sidebar/sidebar-sub-menu.d.ts +23 -0
  143. package/dist/components/sidebar/sidebar-sub-menu.js +40 -0
  144. package/dist/components/sidebar/sidebar-trigger.d.ts +21 -0
  145. package/dist/components/sidebar/sidebar-trigger.js +69 -0
  146. package/dist/components/sidebar/sidebar.context.d.ts +75 -0
  147. package/dist/components/sidebar/sidebar.context.js +30 -0
  148. package/dist/components/sidebar/sidebar.state.d.ts +73 -0
  149. package/dist/components/sidebar/sidebar.state.js +76 -0
  150. package/dist/components/sidebar/sidebar.storage.d.ts +8 -0
  151. package/dist/components/sidebar/sidebar.storage.js +45 -0
  152. package/dist/components/sidebar/sidebar.types.d.ts +259 -0
  153. package/dist/components/splitter/index.d.ts +143 -0
  154. package/dist/components/splitter/index.js +13 -0
  155. package/dist/components/splitter/splitter-handle.d.ts +21 -0
  156. package/dist/components/splitter/splitter-handle.js +209 -0
  157. package/dist/components/splitter/splitter-panel.d.ts +21 -0
  158. package/dist/components/splitter/splitter-panel.js +70 -0
  159. package/dist/components/splitter/splitter-root.d.ts +31 -0
  160. package/dist/components/splitter/splitter-root.js +152 -0
  161. package/dist/components/splitter/splitter.context.d.ts +15 -0
  162. package/dist/components/splitter/splitter.context.js +5 -0
  163. package/dist/components/splitter/splitter.state.d.ts +87 -0
  164. package/dist/components/splitter/splitter.state.js +322 -0
  165. package/dist/components/splitter/splitter.storage.d.ts +15 -0
  166. package/dist/components/splitter/splitter.storage.js +56 -0
  167. package/dist/components/splitter/splitter.types.d.ts +98 -0
  168. package/dist/components/switch/switch-content.js +1 -1
  169. package/dist/components/table/index.d.ts +10 -9
  170. package/dist/components/table/table-body.js +13 -13
  171. package/dist/components/table/table-cell.js +49 -46
  172. package/dist/components/table/table-column-resizer.js +1 -1
  173. package/dist/components/table/table-column.js +1 -1
  174. package/dist/components/table/table-content.js +37 -18
  175. package/dist/{composables → components/table}/table-drag-collection.d.ts +1 -1
  176. package/dist/{composables → components/table}/table-drag-collection.js +1 -1
  177. package/dist/components/table/table-drop-indicator.js +3 -1
  178. package/dist/components/table/table-resizable-container.d.ts +4 -5
  179. package/dist/components/table/table-row.js +45 -14
  180. package/dist/components/table/table-virtualizer-item.d.ts +2 -7
  181. package/dist/components/table/table-virtualizer-item.js +20 -9
  182. package/dist/components/table/table.context.d.ts +11 -3
  183. package/dist/components/table/table.types.d.ts +1 -1
  184. package/dist/{composables → components/table}/use-grid-keyboard.d.ts +3 -3
  185. package/dist/{composables → components/table}/use-grid-keyboard.js +57 -55
  186. package/dist/{composables → components/table}/use-grid-selection-announcement.d.ts +2 -2
  187. package/dist/{composables → components/table}/use-grid-selection-announcement.js +2 -2
  188. package/dist/{composables → components/table}/use-table-collection.d.ts +2 -2
  189. package/dist/{composables → components/table}/use-table-collection.js +4 -4
  190. package/dist/{composables → components/table}/use-table-column-layout.d.ts +13 -20
  191. package/dist/components/table/use-table-column-layout.js +115 -0
  192. package/dist/components/tabs/tabs-panel.js +5 -1
  193. package/dist/components/tabs/tabs-tab.js +1 -1
  194. package/dist/components/textarea/index.d.ts +12 -4
  195. package/dist/components/textarea/textarea-root.d.ts +5 -2
  196. package/dist/components/textarea/textarea-root.js +40 -5
  197. package/dist/components/textarea/textarea.types.d.ts +11 -0
  198. package/dist/components/textfield/index.d.ts +2 -0
  199. package/dist/components/textfield/textfield-root.js +5 -1
  200. package/dist/components/textfield/textfield.context.d.ts +2 -0
  201. package/dist/components/textfield/textfield.types.d.ts +5 -0
  202. package/dist/components/time-field/index.d.ts +1 -0
  203. package/dist/components/toast/index.d.ts +1 -0
  204. package/dist/components/toast/toast-default-content.js +1 -1
  205. package/dist/components/toggle-button-group/toggle-button-group-root.js +3 -3
  206. package/dist/components/toolbar/index.d.ts +3 -2
  207. package/dist/components/toolbar/toolbar-root.js +3 -3
  208. package/dist/components/tooltip/index.js +1 -1
  209. package/dist/components/tooltip/tooltip-root.js +1 -1
  210. package/dist/components/tooltip/tooltip-trigger.js +13 -5
  211. package/dist/components/virtualizer/index.d.ts +3 -1
  212. package/dist/components/virtualizer/index.js +2 -1
  213. package/dist/components/virtualizer/use-virtualizer-item.d.ts +23 -0
  214. package/dist/components/virtualizer/use-virtualizer-item.js +45 -0
  215. package/dist/components/virtualizer/virtualizer-item.js +7 -41
  216. package/dist/components/virtualizer/virtualizer-scrollbar-track.d.ts +20 -0
  217. package/dist/components/virtualizer/virtualizer-scrollbar-track.js +141 -0
  218. package/dist/components/virtualizer/virtualizer-scrollbar.d.ts +18 -0
  219. package/dist/components/virtualizer/virtualizer-scrollbar.js +55 -0
  220. package/dist/components/virtualizer/virtualizer.context.d.ts +17 -1
  221. package/dist/composables/drag-manager.js +1 -13
  222. package/dist/composables/index.d.ts +3 -71
  223. package/dist/composables/use-collection.d.ts +22 -3
  224. package/dist/composables/use-collection.js +67 -14
  225. package/dist/composables/use-color-area.js +2 -2
  226. package/dist/composables/use-color-field.js +1 -1
  227. package/dist/composables/use-combo-box.js +1 -1
  228. package/dist/composables/use-date-field.js +1 -1
  229. package/dist/composables/use-drag-and-drop.js +1 -1
  230. package/dist/composables/use-drag.d.ts +6 -5
  231. package/dist/composables/use-draggable-item.d.ts +2 -2
  232. package/dist/composables/use-droppable-collection.js +2 -2
  233. package/dist/composables/use-droppable-item.js +1 -1
  234. package/dist/composables/use-form-reset.d.ts +6 -2
  235. package/dist/composables/use-form-reset.js +9 -5
  236. package/dist/composables/use-list-keyboard.js +64 -62
  237. package/dist/composables/use-menu.d.ts +10 -0
  238. package/dist/composables/use-menu.js +22 -0
  239. package/dist/composables/use-number-field.js +1 -1
  240. package/dist/composables/use-select.js +2 -3
  241. package/dist/composables/use-selection-manager.js +4 -4
  242. package/dist/composables/use-single-select-list-state.d.ts +37 -0
  243. package/dist/composables/use-single-select-list-state.js +110 -0
  244. package/dist/composables/use-slider-thumb.js +2 -2
  245. package/dist/composables/use-slider.js +1 -1
  246. package/dist/composables/use-tab-list-state.d.ts +20 -29
  247. package/dist/composables/use-tab-list-state.js +20 -99
  248. package/dist/composables/use-text-field.js +1 -1
  249. package/dist/composables/use-virtualizer-scroll.d.ts +52 -2
  250. package/dist/composables/use-virtualizer-scroll.js +79 -13
  251. package/dist/composables/use-virtualizer.d.ts +24 -4
  252. package/dist/composables/use-virtualizer.js +40 -6
  253. package/dist/index.js +58 -80
  254. package/dist/utils/document-order.d.ts +14 -0
  255. package/dist/utils/document-order.js +17 -0
  256. package/dist/utils/flex-sizing.d.ts +41 -0
  257. package/dist/utils/flex-sizing.js +140 -0
  258. package/dist/utils/index.d.ts +2 -0
  259. package/dist/utils/open-link.d.ts +31 -0
  260. package/dist/utils/open-link.js +32 -0
  261. package/dist/utils/story-truncation.d.ts +20 -0
  262. package/dist/utils/story-users.d.ts +11 -0
  263. package/dist/utils/virtualizer-collection.d.ts +14 -4
  264. package/dist/utils/virtualizer-collection.js +9 -14
  265. package/dist/utils/virtualizer-layout-info.js +3 -2
  266. package/dist/utils/virtualizer-list-layout.d.ts +75 -29
  267. package/dist/utils/virtualizer-list-layout.js +182 -99
  268. package/dist/utils/virtualizer-offsets.d.ts +111 -0
  269. package/dist/utils/virtualizer-offsets.js +159 -0
  270. package/dist/utils/virtualizer-overscan.d.ts +9 -15
  271. package/dist/utils/virtualizer-overscan.js +14 -33
  272. package/dist/utils/virtualizer-table-layout.d.ts +50 -21
  273. package/dist/utils/virtualizer-table-layout.js +130 -89
  274. package/dist/version.js +1 -1
  275. package/package.json +19 -3
  276. package/dist/composables/use-table-column-layout.js +0 -214
  277. /package/dist/{composables → components/dropdown}/use-safely-mouse-to-submenu.d.ts +0 -0
@@ -61,6 +61,7 @@ var toggle_button_group_root_vue_vue_type_script_setup_true_vapor_true_lang_defa
61
61
  * `role="radio"` + `aria-checked` instead of `aria-pressed`.
62
62
  */
63
63
  const role = computed(() => state.selectionMode.value === "single" ? "radiogroup" : toolbar.role.value);
64
+ const ariaOrientation = computed(() => role.value === "group" ? void 0 : resolvedOrientation.value);
64
65
  provideToggleButtonGroupContext({
65
66
  size: computed(() => props.size),
66
67
  slots,
@@ -69,12 +70,11 @@ var toggle_button_group_root_vue_vue_type_script_setup_true_vapor_true_lang_defa
69
70
  const n1 = t0();
70
71
  renderEffect(() => {
71
72
  const _resolvedIsDisabled = resolvedIsDisabled.value;
72
- const _resolvedOrientation = resolvedOrientation.value;
73
73
  setAttr(n1, "aria-disabled", _resolvedIsDisabled || void 0);
74
- setAttr(n1, "aria-orientation", _resolvedOrientation);
74
+ setAttr(n1, "aria-orientation", ariaOrientation.value);
75
75
  setClass(n1, slots.value.base({ class: props.class }));
76
76
  setAttr(n1, "data-disabled", unref(dataAttr)(_resolvedIsDisabled));
77
- setAttr(n1, "data-orientation", _resolvedOrientation);
77
+ setAttr(n1, "data-orientation", resolvedOrientation.value);
78
78
  setProp(n1, "role", role.value);
79
79
  });
80
80
  setInsertionState(n1);
@@ -9,7 +9,7 @@ export declare const Toolbar: ((__VLS_props: NonNullable<Awaited<typeof __VLS_se
9
9
  props: import('vue').PublicProps & {
10
10
  class?: string;
11
11
  isAttached?: boolean;
12
- orientation?: import("../../index.js").ToolbarOrientation;
12
+ orientation?: import("./index.js").ToolbarOrientation;
13
13
  } & (typeof globalThis extends {
14
14
  __VLS_PROPS_FALLBACK: infer P;
15
15
  } ? P : {});
@@ -32,7 +32,7 @@ export declare const Toolbar: ((__VLS_props: NonNullable<Awaited<typeof __VLS_se
32
32
  props: import('vue').PublicProps & {
33
33
  class?: string;
34
34
  isAttached?: boolean;
35
- orientation?: import("../../index.js").ToolbarOrientation;
35
+ orientation?: import("./index.js").ToolbarOrientation;
36
36
  } & (typeof globalThis extends {
37
37
  __VLS_PROPS_FALLBACK: infer P;
38
38
  } ? P : {});
@@ -50,5 +50,6 @@ export { ToolbarRoot };
50
50
  export type { ToolbarRootProps, ToolbarRootProps as ToolbarProps } from "./toolbar.types.js";
51
51
  export { useToolbarContext } from "./toolbar.context.js";
52
52
  export type { ToolbarContext } from "./toolbar.context.js";
53
+ export type { ToolbarOrientation } from "../../composables/use-toolbar.js";
53
54
  export { toolbarVariants } from "@ropav/styles";
54
55
  export type { ToolbarVariants } from "@ropav/styles";
@@ -27,12 +27,12 @@ var toolbar_root_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__P
27
27
  });
28
28
  provideToolbarContext({ orientation });
29
29
  provideSeparatorContext({ orientation: computed(() => props.orientation === "horizontal" ? "vertical" : "horizontal") });
30
+ const ariaOrientation = computed(() => toolbar.role.value === "group" ? void 0 : props.orientation);
30
31
  const n1 = t0();
31
32
  renderEffect(() => {
32
- const _props_orientation = props.orientation;
33
- setAttr(n1, "aria-orientation", _props_orientation);
33
+ setAttr(n1, "aria-orientation", ariaOrientation.value);
34
34
  setClass(n1, styles.value);
35
- setAttr(n1, "data-orientation", _props_orientation);
35
+ setAttr(n1, "data-orientation", props.orientation);
36
36
  setProp(n1, "role", unref(toolbar).role.value);
37
37
  });
38
38
  setInsertionState(n1);
@@ -1,8 +1,8 @@
1
- import tooltip_arrow_default from "./tooltip-arrow.js";
2
1
  import { useTooltipContext } from "./tooltip.context.js";
3
2
  import tooltip_content_default from "./tooltip-content.js";
4
3
  import tooltip_root_default from "./tooltip-root.js";
5
4
  import tooltip_trigger_default from "./tooltip-trigger.js";
5
+ import tooltip_arrow_default from "./tooltip-arrow.js";
6
6
  import { tooltipVariants } from "@ropav/styles";
7
7
  //#region src/components/tooltip/index.ts
8
8
  var Tooltip = Object.assign(tooltip_root_default, {
@@ -1,6 +1,6 @@
1
1
  import { provideFocusResponder } from "../../composables/focus-responder.js";
2
- import { useCssVariable } from "../../composables/use-css-variable.js";
3
2
  import { provideTooltipContext } from "./tooltip.context.js";
3
+ import { useCssVariable } from "../../composables/use-css-variable.js";
4
4
  import { useTooltipTrigger } from "../../composables/use-tooltip-trigger.js";
5
5
  import { useTooltipTriggerState } from "../../composables/use-tooltip-trigger-state.js";
6
6
  import { parseCssTime } from "../../utils/css.js";
@@ -1,8 +1,9 @@
1
1
  import { dataAttr } from "../../utils/assertion.js";
2
2
  import { useInteractionStates } from "../../composables/use-interaction-states.js";
3
3
  import { composeFocusResponder, useFocusResponder } from "../../composables/focus-responder.js";
4
+ import { FOCUSABLE_SELECTOR } from "../../utils/focus.js";
4
5
  import { useTooltipContext } from "./tooltip.context.js";
5
- import { computed, createSlot, defineVaporComponent, on, renderEffect, setDynamicProps, setInsertionState, setTemplateRefBinding, template, unref } from "vue";
6
+ import { computed, createSlot, defineVaporComponent, on, renderEffect, setDynamicProps, setInsertionState, setTemplateRefBinding, shallowRef, template, unref, watch } from "vue";
6
7
  //#region src/components/tooltip/tooltip-trigger.vue?vue&type=script&setup=true&vapor=true&lang.ts
7
8
  var t0 = template("<div>", 1);
8
9
  var tooltip_trigger_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
@@ -13,9 +14,15 @@ var tooltip_trigger_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@
13
14
  const { slots } = useTooltipContext();
14
15
  const responder = useFocusResponder();
15
16
  const styles = computed(() => slots.value.trigger({ class: props.class }));
17
+ const host = shallowRef(null);
18
+ const hasFocusableContent = shallowRef(false);
16
19
  const setElement = (element) => {
17
- responder?.registerElement(element ?? null);
20
+ host.value = element ?? null;
21
+ responder?.registerElement(host.value);
18
22
  };
23
+ watch(host, (element) => {
24
+ hasFocusableContent.value = Boolean(element?.querySelector(FOCUSABLE_SELECTOR));
25
+ }, { flush: "post" });
19
26
  const states = useInteractionStates();
20
27
  const focus = composeFocusResponder(responder, {
21
28
  onBlur: states.onBlur,
@@ -23,6 +30,7 @@ var tooltip_trigger_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@
23
30
  onPointerenter: states.onPointerenter,
24
31
  onPointerleave: () => states.onPointerleave()
25
32
  });
33
+ const wrapperAttrs = computed(() => hasFocusableContent.value ? void 0 : responder?.attrs.value);
26
34
  const n1 = t0();
27
35
  renderEffect(() => {
28
36
  const _dataAttr = unref(dataAttr);
@@ -32,9 +40,9 @@ var tooltip_trigger_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@
32
40
  "data-focus-visible": _dataAttr(_states.isFocusVisible.value),
33
41
  "data-hovered": _dataAttr(_states.isHovered.value),
34
42
  "data-slot": "tooltip-trigger",
35
- role: "button",
36
- tabindex: "0"
37
- }, unref(responder)?.attrs.value]);
43
+ role: hasFocusableContent.value ? void 0 : "button",
44
+ tabindex: hasFocusableContent.value ? void 0 : 0
45
+ }, wrapperAttrs.value]);
38
46
  });
39
47
  setInsertionState(n1);
40
48
  createSlot();
@@ -1,5 +1,7 @@
1
+ export type { ScrollBoxInfo, ScrollToOffset } from "../../composables/use-virtualizer-scroll.js";
1
2
  export { provideVirtualizerStateContext, useVirtualizerConfigContext, useVirtualizerStateContext, } from "./virtualizer.context.js";
2
- export type { VirtualizerConfigContext, VirtualizerStateContext } from "./virtualizer.context.js";
3
+ export type { VirtualizerConfigContext, VirtualizerScrollState, VirtualizerStateContext, } from "./virtualizer.context.js";
3
4
  export { default as VirtualizerItem } from "./virtualizer-item.js";
4
5
  export { default as VirtualizerRoot } from "./virtualizer-root.js";
6
+ export { default as VirtualizerScrollbar } from "./virtualizer-scrollbar.js";
5
7
  export type { VirtualizerItemProps, VirtualizerLayoutProp, VirtualizerRootProps, } from "./virtualizer.types.js";
@@ -1,4 +1,5 @@
1
1
  import { provideVirtualizerStateContext, useVirtualizerConfigContext, useVirtualizerStateContext } from "./virtualizer.context.js";
2
2
  import virtualizer_item_default from "./virtualizer-item.js";
3
3
  import virtualizer_root_default from "./virtualizer-root.js";
4
- export { virtualizer_item_default as VirtualizerItem, virtualizer_root_default as VirtualizerRoot, provideVirtualizerStateContext, useVirtualizerConfigContext, useVirtualizerStateContext };
4
+ import virtualizer_scrollbar_default from "./virtualizer-scrollbar.js";
5
+ export { virtualizer_item_default as VirtualizerItem, virtualizer_root_default as VirtualizerRoot, virtualizer_scrollbar_default as VirtualizerScrollbar, provideVirtualizerStateContext, useVirtualizerConfigContext, useVirtualizerStateContext };
@@ -0,0 +1,23 @@
1
+ import type { LayoutInfo } from "../../utils/virtualizer-layout-info.js";
2
+ import type { ComputedRef, ShallowRef } from "vue";
3
+ import { layoutInfoToStyle } from "../../utils/virtualizer-layout-info.js";
4
+ export interface UseVirtualizerItemOptions {
5
+ /** The wrapper element, once it is in the DOM. */
6
+ element: ShallowRef<HTMLElement | null>;
7
+ layoutInfo: () => LayoutInfo | null | undefined;
8
+ parentLayoutInfo?: () => LayoutInfo | null | undefined;
9
+ }
10
+ export interface UseVirtualizerItemReturn {
11
+ /** Where the wrapper sits and how big it is, as the layout worked it out. */
12
+ style: ComputedRef<ReturnType<typeof layoutInfoToStyle> | undefined>;
13
+ }
14
+ /**
15
+ * What a wrapper around one windowed element does: carry the geometry the layout gave it, and
16
+ * measure what the layout could only estimate.
17
+ *
18
+ * A wrapper still carrying an estimate has no height of its own, so what it reports is what its
19
+ * content came to. React Aria writes the estimate on, clears it to read `scrollHeight`, and writes
20
+ * it back — a forced reflow per element, and one that fights the size containment the wrapper
21
+ * also carries.
22
+ */
23
+ export declare const useVirtualizerItem: (options: UseVirtualizerItemOptions) => UseVirtualizerItemReturn;
@@ -0,0 +1,45 @@
1
+ import { useVirtualizerStateContext } from "./virtualizer.context.js";
2
+ import { Size } from "../../utils/virtualizer-geometry.js";
3
+ import { layoutInfoToStyle } from "../../utils/virtualizer-layout-info.js";
4
+ import { computed, watch } from "vue";
5
+ //#region src/components/virtualizer/use-virtualizer-item.ts
6
+ /**
7
+ * What a wrapper around one windowed element does: carry the geometry the layout gave it, and
8
+ * measure what the layout could only estimate.
9
+ *
10
+ * A wrapper still carrying an estimate has no height of its own, so what it reports is what its
11
+ * content came to. React Aria writes the estimate on, clears it to read `scrollHeight`, and writes
12
+ * it back — a forced reflow per element, and one that fights the size containment the wrapper
13
+ * also carries.
14
+ */
15
+ var useVirtualizerItem = (options) => {
16
+ const virtualizer = useVirtualizerStateContext();
17
+ const measure = () => {
18
+ const current = options.element.value;
19
+ const layoutInfo = options.layoutInfo();
20
+ if (!current || !layoutInfo) return;
21
+ const bounds = current.getBoundingClientRect();
22
+ virtualizer?.updateItemSize(layoutInfo.key, new Size(bounds.width, bounds.height));
23
+ };
24
+ watch(() => [options.element.value, options.layoutInfo()], ([current, layoutInfo]) => {
25
+ if (current && layoutInfo?.estimatedSize) measure();
26
+ }, {
27
+ flush: "post",
28
+ immediate: true
29
+ });
30
+ watch(() => [options.element.value, virtualizer?.shouldObserveItemSize.value], ([current, shouldObserve], _previous, onCleanup) => {
31
+ if (!current || !shouldObserve || typeof ResizeObserver === "undefined") return;
32
+ const observer = new ResizeObserver(() => measure());
33
+ for (const child of current.children) observer.observe(child);
34
+ onCleanup(() => observer.disconnect());
35
+ }, {
36
+ flush: "post",
37
+ immediate: true
38
+ });
39
+ return { style: computed(() => {
40
+ const layoutInfo = options.layoutInfo();
41
+ return layoutInfo ? layoutInfoToStyle(layoutInfo, options.parentLayoutInfo?.()) : void 0;
42
+ }) };
43
+ };
44
+ //#endregion
45
+ export { useVirtualizerItem };
@@ -1,7 +1,5 @@
1
- import { useVirtualizerStateContext } from "./virtualizer.context.js";
2
- import { Size } from "../../utils/virtualizer-geometry.js";
3
- import { layoutInfoToStyle } from "../../utils/virtualizer-layout-info.js";
4
- import { computed, createSlot, defineVaporComponent, renderEffect, setInsertionState, setStaticTemplateRef, setStyle, shallowRef, template, watch } from "vue";
1
+ import { useVirtualizerItem } from "./use-virtualizer-item.js";
2
+ import { createSlot, defineVaporComponent, renderEffect, setInsertionState, setStaticTemplateRef, setStyle, shallowRef, template, unref } from "vue";
5
3
  //#region src/components/virtualizer/virtualizer-item.vue?vue&type=script&setup=true&vapor=true&lang.ts
6
4
  var t0 = template("<div role=presentation>", 1);
7
5
  var virtualizer_item_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
@@ -12,46 +10,14 @@ var virtualizer_item_vue_vue_type_script_setup_true_vapor_true_lang_default = /*
12
10
  },
13
11
  setup(__props) {
14
12
  const props = __props;
15
- const virtualizer = useVirtualizerStateContext();
16
13
  const element = shallowRef(null);
17
- const style = computed(() => props.layoutInfo ? layoutInfoToStyle(props.layoutInfo, props.parentLayoutInfo) : void 0);
18
- /**
19
- * Measure what the layout could only estimate.
20
- *
21
- * The inline height is cleared first: it is the estimate, and measuring through it would just
22
- * read the guess back. `scrollHeight` rather than `getBoundingClientRect` because that is what
23
- * React Aria reads, and a row whose content overflows should report the content.
24
- */
25
- const measure = () => {
26
- const current = element.value;
27
- if (!current) return;
28
- const height = current.style.height;
29
- current.style.height = "";
30
- const measured = new Size(current.scrollWidth, current.scrollHeight);
31
- current.style.height = height;
32
- if (props.layoutInfo) virtualizer?.updateItemSize(props.layoutInfo.key, measured);
33
- };
34
- watch(() => [element.value, props.layoutInfo], ([current, layoutInfo]) => {
35
- if (current && layoutInfo?.estimatedSize) measure();
36
- }, {
37
- flush: "post",
38
- immediate: true
39
- });
40
- /**
41
- * Watching the children rather than the wrapper: the wrapper's height is set by the layout, so it
42
- * never changes on its own, while what is inside it does.
43
- */
44
- watch(() => [element.value, virtualizer?.shouldObserveItemSize.value], ([current, shouldObserve], _previous, onCleanup) => {
45
- if (!current || !shouldObserve || typeof ResizeObserver === "undefined") return;
46
- const observer = new ResizeObserver(() => measure());
47
- for (const child of current.children) observer.observe(child);
48
- onCleanup(() => observer.disconnect());
49
- }, {
50
- flush: "post",
51
- immediate: true
14
+ const { style } = useVirtualizerItem({
15
+ element,
16
+ layoutInfo: () => props.layoutInfo,
17
+ parentLayoutInfo: () => props.parentLayoutInfo
52
18
  });
53
19
  const n1 = t0();
54
- renderEffect(() => setStyle(n1, style.value));
20
+ renderEffect(() => setStyle(n1, unref(style)));
55
21
  setInsertionState(n1);
56
22
  createSlot();
57
23
  setStaticTemplateRef(n1, element, null, "element");
@@ -0,0 +1,20 @@
1
+ declare const __VLS_export: (__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>['props'], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, 'attrs' | 'emit' | 'slots'>>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>['expose'], __VLS_setup?: Promise<{
2
+ props: import('vue').PublicProps & __VLS_PrettifyLocal<{
3
+ orientation: "horizontal" | "vertical";
4
+ }> & (typeof globalThis extends {
5
+ __VLS_PROPS_FALLBACK: infer P;
6
+ } ? P : {});
7
+ expose: (exposed: {}) => void;
8
+ attrs: any;
9
+ slots: {};
10
+ emit: {};
11
+ }>) => import('vue').VNode & {
12
+ __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
13
+ };
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
16
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
17
+ [K in keyof T]: T[K];
18
+ } : {
19
+ [K in keyof T as K]: T[K];
20
+ }) & {};
@@ -0,0 +1,141 @@
1
+ import { dataAttr } from "../../utils/assertion.js";
2
+ import { useInteractionStates } from "../../composables/use-interaction-states.js";
3
+ import { useVirtualizerStateContext } from "./virtualizer.context.js";
4
+ import { useMove } from "../../composables/use-move.js";
5
+ import { child, computed, createIf, defineVaporComponent, on, renderEffect, setAttr, setClass, setStyle, template, unref } from "vue";
6
+ import { virtualizerVariants } from "@ropav/styles";
7
+ //#region src/components/virtualizer/virtualizer-scrollbar-track.vue?vue&type=script&setup=true&vapor=true&lang.ts
8
+ var t0 = template("<div data-slot=virtualizer-scrollbar-track><div data-slot=virtualizer-scrollbar-thumb>", 1);
9
+ /**
10
+ * One axis of the scrollbar a windowed collection draws for itself: a track, and the thumb in it.
11
+ *
12
+ * The thumb is moved by the main thread. Every pointer move sets the scroll offset and the rows for
13
+ * it in one task, so no frame is ever drawn with rows that were built for another offset — which is
14
+ * what a native thumb, moved by the compositor, cannot promise. See `VirtualizerScrollbar`.
15
+ */
16
+ var THICKNESS = 10;
17
+ /** The shortest the thumb gets: a long collection would otherwise leave nothing to grab. */
18
+ var MIN_THUMB_LENGTH = 32;
19
+ /**
20
+ * How much of the viewport a press on the track moves by. Less than the whole of it, so what was
21
+ * at the edge is still on screen afterwards to hold the eye — the fraction browsers page by.
22
+ */
23
+ var PAGE_FRACTION = .875;
24
+ var virtualizer_scrollbar_track_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
25
+ __name: "virtualizer-scrollbar-track",
26
+ props: { orientation: {} },
27
+ setup(__props) {
28
+ const props = __props;
29
+ /** How thick the track is, across its axis. */
30
+ const state = useVirtualizerStateContext();
31
+ if (!state) throw new Error("`VirtualizerScrollbarTrack` was rendered outside of a windowed collection.");
32
+ const { scroll } = state;
33
+ const styles = virtualizerVariants();
34
+ const isVertical = props.orientation === "vertical";
35
+ /** A size measured along this track's axis. */
36
+ const along = (size) => isVertical ? size.height : size.width;
37
+ /** A size measured across it, which is the other track's axis. */
38
+ const across = (size) => isVertical ? size.width : size.height;
39
+ const viewport = computed(() => along(scroll.size.value));
40
+ /** How far the box can scroll along this axis. */
41
+ const range = computed(() => Math.max(0, along(scroll.scrollSize.value) - viewport.value));
42
+ /** Whether the box scrolls along this axis at all, rather than clipping it. */
43
+ const scrolls = computed(() => isVertical ? scroll.box.value.scrollsY : scroll.box.value.scrollsX);
44
+ /** Whether the other axis has a track too, which is when the two leave each other a corner. */
45
+ const hasCorner = computed(() => (isVertical ? scroll.box.value.scrollsX : scroll.box.value.scrollsY) && across(scroll.scrollSize.value) > across(scroll.size.value));
46
+ const trackLength = computed(() => Math.max(0, viewport.value - (hasCorner.value ? THICKNESS : 0)));
47
+ /** The thumb is to the track what the viewport is to the content, down to a graspable floor. */
48
+ const thumbLength = computed(() => {
49
+ const total = along(scroll.scrollSize.value);
50
+ if (total <= 0) return trackLength.value;
51
+ return Math.min(trackLength.value, Math.max(MIN_THUMB_LENGTH, trackLength.value * viewport.value / total));
52
+ });
53
+ /** How far the thumb can travel. */
54
+ const travel = computed(() => Math.max(0, trackLength.value - thumbLength.value));
55
+ /** The scroll offset along this axis, signed. */
56
+ const offset = computed(() => isVertical ? scroll.offset.value.y : scroll.offset.value.x);
57
+ /** Where the thumb sits, measured from the start of the track. */
58
+ const thumbOffset = computed(() => range.value > 0 ? Math.min(Math.abs(offset.value), range.value) / range.value * travel.value : 0);
59
+ const isVisible = computed(() => scrolls.value && range.value > 0);
60
+ const scrollTo = (value) => {
61
+ scroll.scrollTo(isVertical ? { top: value } : { left: value });
62
+ };
63
+ const states = useInteractionStates();
64
+ /** The offset the press started from, and how far the pointer has travelled along the track since. */
65
+ let startOffset = 0;
66
+ let dragged = 0;
67
+ /** Content pixels per thumb pixel, fixed at the press so the mapping cannot drift mid-drag. */
68
+ let ratio = 0;
69
+ const { handlers: moveHandlers } = useMove({
70
+ onMove: ({ deltaX, deltaY }) => {
71
+ dragged += isVertical ? deltaY : deltaX;
72
+ scrollTo(startOffset + dragged * ratio);
73
+ },
74
+ onMoveEnd: () => {
75
+ dragged = 0;
76
+ }
77
+ });
78
+ const onThumbPointerdown = (event) => {
79
+ if (event.button !== 0) return;
80
+ startOffset = offset.value;
81
+ dragged = 0;
82
+ ratio = travel.value > 0 ? range.value / travel.value : 0;
83
+ states.onPointerdown(event);
84
+ moveHandlers.onPointerdown(event);
85
+ };
86
+ /** A press beside the thumb pages towards it. The thumb itself stops its press from reaching here. */
87
+ const onTrackPointerdown = (event) => {
88
+ if (event.button !== 0) return;
89
+ event.preventDefault();
90
+ const track = event.currentTarget;
91
+ const bounds = track.getBoundingClientRect();
92
+ const isReversed = !isVertical && getComputedStyle(track).direction === "rtl";
93
+ let pressed;
94
+ if (isVertical) pressed = event.clientY - bounds.top;
95
+ else if (isReversed) pressed = bounds.right - event.clientX;
96
+ else pressed = event.clientX - bounds.left;
97
+ const page = Math.round(viewport.value * PAGE_FRACTION) * (pressed > thumbOffset.value ? 1 : -1);
98
+ scrollTo(offset.value + (isReversed ? -page : page));
99
+ };
100
+ const trackStyle = computed(() => isVertical ? {
101
+ height: `${trackLength.value}px`,
102
+ width: `${THICKNESS}px`
103
+ } : {
104
+ height: `${THICKNESS}px`,
105
+ top: `${across(scroll.size.value) - THICKNESS}px`,
106
+ width: `${trackLength.value}px`
107
+ });
108
+ const thumbStyle = computed(() => isVertical ? {
109
+ height: `${thumbLength.value}px`,
110
+ top: `${thumbOffset.value}px`
111
+ } : {
112
+ "inset-inline-start": `${thumbOffset.value}px`,
113
+ width: `${thumbLength.value}px`
114
+ });
115
+ return createIf(() => isVisible.value, () => {
116
+ const n3 = t0();
117
+ const n2 = child(n3);
118
+ on(n2, "pointerdown", onThumbPointerdown);
119
+ on(n2, "pointerenter", (e) => unref(states).onPointerenter(e));
120
+ on(n2, "pointerleave", (e) => unref(states).onPointerleave(e));
121
+ on(n3, "pointerdown", onTrackPointerdown);
122
+ renderEffect(() => {
123
+ const _styles = unref(styles);
124
+ const _orientation = __props.orientation;
125
+ const _dataAttr = unref(dataAttr);
126
+ const _states = unref(states);
127
+ setClass(n3, _styles.scrollbarTrack());
128
+ setAttr(n3, "data-orientation", _orientation);
129
+ setStyle(n3, trackStyle.value);
130
+ setClass(n2, _styles.scrollbarThumb());
131
+ setAttr(n2, "data-hovered", _dataAttr(_states.isHovered.value));
132
+ setAttr(n2, "data-orientation", _orientation);
133
+ setAttr(n2, "data-pressed", _dataAttr(_states.isPressed.value));
134
+ setStyle(n2, thumbStyle.value);
135
+ });
136
+ return n3;
137
+ });
138
+ }
139
+ });
140
+ //#endregion
141
+ export { virtualizer_scrollbar_track_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
@@ -0,0 +1,18 @@
1
+ declare const __VLS_export: (__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>['props'], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, 'attrs' | 'emit' | 'slots'>>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>['expose'], __VLS_setup?: Promise<{
2
+ props: import('vue').PublicProps & (typeof globalThis extends {
3
+ __VLS_PROPS_FALLBACK: infer P;
4
+ } ? P : {});
5
+ expose: (exposed: {}) => void;
6
+ attrs: any;
7
+ slots: {};
8
+ emit: {};
9
+ }>) => import('vue').VNode & {
10
+ __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
11
+ };
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
14
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
15
+ [K in keyof T]: T[K];
16
+ } : {
17
+ [K in keyof T as K]: T[K];
18
+ }) & {};
@@ -0,0 +1,55 @@
1
+ import { useVirtualizerStateContext } from "./virtualizer.context.js";
2
+ import virtualizer_scrollbar_track_default from "./virtualizer-scrollbar-track.js";
3
+ import { computed, createComponent, defineVaporComponent, renderEffect, setClass, setInsertionState, setStyle, template, unref } from "vue";
4
+ import { virtualizerVariants } from "@ropav/styles";
5
+ //#region src/components/virtualizer/virtualizer-scrollbar.vue?vue&type=script&setup=true&vapor=true&lang.ts
6
+ var t0 = template("<div aria-hidden=true data-slot=virtualizer-scrollbar>", 1);
7
+ /**
8
+ * The scrollbar a windowed collection draws for itself, in place of the native one it hides.
9
+ *
10
+ * A native thumb is moved by the compositor, which draws every frame at the new offset with
11
+ * whatever rows the main thread last committed — and across a long collection those rows are
12
+ * always somewhere else, so the window is empty for as long as the main thread takes to catch up.
13
+ * This thumb is moved by the main thread: a pointer move sets the offset and the rows for it in
14
+ * one task, so no frame is ever drawn with rows that were built for another offset. Wheel,
15
+ * trackpad and keyboard scrolling stay native, and the thumb follows them.
16
+ *
17
+ * A pointer affordance and nothing more, like the native one: the box stays the focusable
18
+ * scroller and the keyboard reaches every offset through it. Hidden from assistive technology for
19
+ * the same reason a native scrollbar is not exposed.
20
+ *
21
+ * Rendered by the collection as the first child of its content wrapper — inside the wrapper rather
22
+ * than beside it, because a stuck box cannot leave its containing block, and only the wrapper is
23
+ * tall enough to stay stuck to for the whole of the scroll. A stuck box is held inside the scroll
24
+ * container's content box, so on a padded container it sits at the content's corner, not the
25
+ * container's; the difference is the padding, and it is given back with a translation, which
26
+ * sticky positioning leaves alone. A track along the edge then runs the full length of the box.
27
+ */
28
+ var virtualizer_scrollbar_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
29
+ __name: "virtualizer-scrollbar",
30
+ setup(__props) {
31
+ const state = useVirtualizerStateContext();
32
+ if (!state) throw new Error("`VirtualizerScrollbar` was rendered outside of a windowed collection.");
33
+ const { scroll } = state;
34
+ const styles = virtualizerVariants();
35
+ const style = computed(() => {
36
+ const { direction, paddingInlineStart, paddingTop } = scroll.box.value;
37
+ return {
38
+ translate: `${direction === "rtl" ? paddingInlineStart : -paddingInlineStart}px ${-paddingTop}px`,
39
+ width: `${scroll.size.value.width}px`
40
+ };
41
+ });
42
+ const n2 = t0();
43
+ renderEffect(() => {
44
+ setClass(n2, unref(styles).scrollbar());
45
+ setStyle(n2, style.value);
46
+ });
47
+ setInsertionState(n2);
48
+ createComponent(virtualizer_scrollbar_track_default, { orientation: "vertical" });
49
+ setInsertionState(n2, 1);
50
+ createComponent(virtualizer_scrollbar_track_default, { orientation: "horizontal" });
51
+ return n2;
52
+ }
53
+ });
54
+ //#endregion
55
+ export { virtualizer_scrollbar_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
@@ -1,5 +1,6 @@
1
+ import type { ScrollBoxInfo, ScrollToOffset } from "../../composables/use-virtualizer-scroll.js";
1
2
  import type { ItemDropTarget } from "../../utils/dnd-types.js";
2
- import type { Size } from "../../utils/virtualizer-geometry.js";
3
+ import type { Point, Size } from "../../utils/virtualizer-geometry.js";
3
4
  import type { Layout } from "../../utils/virtualizer-layout.js";
4
5
  import type { LayoutInfo, VirtualizerKey } from "../../utils/virtualizer-layout-info.js";
5
6
  import type { ComputedRef, ShallowRef } from "vue";
@@ -19,8 +20,23 @@ export interface VirtualizerConfigContext {
19
20
  * for one would make `Virtualizer` mandatory for every listbox in the library.
20
21
  */
21
22
  export declare const useVirtualizerConfigContext: () => VirtualizerConfigContext | null, provideVirtualizerConfigContext: (value: VirtualizerConfigContext | null) => VirtualizerConfigContext | null;
23
+ /** The scroll box as the scrollbar a windowed collection draws for itself reads it. */
24
+ export interface VirtualizerScrollState {
25
+ /** How far the box is scrolled. The inline axis runs negative in a right-to-left box. */
26
+ offset: ComputedRef<Point>;
27
+ /** The box's own size, which is what it shows of the content at once. */
28
+ size: ComputedRef<Size>;
29
+ /** The box's scrollable overflow — everything it could show. */
30
+ scrollSize: ComputedRef<Size>;
31
+ /** The box's padding, and which of its axes scroll at all. */
32
+ box: ComputedRef<ScrollBoxInfo>;
33
+ /** Scrolls the box from the main thread, so the rows and the offset are committed together. */
34
+ scrollTo: (offset: ScrollToOffset) => void;
35
+ }
22
36
  /** What a virtualized collection hands its own parts, so they can describe themselves. */
23
37
  export interface VirtualizerStateContext {
38
+ /** The scroll box, for the scrollbar the collection draws in place of the native one. */
39
+ scroll: VirtualizerScrollState;
24
40
  /** How many items the collection holds, which is not how many are rendered. */
25
41
  itemCount: ComputedRef<number>;
26
42
  /** An item's position among all of them, zero-based. */
@@ -109,11 +109,6 @@ var endDragging = () => {
109
109
  };
110
110
  /** Whether a keyboard or screen reader drag is in flight. */
111
111
  var isVirtualDragging = () => dragSession != null;
112
- /** Whether an element is inside a registered drop target. */
113
- var isValidDropTarget = (element) => {
114
- for (const target of dropTargets.keys()) if (contains(target, element)) return true;
115
- return false;
116
- };
117
112
  /**
118
113
  * The session in flight, as a ref that updates when one starts or ends.
119
114
  *
@@ -432,12 +427,5 @@ var DragSession = class {
432
427
  }, dropItem?.target ?? null);
433
428
  }
434
429
  };
435
- /**
436
- * The session in flight, read once.
437
- *
438
- * The imperative sibling of `useDragSession`, for callers that are not inside an effect scope —
439
- * an event handler deciding whether a keystroke belongs to a drag, or a test ending one.
440
- */
441
- var getDragSession = () => dragSession;
442
430
  //#endregion
443
- export { DragSession, beginDragging, getDragSession, isValidDropTarget, isVirtualDragging, registerDropItem, registerDropTarget, useDragSession };
431
+ export { DragSession, beginDragging, isVirtualDragging, registerDropItem, registerDropTarget, useDragSession };