ropav 0.0.6 → 0.0.8

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 (123) hide show
  1. package/dist/_plugin-vue_export-helper.js +1 -11
  2. package/dist/accordion.css +112 -0
  3. package/dist/accordion.js +358 -0
  4. package/dist/badge.css +169 -0
  5. package/dist/badge.js +101 -0
  6. package/dist/bem.js +9 -0
  7. package/dist/button-group.css +8 -8
  8. package/dist/button-group.js +2 -3
  9. package/dist/button.js +3 -4
  10. package/dist/card.css +40 -20
  11. package/dist/card.js +71 -39
  12. package/dist/checkbox.js +2 -3
  13. package/dist/collapse.css +32 -0
  14. package/dist/collapse.js +62 -0
  15. package/dist/componentColors.js +0 -2
  16. package/dist/components/accordion/accordion-item.d.ts +40 -0
  17. package/dist/components/accordion/accordion.d.ts +23 -0
  18. package/dist/components/accordion/index.d.ts +4 -0
  19. package/dist/components/accordion/index.js +2 -0
  20. package/dist/components/accordion/types.d.ts +100 -0
  21. package/dist/components/accordion/useAccordion.d.ts +3 -0
  22. package/dist/components/badge/badge.d.ts +25 -0
  23. package/dist/components/badge/index.d.ts +3 -0
  24. package/dist/components/badge/index.js +2 -0
  25. package/dist/components/badge/types.d.ts +16 -0
  26. package/dist/components/badge/useBadgeColor.d.ts +8 -0
  27. package/dist/components/card/card.d.ts +4 -0
  28. package/dist/components/card/types.d.ts +4 -0
  29. package/dist/components/collapse/collapse.d.ts +36 -0
  30. package/dist/components/collapse/index.d.ts +3 -0
  31. package/dist/components/collapse/index.js +3 -0
  32. package/dist/components/collapse/types.d.ts +74 -0
  33. package/dist/components/collapse/useCollapse.d.ts +2 -0
  34. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +16 -0
  35. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +23 -0
  36. package/dist/components/dropdown-menu/dropdown-menu.d.ts +26 -0
  37. package/dist/components/dropdown-menu/index.d.ts +3 -0
  38. package/dist/components/dropdown-menu/index.js +2 -0
  39. package/dist/components/dropdown-menu/types.d.ts +104 -0
  40. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +32 -0
  41. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +30 -0
  42. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +28 -0
  43. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +24 -0
  44. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +51 -0
  45. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +16 -0
  46. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +25 -0
  47. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +18 -0
  48. package/dist/components/field/field.d.ts +2 -2
  49. package/dist/components/field/useField.d.ts +17 -0
  50. package/dist/components/input/useInput.d.ts +8 -0
  51. package/dist/components/modal/index.d.ts +2 -0
  52. package/dist/components/modal/index.js +2 -0
  53. package/dist/components/modal/modal.d.ts +42 -0
  54. package/dist/components/modal/types.d.ts +31 -0
  55. package/dist/components/modal/useModal.d.ts +29 -0
  56. package/dist/components/overlay/index.d.ts +2 -0
  57. package/dist/components/overlay/index.js +2 -0
  58. package/dist/components/overlay/overlay.d.ts +19 -0
  59. package/dist/components/overlay/types.d.ts +12 -0
  60. package/dist/components/overlay/useOverlay.d.ts +7 -0
  61. package/dist/components/popover/index.d.ts +2 -0
  62. package/dist/components/popover/index.js +2 -0
  63. package/dist/components/popover/popover.d.ts +43 -0
  64. package/dist/components/popover/types.d.ts +43 -0
  65. package/dist/components/popover/usePopover.d.ts +23 -0
  66. package/dist/components/tabs/index.d.ts +6 -0
  67. package/dist/components/tabs/index.js +2 -0
  68. package/dist/components/tabs/tabs-content.d.ts +24 -0
  69. package/dist/components/tabs/tabs-list.d.ts +26 -0
  70. package/dist/components/tabs/tabs-trigger.d.ts +29 -0
  71. package/dist/components/tabs/tabs.d.ts +31 -0
  72. package/dist/components/tabs/types.d.ts +160 -0
  73. package/dist/components/tabs/useTabs.d.ts +5 -0
  74. package/dist/dropdown-menu.css +159 -0
  75. package/dist/dropdown-menu.js +901 -0
  76. package/dist/field.css +11 -8
  77. package/dist/field.js +93 -52
  78. package/dist/icon-button.css +1 -1
  79. package/dist/icon-button.js +3 -4
  80. package/dist/index.d.ts +8 -0
  81. package/dist/index.js +12 -1
  82. package/dist/input.css +25 -25
  83. package/dist/input.js +57 -40
  84. package/dist/modal.css +134 -0
  85. package/dist/modal.js +427 -0
  86. package/dist/overlay.css +28 -0
  87. package/dist/overlay.js +82 -0
  88. package/dist/popover.css +75 -0
  89. package/dist/popover.js +377 -0
  90. package/dist/progress.js +2 -3
  91. package/dist/radio.js +4 -11
  92. package/dist/select.js +8 -39
  93. package/dist/slider.js +2 -3
  94. package/dist/switch.js +2 -3
  95. package/dist/tabs.css +279 -0
  96. package/dist/tabs.js +513 -0
  97. package/dist/textarea.js +2 -3
  98. package/dist/tooltip.js +2 -3
  99. package/dist/useButtonColor.js +0 -2
  100. package/dist/useClickOutside.js +24 -0
  101. package/dist/useCollapse.js +92 -0
  102. package/dist/useControlState.js +0 -2
  103. package/dist/useRequiredInject.js +9 -0
  104. package/dist/x.js +12 -0
  105. package/package.json +40 -4
  106. package/dist/_plugin-vue_export-helper.js.map +0 -1
  107. package/dist/button-group.js.map +0 -1
  108. package/dist/button.js.map +0 -1
  109. package/dist/card.js.map +0 -1
  110. package/dist/checkbox.js.map +0 -1
  111. package/dist/componentColors.js.map +0 -1
  112. package/dist/field.js.map +0 -1
  113. package/dist/icon-button.js.map +0 -1
  114. package/dist/input.js.map +0 -1
  115. package/dist/progress.js.map +0 -1
  116. package/dist/radio.js.map +0 -1
  117. package/dist/select.js.map +0 -1
  118. package/dist/slider.js.map +0 -1
  119. package/dist/switch.js.map +0 -1
  120. package/dist/textarea.js.map +0 -1
  121. package/dist/tooltip.js.map +0 -1
  122. package/dist/useButtonColor.js.map +0 -1
  123. package/dist/useControlState.js.map +0 -1
