ropav 0.1.3 → 0.1.4

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.
@@ -1,11 +1,45 @@
1
- import { ScrollAreaProps } from './types.js';
1
+ import { PropType } from 'vue';
2
+ import { ScrollAreaProps, ScrollAreaScrollbars } from './types.js';
2
3
  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
+ props: import('vue').PublicProps & __VLS_PrettifyLocal<import('vue').ExtractPublicPropTypes<{
5
+ id: StringConstructor;
6
+ embedded: {
7
+ type: BooleanConstructor;
8
+ default: boolean;
9
+ };
10
+ type: {
11
+ type: PropType<ScrollAreaProps["type"]>;
12
+ default: string;
13
+ };
14
+ scrollbars: {
15
+ type: PropType<ScrollAreaScrollbars | false>;
16
+ default: string;
17
+ };
18
+ scrollbarSize: {
19
+ type: (StringConstructor | NumberConstructor)[];
20
+ default: number;
21
+ };
22
+ scrollHideDelay: {
23
+ type: NumberConstructor;
24
+ default: number;
25
+ };
26
+ ariaLabel: StringConstructor;
27
+ ariaLabelledby: StringConstructor;
28
+ ariaDescribedby: StringConstructor;
29
+ viewportAttrs: PropType<ScrollAreaProps["viewportAttrs"]>;
30
+ contentAttrs: PropType<ScrollAreaProps["contentAttrs"]>;
31
+ classNames: PropType<ScrollAreaProps["classNames"]>;
32
+ styles: PropType<ScrollAreaProps["styles"]>;
33
+ }> & {
4
34
  onScroll?: ((event: Event) => any) | undefined;
5
35
  onScrollPositionChange?: ((position: {
6
36
  x: number;
7
37
  y: number;
8
38
  }) => any) | undefined;
39
+ onReachTop?: ((event: Event) => any) | undefined;
40
+ onReachBottom?: ((event: Event) => any) | undefined;
41
+ onReachLeft?: ((event: Event) => any) | undefined;
42
+ onReachRight?: ((event: Event) => any) | undefined;
9
43
  }> & (typeof globalThis extends {
10
44
  __VLS_PROPS_FALLBACK: infer P;
11
45
  } ? P : {});
@@ -29,7 +63,7 @@ declare const __VLS_export: (__VLS_props: NonNullable<Awaited<typeof __VLS_setup
29
63
  emit: ((evt: "scroll", event: Event) => void) & ((evt: "scrollPositionChange", position: {
30
64
  x: number;
31
65
  y: number;
32
- }) => void);
66
+ }) => void) & ((evt: "reachTop", event: Event) => void) & ((evt: "reachBottom", event: Event) => void) & ((evt: "reachLeft", event: Event) => void) & ((evt: "reachRight", event: Event) => void);
33
67
  }>) => import('vue').VNode & {
34
68
  __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
35
69
  };
@@ -30,4 +30,5 @@ export interface ScrollAreaProps extends StylesApiProps<ScrollAreaPart> {
30
30
  ariaLabelledby?: string;
31
31
  ariaDescribedby?: string;
32
32
  viewportAttrs?: HTMLAttributes;
33
+ contentAttrs?: HTMLAttributes;
33
34
  }
@@ -3,6 +3,10 @@ interface UseScrollAreaOptions {
3
3
  props: Readonly<ScrollAreaProps>;
4
4
  emitScroll: (event: Event) => void;
5
5
  emitPositionChange: (position: ScrollAreaPosition) => void;
6
+ emitReachTop: (event: Event) => void;
7
+ emitReachBottom: (event: Event) => void;
8
+ emitReachLeft: (event: Event) => void;
9
+ emitReachRight: (event: Event) => void;
6
10
  }
