ropav 0.1.1 → 0.1.3

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 (56) hide show
  1. package/README.md +79 -0
  2. package/dist/accordion.css +5 -16
  3. package/dist/accordion.js +11 -28
  4. package/dist/button-link.js +2 -2
  5. package/dist/button.js +2 -2
  6. package/dist/collapse.js +1 -4
  7. package/dist/components/accordion/index.d.ts +1 -1
  8. package/dist/components/accordion/types.d.ts +0 -4
  9. package/dist/components/dialog/dialog-core.d.ts +4 -2
  10. package/dist/components/scroll-area/index.d.ts +3 -0
  11. package/dist/components/scroll-area/index.js +3 -0
  12. package/dist/components/scroll-area/scroll-area.d.ts +42 -0
  13. package/dist/components/scroll-area/scrollAreaCore.d.ts +25 -0
  14. package/dist/components/scroll-area/types.d.ts +33 -0
  15. package/dist/components/scroll-area/useScrollArea.d.ts +54 -0
  16. package/dist/components/scroll-area/useScrollAreaControls.d.ts +21 -0
  17. package/dist/components/scroll-area/useScrollAreaMetrics.d.ts +35 -0
  18. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +17 -0
  19. package/dist/components/scroll-area/useScrollAreaPresentation.d.ts +49 -0
  20. package/dist/components/scroll-area/useScrollAreaVisibility.d.ts +27 -0
  21. package/dist/components/select/useSelect.d.ts +7 -5
  22. package/dist/components/select/useSelectNativeControl.d.ts +9 -0
  23. package/dist/components/select/useSelectNativeValue.d.ts +15 -0
  24. package/dist/components/slider/index.d.ts +1 -1
  25. package/dist/components/slider/range-slider.d.ts +7 -11
  26. package/dist/components/slider/slider.d.ts +7 -14
  27. package/dist/components/slider/sliderCore.d.ts +7 -4
  28. package/dist/components/slider/types.d.ts +46 -4
  29. package/dist/components/slider/useRangeSlider.d.ts +2 -1
  30. package/dist/components/slider/useSlider.d.ts +13 -3
  31. package/dist/dialog.js +23 -6
  32. package/dist/field.js +1 -1
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.js +3 -1
  35. package/dist/input.js +1 -1
  36. package/dist/modal.css +28 -29
  37. package/dist/modal.js +11 -12
  38. package/dist/number-input.css +3 -6
  39. package/dist/popover.js +1 -4
  40. package/dist/progress.js +1 -1
  41. package/dist/scroll-area.css +131 -0
  42. package/dist/scroll-area.js +696 -0
  43. package/dist/scroll-area2.js +23 -0
  44. package/dist/select.css +47 -45
  45. package/dist/select.js +168 -130
  46. package/dist/slider.css +256 -166
  47. package/dist/slider.js +334 -140
  48. package/dist/switch.css +17 -17
  49. package/dist/switch.js +10 -5
  50. package/dist/tabs.css +23 -18
  51. package/dist/tabs.js +16 -14
  52. package/dist/tooltip.js +1 -4
  53. package/dist/unplugin-icons.d.ts +5 -0
  54. package/dist/unplugin-icons.js +40 -0
  55. package/docs/public-styles-api.md +6 -3
  56. package/package.json +55 -35
package/README.md CHANGED
@@ -37,6 +37,85 @@ Import the components you need:
37
37
  import { Button } from 'ropav';
