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