7
11
  export declare function useScrollArea(options: UseScrollAreaOptions): {
8
12
  onScrollbarPointerdown: (axis: import('./scrollAreaCore.js').ScrollAxis, event: PointerEvent) => void;
@@ -8,6 +8,10 @@ interface UseScrollAreaControlsOptions {
8
8
  showDuringScroll: () => void;
9
9
  emitScroll: (event: Event) => void;
10
10
  emitPositionChange: (position: ScrollAreaPosition) => void;
11
+ emitReachTop: (event: Event) => void;
12
+ emitReachBottom: (event: Event) => void;
13
+ emitReachLeft: (event: Event) => void;
14
+ emitReachRight: (event: Event) => void;
11
15
  }
12
16
  export declare function useScrollAreaControls(options: UseScrollAreaControlsOptions): {
13
17
  onViewportScroll: (event: Event) => void;
@@ -4,7 +4,7 @@ import { ScrollAreaOrientation, ScrollAreaProps, ScrollAreaSlotProps } from './t
4
4
  export declare function useScrollAreaPresentation(props: Readonly<ScrollAreaProps>, scrollArea: ScrollAreaController): {
5
5
  rootAttrs: import('vue').ComputedRef<Record<string, unknown>>;
6
6
  viewportAttrs: import('vue').ComputedRef<HTMLAttributes>;
7
- contentAttrs: import('vue').ComputedRef<Pick<HTMLAttributes, "class" | "style">>;
7
+ contentAttrs: import('vue').ComputedRef<HTMLAttributes>;
8
8
  horizontalScrollbarAttrs: import('vue').ComputedRef<{
9
9
  role: string;
10
10
  tabindex: number;
@@ -1,5 +1,5 @@
1
1
  @layer ropav.components {
2
- .rp-scroll-area[data-v-bf91f9cc] {
2
+ .rp-scroll-area[data-v-f5c4e940] {
3
3
  --_rp-scroll-area-scrollbar-size: 10px;
4
4
  --_rp-scroll-area-scrollbar-padding: 2px;
5
5
  --_rp-scroll-area-thumb-bg: var(--rp-color-dimmed);
@@ -11,7 +11,7 @@
11
11
  min-width: 0;
12
12
  overflow: hidden;
13
13
  }
14
- .rp-scroll-area__viewport[data-v-bf91f9cc] {
14
+ .rp-scroll-area__viewport[data-v-f5c4e940] {
15
15
  box-sizing: border-box;
16
16
  flex: 1 1 auto;
17
17
  width: 100%;
@@ -22,33 +22,33 @@
22
22
  scrollbar-width: none;
23
23
  outline: none;
24
24
  }
25
- .rp-scroll-area__viewport[data-v-bf91f9cc]::-webkit-scrollbar {
25
+ .rp-scroll-area__viewport[data-v-f5c4e940]::-webkit-scrollbar {
26
26
  display: none;
27
27
  }
28
- .rp-scroll-area__viewport[data-v-bf91f9cc]:focus-visible {
28
+ .rp-scroll-area__viewport[data-v-f5c4e940]:focus-visible {
29
29
  outline: var(--rp-border-width-medium) solid var(--rp-color-focus-ring);
30
30
  outline-offset: calc(-1 * var(--rp-border-width-medium));
31
31
  }
32
- .rp-scroll-area[data-scrollbars=both] .rp-scroll-area__viewport[data-v-bf91f9cc] {
32
+ .rp-scroll-area[data-scrollbars=both] .rp-scroll-area__viewport[data-v-f5c4e940] {
33
33
  overflow: scroll;
34
34
  }
35
- .rp-scroll-area[data-scrollbars=x] .rp-scroll-area__viewport[data-v-bf91f9cc] {
35
+ .rp-scroll-area[data-scrollbars=x] .rp-scroll-area__viewport[data-v-f5c4e940] {
36
36
  overflow-x: scroll;
37
37
  overflow-y: hidden;
38
38
  }
39
- .rp-scroll-area[data-scrollbars=y] .rp-scroll-area__viewport[data-v-bf91f9cc] {
39
+ .rp-scroll-area[data-scrollbars=y] .rp-scroll-area__viewport[data-v-f5c4e940] {
40
40
  overflow-x: hidden;
41
41
  overflow-y: scroll;
42
42
  }
43
- .rp-scroll-area[data-scrollbars=none] .rp-scroll-area__viewport[data-v-bf91f9cc] {
43
+ .rp-scroll-area[data-scrollbars=none] .rp-scroll-area__viewport[data-v-f5c4e940] {
44
44
  overflow: hidden;
45
45
  }
46
- .rp-scroll-area__content[data-v-bf91f9cc] {
46
+ .rp-scroll-area__content[data-v-f5c4e940] {
47
47
  display: table;
48
48
  box-sizing: border-box;
49
49
  min-width: 100%;
50
50
  }
51
- .rp-scroll-area__scrollbar[data-v-bf91f9cc] {
51
+ .rp-scroll-area__scrollbar[data-v-f5c4e940] {
52
52
  position: absolute;
53
53
  z-index: 1;
54
54
  box-sizing: border-box;
@@ -60,54 +60,54 @@
60
60
  user-select: none;
61
61
  transition: opacity var(--rp-transition-fast);
62
62
  }
63
- .rp-scroll-area__scrollbar[data-visible][data-v-bf91f9cc] {
63
+ .rp-scroll-area__scrollbar[data-visible][data-v-f5c4e940] {
64
64
  opacity: 1;
65
65
  pointer-events: auto;
66
66
  }
67
- .rp-scroll-area__scrollbar[data-v-bf91f9cc]:focus-visible {
67
+ .rp-scroll-area__scrollbar[data-v-f5c4e940]:focus-visible {
68
68
  outline: var(--rp-border-width-medium) solid var(--rp-color-focus-ring);
69
69
  outline-offset: calc(-1 * var(--rp-border-width-medium));
70
70
  }
71
- .rp-scroll-area__scrollbar--horizontal[data-v-bf91f9cc] {
71
+ .rp-scroll-area__scrollbar--horizontal[data-v-f5c4e940] {
72
72
  inset-inline: 0;
73
73
  bottom: 0;
74
74
  align-items: center;
75
75
  width: auto;
76
76
  height: var(--_rp-scroll-area-scrollbar-size);
77
77
  }
78
- .rp-scroll-area__scrollbar--vertical[data-v-bf91f9cc] {
78
+ .rp-scroll-area__scrollbar--vertical[data-v-f5c4e940] {
79
79
  inset-block: 0;
80
80
  inset-inline-end: 0;
81
81
  justify-content: center;
82
82
  width: var(--_rp-scroll-area-scrollbar-size);
83
83
  height: auto;
84
84
  }
85
- .rp-scroll-area[data-scrollbar-y-active] .rp-scroll-area__scrollbar--horizontal[data-v-bf91f9cc] {
85
+ .rp-scroll-area[data-scrollbar-y-active] .rp-scroll-area__scrollbar--horizontal[data-v-f5c4e940] {
86
86
  inset-inline-end: var(--_rp-scroll-area-scrollbar-size);
87
87
  }
88
- .rp-scroll-area[data-scrollbar-x-active] .rp-scroll-area__scrollbar--vertical[data-v-bf91f9cc] {
88
+ .rp-scroll-area[data-scrollbar-x-active] .rp-scroll-area__scrollbar--vertical[data-v-f5c4e940] {
89
89
  inset-block-end: var(--_rp-scroll-area-scrollbar-size);
90
90
  }
91
- .rp-scroll-area__thumb[data-v-bf91f9cc] {
91
+ .rp-scroll-area__thumb[data-v-f5c4e940] {
92
92
  flex: 0 0 auto;
93
93
  background: var(--_rp-scroll-area-thumb-bg);
94
94
  border-radius: var(--rp-radius-full);
95
95
  transition: background-color var(--rp-transition-fast);
96
96
  }
97
- .rp-scroll-area__scrollbar:hover .rp-scroll-area__thumb[data-v-bf91f9cc], .rp-scroll-area__scrollbar:focus-visible .rp-scroll-area__thumb[data-v-bf91f9cc] {
97
+ .rp-scroll-area__scrollbar:hover .rp-scroll-area__thumb[data-v-f5c4e940], .rp-scroll-area__scrollbar:focus-visible .rp-scroll-area__thumb[data-v-f5c4e940] {
98
98
  background: var(--_rp-scroll-area-thumb-bg-hover);
99
99
  }
100
- .rp-scroll-area__scrollbar--horizontal .rp-scroll-area__thumb[data-v-bf91f9cc] {
100
+ .rp-scroll-area__scrollbar--horizontal .rp-scroll-area__thumb[data-v-f5c4e940] {
101
101
  width: var(--_rp-scroll-area-thumb-size);
102
102
  height: 100%;
103
103
  transform: translateX(var(--_rp-scroll-area-thumb-offset));
104
104
  }
105
- .rp-scroll-area__scrollbar--vertical .rp-scroll-area__thumb[data-v-bf91f9cc] {
105
+ .rp-scroll-area__scrollbar--vertical .rp-scroll-area__thumb[data-v-f5c4e940] {
106
106
  width: 100%;
107
107
  height: var(--_rp-scroll-area-thumb-size);
108
108
  transform: translateY(var(--_rp-scroll-area-thumb-offset));
109
109
  }
110
- .rp-scroll-area__corner[data-v-bf91f9cc] {
110
+ .rp-scroll-area__corner[data-v-f5c4e940] {
111
111
  position: absolute;
112
112
  right: 0;
113
113
  bottom: 0;
@@ -118,13 +118,13 @@
118
118
  pointer-events: none;
119
119
  transition: opacity var(--rp-transition-fast);
120
120
  }
121
- .rp-scroll-area__corner[data-visible][data-v-bf91f9cc] {
121
+ .rp-scroll-area__corner[data-visible][data-v-f5c4e940] {
122
122
  opacity: 1;
123
123
  }
124
124
  @media (prefers-reduced-motion: reduce) {
125
- .rp-scroll-area__scrollbar[data-v-bf91f9cc],
126
- .rp-scroll-area__corner[data-v-bf91f9cc],
127
- .rp-scroll-area__thumb[data-v-bf91f9cc] {
125
+ .rp-scroll-area__scrollbar[data-v-f5c4e940],
126
+ .rp-scroll-area__corner[data-v-f5c4e940],
127
+ .rp-scroll-area__thumb[data-v-f5c4e940] {
128
128
  transition: none;
129
129
  }
130
130
  }
@@ -38,14 +38,62 @@ function getLengthValue(value) {
38
38
  //#endregion
39
39
  //#region src/components/scroll-area/useScrollAreaControls.ts
40
40
  function useScrollAreaControls(options) {
41
+ let previousPosition = {
42
+ x: 0,
43
+ y: 0
44
+ };
41
45
  function onViewportScroll(event) {
42
46
  options.metrics.update();
43
47
  options.showDuringScroll();
48
+ const position = {
49
+ x: options.metrics.getPosition("x"),
50
+ y: options.metrics.getPosition("y")
51
+ };
52
+ const reachedBoundaries = getReachedBoundaries(position);
53
+ previousPosition = position;
44
54
  options.emitScroll(event);
45
55
  options.emitPositionChange({
46
56
  x: options.metrics.metrics.x,
47
57
  y: options.metrics.metrics.y
48
58
  });
59
+ for (const boundary of reachedBoundaries) emitReachedBoundary(boundary, event);
60
+ }
61
+ function getReachedBoundaries(position) {
62
+ const boundaries = [];
63
+ if (options.metrics.getOverflow("y")) {
64
+ const maxPosition = options.metrics.getMaxPosition("y");
65
+ if (position.y <= 1 && previousPosition.y > 1) boundaries.push("top");
66
+ if (position.y >= maxPosition - 1 && previousPosition.y < maxPosition - 1) boundaries.push("bottom");
67
+ }
68
+ if (options.metrics.getOverflow("x")) {
69
+ const maxPosition = options.metrics.getMaxPosition("x");
70
+ const reachedStart = position.x <= 1 && previousPosition.x > 1;
71
+ const reachedEnd = position.x >= maxPosition - 1 && previousPosition.x < maxPosition - 1;
72
+ if (reachedStart || reachedEnd) {
73
+ const viewport = options.viewportRef.value;
74
+ const view = viewport?.ownerDocument.defaultView;
75
+ const rtl = viewport ? view?.getComputedStyle(viewport).direction === "rtl" : false;
76
+ if (reachedStart) boundaries.push(rtl ? "right" : "left");
77
+ if (reachedEnd) boundaries.push(rtl ? "left" : "right");
78
+ }
79
+ }
80
+ return boundaries;
81
+ }
82
+ function emitReachedBoundary(boundary, event) {
83
+ switch (boundary) {
84
+ case "top":
85
+ options.emitReachTop(event);
86
+ break;
87
+ case "bottom":
88
+ options.emitReachBottom(event);
89
+ break;
90
+ case "left":
91
+ options.emitReachLeft(event);
92
+ break;
93
+ case "right":
94
+ options.emitReachRight(event);
95
+ break;
96
+ }
49
97
  }
50
98
  function writeAxisPosition(axis, value) {
51
99
  const viewport = options.viewportRef.value;
@@ -446,7 +494,11 @@ function useScrollArea(options) {
446
494
  metrics: measurements,
447
495
  showDuringScroll: visibility.showDuringScroll,
448
496
  emitScroll: options.emitScroll,
449
- emitPositionChange: options.emitPositionChange
497
+ emitPositionChange: options.emitPositionChange,
498
+ emitReachTop: options.emitReachTop,
499
+ emitReachBottom: options.emitReachBottom,
500
+ emitReachLeft: options.emitReachLeft,
501
+ emitReachRight: options.emitReachRight
450
502
  });
451
503
  const pointer = useScrollAreaPointer({
452
504
  horizontalScrollbarRef,
@@ -523,7 +575,17 @@ function useScrollAreaPresentation(props, scrollArea) {
523
575
  }
524
576
  };
525
577
  });
526
- const contentAttrs = computed(() => getPartAttrs("content", { class: "rp-scroll-area__content" }));
578
+ const contentAttrs = computed(() => {
579
+ const { class: compatibilityClass, style: compatibilityStyle, ...attrs } = props.contentAttrs ?? {};
580
+ return {
581
+ ...attrs,
582
+ ...getPartAttrs("content", {
583
+ class: "rp-scroll-area__content",
584
+ compatibilityClass,
585
+ compatibilityStyle
586
+ })
587
+ };
588
+ });
527
589
  const horizontalScrollbarAttrs = computed(() => getScrollbarAttrs("x"));
528
590
  const verticalScrollbarAttrs = computed(() => getScrollbarAttrs("y"));
529
591
  const horizontalThumbAttrs = computed(() => getThumbAttrs("x"));
@@ -592,9 +654,9 @@ function hasAccessibleName(props, attrs) {
592
654
  }
593
655
  //#endregion
594
656
  //#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);
657
+ var t0 = template("<div data-v-f5c4e940><div data-v-f5c4e940></div>");
658
+ var t1 = template("<div data-v-f5c4e940>");
659
+ var t2 = template("<div data-v-f5c4e940><div data-v-f5c4e940><div data-v-f5c4e940></div></div>", 1);
598
660
  delegateEvents("pointerdown", "keydown");
599
661
  //#endregion
600
662
  //#region src/components/scroll-area/scroll-area.vue
@@ -603,33 +665,54 @@ var scroll_area_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
603
665
  inheritAttrs: false,
604
666
  __name: "scroll-area",
605
667
  props: {
606
- id: {},
668
+ id: String,
607
669
  embedded: {
608
670
  type: Boolean,
609
671
  default: false
610
672
  },
611
- type: { default: "hover" },
673
+ type: {
674
+ type: String,
675
+ default: "hover"
676
+ },
612
677
  scrollbars: {
613
- type: Boolean,
678
+ type: [String, Boolean],
614
679
  default: "both"
615
680
  },
616
- scrollbarSize: { default: 10 },
617
- scrollHideDelay: { default: 600 },
618
- ariaLabel: {},
619
- ariaLabelledby: {},
620
- ariaDescribedby: {},
621
- viewportAttrs: {},
622
- classNames: {},
623
- styles: {}
681
+ scrollbarSize: {
682
+ type: [Number, String],
683
+ default: 10
684
+ },
685
+ scrollHideDelay: {
686
+ type: Number,
687
+ default: 600
688
+ },
689
+ ariaLabel: String,
690
+ ariaLabelledby: String,
691
+ ariaDescribedby: String,
692
+ viewportAttrs: Object,
693
+ contentAttrs: Object,
694
+ classNames: Object,
695
+ styles: Object
624
696
  },
625
- emits: ["scroll", "scrollPositionChange"],
697
+ emits: [
698
+ "scroll",
699
+ "scrollPositionChange",
700
+ "reachTop",
701
+ "reachBottom",
702
+ "reachLeft",
703
+ "reachRight"
704
+ ],
626
705
  setup(__props, { expose: __expose, emit: __emit }) {
627
706
  const props = __props;
628
707
  const emit = __emit;
629
708
  const scrollArea = useScrollArea({
630
709
  props,
631
710
  emitScroll: (event) => emit("scroll", event),
632
- emitPositionChange: (position) => emit("scrollPositionChange", position)
711
+ emitPositionChange: (position) => emit("scrollPositionChange", position),
712
+ emitReachTop: (event) => emit("reachTop", event),
713
+ emitReachBottom: (event) => emit("reachBottom", event),
714
+ emitReachLeft: (event) => emit("reachLeft", event),
715
+ emitReachRight: (event) => emit("reachRight", event)
633
716
  });
634
717
  const { rootRef, viewportRef, contentRef, horizontalScrollbarRef, verticalScrollbarRef, renderHorizontalScrollbar, renderVerticalScrollbar, onScrollbarKeydown, onScrollbarWheel, onScrollbarPointerdown, onThumbPointerdown, scrollTo, scrollBy, update } = scrollArea;
635
718
  const { rootAttrs, viewportAttrs, contentAttrs, horizontalScrollbarAttrs, verticalScrollbarAttrs, horizontalThumbAttrs, verticalThumbAttrs, cornerAttrs, slotProps } = useScrollAreaPresentation(props, scrollArea);
@@ -691,6 +774,6 @@ var scroll_area_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
691
774
  _setTemplateRef(n14, rootRef, null, "rootRef");
692
775
  return n14;
693
776
  }
694
- }), [["__scopeId", "data-v-bf91f9cc"]]);
777
+ }), [["__scopeId", "data-v-f5c4e940"]]);
695
778
  //#endregion
696
779
  export { scroll_area_default as t };
package/dist/tabs.css CHANGED
@@ -34,7 +34,7 @@
34
34
  flex: 1 1 0;
35
35
  }
36
36
  }@layer ropav.components {
37
- .rp-tabs-list[data-v-af4a8aa3] {
37
+ .rp-tabs-list[data-v-9bb1525b] {
38
38
  box-sizing: border-box;
39
39
  display: flex;
40
40
  flex-direction: column;
@@ -47,37 +47,37 @@
47
47
  background-color: transparent;
48
48
  border: 0;
49
49
  }
50
- .rp-tabs-list[data-v-af4a8aa3] .rp-scroll-area__content {
50
+ .rp-tabs-list[data-v-9bb1525b] .rp-scroll-area__content {
51
51
  display: flex;
52
52
  align-items: stretch;
53
53
  width: max-content;
54
54
  min-width: 100%;
55
55
  gap: 0;
56
56
  }
57
- .rp-tabs-list--vertical[data-v-af4a8aa3] {
57
+ .rp-tabs-list--vertical[data-v-9bb1525b] {
58
58
  width: max-content;
59
59
  }
60
- .rp-tabs-list--vertical[data-v-af4a8aa3] .rp-scroll-area__content {
60
+ .rp-tabs-list--vertical[data-v-9bb1525b] .rp-scroll-area__content {
61
61
  flex-direction: column;
62
62
  }
63
- .rp-tabs-list--line[data-v-af4a8aa3] .rp-scroll-area__content {
63
+ .rp-tabs-list--line[data-v-9bb1525b] .rp-scroll-area__content {
64
64
  border-bottom: var(--rp-border-width-medium) solid var(--rp-color-default-border);
65
65
  }
66
- .rp-tabs-list--line.rp-tabs-list--vertical[data-v-af4a8aa3] .rp-scroll-area__content {
66
+ .rp-tabs-list--line.rp-tabs-list--vertical[data-v-9bb1525b] .rp-scroll-area__content {
67
67
  border-bottom: 0;
68
68
  border-left: var(--rp-border-width-medium) solid var(--rp-color-default-border);
69
69
  }
70
- .rp-tabs-list--line.rp-tabs-list--vertical.rp-tabs-list--placement-right[data-v-af4a8aa3] .rp-scroll-area__content {
70
+ .rp-tabs-list--line.rp-tabs-list--vertical.rp-tabs-list--placement-right[data-v-9bb1525b] .rp-scroll-area__content {
71
71
  border-right: var(--rp-border-width-medium) solid var(--rp-color-default-border);
72
72
  border-left: 0;
73
73
  }
74
- .rp-tabs-list--pills[data-v-af4a8aa3] .rp-scroll-area__content {
74
+ .rp-tabs-list--pills[data-v-9bb1525b] .rp-scroll-area__content {
75
75
  gap: var(--rp-spacing-2);
76
76
  }
77
- .rp-tabs-list--outline[data-v-af4a8aa3] {
77
+ .rp-tabs-list--outline[data-v-9bb1525b] {
78
78
  position: relative;
79
79
  }
80
- .rp-tabs-list--outline[data-v-af4a8aa3]::after {
80
+ .rp-tabs-list--outline[data-v-9bb1525b]::after {
81
81
  position: absolute;
82
82
  z-index: 0;
83
83
  right: 0;
@@ -88,7 +88,7 @@
88
88
  background-color: var(--rp-color-default-border);
89
89
  pointer-events: none;
90
90
  }
91
- .rp-tabs-list--outline.rp-tabs-list--vertical[data-v-af4a8aa3]::after {
91
+ .rp-tabs-list--outline.rp-tabs-list--vertical[data-v-9bb1525b]::after {
92
92
  top: 0;
93
93
  right: auto;
94
94
  bottom: 0;
@@ -96,11 +96,11 @@
96
96
  width: var(--rp-border-width-thin);
97
97
  height: auto;
98
98
  }
99
- .rp-tabs-list--outline.rp-tabs-list--vertical.rp-tabs-list--placement-right[data-v-af4a8aa3]::after {
99
+ .rp-tabs-list--outline.rp-tabs-list--vertical.rp-tabs-list--placement-right[data-v-9bb1525b]::after {
100
100
  right: 0;
101
101
  left: auto;
102
102
  }
103
- .rp-tabs-list--disabled[data-v-af4a8aa3] {
103
+ .rp-tabs-list--disabled[data-v-9bb1525b] {
104
104
  opacity: var(--rp-opacity-disabled);
105
105
  cursor: not-allowed;
106
106
  }
package/dist/tabs.js CHANGED
@@ -4,9 +4,9 @@ import { n as useStylesApi, t as presence } from "./styles-api.js";
4
4
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
5
5
  import { t as useRequiredInject } from "./useRequiredInject.js";
6
6
  import { t as scroll_area_default } from "./scroll-area.js";
7
- import { computed, createComponent, createIf, createSlot, defineVaporComponent, extend, onBeforeUnmount, onMounted, provide, ref, renderEffect, setDynamicProps, setInsertionState, shallowRef, template, unref, useId, watch } from "vue";
7
+ import { computed, createComponent, createIf, createSlot, defineVaporComponent, extend, mergeProps, onBeforeUnmount, onMounted, provide, ref, renderEffect, setDynamicProps, setInsertionState, shallowRef, template, unref, useId, watch } from "vue";
8
8
  //#region src/components/tabs/useTabs.ts
9
- var TABLIST_SELECTOR = ".rp-tabs-list";
9
+ var TABLIST_SELECTOR = "[role=\"tablist\"]";
10
10
  var TRIGGER_SELECTOR = ".rp-tabs-trigger";
11
11
  var DEFAULT_SIZE = "md";
12
12
  var DEFAULT_VARIANT = "line";
@@ -494,21 +494,50 @@ var tabs_list_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
494
494
  const props = __props;
495
495
  const { rootProps: internalRootProps, slotProps } = useTabsList(props);
496
496
  const scrollbarAxis = computed(() => slotProps.value.orientation === "horizontal" ? "x" : "y");
497
- const { getRootAttrs } = useStylesApi(props, "root");
498
- const rootAttrs = computed(() => getRootAttrs({
499
- ...internalRootProps.value,
500
- "data-disabled": presence(internalRootProps.value["data-disabled"])
501
- }));
497
+ const { attrs: forwardedAttrs, getRootAttrs } = useStylesApi(props, "root");
498
+ const forwardedContentAttrNames = computed(() => Object.keys(forwardedAttrs).filter(isContentAttr));
499
+ const rootAttrs = computed(() => {
500
+ const internal = internalRootProps.value;
501
+ return getRootAttrs({
502
+ id: internal.id,
503
+ class: internal.class,
504
+ "data-disabled": presence(internal["data-disabled"]),
505
+ "data-variant": internal["data-variant"],
506
+ "data-orientation": internal["data-orientation"],
507
+ "data-placement": internal["data-placement"]
508
+ }, {}, forwardedContentAttrNames.value);
509
+ });
510
+ const contentAttrs = computed(() => {
511
+ const internal = internalRootProps.value;
512
+ const internalAttrs = {
513
+ role: internal.role,
514
+ "aria-orientation": internal["aria-orientation"],
515
+ "aria-label": internal["aria-label"],
516
+ "aria-labelledby": internal["aria-labelledby"],
517
+ "aria-describedby": internal["aria-describedby"],
518
+ onKeydown: internal.onKeydown
519
+ };
520
+ const merged = mergeProps(internalAttrs, Object.fromEntries(forwardedContentAttrNames.value.map((name) => [name, forwardedAttrs[name]])));
521
+ for (const [name, value] of Object.entries(internalAttrs)) {
522
+ if (name === "onKeydown") continue;
523
+ merged[name] = value;
524
+ }
525
+ return merged;
526
+ });
527
+ function isContentAttr(name) {
528
+ return name === "role" || name === "onKeydown" || name.startsWith("aria-");
529
+ }
502
530
  return createComponent(scroll_area_default, { $: [() => rootAttrs.value, {
503
531
  embedded: "",
504
532
  type: "auto",
505
533
  scrollbars: () => scrollbarAxis.value,
506
- "viewport-attrs": () => ({ tabindex: -1 })
534
+ "viewport-attrs": () => ({ tabindex: -1 }),
535
+ "content-attrs": () => contentAttrs.value
507
536
  }] }, extend(() => {
508
537
  return createSlot("default", { $: [() => unref(slotProps)] }, null, 1);
509
538
  }, { _: 8 }), true);
510
539
  }
511
- }), [["__scopeId", "data-v-af4a8aa3"]]);
540
+ }), [["__scopeId", "data-v-9bb1525b"]]);
512
541
  //#endregion
513
542
  //#region src/components/tabs/tabs-trigger.vue?vue&type=script&setup=true&vapor=true&lang.ts
514
543
  var t0 = template("<button data-v-6df68725>", 1);
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "ropav",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
- "packageManager": "pnpm@11.13.1",
6
+ "packageManager": "pnpm@11.14.0",
7
7
  "engines": {
8
8
  "node": "^20.19.0 || ^22.13.0 || >=24.0.0"
9
9
  },