package/dist/modal.css ADDED
@@ -0,0 +1,134 @@
1
+ .rp-modal[data-v-657f313d] {
2
+ --_rp-modal-width: 32rem;
3
+ --_rp-modal-max-height: calc(100vh - var(--rp-spacing-12));
4
+ --_rp-modal-radius: var(--rp-radius-sm);
5
+ position: fixed;
6
+ inset: 0;
7
+ z-index: 1000;
8
+ box-sizing: border-box;
9
+ display: grid;
10
+ place-items: center;
11
+ padding: var(--rp-spacing-6);
12
+ overflow: auto;
13
+ font-family: var(--rp-font-family);
14
+ }
15
+ .rp-modal--size-sm[data-v-657f313d] {
16
+ --_rp-modal-width: 22rem;
17
+ }
18
+ .rp-modal--size-lg[data-v-657f313d] {
19
+ --_rp-modal-width: 45rem;
20
+ }
21
+ .rp-modal--size-xl[data-v-657f313d] {
22
+ --_rp-modal-width: 58rem;
23
+ }
24
+ .rp-modal--size-full[data-v-657f313d] {
25
+ --_rp-modal-width: 100vw;
26
+ --_rp-modal-max-height: 100vh;
27
+ --_rp-modal-radius: var(--rp-radius-none);
28
+ padding: 0;
29
+ }
30
+ .rp-modal__overlay[data-v-657f313d] {
31
+ border-radius: 0;
32
+ }
33
+ .rp-modal__panel[data-v-657f313d] {
34
+ position: relative;
35
+ z-index: 1;
36
+ box-sizing: border-box;
37
+ display: flex;
38
+ flex-direction: column;
39
+ width: min(var(--_rp-modal-width), 100%);
40
+ max-height: var(--_rp-modal-max-height);
41
+ color: var(--rp-color-text);
42
+ overflow: hidden;
43
+ background-color: var(--rp-color-surface-raised);
44
+ border: var(--rp-border-width-thin) solid var(--rp-color-border);
45
+ border-radius: var(--_rp-modal-radius);
46
+ box-shadow: var(--rp-shadow-lg);
47
+ outline: none;
48
+ }
49
+ .rp-modal--size-full .rp-modal__panel[data-v-657f313d] {
50
+ min-height: 100vh;
51
+ border: 0;
52
+ }
53
+ .rp-modal__header[data-v-657f313d] {
54
+ box-sizing: border-box;
55
+ padding: var(--rp-spacing-5) calc(var(--rp-spacing-6) + var(--rp-size-control-sm)) var(--rp-spacing-4) var(--rp-spacing-5);
56
+ border-bottom: var(--rp-border-width-thin) solid var(--rp-color-border);
57
+ }
58
+ .rp-modal__heading[data-v-657f313d] {
59
+ display: grid;
60
+ gap: var(--rp-spacing-1);
61
+ }
62
+ .rp-modal__title[data-v-657f313d] {
63
+ margin: 0;
64
+ color: var(--rp-color-text);
65
+ font-size: var(--rp-font-size-xl);
66
+ font-weight: var(--rp-font-weight-semibold);
67
+ line-height: var(--rp-line-height-tight);
68
+ }
69
+ .rp-modal__description[data-v-657f313d] {
70
+ margin: 0;
71
+ color: var(--rp-color-text-secondary);
72
+ font-size: var(--rp-font-size-sm);
73
+ line-height: var(--rp-line-height-normal);
74
+ }
75
+ .rp-modal__close[data-v-657f313d] {
76
+ position: absolute;
77
+ top: var(--rp-spacing-3);
78
+ right: var(--rp-spacing-3);
79
+ z-index: 1;
80
+ }
81
+ .rp-modal__body[data-v-657f313d] {
82
+ box-sizing: border-box;
83
+ flex: 1 1 auto;
84
+ min-height: 0;
85
+ padding: var(--rp-spacing-5);
86
+ overflow: auto;
87
+ color: var(--rp-color-text);
88
+ font-size: var(--rp-font-size-base);
89
+ line-height: var(--rp-line-height-normal);
90
+ }
91
+ .rp-modal--closable.rp-modal--headerless .rp-modal__body[data-v-657f313d] {
92
+ padding-right: calc(var(--rp-spacing-6) + var(--rp-size-control-sm));
93
+ }
94
+ .rp-modal__footer[data-v-657f313d] {
95
+ box-sizing: border-box;
96
+ display: flex;
97
+ flex: 0 0 auto;
98
+ flex-wrap: wrap;
99
+ gap: var(--rp-spacing-2);
100
+ justify-content: flex-end;
101
+ padding: var(--rp-spacing-4) var(--rp-spacing-5);
102
+ border-top: var(--rp-border-width-thin) solid var(--rp-color-border);
103
+ }
104
+ .rp-modal-enter-active[data-v-657f313d],
105
+ .rp-modal-leave-active[data-v-657f313d] {
106
+ transition: opacity var(--rp-transition-fast);
107
+ }
108
+ .rp-modal-enter-active .rp-modal__panel[data-v-657f313d],
109
+ .rp-modal-leave-active .rp-modal__panel[data-v-657f313d] {
110
+ transition: opacity var(--rp-transition-fast), transform var(--rp-transition-fast);
111
+ }
112
+ .rp-modal-enter-from[data-v-657f313d],
113
+ .rp-modal-leave-to[data-v-657f313d] {
114
+ opacity: 0;
115
+ }
116
+ .rp-modal-enter-from .rp-modal__panel[data-v-657f313d],
117
+ .rp-modal-leave-to .rp-modal__panel[data-v-657f313d] {
118
+ opacity: 0;
119
+ transform: translateY(var(--rp-spacing-2)) scale(0.98);
120
+ }
121
+ @media (max-width: 480px) {
122
+ .rp-modal[data-v-657f313d] {
123
+ padding: var(--rp-spacing-3);
124
+ }
125
+ .rp-modal__header[data-v-657f313d] {
126
+ padding-left: var(--rp-spacing-4);
127
+ }
128
+ .rp-modal__body[data-v-657f313d] {
129
+ padding: var(--rp-spacing-4);
130
+ }
131
+ .rp-modal__footer[data-v-657f313d] {
132
+ padding: var(--rp-spacing-4);
133
+ }
134
+ }
package/dist/modal.js ADDED
@@ -0,0 +1,427 @@
1
+ import './modal.css';
2
+ import { t as bem } from "./bem.js";
3
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
4
+ import { t as icon_button_default } from "./icon-button.js";
5
+ import { t as x_default } from "./x.js";
6
+ import { t as overlay_default } from "./overlay.js";
7
+ import { VaporTransition, applyVShow, child, computed, createComponent, createIf, createSlot, createTemplateRefSetter, defineVaporComponent, extend, isRef, nextTick, onBeforeUnmount, onMounted, ref, renderEffect, setAttr, setClass, setInsertionState, setProp, setStyle, setText, template, toDisplayString, txt, unref, useId, useSlots, watch } from "vue";
8
+ //#region src/components/modal/useModal.ts
9
+ var bodyScrollLockCount = 0;
10
+ var previousBodyOverflow = "";
11
+ var activeModalStack = [];
12
+ var DEFAULT_ROLE = "dialog";
13
+ var DEFAULT_SIZE = "md";
14
+ var FOCUSABLE_SELECTOR = [
15
+ "a[href]",
16
+ "button:not([disabled])",
17
+ "textarea:not([disabled])",
18
+ "input:not([disabled])",
19
+ "select:not([disabled])",
20
+ "[tabindex]:not([tabindex=\"-1\"])"
21
+ ].join(",");
22
+ var MODAL_PRESET_SIZES = /* @__PURE__ */ new Set([
23
+ "sm",
24
+ "md",
25
+ "lg",
26
+ "xl",
27
+ "full"
28
+ ]);
29
+ function isHTMLElement(value) {
30
+ return typeof HTMLElement !== "undefined" && value instanceof HTMLElement;
31
+ }
32
+ function isModalPresetSize(size) {
33
+ return MODAL_PRESET_SIZES.has(size);
34
+ }
35
+ function isFocusable(element) {
36
+ if (element.getAttribute("aria-hidden") === "true") return false;
37
+ if (element.hasAttribute("disabled")) return false;
38
+ return element.tabIndex >= 0;
39
+ }
40
+ function getFocusableElements(panel) {
41
+ if (!panel) return [];
42
+ return [...panel.querySelectorAll(FOCUSABLE_SELECTOR)].filter(isFocusable);
43
+ }
44
+ function focusElement(element) {
45
+ if (!element) return;
46
+ try {
47
+ element.focus({ preventScroll: true });
48
+ } catch {
49
+ element.focus();
50
+ }
51
+ }
52
+ function lockBodyScroll() {
53
+ if (typeof document === "undefined") return void 0;
54
+ if (bodyScrollLockCount === 0) {
55
+ previousBodyOverflow = document.body.style.overflow;
56
+ document.body.style.overflow = "hidden";
57
+ }
58
+ bodyScrollLockCount += 1;
59
+ return () => {
60
+ bodyScrollLockCount = Math.max(0, bodyScrollLockCount - 1);
61
+ if (bodyScrollLockCount === 0) document.body.style.overflow = previousBodyOverflow;
62
+ };
63
+ }
64
+ function readInitialFocus(initialFocus) {
65
+ return isRef(initialFocus) ? initialFocus.value : initialFocus;
66
+ }
67
+ function queryPanelElement(panel, selector) {
68
+ try {
69
+ const element = panel.querySelector(selector);
70
+ return isHTMLElement(element) ? element : null;
71
+ } catch {
72
+ return null;
73
+ }
74
+ }
75
+ function useModal(props, emitOpenChange) {
76
+ const slots = useSlots();
77
+ const generatedId = useId();
78
+ const panelRef = ref(null);
79
+ const uncontrolledOpen = ref(false);
80
+ const modalToken = Symbol("modal");
81
+ let isMounted = false;
82
+ let isActiveModal = false;
83
+ let previousActiveElement = null;
84
+ let removeDocumentListeners;
85
+ let unlockScroll;
86
+ const modalId = computed(() => props.id ?? `${generatedId}-modal`);
87
+ const titleId = computed(() => `${modalId.value}-title`);
88
+ const descriptionId = computed(() => `${modalId.value}-description`);
89
+ const role = computed(() => props.role ?? DEFAULT_ROLE);
90
+ const size = computed(() => props.size || DEFAULT_SIZE);
91
+ const isPresetSize = computed(() => isModalPresetSize(size.value));
92
+ const isOpen = computed(() => props.open ?? uncontrolledOpen.value);
93
+ const shouldRender = computed(() => Boolean(props.keepMounted || isOpen.value));
94
+ const hasCustomHeader = computed(() => Boolean(slots.header));
95
+ const hasHeader = computed(() => Boolean(hasCustomHeader.value || props.title || props.description));
96
+ const hasFooter = computed(() => Boolean(slots.footer));
97
+ const showCloseButton = computed(() => props.showCloseButton);
98
+ const headerId = computed(() => hasCustomHeader.value && !props.ariaLabel ? titleId.value : void 0);
99
+ const ariaLabelledby = computed(() => {
100
+ if (props.ariaLabel) return void 0;
101
+ return hasCustomHeader.value || props.title ? titleId.value : void 0;
102
+ });
103
+ const ariaDescribedby = computed(() => props.description && !hasCustomHeader.value ? descriptionId.value : void 0);
104
+ const ariaLabel = computed(() => ariaLabelledby.value ? void 0 : props.ariaLabel || void 0);
105
+ const rootClass = computed(() => bem("rp-modal", {
106
+ [`size-${size.value}`]: isPresetSize.value,
107
+ "size-custom": !isPresetSize.value,
108
+ open: isOpen.value
109
+ }));
110
+ const rootStyle = computed(() => {
111
+ if (isPresetSize.value) return void 0;
112
+ return { "--_rp-modal-width": size.value };
113
+ });
114
+ const stateClass = computed(() => ({
115
+ "rp-modal--closable": showCloseButton.value,
116
+ "rp-modal--headerless": !hasHeader.value
117
+ }));
118
+ const slotProps = computed(() => ({
119
+ isOpen: isOpen.value,
120
+ open: openModal,
121
+ close: closeModal,
122
+ toggle: toggleModal
123
+ }));
124
+ function setOpen(nextOpen) {
125
+ if (nextOpen === isOpen.value) return;
126
+ if (props.open === void 0) uncontrolledOpen.value = nextOpen;
127
+ emitOpenChange?.(nextOpen);
128
+ }
129
+ function openModal() {
130
+ setOpen(true);
131
+ }
132
+ function closeModal() {
133
+ setOpen(false);
134
+ }
135
+ function toggleModal() {
136
+ setOpen(!isOpen.value);
137
+ }
138
+ function resolveInitialFocus() {
139
+ const initialFocus = readInitialFocus(props.initialFocus);
140
+ const panel = panelRef.value;
141
+ if (!initialFocus || !panel) return null;
142
+ if (typeof initialFocus === "string") return queryPanelElement(panel, initialFocus);
143
+ return panel.contains(initialFocus) ? initialFocus : null;
144
+ }
145
+ function focusInitialElement() {
146
+ const firstFocusable = getFocusableElements(panelRef.value)[0];
147
+ focusElement(resolveInitialFocus() ?? firstFocusable ?? panelRef.value);
148
+ }
149
+ function addToStack() {
150
+ if (!activeModalStack.includes(modalToken)) activeModalStack.push(modalToken);
151
+ }
152
+ function removeFromStack() {
153
+ const index = activeModalStack.indexOf(modalToken);
154
+ if (index !== -1) activeModalStack.splice(index, 1);
155
+ }
156
+ function isTopModal() {
157
+ return activeModalStack[activeModalStack.length - 1] === modalToken;
158
+ }
159
+ function trapFocus(event) {
160
+ const panel = panelRef.value;
161
+ if (!panel) return;
162
+ const focusableElements = getFocusableElements(panel);
163
+ if (focusableElements.length === 0) {
164
+ event.preventDefault();
165
+ focusElement(panel);
166
+ return;
167
+ }
168
+ const firstElement = focusableElements[0];
169
+ const lastElement = focusableElements[focusableElements.length - 1];
170
+ const activeElement = document.activeElement;
171
+ if (!(activeElement instanceof Node && panel.contains(activeElement))) {
172
+ event.preventDefault();
173
+ focusElement(firstElement);
174
+ return;
175
+ }
176
+ if (event.shiftKey && activeElement === firstElement) {
177
+ event.preventDefault();
178
+ focusElement(lastElement);
179
+ return;
180
+ }
181
+ if (!event.shiftKey && activeElement === lastElement) {
182
+ event.preventDefault();
183
+ focusElement(firstElement);
184
+ }
185
+ }
186
+ function onDocumentKeydown(event) {
187
+ if (!isOpen.value || !isTopModal()) return;
188
+ if (event.key === "Escape") {
189
+ if (props.closeOnEscape === false) return;
190
+ event.preventDefault();
191
+ closeModal();
192
+ return;
193
+ }
194
+ if (event.key === "Tab") trapFocus(event);
195
+ }
196
+ function bindDocumentListeners() {
197
+ if (typeof document === "undefined" || removeDocumentListeners) return;
198
+ document.addEventListener("keydown", onDocumentKeydown);
199
+ removeDocumentListeners = () => {
200
+ document.removeEventListener("keydown", onDocumentKeydown);
201
+ removeDocumentListeners = void 0;
202
+ };
203
+ }
204
+ function restoreFocus() {
205
+ if (props.returnFocus === false) {
206
+ previousActiveElement = null;
207
+ return;
208
+ }
209
+ if (previousActiveElement?.isConnected) focusElement(previousActiveElement);
210
+ previousActiveElement = null;
211
+ }
212
+ function activateModal() {
213
+ if (isActiveModal) return;
214
+ isActiveModal = true;
215
+ addToStack();
216
+ if (typeof document !== "undefined") {
217
+ const activeElement = document.activeElement;
218
+ previousActiveElement = isHTMLElement(activeElement) ? activeElement : null;
219
+ }
220
+ bindDocumentListeners();
221
+ if (props.preventScroll !== false) unlockScroll = lockBodyScroll();
222
+ nextTick(() => {
223
+ if (isActiveModal) focusInitialElement();
224
+ });
225
+ }
226
+ function deactivateModal() {
227
+ if (!isActiveModal) return;
228
+ isActiveModal = false;
229
+ removeFromStack();
230
+ removeDocumentListeners?.();
231
+ unlockScroll?.();
232
+ unlockScroll = void 0;
233
+ restoreFocus();
234
+ }
235
+ function onOverlayClick(event) {
236
+ if (props.closeOnOverlayClick === false || event.target !== event.currentTarget) return;
237
+ closeModal();
238
+ }
239
+ onMounted(() => {
240
+ isMounted = true;
241
+ if (isOpen.value) activateModal();
242
+ });
243
+ onBeforeUnmount(() => {
244
+ deactivateModal();
245
+ });
246
+ watch(isOpen, (nextOpen) => {
247
+ if (!isMounted) return;
248
+ if (nextOpen) activateModal();
249
+ else deactivateModal();
250
+ });
251
+ return {
252
+ panelRef,
253
+ modalId,
254
+ titleId,
255
+ descriptionId,
256
+ role,
257
+ isOpen,
258
+ shouldRender,
259
+ hasHeader,
260
+ hasFooter,
261
+ showCloseButton,
262
+ headerId,
263
+ ariaLabelledby,
264
+ ariaDescribedby,
265
+ ariaLabel,
266
+ rootClass,
267
+ rootStyle,
268
+ stateClass,
269
+ slotProps,
270
+ openModal,
271
+ closeModal,
272
+ toggleModal,
273
+ onOverlayClick
274
+ };
275
+ }
276
+ //#endregion
277
+ //#region src/components/modal/modal.vue?vue&type=script&setup=true&vapor=true&lang.ts
278
+ var t0 = template("<h2 data-v-657f313d class=rp-modal__title> ");
279
+ var t1 = template("<p data-v-657f313d class=rp-modal__description> ");
280
+ var t2 = template("<div data-v-657f313d class=rp-modal__heading>");
281
+ var t3 = template("<div data-v-657f313d class=rp-modal__header>");
282
+ var t4 = template("<div data-v-657f313d class=rp-modal__body>");
283
+ var t5 = template("<div data-v-657f313d class=rp-modal__footer>");
284
+ var t6 = template("<div data-v-657f313d><section data-v-657f313d class=rp-modal__panel aria-modal=true tabindex=-1>");
285
+ //#endregion
286
+ //#region src/components/modal/modal.vue
287
+ var modal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
288
+ name: "RpModal",
289
+ __name: "modal",
290
+ props: {
291
+ id: {},
292
+ open: {
293
+ type: Boolean,
294
+ default: void 0
295
+ },
296
+ title: { default: "" },
297
+ description: { default: "" },
298
+ ariaLabel: { default: "" },
299
+ closeLabel: { default: "Close modal" },
300
+ role: { default: "dialog" },
301
+ size: { default: "md" },
302
+ initialFocus: { default: null },
303
+ closeOnOverlayClick: {
304
+ type: Boolean,
305
+ default: true
306
+ },
307
+ closeOnEscape: {
308
+ type: Boolean,
309
+ default: true
310
+ },
311
+ showCloseButton: {
312
+ type: Boolean,
313
+ default: true
314
+ },
315
+ overlayProps: { default: () => ({}) },
316
+ preventScroll: {
317
+ type: Boolean,
318
+ default: true
319
+ },
320
+ returnFocus: {
321
+ type: Boolean,
322
+ default: true
323
+ },
324
+ keepMounted: {
325
+ type: Boolean,
326
+ default: false
327
+ }
328
+ },
329
+ emits: ["update:open"],
330
+ setup(__props, { emit: __emit, slots: $slots }) {
331
+ const props = __props;
332
+ const emit = __emit;
333
+ const { panelRef, modalId, titleId, descriptionId, role, isOpen, shouldRender, hasHeader, hasFooter, showCloseButton, headerId, ariaLabelledby, ariaDescribedby, ariaLabel, rootClass, rootStyle, stateClass, slotProps, closeModal, onOverlayClick } = useModal(props, (open) => {
334
+ emit("update:open", open);
335
+ });
336
+ const _setTemplateRef = createTemplateRefSetter();
337
+ return createComponent(VaporTransition, {
338
+ name: "rp-modal",
339
+ persisted: ""
340
+ }, extend(() => {
341
+ return createIf(() => unref(shouldRender), () => {
342
+ const n28 = t6();
343
+ const n27 = child(n28, 1);
344
+ renderEffect(() => {
345
+ setClass(n28, [unref(rootClass), unref(stateClass)]);
346
+ setStyle(n28, unref(rootStyle));
347
+ });
348
+ setInsertionState(n28, 0, 0);
349
+ createComponent(overlay_default, { $: [() => __props.overlayProps, {
350
+ class: "rp-modal__overlay",
351
+ "z-index": 0,
352
+ interactive: "",
353
+ onClick: () => unref(onOverlayClick)
354
+ }] });
355
+ renderEffect(() => {
356
+ setProp(n27, "id", unref(modalId));
357
+ setProp(n27, "role", unref(role));
358
+ setAttr(n27, "aria-label", unref(ariaLabel));
359
+ setAttr(n27, "aria-labelledby", unref(ariaLabelledby));
360
+ setAttr(n27, "aria-describedby", unref(ariaDescribedby));
361
+ });
362
+ setInsertionState(n27, null, 0);
363
+ createIf(() => unref(hasHeader), () => {
364
+ const n14 = t3();
365
+ renderEffect(() => setProp(n14, "id", unref(headerId)));
366
+ setInsertionState(n14, null, 0);
367
+ createSlot("header", { $: [() => unref(slotProps)] }, () => {
368
+ const n13 = t2();
369
+ setInsertionState(n13, null, 0);
370
+ createIf(() => __props.title, () => {
371
+ const n9 = t0();
372
+ const x9 = txt(n9);
373
+ renderEffect(() => {
374
+ setProp(n9, "id", unref(titleId));
375
+ setText(x9, toDisplayString(__props.title));
376
+ });
377
+ return n9;
378
+ });
379
+ setInsertionState(n13, null, 1);
380
+ createIf(() => __props.description, () => {
381
+ const n12 = t1();
382
+ const x12 = txt(n12);
383
+ renderEffect(() => {
384
+ setProp(n12, "id", unref(descriptionId));
385
+ setText(x12, toDisplayString(__props.description));
386
+ });
387
+ return n12;
388
+ });
389
+ return n13;
390
+ }, 1);
391
+ return n14;
392
+ });
393
+ setInsertionState(n27, null, 1);
394
+ createIf(() => unref(showCloseButton), () => {
395
+ return createComponent(icon_button_default, {
396
+ class: "rp-modal__close",
397
+ ariaLabel: () => __props.closeLabel,
398
+ variant: "ghost",
399
+ size: "sm",
400
+ onClick: () => unref(closeModal)
401
+ }, () => {
402
+ return createComponent(unref(x_default));
403
+ });
404
+ });
405
+ setInsertionState(n27, null, 2);
406
+ createIf(() => $slots.default, () => {
407
+ const n22 = t4();
408
+ setInsertionState(n22, null, 0);
409
+ createSlot("default", { $: [() => unref(slotProps)] }, null, 1);
410
+ return n22;
411
+ });
412
+ setInsertionState(n27, null, 3);
413
+ createIf(() => unref(hasFooter), () => {
414
+ const n26 = t5();
415
+ setInsertionState(n26, null, 0);
416
+ createSlot("footer", { $: [() => unref(slotProps)] }, null, 1);
417
+ return n26;
418
+ });
419
+ _setTemplateRef(n27, panelRef, null, "panelRef");
420
+ applyVShow(n28, () => unref(isOpen));
421
+ return n28;
422
+ }, null, 129);
423
+ }, { _: 8 }), true);
424
+ }
425
+ }), [["__scopeId", "data-v-657f313d"]]);
426
+ //#endregion
427
+ export { modal_default as t };
@@ -0,0 +1,28 @@
1
+ .rp-overlay[data-v-4a733439] {
2
+ --_rp-overlay-color: var(--rp-color-overlay);
3
+ --_rp-overlay-opacity: 1;
4
+ --_rp-overlay-blur: 0px;
5
+ --_rp-overlay-z-index: 1;
6
+ position: absolute;
7
+ inset: 0;
8
+ z-index: var(--_rp-overlay-z-index);
9
+ box-sizing: border-box;
10
+ display: block;
11
+ width: 100%;
12
+ height: 100%;
13
+ background-color: var(--_rp-overlay-color);
14
+ border-radius: inherit;
15
+ opacity: var(--_rp-overlay-opacity);
16
+ pointer-events: none;
17
+ }
18
+ .rp-overlay--gradient[data-v-4a733439] {
19
+ background-color: transparent;
20
+ opacity: 1;
21
+ }
22
+ .rp-overlay--blurred[data-v-4a733439] {
23
+ backdrop-filter: blur(var(--_rp-overlay-blur));
24
+ -webkit-backdrop-filter: blur(var(--_rp-overlay-blur));
25
+ }
26
+ .rp-overlay--interactive[data-v-4a733439] {
27
+ pointer-events: auto;
28
+ }
@@ -0,0 +1,82 @@
1
+ import './overlay.css';
2
+ import { t as bem } from "./bem.js";
3
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
4
+ import { computed, createIf, defineVaporComponent, renderEffect, setClass, setStyle, template, unref } from "vue";
5
+ //#region src/components/overlay/useOverlay.ts
6
+ function getBlurValue(blur) {
7
+ if (blur == null || blur === "") return void 0;
8
+ if (typeof blur === "number") {
9
+ if (!Number.isFinite(blur) || blur < 0) return void 0;
10
+ return `${blur}px`;
11
+ }
12
+ return blur;
13
+ }
14
+ function useOverlay(props) {
15
+ const isRendered = computed(() => !props.disabled);
16
+ const hasGradient = computed(() => Boolean(props.gradient));
17
+ const normalizedOpacity = computed(() => {
18
+ const opacity = props.opacity;
19
+ if (opacity === void 0 || !Number.isFinite(opacity)) return 1;
20
+ return Math.min(1, Math.max(0, opacity));
21
+ });
22
+ const blurValue = computed(() => getBlurValue(props.blur));
23
+ const hasBlur = computed(() => Boolean(blurValue.value));
24
+ return {
25
+ isRendered,
26
+ rootClass: computed(() => bem("rp-overlay", {
27
+ gradient: hasGradient.value,
28
+ blurred: hasBlur.value,
29
+ interactive: props.interactive
30
+ })),
31
+ rootStyle: computed(() => {
32
+ const style = { "--_rp-overlay-z-index": props.zIndex };
33
+ if (blurValue.value) style["--_rp-overlay-blur"] = blurValue.value;
34
+ if (hasGradient.value) return {
35
+ ...style,
36
+ backgroundImage: props.gradient
37
+ };
38
+ return {
39
+ ...style,
40
+ "--_rp-overlay-color": props.color,
41
+ "--_rp-overlay-opacity": normalizedOpacity.value
42
+ };
43
+ })
44
+ };
45
+ }
46
+ //#endregion
47
+ //#region src/components/overlay/overlay.vue?vue&type=script&setup=true&vapor=true&lang.ts
48
+ var t0 = template("<div data-v-4a733439 aria-hidden=true>", 1);
49
+ //#endregion
50
+ //#region src/components/overlay/overlay.vue
51
+ var overlay_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
52
+ name: "RpOverlay",
53
+ __name: "overlay",
54
+ props: {
55
+ color: { default: "var(--rp-color-overlay)" },
56
+ opacity: { default: 1 },
57
+ gradient: { default: "" },
58
+ blur: {},
59
+ zIndex: { default: 1 },
60
+ interactive: {
61
+ type: Boolean,
62
+ default: false
63
+ },
64
+ disabled: {
65
+ type: Boolean,
66
+ default: false
67
+ }
68
+ },
69
+ setup(__props) {
70
+ const { isRendered, rootClass, rootStyle } = useOverlay(__props);
71
+ return createIf(() => unref(isRendered), () => {
72
+ const n2 = t0();
73
+ renderEffect(() => {
74
+ setClass(n2, unref(rootClass));
75
+ setStyle(n2, unref(rootStyle));
76
+ });
77
+ return n2;
78
+ });
79
+ }
80
+ }), [["__scopeId", "data-v-4a733439"]]);
81
+ //#endregion
82
+ export { overlay_default as t };