ropav 0.0.13 → 0.1.1

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.
package/dist/modal.css CHANGED
@@ -1,5 +1,5 @@
1
1
  @layer ropav.components {
2
- .rp-modal[data-v-1a627831] {
2
+ .rp-modal[data-v-04a5d994] {
3
3
  --_rp-modal-width: 32rem;
4
4
  --_rp-modal-max-height: calc(100vh - var(--rp-spacing-12));
5
5
  --_rp-modal-radius: var(--rp-radius-sm);
@@ -13,25 +13,25 @@
13
13
  overflow: auto;
14
14
  font-family: var(--rp-font-family);
15
15
  }
16
- .rp-modal--size-sm[data-v-1a627831] {
16
+ .rp-modal--size-sm[data-v-04a5d994] {
17
17
  --_rp-modal-width: 22rem;
18
18
  }
19
- .rp-modal--size-lg[data-v-1a627831] {
19
+ .rp-modal--size-lg[data-v-04a5d994] {
20
20
  --_rp-modal-width: 45rem;
21
21
  }
22
- .rp-modal--size-xl[data-v-1a627831] {
22
+ .rp-modal--size-xl[data-v-04a5d994] {
23
23
  --_rp-modal-width: 58rem;
24
24
  }
25
- .rp-modal--size-full[data-v-1a627831] {
25
+ .rp-modal--size-full[data-v-04a5d994] {
26
26
  --_rp-modal-width: 100vw;
27
27
  --_rp-modal-max-height: 100vh;
28
28
  --_rp-modal-radius: var(--rp-radius-none);
29
29
  padding: 0;
30
30
  }
31
- .rp-modal__overlay[data-v-1a627831] {
31
+ .rp-modal__overlay[data-v-04a5d994] {
32
32
  border-radius: 0;
33
33
  }
34
- .rp-modal__panel[data-v-1a627831] {
34
+ .rp-modal__panel[data-v-04a5d994] {
35
35
  position: relative;
36
36
  z-index: 1;
37
37
  box-sizing: border-box;
@@ -47,39 +47,39 @@
47
47
  box-shadow: var(--rp-shadow-lg);
48
48
  outline: none;
49
49
  }
50
- .rp-modal--size-full .rp-modal__panel[data-v-1a627831] {
50
+ .rp-modal--size-full .rp-modal__panel[data-v-04a5d994] {
51
51
  min-height: 100vh;
52
52
  border: 0;
53
53
  }
54
- .rp-modal__header[data-v-1a627831] {
54
+ .rp-modal__header[data-v-04a5d994] {
55
55
  box-sizing: border-box;
56
56
  padding: var(--rp-spacing-5) calc(var(--rp-spacing-6) + var(--rp-size-control-sm)) var(--rp-spacing-4) var(--rp-spacing-5);
57
57
  border-bottom: var(--rp-border-width-thin) solid var(--rp-color-default-border);
58
58
  }
59
- .rp-modal__heading[data-v-1a627831] {
59
+ .rp-modal__heading[data-v-04a5d994] {
60
60
  display: grid;
61
61
  gap: var(--rp-spacing-1);
62
62
  }
63
- .rp-modal__title[data-v-1a627831] {
63
+ .rp-modal__title[data-v-04a5d994] {
64
64
  margin: 0;
65
65
  color: var(--rp-color-text);
66
66
  font-size: var(--rp-font-size-xl);
67
67
  font-weight: var(--rp-font-weight-semibold);
68
68
  line-height: var(--rp-line-height-xs);
69
69
  }
70
- .rp-modal__description[data-v-1a627831] {
70
+ .rp-modal__description[data-v-04a5d994] {
71
71
  margin: 0;
72
72
  color: var(--rp-color-dimmed);
73
73
  font-size: var(--rp-font-size-sm);
74
74
  line-height: var(--rp-line-height-md);
75
75
  }
76
- .rp-modal__close[data-v-1a627831] {
76
+ .rp-modal__close[data-v-04a5d994] {
77
77
  position: absolute;
78
78
  top: var(--rp-spacing-3);
79
79
  right: var(--rp-spacing-3);
80
80
  z-index: 1;
81
81
  }
82
- .rp-modal__body[data-v-1a627831] {
82
+ .rp-modal__body[data-v-04a5d994] {
83
83
  box-sizing: border-box;
84
84
  flex: 1 1 auto;
85
85
  min-height: 0;
@@ -89,10 +89,10 @@
89
89
  font-size: var(--rp-font-size-md);
90
90
  line-height: var(--rp-line-height-md);
91
91
  }
92
- .rp-modal--closable.rp-modal--headerless .rp-modal__body[data-v-1a627831] {
92
+ .rp-modal--closable.rp-modal--headerless .rp-modal__body[data-v-04a5d994] {
93
93
  padding-right: calc(var(--rp-spacing-6) + var(--rp-size-control-sm));
94
94
  }
95
- .rp-modal__footer[data-v-1a627831] {
95
+ .rp-modal__footer[data-v-04a5d994] {
96
96
  box-sizing: border-box;
97
97
  display: flex;
98
98
  flex: 0 0 auto;
@@ -102,34 +102,34 @@
102
102
  padding: var(--rp-spacing-4) var(--rp-spacing-5);
103
103
  border-top: var(--rp-border-width-thin) solid var(--rp-color-default-border);
104
104
  }
105
- .rp-modal-enter-active[data-v-1a627831],
106
- .rp-modal-leave-active[data-v-1a627831] {
105
+ .rp-modal-enter-active[data-v-04a5d994],
106
+ .rp-modal-leave-active[data-v-04a5d994] {
107
107
  transition: opacity var(--rp-transition-fast);
108
108
  }
109
- .rp-modal-enter-active .rp-modal__panel[data-v-1a627831],
110
- .rp-modal-leave-active .rp-modal__panel[data-v-1a627831] {
109
+ .rp-modal-enter-active .rp-modal__panel[data-v-04a5d994],
110
+ .rp-modal-leave-active .rp-modal__panel[data-v-04a5d994] {
111
111
  transition: opacity var(--rp-transition-fast), transform var(--rp-transition-fast);
112
112
  }
113
- .rp-modal-enter-from[data-v-1a627831],
114
- .rp-modal-leave-to[data-v-1a627831] {
113
+ .rp-modal-enter-from[data-v-04a5d994],
114
+ .rp-modal-leave-to[data-v-04a5d994] {
115
115
  opacity: 0;
116
116
  }
117
- .rp-modal-enter-from .rp-modal__panel[data-v-1a627831],
118
- .rp-modal-leave-to .rp-modal__panel[data-v-1a627831] {
117
+ .rp-modal-enter-from .rp-modal__panel[data-v-04a5d994],
118
+ .rp-modal-leave-to .rp-modal__panel[data-v-04a5d994] {
119
119
  opacity: 0;
120
120
  transform: translateY(var(--rp-spacing-2)) scale(0.98);
121
121
  }
122
122
  @media (max-width: 480px) {
123
- .rp-modal[data-v-1a627831] {
123
+ .rp-modal[data-v-04a5d994] {
124
124
  padding: var(--rp-spacing-3);
125
125
  }
126
- .rp-modal__header[data-v-1a627831] {
126
+ .rp-modal__header[data-v-04a5d994] {
127
127
  padding-left: var(--rp-spacing-4);
128
128
  }
129
- .rp-modal__body[data-v-1a627831] {
129
+ .rp-modal__body[data-v-04a5d994] {
130
130
  padding: var(--rp-spacing-4);
131
131
  }
132
- .rp-modal__footer[data-v-1a627831] {
132
+ .rp-modal__footer[data-v-04a5d994] {
133
133
  padding: var(--rp-spacing-4);
134
134
  }
135
135
  }
package/dist/modal.js CHANGED
@@ -106,8 +106,8 @@ function useModal(props, emit = {}) {
106
106
  //#endregion
107
107
  //#region src/components/modal/modal.vue?vue&type=script&setup=true&vapor=true&lang.ts
108
108
  var t0 = template(" ");
109
- var t1 = template("<div data-v-1a627831 class=rp-modal__heading>");
110
- var t2 = template("<div data-v-1a627831>");
109
+ var t1 = template("<div data-v-04a5d994 class=rp-modal__heading>");
110
+ var t2 = template("<div data-v-04a5d994>");
111
111
  //#endregion
112
112
  //#region src/components/modal/modal.vue
113
113
  var modal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -120,6 +120,7 @@ var modal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
120
120
  type: Boolean,
121
121
  default: void 0
122
122
  },
123
+ baseZIndex: {},
123
124
  title: { default: "" },
124
125
  description: { default: "" },
125
126
  ariaLabel: { default: "" },
@@ -196,6 +197,7 @@ var modal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
196
197
  const closeStyles = computed(() => ({ root: props.styles?.close }));
197
198
  return createComponent(unref(dialog_root_default), {
198
199
  open: () => unref(isOpen),
200
+ "base-z-index": () => __props.baseZIndex,
199
201
  modal: () => __props.modal,
200
202
  "close-on-escape": () => __props.closeOnEscape,
201
203
  "close-on-outside-click": () => __props.closeOnOverlayClick,
@@ -310,7 +312,7 @@ var modal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
310
312
  });
311
313
  }, true);
312
314
  }
313
- }), [["__scopeId", "data-v-1a627831"]]);
315
+ }), [["__scopeId", "data-v-04a5d994"]]);
314
316
  //#endregion
315
317
  //#region src/components/modal/types.ts
316
318
  var modalParts = [
package/dist/overlay2.js CHANGED
@@ -1,4 +1,19 @@
1
+ import { t as provideOverlayZIndex } from "./useOverlayZIndex.js";
2
+ import { createSlot, defineVaporComponent } from "vue";
3
+ //#endregion
4
+ //#region src/components/overlay/overlay-layer-provider.vue
5
+ var overlay_layer_provider_default = /* @__PURE__ */ defineVaporComponent({
6
+ name: "RpOverlayLayerProvider",
7
+ __name: "overlay-layer-provider",
8
+ props: { baseZIndex: {} },
9
+ setup(__props) {
10
+ const props = __props;
11
+ provideOverlayZIndex(() => props.baseZIndex);
12
+ return createSlot();
13
+ }
14
+ });
15
+ //#endregion
1
16
  //#region src/components/overlay/types.ts
2
17
  var overlayParts = ["root"];
3
18
  //#endregion
4
- export { overlayParts as t };
19
+ export { overlay_layer_provider_default as n, overlayParts as t };
package/dist/popover.js CHANGED
@@ -2,7 +2,7 @@ import './popover.css';
2
2
  import { t as bem } from "./bem.js";
3
3
  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
- import { t as useOverlayLayer } from "./useOverlayLayer.js";
5
+ import { n as useOverlayZIndex, r as useOverlayLayer } from "./useOverlayZIndex.js";
6
6
  import { t as useFocusTrap } from "./useFocusTrap.js";
7
7
  import { n as useFloatingPosition, r as useFloatingTarget, t as isElementReference } from "./useFloatingPosition.js";
8
8
  import { n as useTeleportPositioningKey, r as useTeleportTarget } from "./useTeleportTarget.js";
@@ -70,7 +70,11 @@ function usePopover(props, emitOpenChange) {
70
70
  const layer = useOverlayLayer({
71
71
  active: isVisible,
72
72
  element: contentRef,
73
- baseZIndex: 100
73
+ baseZIndex: useOverlayZIndex({
74
+ baseZIndex: () => props.baseZIndex,
75
+ defaultBaseZIndex: 100,
76
+ aboveParent: false
77
+ })
74
78
  });
75
79
  const shouldRenderContent = computed(() => !isDisabled.value && (Boolean(props.keepMounted) || isVisible.value));
76
80
  const shouldShowContent = computed(() => !props.keepMounted || isVisible.value);
@@ -303,6 +307,7 @@ var popover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
303
307
  __name: "popover",
304
308
  props: {
305
309
  id: {},
310
+ baseZIndex: {},
306
311
  contentClass: {},
307
312
  open: {
308
313
  type: Boolean,
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 },
@@ -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 and `thumbStyle` are compatibility stages because these escape hatches also carry 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.
@@ -120,8 +120,6 @@ The layered stylesheet declares `ropav.tokens` before `ropav.components`. A laye
120
120
 
121
121
  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
122
 
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
123
  ## Compatibility
126
124
 
127
125
  - Typed parts, state attributes, manifest entries, geometry variables and cascade layers form the current Public Styles API.
@@ -130,5 +128,3 @@ Layer adoption changes cascade precedence. Consumers whose reset cannot yet be l
130
128
  - `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
129
  - 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
130
  - 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.