ropav 0.0.13 → 0.1.2

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -1
  3. package/dist/accordion.js +1 -4
  4. package/dist/button-link.js +2 -2
  5. package/dist/button.js +2 -2
  6. package/dist/card.css +26 -26
  7. package/dist/card.js +6 -16
  8. package/dist/collapse.js +1 -4
  9. package/dist/components/card/types.d.ts +0 -3
  10. package/dist/components/dialog/types.d.ts +1 -0
  11. package/dist/components/dropdown-menu/types.d.ts +2 -6
  12. package/dist/components/modal/types.d.ts +1 -0
  13. package/dist/components/overlay/index.d.ts +3 -0
  14. package/dist/components/overlay/index.js +3 -2
  15. package/dist/components/overlay/overlay-layer-provider.d.ts +21 -0
  16. package/dist/components/overlay/types.d.ts +10 -1
  17. package/dist/components/overlay/useOverlayZIndex.d.ts +4 -0
  18. package/dist/components/popover/types.d.ts +1 -0
  19. package/dist/components/slider/index.d.ts +1 -1
  20. package/dist/components/slider/range-slider.d.ts +7 -11
  21. package/dist/components/slider/slider.d.ts +7 -14
  22. package/dist/components/slider/sliderCore.d.ts +7 -4
  23. package/dist/components/slider/types.d.ts +46 -4
  24. package/dist/components/slider/useRangeSlider.d.ts +2 -1
  25. package/dist/components/slider/useSlider.d.ts +13 -3
  26. package/dist/components/toast/types.d.ts +1 -0
  27. package/dist/components/tooltip/types.d.ts +1 -0
  28. package/dist/composables/useOverlayLayer.d.ts +1 -1
  29. package/dist/dialog.js +7 -2
  30. package/dist/dropdown-menu.js +18 -21
  31. package/dist/field.js +1 -1
  32. package/dist/index.js +3 -2
  33. package/dist/input.js +1 -1
  34. package/dist/modal.css +28 -28
  35. package/dist/modal.js +6 -7
  36. package/dist/overlay2.js +16 -1
  37. package/dist/popover.js +8 -6
  38. package/dist/progress.js +1 -1
  39. package/dist/select.js +1 -1
  40. package/dist/slider.css +256 -166
  41. package/dist/slider.js +334 -140
  42. package/dist/switch.css +17 -17
  43. package/dist/switch.js +10 -5
  44. package/dist/toast.css +21 -21
  45. package/dist/toast.js +10 -2
  46. package/dist/tooltip.js +9 -5
  47. package/dist/unplugin-icons.d.ts +5 -0
  48. package/dist/unplugin-icons.js +40 -0
  49. package/dist/{useOverlayLayer.js → useOverlayZIndex.js} +29 -4
  50. package/docs/public-overlay-layer-api.md +65 -0
  51. package/docs/public-styles-api.md +5 -6
  52. package/package.json +25 -12
  53. package/dist/legacy-unlayered.css +0 -5382