38
38
  ```
39
39
 
40
+ ## Progress and interactive ranges
41
+
42
+ Use `Progress` for read-only status and `Slider` when the user can change the value. A media seek
43
+ control can draw buffered ranges below the played range, reveal its thumb during interaction, and
44
+ preview the value under the pointer:
45
+
46
+ ```vue
47
+ <Slider
48
+ v-model="currentTime"
49
+ :max="duration"
50
+ thumb="interaction"
51
+ :tooltip="{ anchor: 'pointer' }"
52
+ :format-value="formatTime"
53
+ >
54
+ <template #track-underlay="{ getPercent }">
55
+ <span
56
+ v-for="range in bufferedRanges"
57
+ :key="range.start"
58
+ class="buffered-range"
59
+ :style="{
60
+ left: `${getPercent(range.start)}%`,
61
+ width: `${getPercent(range.end) - getPercent(range.start)}%`,
62
+ }"
63
+ />
64
+ </template>
65
+ <template #tooltip-content="{ formattedValue }">
66
+ {{ formattedValue }}
67
+ </template>
68
+ </Slider>
69
+ ```
70
+
71
+ `track-underlay` and `track-overlay` are decorative layers below and above the selected range. Both
72
+ receive the normalized slider state and a clamped `getPercent(value)` helper, so consumers can draw
73
+ segments, markers, waveforms, or other track content without replacing slider behavior. Their
74
+ coordinate space follows the thumb travel, so percentage positions stay aligned with the control.
75
+ Set `:thumb="false"` to hide only the visual thumb while preserving the native input, hit area, and
76
+ keyboard behavior. An object can combine visibility and geometry, for example
77
+ `:thumb="{ visibility: 'interaction', size: 20 }"`.
78
+
79
+ ## Icons
80
+
81
+ Ropav provides a compiler for
82
+ [`unplugin-icons`](https://github.com/unplugin/unplugin-icons) that emits each
83
+ icon as a zero-VDOM Vue Vapor component.
84
+
85
+ Install `unplugin-icons`, a matching version of `@vue/compiler-vapor`, and the
86
+ Iconify collection you want to use:
87
+
88
+ ```bash
89
+ pnpm add -D unplugin-icons @vue/compiler-vapor @iconify-json/lucide
90
+ ```
91
+
92
+ Pass `vaporIconCompiler` to `unplugin-icons`:
93
+
94
+ ```ts
95
+ // vite.config.ts
96
+ import vue from '@vitejs/plugin-vue';
97
+ import { defineConfig } from 'vite';
98
+ import Icons from 'unplugin-icons/vite';
99
+ import { vaporIconCompiler } from 'ropav/unplugin-icons';
100
+
101
+ export default defineConfig({
102
+ plugins: [vue({ features: { vapor: true } }), Icons({ compiler: vaporIconCompiler() })],
103
+ });
104
+ ```
105
+
106
+ Icons can then be imported on demand. Only imported icons are included in the
107
+ application bundle.
108
+
109
+ ```vue
110
+ <script setup lang="ts" vapor>
111
+ import IconSearch from '~icons/lucide/search';
112
+ </script>
113
+
114
+ <template>
115
+ <IconSearch aria-hidden="true" />
116
+ </template>
117
+ ```
118
+
40
119
  ## Styling contract
41
120
 
42
121
  Use typed `classNames` and `styles`, documented state attributes, and variables listed in the packaged styles manifest. DOM nesting, internal selectors and undocumented variables are private implementation details.
@@ -1,5 +1,5 @@
1
1
  @layer ropav.components {
2
- .rp-accordion[data-v-e732f2da] {
2
+ .rp-accordion[data-v-d15589fa] {
3
3
  --_rp-accordion-radius: var(--rp-radius-sm);
4
4
  --_rp-accordion-duration: var(--rp-transition-fast);
5
5
  box-sizing: border-box;
@@ -12,14 +12,10 @@
12
12
  border: var(--rp-border-width-thin) solid var(--rp-color-default-border);
13
13
  border-radius: var(--_rp-accordion-radius);
14
14
  }
15
- .rp-accordion--disabled[data-v-e732f2da] {
15
+ .rp-accordion--disabled[data-v-d15589fa] {
16
16
  opacity: var(--rp-opacity-disabled);
17
17
  cursor: not-allowed;
18
18
  }
19
- .rp-accordion--horizontal[data-v-e732f2da] {
20
- display: flex;
21
- align-items: stretch;
22
- }
23
19
  }@layer ropav.components {
24
20
  .rp-accordion-item[data-v-5b00ef39] {
25
21
  --_rp-accordion-duration: var(--rp-transition-fast);
@@ -30,14 +26,6 @@
30
26
  .rp-accordion-item[data-v-5b00ef39]:first-child {
31
27
  border-top: 0;
32
28
  }
33
- .rp-accordion-item--horizontal[data-v-5b00ef39] {
34
- flex: 1 1 0;
35
- border-top: 0;
36
- border-left: var(--rp-border-width-thin) solid var(--rp-color-default-border);
37
- }
38
- .rp-accordion-item--horizontal[data-v-5b00ef39]:first-child {
39
- border-left: 0;
40
- }
41
29
  .rp-accordion-item--disabled[data-v-5b00ef39] {
42
30
  opacity: var(--rp-opacity-disabled);
43
31
  cursor: not-allowed;
@@ -95,12 +83,12 @@
95
83
  display: grid;
96
84
  min-width: 0;
97
85
  overflow: hidden;
98
- padding: 0 var(--rp-spacing-4) var(--rp-spacing-4);
86
+ padding: var(--rp-spacing-3) var(--rp-spacing-4) var(--rp-spacing-4);
99
87
  color: var(--rp-color-text);
100
88
  font-size: var(--rp-font-size-md);
101
89
  line-height: var(--rp-line-height-md);
102
90
  grid-template-rows: 1fr;
103
- transition: grid-template-rows var(--_rp-accordion-duration), opacity var(--_rp-accordion-duration), padding-bottom var(--_rp-accordion-duration);
91
+ transition: grid-template-rows var(--_rp-accordion-duration), opacity var(--_rp-accordion-duration), padding-top var(--_rp-accordion-duration), padding-bottom var(--_rp-accordion-duration);
104
92
  }
105
93
  .rp-accordion-item__inner[data-v-5b00ef39] {
106
94
  min-height: 0;
@@ -111,6 +99,7 @@
111
99
  .rp-accordion-content-leave-to[data-v-5b00ef39] {
112
100
  opacity: 0;
113
101
  grid-template-rows: 0fr;
102
+ padding-top: 0;
114
103
  padding-bottom: 0;
115
104
  }
116
105
  }
package/dist/accordion.js CHANGED
@@ -33,15 +33,9 @@ function hasValue(values, value) {
33
33
  function withoutValue(values, value) {
34
34
  return values.filter((itemValue) => itemValue !== value);
35
35
  }
36
- var ORIENTATION_NAVIGATION_KEYS = {
37
- vertical: {
38
- ArrowDown: 1,
39
- ArrowUp: -1
40
- },
41
- horizontal: {
42
- ArrowRight: 1,
43
- ArrowLeft: -1
44
- }
36
+ var NAVIGATION_KEYS = {
37
+ ArrowDown: 1,
38
+ ArrowUp: -1
45
39
  };
46
40
  function getAccordionTrigger(event, root) {
47
41
  const target = event.target;
@@ -53,13 +47,13 @@ function getAccordionTrigger(event, root) {
53
47
  function getAccordionTriggers(root) {
54
48
  return Array.from(root.querySelectorAll(TRIGGER_SELECTOR)).filter((trigger) => trigger.closest(ACCORDION_SELECTOR) === root && !trigger.disabled);
55
49
  }
56
- function getNextTrigger(root, currentTrigger, key, orientation) {
50
+ function getNextTrigger(root, currentTrigger, key) {
57
51
  const triggers = getAccordionTriggers(root);
58
52
  const currentIndex = triggers.indexOf(currentTrigger);
59
53
  if (currentIndex === -1 || triggers.length === 0) return void 0;
60
54
  if (key === "Home") return triggers[0];
61
55
  if (key === "End") return triggers[triggers.length - 1];
62
- const direction = ORIENTATION_NAVIGATION_KEYS[orientation][key];
56
+ const direction = NAVIGATION_KEYS[key];
63
57
  if (!direction) return void 0;
64
58
  return triggers[(currentIndex + direction + triggers.length) % triggers.length];
65
59
  }
@@ -67,20 +61,17 @@ function useAccordion(props, emitUpdate) {
67
61
  const isMultiple = computed(() => Boolean(props.multiple));
68
62
  const isCollapsible = computed(() => props.collapsible !== false);
69
63
  const isDisabled = computed(() => Boolean(props.disabled));
70
- const orientation = computed(() => props.orientation ?? "vertical");
71
64
  const isControlled = computed(() => props.modelValue !== void 0);
72
65
  const uncontrolledValue = ref(props.defaultValue ?? null);
73
66
  const openValues = computed(() => normalizeValue(isControlled.value ? props.modelValue : uncontrolledValue.value, isMultiple.value));
74
67
  const rootClass = computed(() => bem("rp-accordion", {
75
68
  disabled: isDisabled.value,
76
- multiple: isMultiple.value,
77
- [`${orientation.value}`]: true
69
+ multiple: isMultiple.value
78
70
  }));
79
71
  const rootProps = computed(() => ({
80
72
  id: props.id,
81
73
  class: rootClass.value,
82
74
  "data-disabled": isDisabled.value || void 0,
83
- "data-orientation": orientation.value,
84
75
  "aria-label": props.ariaLabel || void 0,
85
76
  "aria-labelledby": props.labelledby || void 0,
86
77
  "aria-describedby": props.describedby || void 0,
@@ -107,7 +98,7 @@ function useAccordion(props, emitUpdate) {
107
98
  if (!root) return;
108
99
  const trigger = getAccordionTrigger(event, root);
109
100
  if (!trigger) return;
110
- const nextTrigger = getNextTrigger(root, trigger, event.key, orientation.value);
101
+ const nextTrigger = getNextTrigger(root, trigger, event.key);
111
102
  if (!nextTrigger) return;
112
103
  event.preventDefault();
113
104
  nextTrigger.focus();
@@ -125,9 +116,6 @@ function useAccordion(props, emitUpdate) {
125
116
  get unmountOnExit() {
126
117
  return Boolean(props.unmountOnExit);
127
118
  },
128
- get orientation() {
129
- return orientation.value;
130
- },
131
119
  isItemOpen(value) {
132
120
  return hasValue(openValues.value, value);
133
121
  },
@@ -166,8 +154,7 @@ function useAccordionItem(props) {
166
154
  const rootClass = computed(() => bem("rp-accordion-item", {
167
155
  open: isOpen.value,
168
156
  closed: !isOpen.value,
169
- disabled: isDisabled.value,
170
- [`${group.orientation}`]: true
157
+ disabled: isDisabled.value
171
158
  }));
172
159
  const rootProps = computed(() => ({
173
160
  id: id.value,
@@ -241,7 +228,7 @@ function useAccordionItem(props) {
241
228
  }
242
229
  //#endregion
243
230
  //#region src/components/accordion/accordion.vue?vue&type=script&setup=true&vapor=true&lang.ts
244
- var t0$2 = template("<div data-v-e732f2da>", 1);
231
+ var t0$2 = template("<div data-v-d15589fa>", 1);
245
232
  //#endregion
246
233
  //#region src/components/accordion/accordion.vue
247
234
  var accordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -268,7 +255,6 @@ var accordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
268
255
  type: Boolean,
269
256
  default: false
270
257
  },
271
- orientation: { default: "vertical" },
272
258
  ariaLabel: {},
273
259
  describedby: {},
274
260
  labelledby: {},
@@ -293,7 +279,7 @@ var accordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
293
279
  createSlot("default", null, null, 1);
294
280
  return n1;
295
281
  }
296
- }), [["__scopeId", "data-v-e732f2da"]]);
282
+ }), [["__scopeId", "data-v-d15589fa"]]);
297
283
  //#endregion
298
284
  //#region ~icons/lucide/chevron-down
299
285
  var t0$1 = template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"m6 9l6 6l6-6\">", 3, 1);
@@ -381,10 +367,7 @@ var accordion_item_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
381
367
  return n8;
382
368
  }, 1);
383
369
  setInsertionState(n16, null, 1);
384
- createComponent(VaporTransition, {
385
- name: "rp-accordion-content",
386
- persisted: ""
387
- }, extend(() => {
370
+ createComponent(VaporTransition, { name: "rp-accordion-content" }, extend(() => {
388
371
  return createIf(() => unref(shouldRenderContent), () => {
389
372
  const n14 = t2();
390
373
  const n13 = child(n14);
@@ -82,7 +82,7 @@ var button_link_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
82
82
  const n16 = child(n17, 1);
83
83
  const n11 = child(n16, 1);
84
84
  renderEffect(() => setDynamicProps(n17, [rootAttrs.value]));
85
- setInsertionState(n17, 0, 0);
85
+ setInsertionState(n17, 0);
86
86
  createIf(() => __props.loading, () => {
87
87
  const n5 = t0();
88
88
  renderEffect(() => setDynamicProps(n5, [unref(getPartAttrs)("loader", { class: "rp-button__loading" }), { "aria-hidden": "true" }]));
@@ -92,7 +92,7 @@ var button_link_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
92
92
  }, 1);
93
93
  return n5;
94
94
  });
95
- setInsertionState(n16, 0, 0);
95
+ setInsertionState(n16, 0);
96
96
  createIf(() => $slots.left, () => {
97
97
  const n9 = t0();
98
98
  renderEffect(() => setDynamicProps(n9, [unref(getPartAttrs)("left", { class: "rp-button__left" })]));
package/dist/button.js CHANGED
@@ -54,7 +54,7 @@ var button_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
54
54
  const n16 = child(n17, 1);
55
55
  const n11 = child(n16, 1);
56
56
  renderEffect(() => setDynamicProps(n17, [rootAttrs.value]));
57
- setInsertionState(n17, 0, 0);
57
+ setInsertionState(n17, 0);
58
58
  createIf(() => __props.loading, () => {
59
59
  const n5 = t0();
60
60
  renderEffect(() => setDynamicProps(n5, [unref(getPartAttrs)("loader", { class: "rp-button__loading" }), { "aria-hidden": "true" }]));
@@ -64,7 +64,7 @@ var button_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
64
64
  }, 1);
65
65
  return n5;
66
66
  });
67
- setInsertionState(n16, 0, 0);
67
+ setInsertionState(n16, 0);
68
68
  createIf(() => $slots.left, () => {
69
69
  const n9 = t0();
70
70
  renderEffect(() => setDynamicProps(n9, [unref(getPartAttrs)("left", { class: "rp-button__left" })]));
package/dist/collapse.js CHANGED
@@ -68,10 +68,7 @@ var collapse_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
68
68
  setInsertionState(n7, null, 0);
69
69
  createSlot("trigger", { $: [() => publicTriggerSlotProps.value] }, null, 1);
70
70
  setInsertionState(n7, null, 1);
71
- createComponent(VaporTransition, {
72
- name: "rp-collapse-content",
73
- persisted: ""
74
- }, extend(() => {
71
+ createComponent(VaporTransition, { name: "rp-collapse-content" }, extend(() => {
75
72
  return createIf(() => unref(shouldRenderContent), () => {
76
73
  const n5 = t0();
77
74
  const n4 = child(n5);
@@ -2,4 +2,4 @@ export { default as Accordion } from './accordion.js';
2
2
  export { default as AccordionItem } from './accordion-item.js';
3
3
  export { useAccordion, useAccordionItem } from './useAccordion.js';
4
4
  export { accordionItemParts, accordionParts } from './types.js';
5
- export type { AccordionItemPart, AccordionContentProps, AccordionContext, AccordionItemProps, AccordionItemRootProps, AccordionItemSlotProps, AccordionItemTriggerSlotProps, AccordionItemValue, AccordionModelValue, AccordionOrientation, AccordionPart, AccordionProps, AccordionRootProps, AccordionState, AccordionTriggerProps, UseAccordionItemReturn, UseAccordionReturn, } from './types.js';
5
+ export type { AccordionItemPart, AccordionContentProps, AccordionContext, AccordionItemProps, AccordionItemRootProps, AccordionItemSlotProps, AccordionItemTriggerSlotProps, AccordionItemValue, AccordionModelValue, AccordionPart, AccordionProps, AccordionRootProps, AccordionState, AccordionTriggerProps, UseAccordionItemReturn, UseAccordionReturn, } from './types.js';
@@ -3,7 +3,6 @@ import { StylesApiProps } from '../../styles-api.js';
3
3
  import { CollapseContentProps, CollapseContentRole, CollapseTriggerProps } from '../collapse/types.js';
4
4
  export type AccordionItemValue = string | number;
5
5
  export type AccordionModelValue = AccordionItemValue | AccordionItemValue[] | null;
6
- export type AccordionOrientation = 'vertical' | 'horizontal';
7
6
  export type AccordionState = 'open' | 'closed';
8
7
  export declare const accordionParts: readonly ["root"];
9
8
  export declare const accordionItemParts: readonly ["root", "trigger", "title", "icon", "content"];
@@ -17,7 +16,6 @@ export interface AccordionProps extends StylesApiProps<AccordionPart> {
17
16
  collapsible?: boolean;
18
17
  disabled?: boolean;
19
18
  unmountOnExit?: boolean;
20
- orientation?: AccordionOrientation;
21
19
  ariaLabel?: string;
22
20
  describedby?: string;
23
21
  labelledby?: string;
@@ -37,7 +35,6 @@ export interface AccordionRootProps {
37
35
  id?: string;
38
36
  class: string[];
39
37
  'data-disabled'?: boolean;
40
- 'data-orientation': AccordionOrientation;
41
38
  'aria-label'?: string;
42
39
  'aria-labelledby'?: string;
43
40
  'aria-describedby'?: string;
@@ -73,7 +70,6 @@ export interface AccordionContext {
73
70
  collapsible: boolean;
74
71
  disabled: boolean;
75
72
  unmountOnExit: boolean;
76
- orientation: AccordionOrientation;
77
73
  isItemOpen: (value: AccordionItemValue) => boolean;
78
74
  setItemOpen: (value: AccordionItemValue, open: boolean) => void;
79
75
  }
@@ -1,4 +1,4 @@
1
- import { ComponentPublicInstance, ComputedRef, InjectionKey, Ref } from 'vue';
1
+ import { ComponentPublicInstance, ComputedRef, InjectionKey, Ref, VaporComponentInstance } from 'vue';
2
2
  import { OverlayLayerContext } from '../../composables/useOverlayLayer.js';
3
3
  import { DialogCloseReason } from './types.js';
4
4
  export interface DialogRootContext {
@@ -22,6 +22,8 @@ export interface DialogRootContext {
22
22
  registerDescription: (id: string) => () => void;
23
23
  }
24
24
  export declare const dialogRootKey: InjectionKey<DialogRootContext>;
25
+ export type DialogElementRefValue = Element | ComponentPublicInstance | VaporComponentInstance | null;
25
26
  export declare function resolveDialogCloseReason(reason: unknown): DialogCloseReason;
26
- export declare function toDialogHTMLElement(value: Element | ComponentPublicInstance | null): HTMLElement | null;
27
+ export declare function toDialogHTMLElement(value: DialogElementRefValue): HTMLElement | null;
28
+ export declare function resolveDialogHTMLElementRef(value: DialogElementRefValue, fallbackId: string, resolve: (element: HTMLElement | null) => void): void;
27
29
  export declare function createDialogEvent<T>(type: string, detail: T, originalEvent: Event): CustomEvent<T>;
@@ -0,0 +1,3 @@
1
+ export { default as ScrollArea } from './scroll-area.js';
2
+ export { scrollAreaParts, scrollAreaScrollbars, scrollAreaTypes } from './types.js';
3
+ export type { ScrollAreaOrientation, ScrollAreaPart, ScrollAreaPosition, ScrollAreaProps, ScrollAreaScrollbars, ScrollAreaSlotProps, ScrollAreaType, } from './types.js';
@@ -0,0 +1,3 @@
1
+ import { t as scroll_area_default } from "../../scroll-area.js";
2
+ import { n as scrollAreaScrollbars, r as scrollAreaTypes, t as scrollAreaParts } from "../../scroll-area2.js";
3
+ export { scroll_area_default as ScrollArea, scrollAreaParts, scrollAreaScrollbars, scrollAreaTypes };
@@ -0,0 +1,42 @@
1
+ import { ScrollAreaProps } from './types.js';
2
+ 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<{
3
+ props: import('vue').PublicProps & __VLS_PrettifyLocal<ScrollAreaProps & {
4
+ onScroll?: ((event: Event) => any) | undefined;
5
+ onScrollPositionChange?: ((position: {
6
+ x: number;
7
+ y: number;
8
+ }) => any) | undefined;
9
+ }> & (typeof globalThis extends {
10
+ __VLS_PROPS_FALLBACK: infer P;
11
+ } ? P : {});
12
+ expose: (exposed: import('vue').ShallowUnwrapRef<{
13
+ viewport: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
14
+ scrollTo: (scrollOptions: ScrollToOptions) => void;
15
+ scrollBy: (scrollOptions: ScrollToOptions) => void;
16
+ update: () => void;
17
+ }>) => void;
18
+ attrs: any;
19
+ slots: {
20
+ default?: (props: {
21
+ position: import('./types.js').ScrollAreaPosition;
22
+ overflowX: boolean;
23
+ overflowY: boolean;
24
+ scrollTo: (options: ScrollToOptions) => void;
25
+ scrollBy: (options: ScrollToOptions) => void;
26
+ update: () => void;
27
+ }) => any;
28
+ };
29
+ emit: ((evt: "scroll", event: Event) => void) & ((evt: "scrollPositionChange", position: {
30
+ x: number;
31
+ y: number;
32
+ }) => void);
33
+ }>) => import('vue').VNode & {
34
+ __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
35
+ };
36
+ declare const _default: typeof __VLS_export;
37
+ export default _default;
38
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
39
+ [K in keyof T]: T[K];
40
+ } : {
41
+ [K in keyof T as K]: T[K];
42
+ }) & {};
@@ -0,0 +1,25 @@
1
+ import { ScrollAreaScrollbars, ScrollAreaType } from './types.js';
2
+ export type ScrollAxis = 'x' | 'y';
3
+ export interface ScrollAreaMetrics {
4
+ clientWidth: number;
5
+ clientHeight: number;
6
+ scrollWidth: number;
7
+ scrollHeight: number;
8
+ x: number;
9
+ y: number;
10
+ overflowX: boolean;
11
+ overflowY: boolean;
12
+ horizontalThumbSize: number;
13
+ horizontalThumbOffset: number;
14
+ verticalThumbSize: number;
15
+ verticalThumbOffset: number;
16
+ }
17
+ export declare function clamp(value: number, min: number, max: number): number;
18
+ export declare function isAxisEnabled(scrollbars: ScrollAreaScrollbars | false | undefined, axis: ScrollAxis): boolean;
19
+ export declare function isScrollbarActive(type: ScrollAreaType, enabled: boolean, overflowing: boolean): boolean;
20
+ export declare function getThumbGeometry(trackSize: number, viewportSize: number, scrollSize: number): {
21
+ size: number;
22
+ offsetRatio: number;
23
+ };
24
+ export declare function getThumbOffset(position: number, maxPosition: number, sizeRatio: number): number;
25
+ export declare function getLengthValue(value: number | string | undefined): string;
@@ -0,0 +1,33 @@
1
+ import { HTMLAttributes } from 'vue';
2
+ import { StylesApiProps } from '../../styles-api.js';
3
+ export declare const scrollAreaParts: readonly ["root", "viewport", "content", "scrollbar", "thumb", "corner"];
4
+ export type ScrollAreaPart = (typeof scrollAreaParts)[number];
5
+ export declare const scrollAreaTypes: readonly ["auto", "always", "hover", "scroll", "never"];
6
+ export type ScrollAreaType = (typeof scrollAreaTypes)[number];
7
+ export declare const scrollAreaScrollbars: readonly ["x", "y", "both"];
8
+ export type ScrollAreaScrollbars = (typeof scrollAreaScrollbars)[number];
9
+ export type ScrollAreaOrientation = 'horizontal' | 'vertical';
10
+ export interface ScrollAreaPosition {
11
+ x: number;
12
+ y: number;
13
+ }
14
+ export interface ScrollAreaSlotProps {
15
+ position: ScrollAreaPosition;
16
+ overflowX: boolean;
17
+ overflowY: boolean;
18
+ scrollTo: (options: ScrollToOptions) => void;
19
+ scrollBy: (options: ScrollToOptions) => void;
20
+ update: () => void;
21
+ }
22
+ export interface ScrollAreaProps extends StylesApiProps<ScrollAreaPart> {
23
+ id?: string;
24
+ embedded?: boolean;
25
+ type?: ScrollAreaType;
26
+ scrollbars?: ScrollAreaScrollbars | false;
27
+ scrollbarSize?: number | string;
28
+ scrollHideDelay?: number;
29
+ ariaLabel?: string;
30
+ ariaLabelledby?: string;
31
+ ariaDescribedby?: string;
32
+ viewportAttrs?: HTMLAttributes;
33
+ }
@@ -0,0 +1,54 @@
1
+ import { ScrollAreaPosition, ScrollAreaProps } from './types.js';
2
+ interface UseScrollAreaOptions {
3
+ props: Readonly<ScrollAreaProps>;
4
+ emitScroll: (event: Event) => void;
5
+ emitPositionChange: (position: ScrollAreaPosition) => void;
6
+ }
7
+ export declare function useScrollArea(options: UseScrollAreaOptions): {
8
+ onScrollbarPointerdown: (axis: import('./scrollAreaCore.js').ScrollAxis, event: PointerEvent) => void;
9
+ onThumbPointerdown: (axis: import('./scrollAreaCore.js').ScrollAxis, event: PointerEvent) => void;
10
+ onViewportScroll: (event: Event) => void;
11
+ onScrollbarKeydown: (axis: import('./scrollAreaCore.js').ScrollAxis, event: KeyboardEvent) => void;
12
+ onScrollbarWheel: (axis: import('./scrollAreaCore.js').ScrollAxis, event: WheelEvent) => void;
13
+ writeAxisPosition: (axis: import('./scrollAreaCore.js').ScrollAxis, value: number) => void;
14
+ scrollTo: (scrollOptions: ScrollToOptions) => void;
15
+ scrollBy: (scrollOptions: ScrollToOptions) => void;
16
+ renderHorizontalScrollbar: import('vue').ComputedRef<boolean>;
17
+ renderVerticalScrollbar: import('vue').ComputedRef<boolean>;
18
+ horizontalScrollbarActive: import('vue').ComputedRef<boolean>;
19
+ verticalScrollbarActive: import('vue').ComputedRef<boolean>;
20
+ horizontalScrollbarVisible: import('vue').ComputedRef<boolean>;
21
+ verticalScrollbarVisible: import('vue').ComputedRef<boolean>;
22
+ showDuringScroll: () => void;
23
+ setDraggingAxis: (axis: import('./scrollAreaCore.js').ScrollAxis | null) => void;
24
+ onPointerenter: () => void;
25
+ onPointerleave: () => void;
26
+ onFocusin: () => void;
27
+ onFocusout: (event: FocusEvent) => void;
28
+ rootRef: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
29
+ viewportRef: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
30
+ contentRef: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
31
+ horizontalScrollbarRef: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
32
+ verticalScrollbarRef: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
33
+ metrics: {
34
+ clientWidth: number;
35
+ clientHeight: number;
36
+ scrollWidth: number;
37
+ scrollHeight: number;
38
+ x: number;
39
+ y: number;
40
+ overflowX: boolean;
41
+ overflowY: boolean;
42
+ horizontalThumbSize: number;
43
+ horizontalThumbOffset: number;
44
+ verticalThumbSize: number;
45
+ verticalThumbOffset: number;
46
+ };
47
+ position: import('vue').ComputedRef<ScrollAreaPosition>;
48
+ update: () => void;
49
+ getPosition: (axis: import('./scrollAreaCore.js').ScrollAxis) => number;
50
+ getMaxPosition: (axis: import('./scrollAreaCore.js').ScrollAxis) => number;
51
+ getOverflow: (axis: import('./scrollAreaCore.js').ScrollAxis) => boolean;
52
+ };
53
+ export type ScrollAreaController = ReturnType<typeof useScrollArea>;
54
+ export {};
@@ -0,0 +1,21 @@
1
+ import { Ref } from 'vue';
2
+ import { ScrollAxis } from './scrollAreaCore.js';
3
+ import { ScrollAreaMetricsController } from './useScrollAreaMetrics.js';
4
+ import { ScrollAreaPosition } from './types.js';
5
+ interface UseScrollAreaControlsOptions {
6
+ viewportRef: Ref<HTMLElement | null>;
7
+ metrics: ScrollAreaMetricsController;
8
+ showDuringScroll: () => void;
9
+ emitScroll: (event: Event) => void;
10
+ emitPositionChange: (position: ScrollAreaPosition) => void;
11
+ }
12
+ export declare function useScrollAreaControls(options: UseScrollAreaControlsOptions): {
13
+ onViewportScroll: (event: Event) => void;
14
+ onScrollbarKeydown: (axis: ScrollAxis, event: KeyboardEvent) => void;
15
+ onScrollbarWheel: (axis: ScrollAxis, event: WheelEvent) => void;
16
+ writeAxisPosition: (axis: ScrollAxis, value: number) => void;
17
+ scrollTo: (scrollOptions: ScrollToOptions) => void;
18
+ scrollBy: (scrollOptions: ScrollToOptions) => void;
19
+ };
20
+ export type ScrollAreaControlsController = ReturnType<typeof useScrollAreaControls>;
21
+ export {};
@@ -0,0 +1,35 @@
1
+ import { Ref } from 'vue';
2
+ import { ScrollAxis } from './scrollAreaCore.js';
3
+ import { ScrollAreaPosition } from './types.js';
4
+ interface UseScrollAreaMetricsOptions {
5
+ viewportRef: Ref<HTMLElement | null>;
6
+ contentRef: Ref<HTMLElement | null>;
7
+ horizontalScrollbarRef: Ref<HTMLElement | null>;
8
+ verticalScrollbarRef: Ref<HTMLElement | null>;
9
+ horizontalEnabled: Readonly<Ref<boolean>>;
10
+ verticalEnabled: Readonly<Ref<boolean>>;
11
+ }
12
+ export declare function useScrollAreaMetrics(options: UseScrollAreaMetricsOptions): {
13
+ metrics: {
14
+ clientWidth: number;
15
+ clientHeight: number;
16
+ scrollWidth: number;
17
+ scrollHeight: number;
18
+ x: number;
19
+ y: number;
20
+ overflowX: boolean;
21
+ overflowY: boolean;
22
+ horizontalThumbSize: number;
23
+ horizontalThumbOffset: number;
24
+ verticalThumbSize: number;
25
+ verticalThumbOffset: number;
26
+ };
27
+ position: import('vue').ComputedRef<ScrollAreaPosition>;
28
+ update: () => void;
29
+ scheduleUpdate: () => void;
30
+ getPosition: (axis: ScrollAxis) => number;
31
+ getMaxPosition: (axis: ScrollAxis) => number;
32
+ getOverflow: (axis: ScrollAxis) => boolean;
33
+ };
34
+ export type ScrollAreaMetricsController = ReturnType<typeof useScrollAreaMetrics>;
35
+ export {};
@@ -0,0 +1,17 @@
1
+ import { Ref } from 'vue';
2
+ import { ScrollAxis } from './scrollAreaCore.js';
3
+ import { ScrollAreaControlsController } from './useScrollAreaControls.js';
4
+ import { ScrollAreaMetricsController } from './useScrollAreaMetrics.js';
5
+ interface UseScrollAreaPointerOptions {
6
+ horizontalScrollbarRef: Ref<HTMLElement | null>;
7
+ verticalScrollbarRef: Ref<HTMLElement | null>;
8
+ metrics: ScrollAreaMetricsController;
9
+ controls: ScrollAreaControlsController;
10
+ setDraggingAxis: (axis: ScrollAxis | null) => void;
11
+ shouldFocusScrollbar: () => boolean;
12
+ }
13
+ export declare function useScrollAreaPointer(options: UseScrollAreaPointerOptions): {
14
+ onScrollbarPointerdown: (axis: ScrollAxis, event: PointerEvent) => void;
15
+ onThumbPointerdown: (axis: ScrollAxis, event: PointerEvent) => void;
16
+ };
17
+ export {};