package/dist/switch.css CHANGED
@@ -1,5 +1,5 @@
1
1
  @layer ropav.components {
2
- .rp-switch[data-v-d966892e] {
2
+ .rp-switch[data-v-81b33803] {
3
3
  --_rp-switch-color: var(--rp-color-control-selected-bg);
4
4
  --_rp-switch-font-size: var(--rp-font-size-md);
5
5
  --_rp-switch-default-track-width: 46px;
@@ -26,15 +26,15 @@
26
26
  font-family: var(--rp-font-family);
27
27
  user-select: none;
28
28
  }
29
- .rp-switch--disabled[data-v-d966892e] {
29
+ .rp-switch--disabled[data-v-81b33803] {
30
30
  opacity: var(--rp-opacity-disabled);
31
31
  cursor: not-allowed;
32
32
  }
33
- .rp-switch[data-v-d966892e] {
33
+ .rp-switch[data-v-81b33803] {
34
34
  gap: var(--rp-spacing-2);
35
35
  font-size: var(--_rp-switch-font-size);
36
36
  }
37
- .rp-switch__native[data-v-d966892e] {
37
+ .rp-switch__native[data-v-81b33803] {
38
38
  position: absolute;
39
39
  width: 1px;
40
40
  height: 1px;
@@ -46,11 +46,11 @@
46
46
  border-width: 0;
47
47
  pointer-events: none;
48
48
  }
49
- .rp-switch__native:focus-visible + .rp-switch__track[data-v-d966892e] {
49
+ .rp-switch__native:focus-visible + .rp-switch__track[data-v-81b33803] {
50
50
  border-color: var(--rp-color-control-border-focus);
51
51
  box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
52
52
  }
53
- .rp-switch__track[data-v-d966892e] {
53
+ .rp-switch__track[data-v-81b33803] {
54
54
  position: relative;
55
55
  display: inline-flex;
56
56
  align-items: center;
@@ -61,17 +61,17 @@
61
61
  border-radius: var(--rp-radius-full);
62
62
  transition: background-color var(--rp-transition-fast);
63
63
  }
64
- .rp-switch--checked .rp-switch__track[data-v-d966892e] {
64
+ .rp-switch--checked .rp-switch__track[data-v-81b33803] {
65
65
  background-color: var(--_rp-switch-color);
66
66
  }
67
- .rp-switch--invalid .rp-switch__track[data-v-d966892e] {
67
+ .rp-switch--invalid .rp-switch__track[data-v-81b33803] {
68
68
  outline: var(--rp-border-width-thin) solid var(--_rp-switch-invalid-border);
69
69
  outline-offset: var(--_rp-switch-thumb-offset);
70
70
  }
71
- .rp-switch--invalid .rp-switch__native:focus-visible + .rp-switch__track[data-v-d966892e] {
71
+ .rp-switch--invalid .rp-switch__native:focus-visible + .rp-switch__track[data-v-81b33803] {
72
72
  box-shadow: 0 0 0 var(--rp-border-width-medium) var(--_rp-switch-invalid-ring);
73
73
  }
74
- .rp-switch__thumb[data-v-d966892e] {
74
+ .rp-switch__thumb[data-v-81b33803] {
75
75
  position: absolute;
76
76
  left: var(--_rp-switch-thumb-offset);
77
77
  width: var(--_rp-switch-thumb-size);
@@ -81,38 +81,38 @@
81
81
  box-shadow: var(--rp-shadow-sm);
82
82
  transition: transform var(--rp-transition-fast);
83
83
  }
84
- .rp-switch--checked .rp-switch__thumb[data-v-d966892e] {
84
+ .rp-switch--checked .rp-switch__thumb[data-v-81b33803] {
85
85
  transform: translateX(calc(var(--_rp-switch-track-width) - var(--_rp-switch-thumb-size) - var(--_rp-switch-thumb-offset) * 2));
86
86
  }
87
- .rp-switch__label[data-v-d966892e] {
87
+ .rp-switch__label[data-v-81b33803] {
88
88
  line-height: var(--rp-line-height-md);
89
89
  color: var(--rp-color-text);
90
90
  }
91
- .rp-switch--size-xs[data-v-d966892e] {
91
+ .rp-switch--size-xs[data-v-81b33803] {
92
92
  --_rp-switch-default-track-width: 32px;
93
93
  --_rp-switch-default-track-height: 16px;
94
94
  --_rp-switch-default-thumb-size: 12px;
95
95
  --_rp-switch-font-size: var(--rp-font-size-xs);
96
96
  }
97
- .rp-switch--size-sm[data-v-d966892e] {
97
+ .rp-switch--size-sm[data-v-81b33803] {
98
98
  --_rp-switch-default-track-width: 38px;
99
99
  --_rp-switch-default-track-height: 20px;
100
100
  --_rp-switch-default-thumb-size: 14px;
101
101
  --_rp-switch-font-size: var(--rp-font-size-sm);
102
102
  }
103
- .rp-switch--size-md[data-v-d966892e] {
103
+ .rp-switch--size-md[data-v-81b33803] {
104
104
  --_rp-switch-default-track-width: 46px;
105
105
  --_rp-switch-default-track-height: 24px;
106
106
  --_rp-switch-default-thumb-size: 18px;
107
107
  --_rp-switch-font-size: var(--rp-font-size-md);
108
108
  }
109
- .rp-switch--size-lg[data-v-d966892e] {
109
+ .rp-switch--size-lg[data-v-81b33803] {
110
110
  --_rp-switch-default-track-width: 56px;
111
111
  --_rp-switch-default-track-height: 30px;
112
112
  --_rp-switch-default-thumb-size: 22px;
113
113
  --_rp-switch-font-size: var(--rp-font-size-lg);
114
114
  }
115
- .rp-switch--size-xl[data-v-d966892e] {
115
+ .rp-switch--size-xl[data-v-81b33803] {
116
116
  --_rp-switch-default-track-width: 72px;
117
117
  --_rp-switch-default-track-height: 36px;
118
118
  --_rp-switch-default-thumb-size: 28px;
package/dist/switch.js CHANGED
@@ -5,7 +5,7 @@ import { n as getComponentColorValue } from "./componentColors.js";
5
5
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
6
6
  import { o as useControllableValue, r as useCheckedFormControl } from "./useFormControl.js";
7
7
  import { t as useControlState } from "./useControlState.js";
8
- import { child, computed, createIf, createSlot, defineVaporComponent, next, ref, renderEffect, setDynamicProps, setInsertionState, setStaticTemplateRef, template, unref } from "vue";
8
+ import { child, computed, createIf, createSlot, defineVaporComponent, next, nextTick, ref, renderEffect, setDynamicProps, setInsertionState, setStaticTemplateRef, template, unref } from "vue";
9
9
  //#region src/components/switch/useSwitch.ts
10
10
  function getSwitchColorStyle(color) {
11
11
  const colorValue = getComponentColorValue(color);
@@ -23,7 +23,11 @@ function useSwitch(props, emitUpdate, getValue = () => props.modelValue ?? false
23
23
  }));
24
24
  const rootStyle = computed(() => getSwitchColorStyle(props.color));
25
25
  function onChange(e) {
26
- emitUpdate(e.target.checked);
26
+ const input = e.target;
27
+ emitUpdate(input.checked);
28
+ nextTick(() => {
29
+ input.checked = getValue();
30
+ });
27
31
  }
28
32
  function focus(options) {
29
33
  inputRef.value?.focus(options);
@@ -39,8 +43,8 @@ function useSwitch(props, emitUpdate, getValue = () => props.modelValue ?? false
39
43
  }
40
44
  //#endregion
41
45
  //#region src/components/switch/switch.vue?vue&type=script&setup=true&vapor=true&lang.ts
42
- var t0 = template("<span data-v-d966892e>");
43
- var t1 = template("<label data-v-d966892e><input data-v-d966892e><span data-v-d966892e><span data-v-d966892e></span></span>", 1);
46
+ var t0 = template("<span data-v-81b33803>");
47
+ var t1 = template("<label data-v-81b33803><input data-v-81b33803><span data-v-81b33803><span data-v-81b33803></span></span>", 1);
44
48
  //#endregion
45
49
  //#region src/components/switch/switch.vue
46
50
  var switch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -113,6 +117,7 @@ var switch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
113
117
  }),
114
118
  "data-disabled": presence(control.disabled),
115
119
  "data-invalid": presence(control.invalid),
120
+ "data-state": controllable.value.value ? "checked" : "unchecked",
116
121
  onChange(event) {
117
122
  onChange(event);
118
123
  attrs.onChange?.(event);
@@ -165,7 +170,7 @@ var switch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
165
170
  });
166
171
  return n7;
167
172
  }
168
- }), [["__scopeId", "data-v-d966892e"]]);
173
+ }), [["__scopeId", "data-v-81b33803"]]);
169
174
  //#endregion
170
175
  //#region src/components/switch/types.ts
171
176
  var switchParts = [
package/dist/toast.css CHANGED
@@ -132,7 +132,7 @@
132
132
  }
133
133
  }
134
134
  }@layer ropav.components {
135
- .rp-toast-viewport[data-v-e14bb4e0] {
135
+ .rp-toast-viewport[data-v-480d3e51] {
136
136
  --_rp-toast-viewport-shift-x: 0;
137
137
  --_rp-toast-viewport-shift-y: calc(var(--rp-spacing-3) * -1);
138
138
  position: fixed;
@@ -150,58 +150,58 @@
150
150
  list-style: none;
151
151
  pointer-events: none;
152
152
  }
153
- .rp-toast-viewport--top-left[data-v-e14bb4e0] {
153
+ .rp-toast-viewport--top-left[data-v-480d3e51] {
154
154
  --_rp-toast-viewport-shift-x: calc(var(--rp-spacing-3) * -1);
155
155
  --_rp-toast-viewport-shift-y: 0;
156
156
  top: 0;
157
157
  left: 0;
158
158
  }
159
- .rp-toast-viewport--top-center[data-v-e14bb4e0] {
159
+ .rp-toast-viewport--top-center[data-v-480d3e51] {
160
160
  top: 0;
161
161
  left: 50%;
162
162
  transform: translateX(-50%);
163
163
  }
164
- .rp-toast-viewport--top-right[data-v-e14bb4e0] {
164
+ .rp-toast-viewport--top-right[data-v-480d3e51] {
165
165
  --_rp-toast-viewport-shift-x: var(--rp-spacing-3);
166
166
  --_rp-toast-viewport-shift-y: 0;
167
167
  top: 0;
168
168
  right: 0;
169
169
  }
170
- .rp-toast-viewport--bottom-left[data-v-e14bb4e0] {
170
+ .rp-toast-viewport--bottom-left[data-v-480d3e51] {
171
171
  --_rp-toast-viewport-shift-x: calc(var(--rp-spacing-3) * -1);
172
172
  --_rp-toast-viewport-shift-y: 0;
173
173
  bottom: 0;
174
174
  left: 0;
175
175
  }
176
- .rp-toast-viewport--bottom-center[data-v-e14bb4e0] {
176
+ .rp-toast-viewport--bottom-center[data-v-480d3e51] {
177
177
  --_rp-toast-viewport-shift-y: var(--rp-spacing-3);
178
178
  bottom: 0;
179
179
  left: 50%;
180
180
  transform: translateX(-50%);
181
181
  }
182
- .rp-toast-viewport--bottom-right[data-v-e14bb4e0] {
182
+ .rp-toast-viewport--bottom-right[data-v-480d3e51] {
183
183
  --_rp-toast-viewport-shift-x: var(--rp-spacing-3);
184
184
  --_rp-toast-viewport-shift-y: 0;
185
185
  right: 0;
186
186
  bottom: 0;
187
187
  }
188
- .rp-toast-viewport__item[data-v-e14bb4e0] {
188
+ .rp-toast-viewport__item[data-v-480d3e51] {
189
189
  display: flex;
190
190
  width: 100%;
191
191
  flex: 0 0 auto;
192
192
  pointer-events: auto;
193
193
  }
194
- .rp-toast-viewport__item[data-v-e14bb4e0] .rp-toast {
194
+ .rp-toast-viewport__item[data-v-480d3e51] .rp-toast {
195
195
  width: 100%;
196
196
  }
197
- .rp-toast-viewport-item-enter-active[data-v-e14bb4e0],
198
- .rp-toast-viewport-item-leave-active[data-v-e14bb4e0] {
197
+ .rp-toast-viewport-item-enter-active[data-v-480d3e51],
198
+ .rp-toast-viewport-item-leave-active[data-v-480d3e51] {
199
199
  will-change: opacity, transform;
200
200
  }
201
- .rp-toast-viewport-item-enter-active[data-v-e14bb4e0] {
201
+ .rp-toast-viewport-item-enter-active[data-v-480d3e51] {
202
202
  transition: opacity 180ms ease-out, transform 240ms cubic-bezier(0.16, 1, 0.3, 1);
203
203
  }
204
- .rp-toast-viewport-item-leave-active[data-v-e14bb4e0] {
204
+ .rp-toast-viewport-item-leave-active[data-v-480d3e51] {
205
205
  position: absolute;
206
206
  right: var(--rp-spacing-4);
207
207
  left: var(--rp-spacing-4);
@@ -209,27 +209,27 @@
209
209
  pointer-events: none;
210
210
  transition: opacity 120ms ease-in, transform 180ms cubic-bezier(0.4, 0, 1, 1);
211
211
  }
212
- .rp-toast-viewport--empty .rp-toast-viewport-item-leave-active[data-v-e14bb4e0] {
212
+ .rp-toast-viewport--empty .rp-toast-viewport-item-leave-active[data-v-480d3e51] {
213
213
  position: relative;
214
214
  right: auto;
215
215
  left: auto;
216
216
  width: 100%;
217
217
  }
218
- .rp-toast-viewport-item-move[data-v-e14bb4e0] {
218
+ .rp-toast-viewport-item-move[data-v-480d3e51] {
219
219
  transition: transform 240ms cubic-bezier(0.16, 1, 0.3, 1);
220
220
  }
221
- .rp-toast-viewport-item-enter-from[data-v-e14bb4e0],
222
- .rp-toast-viewport-item-leave-to[data-v-e14bb4e0] {
221
+ .rp-toast-viewport-item-enter-from[data-v-480d3e51],
222
+ .rp-toast-viewport-item-leave-to[data-v-480d3e51] {
223
223
  opacity: 0;
224
224
  transform: translate3d(var(--_rp-toast-viewport-shift-x), var(--_rp-toast-viewport-shift-y), 0) scale(0.98);
225
225
  }
226
226
  @media (prefers-reduced-motion: reduce) {
227
- .rp-toast-viewport[data-v-e14bb4e0] {
227
+ .rp-toast-viewport[data-v-480d3e51] {
228
228
  scroll-behavior: auto;
229
229
  }
230
- .rp-toast-viewport-item-enter-active[data-v-e14bb4e0],
231
- .rp-toast-viewport-item-leave-active[data-v-e14bb4e0],
232
- .rp-toast-viewport-item-move[data-v-e14bb4e0] {
230
+ .rp-toast-viewport-item-enter-active[data-v-480d3e51],
231
+ .rp-toast-viewport-item-leave-active[data-v-480d3e51],
232
+ .rp-toast-viewport-item-move[data-v-480d3e51] {
233
233
  transition: none;
234
234
  }
235
235
  }
package/dist/toast.js CHANGED
@@ -4,6 +4,7 @@ import { t as bem } from "./bem.js";
4
4
  import { n as useStylesApi } from "./styles-api.js";
5
5
  import { i as getComponentVariantColorRoles, t as componentColors } from "./componentColors.js";
6
6
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
7
+ import { n as useOverlayZIndex } from "./useOverlayZIndex.js";
7
8
  import { r as useTeleportTarget } from "./useTeleportTarget.js";
8
9
  import { VaporTeleport, VaporTransition, VaporTransitionGroup, computed, createComponent, createFor, createIf, createInvoker, createSlot, defineVaporComponent, delegateEvents, extend, inject, nextTick, onBeforeUnmount, onMounted, provide, ref, renderEffect, setDynamicProps, setInsertionState, setText, template, toDisplayString, toValue, txt, unref, useSlots, watch } from "vue";
9
10
  //#region src/components/toast/defaults.ts
@@ -583,7 +584,7 @@ var toast_provider_default = /* @__PURE__ */ defineVaporComponent({
583
584
  });
584
585
  //#endregion
585
586
  //#region src/components/toast/toast-viewport.vue?vue&type=script&setup=true&vapor=true&lang.ts
586
- var t0 = template("<li data-v-e14bb4e0>");
587
+ var t0 = template("<li data-v-480d3e51>");
587
588
  //#endregion
588
589
  //#region src/components/toast/toast-viewport.vue
589
590
  var toast_viewport_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -593,6 +594,7 @@ var toast_viewport_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
593
594
  props: {
594
595
  position: { default: "top-right" },
595
596
  label: { default: "Notifications" },
597
+ baseZIndex: {},
596
598
  teleport: {
597
599
  type: Boolean,
598
600
  default: true
@@ -604,6 +606,11 @@ var toast_viewport_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
604
606
  setup(__props, { slots: $slots }) {
605
607
  const props = __props;
606
608
  const resolvedTeleportTo = useTeleportTarget(() => props.teleportTo);
609
+ const zIndex = useOverlayZIndex({
610
+ baseZIndex: () => props.baseZIndex,
611
+ defaultBaseZIndex: 1e3,
612
+ offset: 1
613
+ });
607
614
  const context = useToastContext("<ToastViewport>");
608
615
  function reverseToasts(toasts) {
609
616
  return toasts.map((_, index) => toasts[toasts.length - index - 1]);
@@ -616,6 +623,7 @@ var toast_viewport_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
616
623
  `rp-toast-viewport--${props.position}`,
617
624
  { "rp-toast-viewport--empty": orderedToasts.value.length === 0 }
618
625
  ],
626
+ style: { zIndex: zIndex.value },
619
627
  "data-position": props.position,
620
628
  "aria-label": props.label
621
629
  }));
@@ -689,7 +697,7 @@ var toast_viewport_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
689
697
  }, { _: 8 }));
690
698
  }, true);
691
699
  }
692
- }), [["__scopeId", "data-v-e14bb4e0"]]);
700
+ }), [["__scopeId", "data-v-480d3e51"]]);
693
701
  //#endregion
694
702
  //#region src/components/toast/useToastState.ts
695
703
  function optionValue(value) {
package/dist/tooltip.js CHANGED
@@ -3,6 +3,7 @@ import { t as bem } from "./bem.js";
3
3
  import { n as useStylesApi, t as presence } from "./styles-api.js";
4
4
  import { i as getComponentVariantColorRoles } from "./componentColors.js";
5
5
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
6
+ import { n as useOverlayZIndex } from "./useOverlayZIndex.js";
6
7
  import { n as useFloatingPosition, r as useFloatingTarget, t as isElementReference } from "./useFloatingPosition.js";
7
8
  import { n as useTeleportPositioningKey, r as useTeleportTarget } from "./useTeleportTarget.js";
8
9
  import { VaporTeleport, VaporTransition, applyVShow, computed, createComponent, createIf, createSlot, createTemplateRefSetter, defineVaporComponent, extend, onBeforeUnmount, ref, renderEffect, setAttr, setDynamicProps, setInsertionState, setStaticTemplateRef, setStyle, setText, template, toDisplayString, unref, useId, useSlots, watch } from "vue";
@@ -95,6 +96,10 @@ function useTooltip(props, emitOpenChange) {
95
96
  const teleportPositioningKey = useTeleportPositioningKey();
96
97
  const { isExplicitTarget, reference, resolvedTarget } = useFloatingTarget(() => props.target, rootRef);
97
98
  const targetElement = computed(() => isElementReference(resolvedTarget.value) ? resolvedTarget.value : null);
99
+ const zIndex = useOverlayZIndex({
100
+ baseZIndex: () => props.baseZIndex,
101
+ defaultBaseZIndex: 1e3
102
+ });
98
103
  const { isOpen, open, closeImmediate } = useDelayedOpen({
99
104
  open: () => props.open,
100
105
  openDelay: () => props.openDelay ?? 300,
@@ -135,7 +140,8 @@ function useTooltip(props, emitOpenChange) {
135
140
  const contentStyle = computed(() => ({
136
141
  ...floating.floatingStyle.value,
137
142
  ...resolveTooltipOffsetStyle(props.offset),
138
- ...resolveTooltipColorStyleWithContrast(props.color, props.autoContrast)
143
+ ...resolveTooltipColorStyleWithContrast(props.color, props.autoContrast),
144
+ zIndex: zIndex.value
139
145
  }));
140
146
  function openTooltip() {
141
147
  open();
@@ -218,6 +224,7 @@ var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
218
224
  __name: "tooltip",
219
225
  props: {
220
226
  id: {},
227
+ baseZIndex: {},
221
228
  content: { default: "" },
222
229
  color: {},
223
230
  autoContrast: { type: Boolean },
@@ -310,10 +317,7 @@ var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
310
317
  to: () => unref(teleportTo),
311
318
  disabled: () => !__props.teleport
312
319
  }, () => {
313
- return createComponent(VaporTransition, {
314
- name: "rp-tooltip-content",
315
- persisted: ""
316
- }, extend(() => {
320
+ return createComponent(VaporTransition, { name: "rp-tooltip-content" }, extend(() => {
317
321
  return createIf(() => unref(shouldRenderContent), () => {
318
322
  const n11 = t2();
319
323
  renderEffect(() => setDynamicProps(n11, [
@@ -0,0 +1,5 @@
1
+ export interface VaporIconCompiler {
2
+ compiler(svg: string, collection: string, icon: string): string;
3
+ }
4
+ /** An unplugin-icons compiler that emits zero-VDOM Vue Vapor components. */
5
+ export declare function vaporIconCompiler(): VaporIconCompiler;
@@ -0,0 +1,40 @@
1
+ import { compile } from "@vue/compiler-vapor";
2
+ //#region src/unplugin-icons.ts
3
+ var randomIdHelper = "const __randId = () => Math.random().toString(36).substr(2, 10);";
4
+ function handleSVGId(svg) {
5
+ if (!/="url\(#/.test(svg)) return {
6
+ svg,
7
+ injectScripts: ""
8
+ };
9
+ const idMap = {};
10
+ return {
11
+ svg: svg.replace(/\b([\w-]+)="url\(#(.+?)\)"/g, (_, attr, id) => {
12
+ idMap[id] = `'${id}':'uicons-'+__randId()`;
13
+ return `:${attr}="'url(#'+idMap['${id}']+')'"`;
14
+ }).replace(/\bid="(.+?)"/g, (full, id) => {
15
+ if (idMap[id]) return `:id="idMap['${id}']"`;
16
+ return full;
17
+ }),
18
+ injectScripts: `${randomIdHelper}const idMap = {${Object.values(idMap).join(",")}};`
19
+ };
20
+ }
21
+ /** An unplugin-icons compiler that emits zero-VDOM Vue Vapor components. */
22
+ function vaporIconCompiler() {
23
+ return { compiler(svg, collection, icon) {
24
+ const name = `${collection}-${icon}`;
25
+ const { injectScripts, svg: handled } = handleSVGId(svg);
26
+ let { code } = compile(handled, {
27
+ filename: `${name}.vue`,
28
+ prefixIdentifiers: true
29
+ });
30
+ code = code.replace(/^export /gm, "");
31
+ const setup = injectScripts ? `,\n setup() {${injectScripts};return { idMap }}` : "";
32
+ return `${code}
33
+ import { defineVaporComponent, markRaw } from 'vue';
34
+
35
+ export default markRaw(defineVaporComponent({ name: ${JSON.stringify(name)}, render${setup} }))
36
+ /* vite-plugin-components disabled */`;
37
+ } };
38
+ }
39
+ //#endregion
40
+ export { vaporIconCompiler };
@@ -33,7 +33,7 @@ function syncLayerZIndices(state) {
33
33
  for (const layer of state.layers) {
34
34
  const metadata = layerMetadata.get(layer);
35
35
  if (!metadata) continue;
36
- const zIndex = Math.max(metadata.baseZIndex, highestZIndex + 2);
36
+ const zIndex = Math.max(metadata.baseZIndex.value, highestZIndex + 2);
37
37
  metadata.setZIndex(zIndex);
38
38
  highestZIndex = zIndex;
39
39
  }
@@ -142,7 +142,8 @@ function useOverlayLayer(options) {
142
142
  const branchSet = /* @__PURE__ */ new Set();
143
143
  const focusBranchSet = /* @__PURE__ */ new Set();
144
144
  const insideBranchSet = /* @__PURE__ */ new Set();
145
- const zIndex = ref(options.baseZIndex ?? 100);
145
+ const baseZIndex = computed(() => toValue(options.baseZIndex ?? 100));
146
+ const zIndex = ref(baseZIndex.value);
146
147
  let registeredDocument = null;
147
148
  let registeredElement = null;
148
149
  let parentBranchCleanup;
@@ -194,7 +195,7 @@ function useOverlayLayer(options) {
194
195
  registerBranch
195
196
  };
196
197
  layerMetadata.set(context, {
197
- baseZIndex: options.baseZIndex ?? 100,
198
+ baseZIndex,
198
199
  parent,
199
200
  setZIndex(value) {
200
201
  zIndex.value = value;
@@ -241,6 +242,10 @@ function useOverlayLayer(options) {
241
242
  watch([modal, preventScroll], () => {
242
243
  if (registeredDocument) syncModalEffects(registeredDocument, getState(registeredDocument));
243
244
  });
245
+ watch(baseZIndex, (value) => {
246
+ if (registeredDocument) syncLayerZIndices(getState(registeredDocument));
247
+ else zIndex.value = value;
248
+ });
244
249
  onBeforeUnmount(unregister);
245
250
  provide(overlayLayerKey, context);
246
251
  return context;
@@ -258,5 +263,25 @@ function useOverlayLayerBranch(element, options = {}) {
258
263
  onBeforeUnmount(() => cleanup?.());
259
264
  return layer;
260
265
  }
266
+ function useParentOverlayLayer() {
267
+ return inject(overlayLayerKey, null);
268
+ }
269
+ //#endregion
270
+ //#region src/components/overlay/useOverlayZIndex.ts
271
+ var overlayZIndexKey = Symbol("overlay-z-index");
272
+ function provideOverlayZIndex(baseZIndex) {
273
+ const resolvedBaseZIndex = computed(() => toValue(baseZIndex));
274
+ provide(overlayZIndexKey, { baseZIndex: resolvedBaseZIndex });
275
+ return resolvedBaseZIndex;
276
+ }
277
+ function useOverlayZIndex(options = {}) {
278
+ const provided = inject(overlayZIndexKey, null);
279
+ const parentLayer = useParentOverlayLayer();
280
+ return computed(() => {
281
+ const resolvedZIndex = (toValue(options.baseZIndex) ?? provided?.baseZIndex.value ?? options.defaultBaseZIndex ?? 1e3) + (toValue(options.offset) ?? 0);
282
+ if (toValue(options.aboveParent) === false || !parentLayer) return resolvedZIndex;
283
+ return Math.max(resolvedZIndex, parentLayer.zIndex.value + 1);
284
+ });
285
+ }
261
286
  //#endregion
262
- export { useOverlayLayerBranch as n, useOverlayLayer as t };
287
+ export { useOverlayLayerBranch as i, useOverlayZIndex as n, useOverlayLayer as r, provideOverlayZIndex as t };
@@ -0,0 +1,65 @@
1
+ # Overlay layer z-index API
2
+
3
+ `OverlayLayerProvider` sets a shared z-index floor for Ropav portal surfaces in a Vue subtree.
4
+ Component props take precedence over the nearest provider, and components outside a provider keep
5
+ their existing defaults.
6
+
7
+ ```vue
8
+ <template>
9
+ <OverlayLayerProvider :base-z-index="5000">
10
+ <AppShell />
11
+ </OverlayLayerProvider>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import { OverlayLayerProvider } from 'ropav/overlay';
16
+ </script>
17
+ ```
18
+
19
+ The provider follows the logical Vue component tree, including content rendered through
20
+ `Teleport`. Providers can be nested to create a higher or lower floor for one subtree.
21
+
22
+ ## Component overrides
23
+
24
+ `DialogRoot`, `Modal`, `Popover`, `DropdownMenu`, `DropdownMenuRoot`, `Tooltip` and `ToastViewport`
25
+ accept `baseZIndex`. The resolution order is:
26
+
27
+ 1. The component's `baseZIndex` prop.
28
+ 2. The nearest `OverlayLayerProvider`.
29
+ 3. The component's legacy default.
30
+
31
+ Dialog, Popover and Dropdown layers may end up above the resolved floor because active managed
32
+ layers are ordered in two-unit steps. The unused plane immediately below a Dialog content layer is
33
+ reserved for its overlay. A top-level Tooltip uses the resolved floor, while a Tooltip nested in a
34
+ managed layer uses at least `parentZIndex + 1`. `ToastViewport` applies an offset of `1`.
35
+
36
+ Without a provider or local override, Dropdown and Popover start at `100`, Dialog and Tooltip start
37
+ at `1000`, and ToastViewport uses `1001`.
38
+
39
+ ## Custom portal surfaces
40
+
41
+ `useOverlayZIndex()` lets custom portal content resolve the same policy without joining Ropav's
42
+ focus, inert, dismissal or active-layer management.
43
+
44
+ ```vue
45
+ <script setup lang="ts">
46
+ import { useOverlayZIndex } from 'ropav/overlay';
47
+
48
+ const props = defineProps<{ baseZIndex?: number }>();
49
+ const zIndex = useOverlayZIndex({
50
+ baseZIndex: () => props.baseZIndex,
51
+ defaultBaseZIndex: 1000,
52
+ offset: 1,
53
+ });
54
+ </script>
55
+ ```
56
+
57
+ | Option | Default | Description |
58
+ | ------------------- | ------- | ------------------------------------------------------------------- |
59
+ | `baseZIndex` | — | Local value, ref or getter that overrides the provider. |
60
+ | `defaultBaseZIndex` | `1000` | Fallback used when neither a local value nor provider is available. |
61
+ | `offset` | `0` | Value, ref or getter added to the resolved base. |
62
+ | `aboveParent` | `true` | Ensures the result is at least one plane above a parent layer. |
63
+
64
+ Set `aboveParent: false` when the custom surface only needs the resolved floor. The returned
65
+ `ComputedRef<number>` updates when the local value, provider or parent layer changes.
@@ -26,7 +26,7 @@ Ropav does not expose a `vars` prop. Public CSS variables are set through CSS, t
26
26
 
27
27
  - Classes merge as internal classes, compatibility classes, `classNames`, then root `class` attributes.
28
28
  - Styles merge as internal styles, compatibility styles, `styles`, then root `style` attributes. Later stages win a duplicate property.
29
- - `Card.bodyClass`, `inputAttrs` styling and `thumbStyle` are compatibility stages. `Card.bodyClass` is deprecated; the other escape hatches remain because they also carry non-styling behavior.
29
+ - `inputAttrs` styling is a compatibility stage because this escape hatch also carries non-styling behavior.
30
30
  - Attributes and native listeners are forwarded exactly once to the public root host. Internal native handlers run before consumer handlers.
31
31
  - Declared component events remain component events. Component-owned roles, ARIA and behavioral attributes remain authoritative.
32
32
  - Composite components do not copy root attributes into their child components. Teleported roots receive attributes on the rendered host, not on the virtual teleport node.
@@ -64,7 +64,8 @@ Only independently useful semantic elements are public parts. Conditional parts
64
64
  | Radio | `root`, `input`, `indicator`, `label` |
65
65
  | RadioGroup | `root` |
66
66
  | Select | `root`, `trigger`, `value`, `indicator`, `clear`, `content`, `option`, `empty` |
67
- | Slider, RangeSlider | `root`, `label`, `value`, `track`, `range`, `input`, `thumb`, `mark`, `markLabel`, `tooltip` |
67
+ | Slider | `root`, `label`, `value`, `track`, `range`, `input`, `thumb`, `mark`, `markLabel`, `tooltip` |
68
+ | RangeSlider | `root`, `label`, `value`, `track`, `range`, `input`, `thumb`, `mark`, `markLabel`, `tooltip` |
68
69
  | Switch | `root`, `input`, `track`, `thumb`, `label` |
69
70
  | Tabs, TabsList, TabsTrigger, TabsContent | `root` on each component |
70
71
  | Textarea | `root`, `input` |
@@ -90,6 +91,8 @@ Boolean states use presence semantics: the attribute value is empty when true an
90
91
  - `data-selected`: Select options and ColorPicker swatches.
91
92
  - `data-highlighted`: Select options and DropdownMenu items.
92
93
  - `data-filled`: Slider and RangeSlider marks.
94
+ - `data-track-hovered` and `data-dragging`: Slider track pointer interaction.
95
+ - `data-thumb-visibility="always|interaction|hidden"`: Slider thumb visibility behavior.
93
96
  - `data-submenu`: DropdownMenu items that own children.
94
97
  - `data-orientation="horizontal|vertical"`: Accordion, ButtonGroup, RadioGroup, Slider, RangeSlider, Tabs and TabsList.
95
98
  - `data-placement`: the final placement after collision handling; twelve placements for Popover and DropdownMenu, and a side (`top`, `right`, `bottom`, `left`) for Tooltip.
@@ -120,8 +123,6 @@ The layered stylesheet declares `ropav.tokens` before `ropav.components`. A laye
120
123
 
121
124
  Place global resets in `reset` and application overrides in `app`. Import order does not change precedence once the order is declared. Unlayered application rules still outrank named Ropav layers.
122
125
 
123
- Layer adoption changes cascade precedence. Consumers whose reset cannot yet be layered can temporarily import `ropav/legacy-unlayered.css` after that reset. The aggregate fallback is deprecated from its introduction and is intended only as a migration aid.
124
-
125
126
  ## Compatibility
126
127
 
127
128
  - Typed parts, state attributes, manifest entries, geometry variables and cascade layers form the current Public Styles API.
@@ -130,5 +131,3 @@ Layer adoption changes cascade precedence. Consumers whose reset cannot yet be l
130
131
  - `tokens:check` compares the current manifest with the latest reachable `v*` release tag that contains one. Until the first such release, it uses the immutable manifest from the initial Public Styles API commit (`f16e826`). Released variables cannot be removed, renamed or changed semantically; adding a variable requires incrementing the manifest's `contractVersion`.
131
132
  - Release tags must be available in the Git checkout that runs the check. `PUBLIC_STYLES_BASELINE_REF` can explicitly pin a commit or tag that contains a manifest.
132
133
  - Internal DOM, selectors and undocumented variables are outside the public contract.
133
- - `Card.bodyClass` is a deprecated compatibility escape hatch; prefer `classNames.body`.
134
- - The legacy unlayered stylesheet is a temporary migration fallback for consumers that cannot yet adopt cascade layers.