ropav 0.0.5 → 0.0.7
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/README.md +20 -51
- package/dist/_plugin-vue_export-helper.js +1 -11
- package/dist/accordion.css +112 -0
- package/dist/accordion.js +360 -0
- package/dist/accordion.js.map +1 -0
- package/dist/badge.css +169 -0
- package/dist/badge.js +103 -0
- package/dist/badge.js.map +1 -0
- package/dist/base.css +21 -0
- package/dist/bem.js +11 -0
- package/dist/bem.js.map +1 -0
- package/dist/button-group.css +50 -0
- package/dist/button-group.js +50 -0
- package/dist/button-group.js.map +1 -0
- package/dist/button.css +72 -42
- package/dist/button.js +43 -32
- package/dist/button.js.map +1 -1
- package/dist/card.js +2 -1
- package/dist/card.js.map +1 -1
- package/dist/checkbox.css +105 -102
- package/dist/checkbox.js +20 -7
- package/dist/checkbox.js.map +1 -1
- package/dist/collapse.css +32 -0
- package/dist/collapse.js +68 -0
- package/dist/collapse.js.map +1 -0
- package/dist/componentColors.js +22 -0
- package/dist/componentColors.js.map +1 -0
- package/dist/components/accordion/accordion-item.d.ts +40 -0
- package/dist/components/accordion/accordion.d.ts +23 -0
- package/dist/components/accordion/index.d.ts +4 -0
- package/dist/components/accordion/index.js +2 -0
- package/dist/components/accordion/types.d.ts +100 -0
- package/dist/components/accordion/useAccordion.d.ts +3 -0
- package/dist/components/badge/badge.d.ts +25 -0
- package/dist/components/badge/index.d.ts +3 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/badge/types.d.ts +16 -0
- package/dist/components/badge/useBadgeColor.d.ts +8 -0
- package/dist/components/button/button.d.ts +2 -0
- package/dist/components/button/types.d.ts +2 -1
- package/dist/components/button/useButtonColor.d.ts +13 -0
- package/dist/components/button-group/button-group.d.ts +21 -0
- package/dist/components/button-group/index.d.ts +2 -0
- package/dist/components/button-group/index.js +2 -0
- package/dist/components/button-group/types.d.ts +10 -0
- package/dist/components/checkbox/types.d.ts +2 -1
- package/dist/components/checkbox/useCheckbox.d.ts +4 -0
- package/dist/components/collapse/collapse.d.ts +36 -0
- package/dist/components/collapse/index.d.ts +3 -0
- package/dist/components/collapse/index.js +3 -0
- package/dist/components/collapse/types.d.ts +76 -0
- package/dist/components/collapse/useCollapse.d.ts +2 -0
- package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +16 -0
- package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +23 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +26 -0
- package/dist/components/dropdown-menu/index.d.ts +3 -0
- package/dist/components/dropdown-menu/index.js +2 -0
- package/dist/components/dropdown-menu/types.d.ts +104 -0
- package/dist/components/dropdown-menu/useDropdownMenu.d.ts +32 -0
- package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +30 -0
- package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +28 -0
- package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +24 -0
- package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +51 -0
- package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +16 -0
- package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +25 -0
- package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +18 -0
- package/dist/components/field/field.d.ts +2 -2
- package/dist/components/field/useField.d.ts +16 -0
- package/dist/components/input/useInput.d.ts +8 -0
- package/dist/components/modal/index.d.ts +2 -0
- package/dist/components/modal/index.js +2 -0
- package/dist/components/modal/modal.d.ts +42 -0
- package/dist/components/modal/types.d.ts +32 -0
- package/dist/components/modal/useModal.d.ts +29 -0
- package/dist/components/overlay/index.d.ts +2 -0
- package/dist/components/overlay/index.js +2 -0
- package/dist/components/overlay/overlay.d.ts +19 -0
- package/dist/components/overlay/types.d.ts +12 -0
- package/dist/components/overlay/useOverlay.d.ts +7 -0
- package/dist/components/popover/index.d.ts +2 -0
- package/dist/components/popover/index.js +2 -0
- package/dist/components/popover/popover.d.ts +43 -0
- package/dist/components/popover/types.d.ts +40 -0
- package/dist/components/popover/usePopover.d.ts +20 -0
- package/dist/components/progress/index.d.ts +3 -0
- package/dist/components/progress/index.js +2 -0
- package/dist/components/progress/progress.d.ts +27 -0
- package/dist/components/progress/types.d.ts +24 -0
- package/dist/components/progress/useProgress.d.ts +28 -0
- package/dist/components/radio/types.d.ts +2 -1
- package/dist/components/radio/useRadio.d.ts +4 -0
- package/dist/components/slider/index.d.ts +3 -0
- package/dist/components/slider/index.js +2 -0
- package/dist/components/slider/slider.d.ts +35 -0
- package/dist/components/slider/types.d.ts +50 -0
- package/dist/components/slider/useSlider.d.ts +50 -0
- package/dist/components/switch/types.d.ts +2 -1
- package/dist/components/switch/useSwitch.d.ts +3 -0
- package/dist/components/tabs/index.d.ts +6 -0
- package/dist/components/tabs/index.js +2 -0
- package/dist/components/tabs/tabs-content.d.ts +24 -0
- package/dist/components/tabs/tabs-list.d.ts +26 -0
- package/dist/components/tabs/tabs-trigger.d.ts +29 -0
- package/dist/components/tabs/tabs.d.ts +31 -0
- package/dist/components/tabs/types.d.ts +160 -0
- package/dist/components/tabs/useTabs.d.ts +5 -0
- package/dist/components/textarea/index.d.ts +1 -1
- package/dist/components/textarea/types.d.ts +5 -0
- package/dist/components/textarea/useTextarea.d.ts +2 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +2 -0
- package/dist/components/tooltip/tooltip.d.ts +27 -0
- package/dist/components/tooltip/types.d.ts +29 -0
- package/dist/components/tooltip/useTooltip.d.ts +17 -0
- package/dist/dropdown-menu.css +159 -0
- package/dist/dropdown-menu.js +903 -0
- package/dist/dropdown-menu.js.map +1 -0
- package/dist/field.css +8 -8
- package/dist/field.js +68 -50
- package/dist/field.js.map +1 -1
- package/dist/icon-button.css +82 -49
- package/dist/icon-button.js +15 -10
- package/dist/icon-button.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.js +17 -1
- package/dist/input.css +25 -25
- package/dist/input.js +57 -38
- package/dist/input.js.map +1 -1
- package/dist/modal.css +134 -0
- package/dist/modal.js +433 -0
- package/dist/modal.js.map +1 -0
- package/dist/overlay.css +28 -0
- package/dist/overlay.js +84 -0
- package/dist/overlay.js.map +1 -0
- package/dist/popover.css +75 -0
- package/dist/popover.js +367 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress.css +125 -0
- package/dist/progress.js +178 -0
- package/dist/progress.js.map +1 -0
- package/dist/radio.css +83 -83
- package/dist/radio.js +21 -14
- package/dist/radio.js.map +1 -1
- package/dist/select.css +3 -1
- package/dist/select.js +15 -37
- package/dist/select.js.map +1 -1
- package/dist/slider.css +438 -0
- package/dist/slider.js +413 -0
- package/dist/slider.js.map +1 -0
- package/dist/switch.css +77 -77
- package/dist/switch.js +17 -7
- package/dist/switch.js.map +1 -1
- package/dist/tabs.css +279 -0
- package/dist/tabs.js +515 -0
- package/dist/tabs.js.map +1 -0
- package/dist/textarea.css +33 -26
- package/dist/textarea.js +108 -16
- package/dist/textarea.js.map +1 -1
- package/dist/tooltip.css +136 -0
- package/dist/tooltip.js +385 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/useButtonColor.js +33 -0
- package/dist/useButtonColor.js.map +1 -0
- package/dist/useClickOutside.js +26 -0
- package/dist/useClickOutside.js.map +1 -0
- package/dist/useCollapse.js +94 -0
- package/dist/useCollapse.js.map +1 -0
- package/dist/useRequiredInject.js +11 -0
- package/dist/useRequiredInject.js.map +1 -0
- package/dist/x.js +14 -0
- package/dist/x.js.map +1 -0
- package/package.json +52 -4
- package/src/styles/_mixins.scss +17 -0
- package/src/styles/_utilities.scss +13 -0
- package/src/styles/base.scss +1 -0
- package/dist/_plugin-vue_export-helper.js.map +0 -1
- package/dist/loader-circle.js +0 -14
- package/dist/loader-circle.js.map +0 -1
package/dist/tooltip.js
ADDED
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import './tooltip.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 { n as getComponentCustomColor, r as isComponentPresetColor } from "./componentColors.js";
|
|
5
|
+
import { VaporTransition, applyVShow, computed, createComponent, createIf, createInvoker, createSlot, defineVaporComponent, delegateEvents, extend, isRef, on, onBeforeUnmount, onMounted, ref, renderEffect, setAttr, setClass, setInsertionState, setProp, setStyle, setText, template, toDisplayString, unref, useId, useSlots, watch } from "vue";
|
|
6
|
+
//#region src/composables/useDelayedOpen.ts
|
|
7
|
+
function readOption(value, fallback) {
|
|
8
|
+
return typeof value === "function" ? value() ?? fallback : value ?? fallback;
|
|
9
|
+
}
|
|
10
|
+
function readOptional(value) {
|
|
11
|
+
return typeof value === "function" ? value() : value;
|
|
12
|
+
}
|
|
13
|
+
function useDelayedOpen(options = {}) {
|
|
14
|
+
const uncontrolledOpen = ref(false);
|
|
15
|
+
let openTimer = null;
|
|
16
|
+
const isOpen = computed(() => readOptional(options.open) ?? uncontrolledOpen.value);
|
|
17
|
+
function clearTimers() {
|
|
18
|
+
if (openTimer) {
|
|
19
|
+
clearTimeout(openTimer);
|
|
20
|
+
openTimer = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function isDisabled() {
|
|
24
|
+
return readOption(options.disabled, false);
|
|
25
|
+
}
|
|
26
|
+
function setOpen(nextOpen) {
|
|
27
|
+
const previousOpen = isOpen.value;
|
|
28
|
+
if (readOptional(options.open) === void 0) uncontrolledOpen.value = nextOpen;
|
|
29
|
+
if (previousOpen !== nextOpen) options.onOpenChange?.(nextOpen);
|
|
30
|
+
}
|
|
31
|
+
function open() {
|
|
32
|
+
if (isDisabled()) return;
|
|
33
|
+
const delay = readOption(options.openDelay, 0);
|
|
34
|
+
if (delay <= 0) {
|
|
35
|
+
setOpen(true);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (openTimer) clearTimeout(openTimer);
|
|
39
|
+
openTimer = setTimeout(() => {
|
|
40
|
+
setOpen(true);
|
|
41
|
+
openTimer = null;
|
|
42
|
+
}, delay);
|
|
43
|
+
}
|
|
44
|
+
function closeImmediate() {
|
|
45
|
+
clearTimers();
|
|
46
|
+
setOpen(false);
|
|
47
|
+
}
|
|
48
|
+
onBeforeUnmount(clearTimers);
|
|
49
|
+
return {
|
|
50
|
+
isOpen,
|
|
51
|
+
open,
|
|
52
|
+
closeImmediate
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/components/tooltip/useTooltip.ts
|
|
57
|
+
function isHTMLElement(value) {
|
|
58
|
+
return typeof HTMLElement !== "undefined" && value instanceof HTMLElement;
|
|
59
|
+
}
|
|
60
|
+
function getTargetPosition(rect, placement) {
|
|
61
|
+
switch (placement) {
|
|
62
|
+
case "right": return {
|
|
63
|
+
x: rect.right,
|
|
64
|
+
y: rect.top + rect.height / 2
|
|
65
|
+
};
|
|
66
|
+
case "bottom": return {
|
|
67
|
+
x: rect.left + rect.width / 2,
|
|
68
|
+
y: rect.bottom
|
|
69
|
+
};
|
|
70
|
+
case "left": return {
|
|
71
|
+
x: rect.left,
|
|
72
|
+
y: rect.top + rect.height / 2
|
|
73
|
+
};
|
|
74
|
+
default: return {
|
|
75
|
+
x: rect.left + rect.width / 2,
|
|
76
|
+
y: rect.top
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function resolveOffsetStyle(offset) {
|
|
81
|
+
if (offset == null) return void 0;
|
|
82
|
+
if (typeof offset === "number") return { "--_rp-tooltip-main-axis-offset": `${offset}px` };
|
|
83
|
+
const style = {};
|
|
84
|
+
if (offset.mainAxis != null) style["--_rp-tooltip-main-axis-offset"] = `${offset.mainAxis}px`;
|
|
85
|
+
if (offset.crossAxis != null) style["--_rp-tooltip-cross-axis-offset"] = `${offset.crossAxis}px`;
|
|
86
|
+
return Object.keys(style).length > 0 ? style : void 0;
|
|
87
|
+
}
|
|
88
|
+
function resolveTooltipColorStyle(color) {
|
|
89
|
+
const customColor = getComponentCustomColor(color);
|
|
90
|
+
if (!customColor) return void 0;
|
|
91
|
+
return {
|
|
92
|
+
"--_rp-tooltip-bg": customColor,
|
|
93
|
+
"--_rp-tooltip-fg": "var(--rp-color-on-primary)"
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function useTooltip(props, emitOpenChange) {
|
|
97
|
+
const slots = useSlots();
|
|
98
|
+
const generatedId = useId();
|
|
99
|
+
const targetElement = ref(null);
|
|
100
|
+
const targetPosition = ref(null);
|
|
101
|
+
let isMounted = false;
|
|
102
|
+
let removeTargetListeners;
|
|
103
|
+
let removePositionListeners;
|
|
104
|
+
let describedTarget = null;
|
|
105
|
+
let previousTargetDescribedby = null;
|
|
106
|
+
const tooltipId = computed(() => props.id ?? `${generatedId}-tooltip`);
|
|
107
|
+
const placement = computed(() => props.placement ?? "top");
|
|
108
|
+
const isTargetMode = computed(() => props.target != null && props.target !== "");
|
|
109
|
+
const hasContent = computed(() => Boolean(props.content || slots.content));
|
|
110
|
+
const isDecorative = computed(() => Boolean(props.decorative));
|
|
111
|
+
const isDisabled = computed(() => Boolean(props.disabled || !hasContent.value));
|
|
112
|
+
const shouldRenderContent = computed(() => !isDisabled.value);
|
|
113
|
+
const shouldDescribeContent = computed(() => shouldRenderContent.value && !isDecorative.value);
|
|
114
|
+
const { isOpen, open, closeImmediate } = useDelayedOpen({
|
|
115
|
+
open: () => props.open,
|
|
116
|
+
openDelay: () => props.openDelay ?? 300,
|
|
117
|
+
disabled: () => isDisabled.value,
|
|
118
|
+
onOpenChange: emitOpenChange
|
|
119
|
+
});
|
|
120
|
+
const isVisible = computed(() => isOpen.value && !isDisabled.value);
|
|
121
|
+
const rootClass = computed(() => bem("rp-tooltip", {
|
|
122
|
+
[`placement-${placement.value}`]: true,
|
|
123
|
+
[`color-${props.color}`]: isComponentPresetColor(props.color),
|
|
124
|
+
arrow: props.arrow,
|
|
125
|
+
target: isTargetMode.value,
|
|
126
|
+
open: isVisible.value,
|
|
127
|
+
disabled: props.disabled
|
|
128
|
+
}));
|
|
129
|
+
const triggerProps = computed(() => ({ "aria-describedby": shouldDescribeContent.value ? tooltipId.value : void 0 }));
|
|
130
|
+
const contentRole = computed(() => isDecorative.value ? void 0 : "tooltip");
|
|
131
|
+
const contentAriaHidden = computed(() => isDecorative.value ? "true" : void 0);
|
|
132
|
+
const contentStyle = computed(() => {
|
|
133
|
+
const style = {
|
|
134
|
+
...resolveOffsetStyle(props.offset),
|
|
135
|
+
...resolveTooltipColorStyle(props.color)
|
|
136
|
+
};
|
|
137
|
+
if (!isTargetMode.value || !targetPosition.value) return Object.keys(style).length > 0 ? style : void 0;
|
|
138
|
+
return {
|
|
139
|
+
...style,
|
|
140
|
+
"--_rp-tooltip-target-x": `${targetPosition.value.x}px`,
|
|
141
|
+
"--_rp-tooltip-target-y": `${targetPosition.value.y}px`
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
function openTooltip() {
|
|
145
|
+
open();
|
|
146
|
+
}
|
|
147
|
+
function closeTooltip() {
|
|
148
|
+
closeImmediate();
|
|
149
|
+
}
|
|
150
|
+
function onKeydown(event) {
|
|
151
|
+
if (event.key === "Escape") closeTooltip();
|
|
152
|
+
}
|
|
153
|
+
function readTarget() {
|
|
154
|
+
return isRef(props.target) ? props.target.value : props.target;
|
|
155
|
+
}
|
|
156
|
+
function resolveTarget() {
|
|
157
|
+
const target = readTarget();
|
|
158
|
+
if (!target) return null;
|
|
159
|
+
if (typeof target === "string") {
|
|
160
|
+
if (typeof document === "undefined") return null;
|
|
161
|
+
try {
|
|
162
|
+
const element = document.querySelector(target);
|
|
163
|
+
return isHTMLElement(element) ? element : null;
|
|
164
|
+
} catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return isHTMLElement(target) ? target : null;
|
|
169
|
+
}
|
|
170
|
+
function restoreTargetDescription() {
|
|
171
|
+
if (!describedTarget) return;
|
|
172
|
+
if (previousTargetDescribedby) describedTarget.setAttribute("aria-describedby", previousTargetDescribedby);
|
|
173
|
+
else describedTarget.removeAttribute("aria-describedby");
|
|
174
|
+
describedTarget = null;
|
|
175
|
+
previousTargetDescribedby = null;
|
|
176
|
+
}
|
|
177
|
+
function syncTargetDescription() {
|
|
178
|
+
restoreTargetDescription();
|
|
179
|
+
if (!isTargetMode.value || !shouldDescribeContent.value || !targetElement.value) return;
|
|
180
|
+
describedTarget = targetElement.value;
|
|
181
|
+
previousTargetDescribedby = describedTarget.getAttribute("aria-describedby");
|
|
182
|
+
const ids = (previousTargetDescribedby ?? "").split(/\s+/).filter(Boolean);
|
|
183
|
+
if (!ids.includes(tooltipId.value)) ids.push(tooltipId.value);
|
|
184
|
+
describedTarget.setAttribute("aria-describedby", ids.join(" "));
|
|
185
|
+
}
|
|
186
|
+
function updateTargetPosition() {
|
|
187
|
+
if (!isTargetMode.value || !targetElement.value) {
|
|
188
|
+
targetPosition.value = null;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
targetPosition.value = getTargetPosition(targetElement.value.getBoundingClientRect(), placement.value);
|
|
192
|
+
}
|
|
193
|
+
function onTargetOpen() {
|
|
194
|
+
updateTargetPosition();
|
|
195
|
+
openTooltip();
|
|
196
|
+
}
|
|
197
|
+
function bindTargetListeners(element) {
|
|
198
|
+
removeTargetListeners?.();
|
|
199
|
+
element.addEventListener("mouseenter", onTargetOpen);
|
|
200
|
+
element.addEventListener("mouseleave", closeTooltip);
|
|
201
|
+
element.addEventListener("focusin", onTargetOpen);
|
|
202
|
+
element.addEventListener("focusout", closeTooltip);
|
|
203
|
+
element.addEventListener("keydown", onKeydown);
|
|
204
|
+
removeTargetListeners = () => {
|
|
205
|
+
element.removeEventListener("mouseenter", onTargetOpen);
|
|
206
|
+
element.removeEventListener("mouseleave", closeTooltip);
|
|
207
|
+
element.removeEventListener("focusin", onTargetOpen);
|
|
208
|
+
element.removeEventListener("focusout", closeTooltip);
|
|
209
|
+
element.removeEventListener("keydown", onKeydown);
|
|
210
|
+
removeTargetListeners = void 0;
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function removeViewportListeners() {
|
|
214
|
+
removePositionListeners?.();
|
|
215
|
+
removePositionListeners = void 0;
|
|
216
|
+
}
|
|
217
|
+
function bindViewportListeners() {
|
|
218
|
+
if (typeof window === "undefined" || removePositionListeners) return;
|
|
219
|
+
window.addEventListener("resize", updateTargetPosition);
|
|
220
|
+
window.addEventListener("scroll", updateTargetPosition, true);
|
|
221
|
+
removePositionListeners = () => {
|
|
222
|
+
window.removeEventListener("resize", updateTargetPosition);
|
|
223
|
+
window.removeEventListener("scroll", updateTargetPosition, true);
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function syncTarget() {
|
|
227
|
+
if (!isTargetMode.value) {
|
|
228
|
+
removeTargetListeners?.();
|
|
229
|
+
removeViewportListeners();
|
|
230
|
+
restoreTargetDescription();
|
|
231
|
+
targetElement.value = null;
|
|
232
|
+
targetPosition.value = null;
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const nextTarget = resolveTarget();
|
|
236
|
+
if (targetElement.value === nextTarget) {
|
|
237
|
+
syncTargetDescription();
|
|
238
|
+
updateTargetPosition();
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
removeTargetListeners?.();
|
|
242
|
+
removeViewportListeners();
|
|
243
|
+
restoreTargetDescription();
|
|
244
|
+
targetElement.value = nextTarget;
|
|
245
|
+
if (!nextTarget) {
|
|
246
|
+
targetPosition.value = null;
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
bindTargetListeners(nextTarget);
|
|
250
|
+
syncTargetDescription();
|
|
251
|
+
updateTargetPosition();
|
|
252
|
+
}
|
|
253
|
+
watch(isDisabled, (disabled) => {
|
|
254
|
+
if (disabled) closeTooltip();
|
|
255
|
+
});
|
|
256
|
+
watch(() => readTarget(), () => {
|
|
257
|
+
if (isMounted) syncTarget();
|
|
258
|
+
}, { flush: "post" });
|
|
259
|
+
watch([
|
|
260
|
+
isTargetMode,
|
|
261
|
+
shouldDescribeContent,
|
|
262
|
+
tooltipId
|
|
263
|
+
], () => {
|
|
264
|
+
if (isMounted) syncTargetDescription();
|
|
265
|
+
});
|
|
266
|
+
watch([placement, isVisible], () => {
|
|
267
|
+
if (isMounted && isVisible.value) updateTargetPosition();
|
|
268
|
+
});
|
|
269
|
+
watch(isVisible, (visible) => {
|
|
270
|
+
if (!isMounted || !isTargetMode.value) return;
|
|
271
|
+
if (visible) {
|
|
272
|
+
updateTargetPosition();
|
|
273
|
+
bindViewportListeners();
|
|
274
|
+
} else removeViewportListeners();
|
|
275
|
+
});
|
|
276
|
+
onMounted(() => {
|
|
277
|
+
isMounted = true;
|
|
278
|
+
syncTarget();
|
|
279
|
+
});
|
|
280
|
+
onBeforeUnmount(() => {
|
|
281
|
+
isMounted = false;
|
|
282
|
+
removeTargetListeners?.();
|
|
283
|
+
removeViewportListeners();
|
|
284
|
+
restoreTargetDescription();
|
|
285
|
+
});
|
|
286
|
+
return {
|
|
287
|
+
tooltipId,
|
|
288
|
+
isOpen,
|
|
289
|
+
isVisible,
|
|
290
|
+
isTargetMode,
|
|
291
|
+
shouldRenderContent,
|
|
292
|
+
rootClass,
|
|
293
|
+
triggerProps,
|
|
294
|
+
contentRole,
|
|
295
|
+
contentAriaHidden,
|
|
296
|
+
contentStyle,
|
|
297
|
+
openTooltip,
|
|
298
|
+
closeTooltip,
|
|
299
|
+
onKeydown
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
//#endregion
|
|
303
|
+
//#region src/components/tooltip/tooltip.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
304
|
+
var t0 = template(" ");
|
|
305
|
+
var t1 = template("<span data-v-13c39164 class=rp-tooltip__content>");
|
|
306
|
+
var t2 = template("<span data-v-13c39164>", 1);
|
|
307
|
+
delegateEvents("focusin", "focusout", "keydown");
|
|
308
|
+
//#endregion
|
|
309
|
+
//#region src/components/tooltip/tooltip.vue
|
|
310
|
+
var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
|
|
311
|
+
name: "RpTooltip",
|
|
312
|
+
__name: "tooltip",
|
|
313
|
+
props: {
|
|
314
|
+
id: {},
|
|
315
|
+
content: { default: "" },
|
|
316
|
+
target: {},
|
|
317
|
+
placement: { default: "top" },
|
|
318
|
+
color: {},
|
|
319
|
+
offset: {},
|
|
320
|
+
open: {
|
|
321
|
+
type: Boolean,
|
|
322
|
+
default: void 0
|
|
323
|
+
},
|
|
324
|
+
openDelay: { default: 300 },
|
|
325
|
+
arrow: {
|
|
326
|
+
type: Boolean,
|
|
327
|
+
default: false
|
|
328
|
+
},
|
|
329
|
+
disabled: {
|
|
330
|
+
type: Boolean,
|
|
331
|
+
default: false
|
|
332
|
+
},
|
|
333
|
+
decorative: {
|
|
334
|
+
type: Boolean,
|
|
335
|
+
default: false
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
emits: ["update:open"],
|
|
339
|
+
setup(__props, { emit: __emit }) {
|
|
340
|
+
const props = __props;
|
|
341
|
+
const emit = __emit;
|
|
342
|
+
const { tooltipId, isVisible, isTargetMode, shouldRenderContent, rootClass, triggerProps, contentRole, contentAriaHidden, contentStyle, openTooltip, closeTooltip, onKeydown } = useTooltip(props, (open) => {
|
|
343
|
+
emit("update:open", open);
|
|
344
|
+
});
|
|
345
|
+
const n10 = t2();
|
|
346
|
+
renderEffect(() => setClass(n10, unref(rootClass)));
|
|
347
|
+
setInsertionState(n10, null, 0);
|
|
348
|
+
createIf(() => !unref(isTargetMode), () => {
|
|
349
|
+
return createSlot("default", { triggerProps: () => unref(triggerProps) }, null, 1);
|
|
350
|
+
});
|
|
351
|
+
setInsertionState(n10, null, 1);
|
|
352
|
+
createComponent(VaporTransition, {
|
|
353
|
+
name: "rp-tooltip-content",
|
|
354
|
+
persisted: ""
|
|
355
|
+
}, extend(() => {
|
|
356
|
+
return createIf(() => unref(shouldRenderContent), () => {
|
|
357
|
+
const n8 = t1();
|
|
358
|
+
renderEffect(() => {
|
|
359
|
+
setProp(n8, "id", unref(tooltipId));
|
|
360
|
+
setProp(n8, "role", unref(contentRole));
|
|
361
|
+
setAttr(n8, "aria-hidden", unref(contentAriaHidden));
|
|
362
|
+
setStyle(n8, unref(contentStyle));
|
|
363
|
+
});
|
|
364
|
+
setInsertionState(n8, null, 0);
|
|
365
|
+
createSlot("content", null, () => {
|
|
366
|
+
const n7 = t0();
|
|
367
|
+
renderEffect(() => setText(n7, toDisplayString(__props.content)));
|
|
368
|
+
return n7;
|
|
369
|
+
}, 1);
|
|
370
|
+
applyVShow(n8, () => unref(isVisible));
|
|
371
|
+
return n8;
|
|
372
|
+
}, null, 129);
|
|
373
|
+
}, { _: 8 }));
|
|
374
|
+
on(n10, "mouseenter", (e) => unref(openTooltip)(e));
|
|
375
|
+
on(n10, "mouseleave", (e) => unref(closeTooltip)(e));
|
|
376
|
+
n10.$evtfocusin = createInvoker((e) => unref(openTooltip)(e));
|
|
377
|
+
n10.$evtfocusout = createInvoker((e) => unref(closeTooltip)(e));
|
|
378
|
+
n10.$evtkeydown = createInvoker((e) => unref(onKeydown)(e));
|
|
379
|
+
return n10;
|
|
380
|
+
}
|
|
381
|
+
}), [["__scopeId", "data-v-13c39164"]]);
|
|
382
|
+
//#endregion
|
|
383
|
+
export { useDelayedOpen as n, tooltip_default as t };
|
|
384
|
+
|
|
385
|
+
//# sourceMappingURL=tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":[],"sources":["../src/composables/useDelayedOpen.ts","../src/components/tooltip/useTooltip.ts","../src/components/tooltip/tooltip.vue","../src/components/tooltip/tooltip.vue"],"sourcesContent":["import { computed, onBeforeUnmount, ref } from 'vue';\n\nexport interface UseDelayedOpenOptions {\n open?: boolean | (() => boolean | undefined);\n openDelay?: number | (() => number | undefined);\n disabled?: boolean | (() => boolean | undefined);\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction readOption<T>(value: T | (() => T | undefined) | undefined, fallback: T): T {\n return typeof value === 'function'\n ? ((value as () => T | undefined)() ?? fallback)\n : (value ?? fallback);\n}\n\nfunction readOptional<T>(value: T | (() => T | undefined) | undefined): T | undefined {\n return typeof value === 'function' ? (value as () => T | undefined)() : value;\n}\n\nexport function useDelayedOpen(options: UseDelayedOpenOptions = {}) {\n const uncontrolledOpen = ref(false);\n let openTimer: ReturnType<typeof setTimeout> | null = null;\n\n const isOpen = computed(() => readOptional(options.open) ?? uncontrolledOpen.value);\n\n function clearTimers() {\n if (openTimer) {\n clearTimeout(openTimer);\n openTimer = null;\n }\n }\n\n function isDisabled() {\n return readOption(options.disabled, false);\n }\n\n function setOpen(nextOpen: boolean) {\n const previousOpen = isOpen.value;\n if (readOptional(options.open) === undefined) uncontrolledOpen.value = nextOpen;\n if (previousOpen !== nextOpen) options.onOpenChange?.(nextOpen);\n }\n\n function open() {\n if (isDisabled()) return;\n const delay = readOption(options.openDelay, 0);\n if (delay <= 0) {\n setOpen(true);\n return;\n }\n if (openTimer) clearTimeout(openTimer);\n openTimer = setTimeout(() => {\n setOpen(true);\n openTimer = null;\n }, delay);\n }\n\n function closeImmediate() {\n clearTimers();\n setOpen(false);\n }\n\n onBeforeUnmount(clearTimers);\n\n return {\n isOpen,\n open,\n closeImmediate,\n };\n}\n","import {\n computed,\n isRef,\n onBeforeUnmount,\n onMounted,\n ref,\n useId,\n useSlots,\n watch,\n type CSSProperties,\n} from 'vue';\nimport { useDelayedOpen } from '@/composables/useDelayedOpen';\nimport { getComponentCustomColor, isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport type { TooltipOffset, TooltipPlacement, TooltipProps, TooltipTriggerProps } from './types';\n\ninterface TooltipPosition {\n x: number;\n y: number;\n}\n\nfunction isHTMLElement(value: unknown): value is HTMLElement {\n return typeof HTMLElement !== 'undefined' && value instanceof HTMLElement;\n}\n\nfunction getTargetPosition(rect: DOMRect, placement: TooltipPlacement): TooltipPosition {\n switch (placement) {\n case 'right':\n return { x: rect.right, y: rect.top + rect.height / 2 };\n case 'bottom':\n return { x: rect.left + rect.width / 2, y: rect.bottom };\n case 'left':\n return { x: rect.left, y: rect.top + rect.height / 2 };\n case 'top':\n default:\n return { x: rect.left + rect.width / 2, y: rect.top };\n }\n}\n\nfunction resolveOffsetStyle(offset: TooltipOffset | undefined): CSSProperties | undefined {\n if (offset == null) return undefined;\n\n if (typeof offset === 'number') {\n return {\n '--_rp-tooltip-main-axis-offset': `${offset}px`,\n };\n }\n\n const style: CSSProperties = {};\n\n if (offset.mainAxis != null) {\n style['--_rp-tooltip-main-axis-offset'] = `${offset.mainAxis}px`;\n }\n\n if (offset.crossAxis != null) {\n style['--_rp-tooltip-cross-axis-offset'] = `${offset.crossAxis}px`;\n }\n\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\nfunction resolveTooltipColorStyle(color: TooltipProps['color']): CSSProperties | undefined {\n const customColor = getComponentCustomColor(color);\n if (!customColor) return undefined;\n\n return {\n '--_rp-tooltip-bg': customColor,\n '--_rp-tooltip-fg': 'var(--rp-color-on-primary)',\n };\n}\n\nexport function useTooltip(\n props: Readonly<TooltipProps>,\n emitOpenChange?: (open: boolean) => void,\n) {\n const slots = useSlots();\n const generatedId = useId();\n const targetElement = ref<HTMLElement | null>(null);\n const targetPosition = ref<TooltipPosition | null>(null);\n\n let isMounted = false;\n let removeTargetListeners: (() => void) | undefined;\n let removePositionListeners: (() => void) | undefined;\n let describedTarget: HTMLElement | null = null;\n let previousTargetDescribedby: string | null = null;\n\n const tooltipId = computed(() => props.id ?? `${generatedId}-tooltip`);\n const placement = computed(() => props.placement ?? 'top');\n const isTargetMode = computed(() => props.target != null && props.target !== '');\n const hasContent = computed(() => Boolean(props.content || slots.content));\n const isDecorative = computed(() => Boolean(props.decorative));\n const isDisabled = computed(() => Boolean(props.disabled || !hasContent.value));\n const shouldRenderContent = computed(() => !isDisabled.value);\n const shouldDescribeContent = computed(() => shouldRenderContent.value && !isDecorative.value);\n\n const { isOpen, open, closeImmediate } = useDelayedOpen({\n open: () => props.open,\n openDelay: () => props.openDelay ?? 300,\n disabled: () => isDisabled.value,\n onOpenChange: emitOpenChange,\n });\n\n const isVisible = computed(() => isOpen.value && !isDisabled.value);\n\n const rootClass = computed(() =>\n bem('rp-tooltip', {\n [`placement-${placement.value}`]: true,\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n arrow: props.arrow,\n target: isTargetMode.value,\n open: isVisible.value,\n disabled: props.disabled,\n }),\n );\n\n const triggerProps = computed<TooltipTriggerProps>(() => ({\n 'aria-describedby': shouldDescribeContent.value ? tooltipId.value : undefined,\n }));\n\n const contentRole = computed(() => (isDecorative.value ? undefined : 'tooltip'));\n const contentAriaHidden = computed(() => (isDecorative.value ? 'true' : undefined));\n\n const contentStyle = computed<CSSProperties | undefined>(() => {\n const style: CSSProperties = {\n ...resolveOffsetStyle(props.offset),\n ...resolveTooltipColorStyle(props.color),\n };\n\n if (!isTargetMode.value || !targetPosition.value) {\n return Object.keys(style).length > 0 ? style : undefined;\n }\n\n return {\n ...style,\n '--_rp-tooltip-target-x': `${targetPosition.value.x}px`,\n '--_rp-tooltip-target-y': `${targetPosition.value.y}px`,\n };\n });\n\n function openTooltip() {\n open();\n }\n\n function closeTooltip() {\n closeImmediate();\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') closeTooltip();\n }\n\n function readTarget() {\n return isRef(props.target) ? props.target.value : props.target;\n }\n\n function resolveTarget() {\n const target = readTarget();\n if (!target) return null;\n\n if (typeof target === 'string') {\n if (typeof document === 'undefined') return null;\n\n try {\n const element = document.querySelector(target);\n return isHTMLElement(element) ? element : null;\n } catch {\n return null;\n }\n }\n\n return isHTMLElement(target) ? target : null;\n }\n\n function restoreTargetDescription() {\n if (!describedTarget) return;\n\n if (previousTargetDescribedby) {\n describedTarget.setAttribute('aria-describedby', previousTargetDescribedby);\n } else {\n describedTarget.removeAttribute('aria-describedby');\n }\n\n describedTarget = null;\n previousTargetDescribedby = null;\n }\n\n function syncTargetDescription() {\n restoreTargetDescription();\n\n if (!isTargetMode.value || !shouldDescribeContent.value || !targetElement.value) return;\n\n describedTarget = targetElement.value;\n previousTargetDescribedby = describedTarget.getAttribute('aria-describedby');\n\n const ids = (previousTargetDescribedby ?? '').split(/\\s+/).filter(Boolean);\n if (!ids.includes(tooltipId.value)) ids.push(tooltipId.value);\n describedTarget.setAttribute('aria-describedby', ids.join(' '));\n }\n\n function updateTargetPosition() {\n if (!isTargetMode.value || !targetElement.value) {\n targetPosition.value = null;\n return;\n }\n\n targetPosition.value = getTargetPosition(\n targetElement.value.getBoundingClientRect(),\n placement.value,\n );\n }\n\n function onTargetOpen() {\n updateTargetPosition();\n openTooltip();\n }\n\n function bindTargetListeners(element: HTMLElement) {\n removeTargetListeners?.();\n\n element.addEventListener('mouseenter', onTargetOpen);\n element.addEventListener('mouseleave', closeTooltip);\n element.addEventListener('focusin', onTargetOpen);\n element.addEventListener('focusout', closeTooltip);\n element.addEventListener('keydown', onKeydown);\n\n removeTargetListeners = () => {\n element.removeEventListener('mouseenter', onTargetOpen);\n element.removeEventListener('mouseleave', closeTooltip);\n element.removeEventListener('focusin', onTargetOpen);\n element.removeEventListener('focusout', closeTooltip);\n element.removeEventListener('keydown', onKeydown);\n removeTargetListeners = undefined;\n };\n }\n\n function removeViewportListeners() {\n removePositionListeners?.();\n removePositionListeners = undefined;\n }\n\n function bindViewportListeners() {\n if (typeof window === 'undefined' || removePositionListeners) return;\n\n window.addEventListener('resize', updateTargetPosition);\n window.addEventListener('scroll', updateTargetPosition, true);\n\n removePositionListeners = () => {\n window.removeEventListener('resize', updateTargetPosition);\n window.removeEventListener('scroll', updateTargetPosition, true);\n };\n }\n\n function syncTarget() {\n if (!isTargetMode.value) {\n removeTargetListeners?.();\n removeViewportListeners();\n restoreTargetDescription();\n targetElement.value = null;\n targetPosition.value = null;\n return;\n }\n\n const nextTarget = resolveTarget();\n if (targetElement.value === nextTarget) {\n syncTargetDescription();\n updateTargetPosition();\n return;\n }\n\n removeTargetListeners?.();\n removeViewportListeners();\n restoreTargetDescription();\n targetElement.value = nextTarget;\n\n if (!nextTarget) {\n targetPosition.value = null;\n return;\n }\n\n bindTargetListeners(nextTarget);\n syncTargetDescription();\n updateTargetPosition();\n }\n\n watch(isDisabled, (disabled) => {\n if (disabled) closeTooltip();\n });\n\n watch(\n () => readTarget(),\n () => {\n if (isMounted) syncTarget();\n },\n { flush: 'post' },\n );\n\n watch([isTargetMode, shouldDescribeContent, tooltipId], () => {\n if (isMounted) syncTargetDescription();\n });\n\n watch([placement, isVisible], () => {\n if (isMounted && isVisible.value) updateTargetPosition();\n });\n\n watch(isVisible, (visible) => {\n if (!isMounted || !isTargetMode.value) return;\n\n if (visible) {\n updateTargetPosition();\n bindViewportListeners();\n } else {\n removeViewportListeners();\n }\n });\n\n onMounted(() => {\n isMounted = true;\n syncTarget();\n });\n\n onBeforeUnmount(() => {\n isMounted = false;\n removeTargetListeners?.();\n removeViewportListeners();\n restoreTargetDescription();\n });\n\n return {\n tooltipId,\n isOpen,\n isVisible,\n isTargetMode,\n shouldRenderContent,\n rootClass,\n triggerProps,\n contentRole,\n contentAriaHidden,\n contentStyle,\n openTooltip,\n closeTooltip,\n onKeydown,\n };\n}\n","<template>\n <span\n :class=\"rootClass\"\n @mouseenter=\"openTooltip\"\n @mouseleave=\"closeTooltip\"\n @focusin=\"openTooltip\"\n @focusout=\"closeTooltip\"\n @keydown=\"onKeydown\"\n >\n <slot v-if=\"!isTargetMode\" :trigger-props=\"triggerProps\" />\n\n <Transition name=\"rp-tooltip-content\">\n <span\n v-if=\"shouldRenderContent\"\n v-show=\"isVisible\"\n :id=\"tooltipId\"\n class=\"rp-tooltip__content\"\n :role=\"contentRole\"\n :aria-hidden=\"contentAriaHidden\"\n :style=\"contentStyle\"\n >\n <slot name=\"content\">{{ content }}</slot>\n </span>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTooltip } from './useTooltip';\nimport type { TooltipProps } from './types';\n\ndefineOptions({ name: 'RpTooltip' });\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n content: '',\n placement: 'top',\n open: undefined,\n openDelay: 300,\n arrow: false,\n disabled: false,\n decorative: false,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n tooltipId,\n isVisible,\n isTargetMode,\n shouldRenderContent,\n rootClass,\n triggerProps,\n contentRole,\n contentAriaHidden,\n contentStyle,\n openTooltip,\n closeTooltip,\n onKeydown,\n} = useTooltip(props, (open) => {\n emit('update:open', open);\n});\n</script>\n\n<style src=\"./tooltip.scss\" lang=\"scss\" scoped></style>\n","<template>\n <span\n :class=\"rootClass\"\n @mouseenter=\"openTooltip\"\n @mouseleave=\"closeTooltip\"\n @focusin=\"openTooltip\"\n @focusout=\"closeTooltip\"\n @keydown=\"onKeydown\"\n >\n <slot v-if=\"!isTargetMode\" :trigger-props=\"triggerProps\" />\n\n <Transition name=\"rp-tooltip-content\">\n <span\n v-if=\"shouldRenderContent\"\n v-show=\"isVisible\"\n :id=\"tooltipId\"\n class=\"rp-tooltip__content\"\n :role=\"contentRole\"\n :aria-hidden=\"contentAriaHidden\"\n :style=\"contentStyle\"\n >\n <slot name=\"content\">{{ content }}</slot>\n </span>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTooltip } from './useTooltip';\nimport type { TooltipProps } from './types';\n\ndefineOptions({ name: 'RpTooltip' });\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n content: '',\n placement: 'top',\n open: undefined,\n openDelay: 300,\n arrow: false,\n disabled: false,\n decorative: false,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n tooltipId,\n isVisible,\n isTargetMode,\n shouldRenderContent,\n rootClass,\n triggerProps,\n contentRole,\n contentAriaHidden,\n contentStyle,\n openTooltip,\n closeTooltip,\n onKeydown,\n} = useTooltip(props, (open) => {\n emit('update:open', open);\n});\n</script>\n\n<style src=\"./tooltip.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;AASA,SAAS,WAAc,OAA8C,UAAgB;CACjF,OAAO,OAAO,UAAU,aAChB,MAA8B,KAAK,WACpC,SAAS;AACpB;AAEA,SAAS,aAAgB,OAA6D;CAClF,OAAO,OAAO,UAAU,aAAc,MAA8B,IAAI;AAC5E;AAEA,SAAgB,eAAe,UAAiC,CAAC,GAAG;CAChE,MAAM,mBAAmB,IAAI,KAAK;CAClC,IAAI,YAAkD;CAEtD,MAAM,SAAS,eAAe,aAAa,QAAQ,IAAI,KAAK,iBAAiB,KAAK;CAElF,SAAS,cAAc;EACnB,IAAI,WAAW;GACX,aAAa,SAAS;GACtB,YAAY;EAChB;CACJ;CAEA,SAAS,aAAa;EAClB,OAAO,WAAW,QAAQ,UAAU,KAAK;CAC7C;CAEA,SAAS,QAAQ,UAAmB;EAChC,MAAM,eAAe,OAAO;EAC5B,IAAI,aAAa,QAAQ,IAAI,MAAM,KAAA,GAAW,iBAAiB,QAAQ;EACvE,IAAI,iBAAiB,UAAU,QAAQ,eAAe,QAAQ;CAClE;CAEA,SAAS,OAAO;EACZ,IAAI,WAAW,GAAG;EAClB,MAAM,QAAQ,WAAW,QAAQ,WAAW,CAAC;EAC7C,IAAI,SAAS,GAAG;GACZ,QAAQ,IAAI;GACZ;EACJ;EACA,IAAI,WAAW,aAAa,SAAS;EACrC,YAAY,iBAAiB;GACzB,QAAQ,IAAI;GACZ,YAAY;EAChB,GAAG,KAAK;CACZ;CAEA,SAAS,iBAAiB;EACtB,YAAY;EACZ,QAAQ,KAAK;CACjB;CAEA,gBAAgB,WAAW;CAE3B,OAAO;EACH;EACA;EACA;CACJ;AACJ;;;AC/CA,SAAS,cAAc,OAAsC;CACzD,OAAO,OAAO,gBAAgB,eAAe,iBAAiB;AAClE;AAEA,SAAS,kBAAkB,MAAe,WAA8C;CACpF,QAAQ,WAAR;EACI,KAAK,SACD,OAAO;GAAE,GAAG,KAAK;GAAO,GAAG,KAAK,MAAM,KAAK,SAAS;EAAE;EAC1D,KAAK,UACD,OAAO;GAAE,GAAG,KAAK,OAAO,KAAK,QAAQ;GAAG,GAAG,KAAK;EAAO;EAC3D,KAAK,QACD,OAAO;GAAE,GAAG,KAAK;GAAM,GAAG,KAAK,MAAM,KAAK,SAAS;EAAE;EAEzD,SACI,OAAO;GAAE,GAAG,KAAK,OAAO,KAAK,QAAQ;GAAG,GAAG,KAAK;EAAI;CAC5D;AACJ;AAEA,SAAS,mBAAmB,QAA8D;CACtF,IAAI,UAAU,MAAM,OAAO,KAAA;CAE3B,IAAI,OAAO,WAAW,UAClB,OAAO,EACH,kCAAkC,GAAG,OAAO,IAChD;CAGJ,MAAM,QAAuB,CAAC;CAE9B,IAAI,OAAO,YAAY,MACnB,MAAM,oCAAoC,GAAG,OAAO,SAAS;CAGjE,IAAI,OAAO,aAAa,MACpB,MAAM,qCAAqC,GAAG,OAAO,UAAU;CAGnE,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,QAAQ,KAAA;AACnD;AAEA,SAAS,yBAAyB,OAAyD;CACvF,MAAM,cAAc,wBAAwB,KAAK;CACjD,IAAI,CAAC,aAAa,OAAO,KAAA;CAEzB,OAAO;EACH,oBAAoB;EACpB,oBAAoB;CACxB;AACJ;AAEA,SAAgB,WACZ,OACA,gBACF;CACE,MAAM,QAAQ,SAAS;CACvB,MAAM,cAAc,MAAM;CAC1B,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,iBAAiB,IAA4B,IAAI;CAEvD,IAAI,YAAY;CAChB,IAAI;CACJ,IAAI;CACJ,IAAI,kBAAsC;CAC1C,IAAI,4BAA2C;CAE/C,MAAM,YAAY,eAAe,MAAM,MAAM,GAAG,YAAY,SAAS;CACrE,MAAM,YAAY,eAAe,MAAM,aAAa,KAAK;CACzD,MAAM,eAAe,eAAe,MAAM,UAAU,QAAQ,MAAM,WAAW,EAAE;CAC/E,MAAM,aAAa,eAAe,QAAQ,MAAM,WAAW,MAAM,OAAO,CAAC;CACzE,MAAM,eAAe,eAAe,QAAQ,MAAM,UAAU,CAAC;CAC7D,MAAM,aAAa,eAAe,QAAQ,MAAM,YAAY,CAAC,WAAW,KAAK,CAAC;CAC9E,MAAM,sBAAsB,eAAe,CAAC,WAAW,KAAK;CAC5D,MAAM,wBAAwB,eAAe,oBAAoB,SAAS,CAAC,aAAa,KAAK;CAE7F,MAAM,EAAE,QAAQ,MAAM,mBAAmB,eAAe;EACpD,YAAY,MAAM;EAClB,iBAAiB,MAAM,aAAa;EACpC,gBAAgB,WAAW;EAC3B,cAAc;CAClB,CAAC;CAED,MAAM,YAAY,eAAe,OAAO,SAAS,CAAC,WAAW,KAAK;CAElE,MAAM,YAAY,eACd,IAAI,cAAc;GACb,aAAa,UAAU,UAAU;GACjC,SAAS,MAAM,UAAU,uBAAuB,MAAM,KAAK;EAC5D,OAAO,MAAM;EACb,QAAQ,aAAa;EACrB,MAAM,UAAU;EAChB,UAAU,MAAM;CACpB,CAAC,CACL;CAEA,MAAM,eAAe,gBAAqC,EACtD,oBAAoB,sBAAsB,QAAQ,UAAU,QAAQ,KAAA,EACxE,EAAE;CAEF,MAAM,cAAc,eAAgB,aAAa,QAAQ,KAAA,IAAY,SAAU;CAC/E,MAAM,oBAAoB,eAAgB,aAAa,QAAQ,SAAS,KAAA,CAAU;CAElF,MAAM,eAAe,eAA0C;EAC3D,MAAM,QAAuB;GACzB,GAAG,mBAAmB,MAAM,MAAM;GAClC,GAAG,yBAAyB,MAAM,KAAK;EAC3C;EAEA,IAAI,CAAC,aAAa,SAAS,CAAC,eAAe,OACvC,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,QAAQ,KAAA;EAGnD,OAAO;GACH,GAAG;GACH,0BAA0B,GAAG,eAAe,MAAM,EAAE;GACpD,0BAA0B,GAAG,eAAe,MAAM,EAAE;EACxD;CACJ,CAAC;CAED,SAAS,cAAc;EACnB,KAAK;CACT;CAEA,SAAS,eAAe;EACpB,eAAe;CACnB;CAEA,SAAS,UAAU,OAAsB;EACrC,IAAI,MAAM,QAAQ,UAAU,aAAa;CAC7C;CAEA,SAAS,aAAa;EAClB,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,OAAO,QAAQ,MAAM;CAC5D;CAEA,SAAS,gBAAgB;EACrB,MAAM,SAAS,WAAW;EAC1B,IAAI,CAAC,QAAQ,OAAO;EAEpB,IAAI,OAAO,WAAW,UAAU;GAC5B,IAAI,OAAO,aAAa,aAAa,OAAO;GAE5C,IAAI;IACA,MAAM,UAAU,SAAS,cAAc,MAAM;IAC7C,OAAO,cAAc,OAAO,IAAI,UAAU;GAC9C,QAAQ;IACJ,OAAO;GACX;EACJ;EAEA,OAAO,cAAc,MAAM,IAAI,SAAS;CAC5C;CAEA,SAAS,2BAA2B;EAChC,IAAI,CAAC,iBAAiB;EAEtB,IAAI,2BACA,gBAAgB,aAAa,oBAAoB,yBAAyB;OAE1E,gBAAgB,gBAAgB,kBAAkB;EAGtD,kBAAkB;EAClB,4BAA4B;CAChC;CAEA,SAAS,wBAAwB;EAC7B,yBAAyB;EAEzB,IAAI,CAAC,aAAa,SAAS,CAAC,sBAAsB,SAAS,CAAC,cAAc,OAAO;EAEjF,kBAAkB,cAAc;EAChC,4BAA4B,gBAAgB,aAAa,kBAAkB;EAE3E,MAAM,OAAO,6BAA6B,GAAA,CAAI,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;EACzE,IAAI,CAAC,IAAI,SAAS,UAAU,KAAK,GAAG,IAAI,KAAK,UAAU,KAAK;EAC5D,gBAAgB,aAAa,oBAAoB,IAAI,KAAK,GAAG,CAAC;CAClE;CAEA,SAAS,uBAAuB;EAC5B,IAAI,CAAC,aAAa,SAAS,CAAC,cAAc,OAAO;GAC7C,eAAe,QAAQ;GACvB;EACJ;EAEA,eAAe,QAAQ,kBACnB,cAAc,MAAM,sBAAsB,GAC1C,UAAU,KACd;CACJ;CAEA,SAAS,eAAe;EACpB,qBAAqB;EACrB,YAAY;CAChB;CAEA,SAAS,oBAAoB,SAAsB;EAC/C,wBAAwB;EAExB,QAAQ,iBAAiB,cAAc,YAAY;EACnD,QAAQ,iBAAiB,cAAc,YAAY;EACnD,QAAQ,iBAAiB,WAAW,YAAY;EAChD,QAAQ,iBAAiB,YAAY,YAAY;EACjD,QAAQ,iBAAiB,WAAW,SAAS;EAE7C,8BAA8B;GAC1B,QAAQ,oBAAoB,cAAc,YAAY;GACtD,QAAQ,oBAAoB,cAAc,YAAY;GACtD,QAAQ,oBAAoB,WAAW,YAAY;GACnD,QAAQ,oBAAoB,YAAY,YAAY;GACpD,QAAQ,oBAAoB,WAAW,SAAS;GAChD,wBAAwB,KAAA;EAC5B;CACJ;CAEA,SAAS,0BAA0B;EAC/B,0BAA0B;EAC1B,0BAA0B,KAAA;CAC9B;CAEA,SAAS,wBAAwB;EAC7B,IAAI,OAAO,WAAW,eAAe,yBAAyB;EAE9D,OAAO,iBAAiB,UAAU,oBAAoB;EACtD,OAAO,iBAAiB,UAAU,sBAAsB,IAAI;EAE5D,gCAAgC;GAC5B,OAAO,oBAAoB,UAAU,oBAAoB;GACzD,OAAO,oBAAoB,UAAU,sBAAsB,IAAI;EACnE;CACJ;CAEA,SAAS,aAAa;EAClB,IAAI,CAAC,aAAa,OAAO;GACrB,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,cAAc,QAAQ;GACtB,eAAe,QAAQ;GACvB;EACJ;EAEA,MAAM,aAAa,cAAc;EACjC,IAAI,cAAc,UAAU,YAAY;GACpC,sBAAsB;GACtB,qBAAqB;GACrB;EACJ;EAEA,wBAAwB;EACxB,wBAAwB;EACxB,yBAAyB;EACzB,cAAc,QAAQ;EAEtB,IAAI,CAAC,YAAY;GACb,eAAe,QAAQ;GACvB;EACJ;EAEA,oBAAoB,UAAU;EAC9B,sBAAsB;EACtB,qBAAqB;CACzB;CAEA,MAAM,aAAa,aAAa;EAC5B,IAAI,UAAU,aAAa;CAC/B,CAAC;CAED,YACU,WAAW,SACX;EACF,IAAI,WAAW,WAAW;CAC9B,GACA,EAAE,OAAO,OAAO,CACpB;CAEA,MAAM;EAAC;EAAc;EAAuB;CAAS,SAAS;EAC1D,IAAI,WAAW,sBAAsB;CACzC,CAAC;CAED,MAAM,CAAC,WAAW,SAAS,SAAS;EAChC,IAAI,aAAa,UAAU,OAAO,qBAAqB;CAC3D,CAAC;CAED,MAAM,YAAY,YAAY;EAC1B,IAAI,CAAC,aAAa,CAAC,aAAa,OAAO;EAEvC,IAAI,SAAS;GACT,qBAAqB;GACrB,sBAAsB;EAC1B,OACI,wBAAwB;CAEhC,CAAC;CAED,gBAAgB;EACZ,YAAY;EACZ,WAAW;CACf,CAAC;CAED,sBAAsB;EAClB,YAAY;EACZ,wBAAwB;EACxB,wBAAwB;EACxB,yBAAyB;CAC7B,CAAC;CAED,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECrTA,MAAM,QAAQ;EAUd,MAAM,OAAO;EAIb,MAAM,EACF,WACA,WACA,cACA,qBACA,WACA,cACA,aACA,mBACA,cACA,aACA,cACA,cACA,WAAW,QAAQ,SAAS;GAC5B,KAAK,eAAe,IAAI;EAC5B,CAAC;;mCA5De,MAAA,SAAA,CAAS,CAAA;;kBAOJ,MAAA,YAAA,SAAY;kCAAG,oBAAe,MAAA,YAAA,EAAY,GAAA,MAAA,CAAA;;;;GAE3C,MAAK;GAAjB,WAYa;;yBAVC,MAAA,mBAAA,SAAmB;;;iBAExB,MAAI,MAAA,SAAA,CAAS;iBAEb,QAAM,MAAA,WAAA,CAAW;iBACjB,eAAa,MAAA,iBAAA,CAAiB;kBACvB,MAAA,YAAA,CAAY;;;eAEd,WAAc,YAAA;;oDAAI,QAAA,OAAO,CAAA,CAAA;;;yBAPvB,MAAA,SAAA,CAAS;;;;UAXxB,eAAU,MAAE,MAAA,WAAA,CAAW,CAAA,CAAA,CAAA;UACvB,eAAU,MAAE,MAAA,YAAA,CAAY,CAAA,CAAA,CAAA;yCACf,MAAA,WAAA,CAAW,CAAA,CAAA,CAAA;0CACV,MAAA,YAAA,CAAY,CAAA,CAAA,CAAA;yCACb,MAAA,SAAA,CAAS,CAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { n as getComponentCustomColor } from "./componentColors.js";
|
|
2
|
+
import { defineVaporComponent, markRaw, template } from "vue";
|
|
3
|
+
//#region ~icons/lucide/loader-circle
|
|
4
|
+
var t0 = template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"M21 12a9 9 0 1 1-6.219-8.56\">", 3, 1);
|
|
5
|
+
function render(_ctx) {
|
|
6
|
+
return t0();
|
|
7
|
+
}
|
|
8
|
+
var loader_circle_default = markRaw(defineVaporComponent({
|
|
9
|
+
name: "lucide-loader-circle",
|
|
10
|
+
render
|
|
11
|
+
}));
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/components/button/useButtonColor.ts
|
|
14
|
+
function getButtonColorStyle(color) {
|
|
15
|
+
const customColor = getComponentCustomColor(color);
|
|
16
|
+
if (!customColor) return void 0;
|
|
17
|
+
return {
|
|
18
|
+
"--_rp-button-custom-color": customColor,
|
|
19
|
+
"--_rp-button-custom-hover": `color-mix(in srgb, ${customColor} 90%, #111111)`,
|
|
20
|
+
"--_rp-button-custom-active": `color-mix(in srgb, ${customColor} 80%, #111111)`,
|
|
21
|
+
"--_rp-button-custom-on": "var(--rp-color-on-primary)",
|
|
22
|
+
"--_rp-button-custom-subtle-bg": `color-mix(in srgb, ${customColor} 12%, transparent)`,
|
|
23
|
+
"--_rp-button-custom-subtle-bg-hover": `color-mix(in srgb, ${customColor} 18%, transparent)`,
|
|
24
|
+
"--_rp-button-custom-subtle-bg-active": `color-mix(in srgb, ${customColor} 24%, transparent)`,
|
|
25
|
+
"--_rp-button-custom-border": `color-mix(in srgb, ${customColor} 45%, transparent)`,
|
|
26
|
+
"--_rp-button-custom-border-hover": `color-mix(in srgb, ${customColor} 62%, transparent)`,
|
|
27
|
+
"--_rp-button-custom-fg": customColor
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { loader_circle_default as n, getButtonColorStyle as t };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=useButtonColor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useButtonColor.js","names":[],"sources":["../src/components/button/useButtonColor.ts"],"sourcesContent":["import type { CSSProperties } from 'vue';\nimport { getComponentCustomColor } from '@/utils/componentColors';\nimport type { ButtonColor } from './types';\n\nexport function getButtonColorStyle(color: ButtonColor | undefined) {\n const customColor = getComponentCustomColor(color);\n if (!customColor) return undefined;\n\n return {\n '--_rp-button-custom-color': customColor,\n '--_rp-button-custom-hover': `color-mix(in srgb, ${customColor} 90%, #111111)`,\n '--_rp-button-custom-active': `color-mix(in srgb, ${customColor} 80%, #111111)`,\n '--_rp-button-custom-on': 'var(--rp-color-on-primary)',\n '--_rp-button-custom-subtle-bg': `color-mix(in srgb, ${customColor} 12%, transparent)`,\n '--_rp-button-custom-subtle-bg-hover': `color-mix(in srgb, ${customColor} 18%, transparent)`,\n '--_rp-button-custom-subtle-bg-active': `color-mix(in srgb, ${customColor} 24%, transparent)`,\n '--_rp-button-custom-border': `color-mix(in srgb, ${customColor} 45%, transparent)`,\n '--_rp-button-custom-border-hover': `color-mix(in srgb, ${customColor} 62%, transparent)`,\n '--_rp-button-custom-fg': customColor,\n } satisfies CSSProperties;\n}\n"],"mappings":";;;;;;;;;;;;;AAIA,SAAgB,oBAAoB,OAAgC;CAChE,MAAM,cAAc,wBAAwB,KAAK;CACjD,IAAI,CAAC,aAAa,OAAO,KAAA;CAEzB,OAAO;EACH,6BAA6B;EAC7B,6BAA6B,sBAAsB,YAAY;EAC/D,8BAA8B,sBAAsB,YAAY;EAChE,0BAA0B;EAC1B,iCAAiC,sBAAsB,YAAY;EACnE,uCAAuC,sBAAsB,YAAY;EACzE,wCAAwC,sBAAsB,YAAY;EAC1E,8BAA8B,sBAAsB,YAAY;EAChE,oCAAoC,sBAAsB,YAAY;EACtE,0BAA0B;CAC9B;AACJ"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { onBeforeUnmount, onMounted, watch } from "vue";
|
|
2
|
+
//#region src/composables/useClickOutside.ts
|
|
3
|
+
function useClickOutside(target, active, callback) {
|
|
4
|
+
let isListening = false;
|
|
5
|
+
let stopWatch;
|
|
6
|
+
function handler(e) {
|
|
7
|
+
if (target.value && !target.value.contains(e.target)) callback();
|
|
8
|
+
}
|
|
9
|
+
function setListening(value) {
|
|
10
|
+
if (typeof document === "undefined" || value === isListening) return;
|
|
11
|
+
isListening = value;
|
|
12
|
+
if (value) document.addEventListener("click", handler, true);
|
|
13
|
+
else document.removeEventListener("click", handler, true);
|
|
14
|
+
}
|
|
15
|
+
onMounted(() => {
|
|
16
|
+
stopWatch = watch(active, setListening, { immediate: true });
|
|
17
|
+
});
|
|
18
|
+
onBeforeUnmount(() => {
|
|
19
|
+
stopWatch?.();
|
|
20
|
+
setListening(false);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { useClickOutside as t };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=useClickOutside.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClickOutside.js","names":[],"sources":["../src/composables/useClickOutside.ts"],"sourcesContent":["import { watch, onMounted, onBeforeUnmount, type Ref } from 'vue';\n\nexport function useClickOutside(\n target: Ref<HTMLElement | null>,\n active: Readonly<Ref<boolean>>,\n callback: () => void,\n) {\n let isListening = false;\n let stopWatch: (() => void) | undefined;\n\n function handler(e: MouseEvent) {\n if (target.value && !target.value.contains(e.target as Node)) {\n callback();\n }\n }\n\n function setListening(value: boolean) {\n if (typeof document === 'undefined' || value === isListening) return;\n isListening = value;\n\n if (value) {\n document.addEventListener('click', handler, true);\n } else {\n document.removeEventListener('click', handler, true);\n }\n }\n\n onMounted(() => {\n stopWatch = watch(active, setListening, { immediate: true });\n });\n\n onBeforeUnmount(() => {\n stopWatch?.();\n setListening(false);\n });\n}\n"],"mappings":";;AAEA,SAAgB,gBACZ,QACA,QACA,UACF;CACE,IAAI,cAAc;CAClB,IAAI;CAEJ,SAAS,QAAQ,GAAe;EAC5B,IAAI,OAAO,SAAS,CAAC,OAAO,MAAM,SAAS,EAAE,MAAc,GACvD,SAAS;CAEjB;CAEA,SAAS,aAAa,OAAgB;EAClC,IAAI,OAAO,aAAa,eAAe,UAAU,aAAa;EAC9D,cAAc;EAEd,IAAI,OACA,SAAS,iBAAiB,SAAS,SAAS,IAAI;OAEhD,SAAS,oBAAoB,SAAS,SAAS,IAAI;CAE3D;CAEA,gBAAgB;EACZ,YAAY,MAAM,QAAQ,cAAc,EAAE,WAAW,KAAK,CAAC;CAC/D,CAAC;CAED,sBAAsB;EAClB,YAAY;EACZ,aAAa,KAAK;CACtB,CAAC;AACL"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { t as bem } from "./bem.js";
|
|
2
|
+
import { computed, ref, toValue, useId } from "vue";
|
|
3
|
+
//#region src/components/collapse/useCollapse.ts
|
|
4
|
+
var DEFAULT_ROLE = "region";
|
|
5
|
+
function optionValue(value) {
|
|
6
|
+
return toValue(value);
|
|
7
|
+
}
|
|
8
|
+
function useCollapse(options = {}, emitOpenChange) {
|
|
9
|
+
const generatedId = useId();
|
|
10
|
+
const uncontrolledOpen = ref(Boolean(optionValue(options.defaultOpen)));
|
|
11
|
+
const id = computed(() => optionValue(options.id) ?? `${generatedId}-collapse`);
|
|
12
|
+
const controlledOpen = computed(() => optionValue(options.open));
|
|
13
|
+
const isDisabled = computed(() => Boolean(optionValue(options.disabled)));
|
|
14
|
+
const isOpen = computed(() => Boolean(controlledOpen.value ?? uncontrolledOpen.value));
|
|
15
|
+
const state = computed(() => isOpen.value ? "open" : "closed");
|
|
16
|
+
const shouldRenderContent = computed(() => !optionValue(options.unmountOnExit) || isOpen.value);
|
|
17
|
+
const rootClass = computed(() => bem("rp-collapse", {
|
|
18
|
+
open: isOpen.value,
|
|
19
|
+
closed: !isOpen.value,
|
|
20
|
+
disabled: isDisabled.value
|
|
21
|
+
}));
|
|
22
|
+
const rootProps = computed(() => ({
|
|
23
|
+
class: rootClass.value,
|
|
24
|
+
"data-state": state.value,
|
|
25
|
+
"data-disabled": isDisabled.value || void 0
|
|
26
|
+
}));
|
|
27
|
+
const contentSlotProps = computed(() => ({
|
|
28
|
+
isOpen: isOpen.value,
|
|
29
|
+
open,
|
|
30
|
+
close,
|
|
31
|
+
toggle
|
|
32
|
+
}));
|
|
33
|
+
const triggerProps = computed(() => ({
|
|
34
|
+
type: "button",
|
|
35
|
+
disabled: isDisabled.value || void 0,
|
|
36
|
+
"aria-controls": id.value,
|
|
37
|
+
"aria-expanded": isOpen.value,
|
|
38
|
+
"aria-disabled": isDisabled.value || void 0,
|
|
39
|
+
onClick: onTriggerClick
|
|
40
|
+
}));
|
|
41
|
+
const contentProps = computed(() => ({
|
|
42
|
+
class: "rp-collapse__content",
|
|
43
|
+
id: id.value,
|
|
44
|
+
role: optionValue(options.role) ?? DEFAULT_ROLE,
|
|
45
|
+
"data-state": state.value,
|
|
46
|
+
"aria-hidden": isOpen.value ? void 0 : "true",
|
|
47
|
+
"aria-label": optionValue(options.ariaLabel) || void 0,
|
|
48
|
+
"aria-labelledby": optionValue(options.ariaLabelledby) || void 0,
|
|
49
|
+
"aria-describedby": optionValue(options.ariaDescribedby) || void 0
|
|
50
|
+
}));
|
|
51
|
+
const triggerSlotProps = computed(() => ({
|
|
52
|
+
triggerProps: triggerProps.value,
|
|
53
|
+
...contentSlotProps.value
|
|
54
|
+
}));
|
|
55
|
+
function setOpen(nextOpen) {
|
|
56
|
+
if (isDisabled.value || nextOpen === isOpen.value) return;
|
|
57
|
+
if (controlledOpen.value === void 0) uncontrolledOpen.value = nextOpen;
|
|
58
|
+
options.onOpenChange?.(nextOpen);
|
|
59
|
+
emitOpenChange?.(nextOpen);
|
|
60
|
+
}
|
|
61
|
+
function open() {
|
|
62
|
+
setOpen(true);
|
|
63
|
+
}
|
|
64
|
+
function close() {
|
|
65
|
+
setOpen(false);
|
|
66
|
+
}
|
|
67
|
+
function toggle() {
|
|
68
|
+
setOpen(!isOpen.value);
|
|
69
|
+
}
|
|
70
|
+
function onTriggerClick() {
|
|
71
|
+
toggle();
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
id,
|
|
75
|
+
state,
|
|
76
|
+
isDisabled,
|
|
77
|
+
isOpen,
|
|
78
|
+
shouldRenderContent,
|
|
79
|
+
rootClass,
|
|
80
|
+
rootProps,
|
|
81
|
+
triggerProps,
|
|
82
|
+
contentProps,
|
|
83
|
+
triggerSlotProps,
|
|
84
|
+
contentSlotProps,
|
|
85
|
+
setOpen,
|
|
86
|
+
open,
|
|
87
|
+
close,
|
|
88
|
+
toggle
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { useCollapse as t };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=useCollapse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCollapse.js","names":[],"sources":["../src/components/collapse/useCollapse.ts"],"sourcesContent":["import { computed, ref, toValue, useId } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type {\n CollapseContentProps,\n CollapseContentRole,\n CollapseOption,\n CollapseRootProps,\n CollapseSlotProps,\n CollapseState,\n CollapseTriggerProps,\n CollapseTriggerSlotProps,\n UseCollapseOptions,\n UseCollapseReturn,\n} from './types';\n\nconst DEFAULT_ROLE: CollapseContentRole = 'region';\n\nfunction optionValue<T>(value: CollapseOption<T | undefined> | undefined) {\n return toValue(value);\n}\n\nexport function useCollapse(\n options: Readonly<UseCollapseOptions> = {},\n emitOpenChange?: (open: boolean) => void,\n): UseCollapseReturn {\n const generatedId = useId();\n const uncontrolledOpen = ref(Boolean(optionValue<boolean>(options.defaultOpen)));\n\n const id = computed(() => optionValue<string>(options.id) ?? `${generatedId}-collapse`);\n const controlledOpen = computed(() => optionValue<boolean>(options.open));\n const isDisabled = computed(() => Boolean(optionValue<boolean>(options.disabled)));\n const isOpen = computed(() => Boolean(controlledOpen.value ?? uncontrolledOpen.value));\n const state = computed<CollapseState>(() => (isOpen.value ? 'open' : 'closed'));\n const shouldRenderContent = computed(\n () => !optionValue<boolean>(options.unmountOnExit) || isOpen.value,\n );\n\n const rootClass = computed(() =>\n bem('rp-collapse', {\n open: isOpen.value,\n closed: !isOpen.value,\n disabled: isDisabled.value,\n }),\n );\n\n const rootProps = computed<CollapseRootProps>(() => ({\n class: rootClass.value,\n 'data-state': state.value,\n 'data-disabled': isDisabled.value || undefined,\n }));\n\n const contentSlotProps = computed<CollapseSlotProps>(() => ({\n isOpen: isOpen.value,\n open,\n close,\n toggle,\n }));\n\n const triggerProps = computed<CollapseTriggerProps>(() => ({\n type: 'button',\n disabled: isDisabled.value || undefined,\n 'aria-controls': id.value,\n 'aria-expanded': isOpen.value,\n 'aria-disabled': isDisabled.value || undefined,\n onClick: onTriggerClick,\n }));\n\n const contentProps = computed<CollapseContentProps>(() => ({\n class: 'rp-collapse__content',\n id: id.value,\n role: optionValue<CollapseContentRole>(options.role) ?? DEFAULT_ROLE,\n 'data-state': state.value,\n 'aria-hidden': isOpen.value ? undefined : 'true',\n 'aria-label': optionValue<string>(options.ariaLabel) || undefined,\n 'aria-labelledby': optionValue<string>(options.ariaLabelledby) || undefined,\n 'aria-describedby': optionValue<string>(options.ariaDescribedby) || undefined,\n }));\n\n const triggerSlotProps = computed<CollapseTriggerSlotProps>(() => ({\n triggerProps: triggerProps.value,\n ...contentSlotProps.value,\n }));\n\n function setOpen(nextOpen: boolean) {\n if (isDisabled.value || nextOpen === isOpen.value) return;\n\n if (controlledOpen.value === undefined) uncontrolledOpen.value = nextOpen;\n options.onOpenChange?.(nextOpen);\n emitOpenChange?.(nextOpen);\n }\n\n function open() {\n setOpen(true);\n }\n\n function close() {\n setOpen(false);\n }\n\n function toggle() {\n setOpen(!isOpen.value);\n }\n\n function onTriggerClick() {\n toggle();\n }\n\n return {\n id,\n state,\n isDisabled,\n isOpen,\n shouldRenderContent,\n rootClass,\n rootProps,\n triggerProps,\n contentProps,\n triggerSlotProps,\n contentSlotProps,\n setOpen,\n open,\n close,\n toggle,\n };\n}\n"],"mappings":";;;AAeA,IAAM,eAAoC;AAE1C,SAAS,YAAe,OAAkD;CACtE,OAAO,QAAQ,KAAK;AACxB;AAEA,SAAgB,YACZ,UAAwC,CAAC,GACzC,gBACiB;CACjB,MAAM,cAAc,MAAM;CAC1B,MAAM,mBAAmB,IAAI,QAAQ,YAAqB,QAAQ,WAAW,CAAC,CAAC;CAE/E,MAAM,KAAK,eAAe,YAAoB,QAAQ,EAAE,KAAK,GAAG,YAAY,UAAU;CACtF,MAAM,iBAAiB,eAAe,YAAqB,QAAQ,IAAI,CAAC;CACxE,MAAM,aAAa,eAAe,QAAQ,YAAqB,QAAQ,QAAQ,CAAC,CAAC;CACjF,MAAM,SAAS,eAAe,QAAQ,eAAe,SAAS,iBAAiB,KAAK,CAAC;CACrF,MAAM,QAAQ,eAA+B,OAAO,QAAQ,SAAS,QAAS;CAC9E,MAAM,sBAAsB,eAClB,CAAC,YAAqB,QAAQ,aAAa,KAAK,OAAO,KACjE;CAEA,MAAM,YAAY,eACd,IAAI,eAAe;EACf,MAAM,OAAO;EACb,QAAQ,CAAC,OAAO;EAChB,UAAU,WAAW;CACzB,CAAC,CACL;CAEA,MAAM,YAAY,gBAAmC;EACjD,OAAO,UAAU;EACjB,cAAc,MAAM;EACpB,iBAAiB,WAAW,SAAS,KAAA;CACzC,EAAE;CAEF,MAAM,mBAAmB,gBAAmC;EACxD,QAAQ,OAAO;EACf;EACA;EACA;CACJ,EAAE;CAEF,MAAM,eAAe,gBAAsC;EACvD,MAAM;EACN,UAAU,WAAW,SAAS,KAAA;EAC9B,iBAAiB,GAAG;EACpB,iBAAiB,OAAO;EACxB,iBAAiB,WAAW,SAAS,KAAA;EACrC,SAAS;CACb,EAAE;CAEF,MAAM,eAAe,gBAAsC;EACvD,OAAO;EACP,IAAI,GAAG;EACP,MAAM,YAAiC,QAAQ,IAAI,KAAK;EACxD,cAAc,MAAM;EACpB,eAAe,OAAO,QAAQ,KAAA,IAAY;EAC1C,cAAc,YAAoB,QAAQ,SAAS,KAAK,KAAA;EACxD,mBAAmB,YAAoB,QAAQ,cAAc,KAAK,KAAA;EAClE,oBAAoB,YAAoB,QAAQ,eAAe,KAAK,KAAA;CACxE,EAAE;CAEF,MAAM,mBAAmB,gBAA0C;EAC/D,cAAc,aAAa;EAC3B,GAAG,iBAAiB;CACxB,EAAE;CAEF,SAAS,QAAQ,UAAmB;EAChC,IAAI,WAAW,SAAS,aAAa,OAAO,OAAO;EAEnD,IAAI,eAAe,UAAU,KAAA,GAAW,iBAAiB,QAAQ;EACjE,QAAQ,eAAe,QAAQ;EAC/B,iBAAiB,QAAQ;CAC7B;CAEA,SAAS,OAAO;EACZ,QAAQ,IAAI;CAChB;CAEA,SAAS,QAAQ;EACb,QAAQ,KAAK;CACjB;CAEA,SAAS,SAAS;EACd,QAAQ,CAAC,OAAO,KAAK;CACzB;CAEA,SAAS,iBAAiB;EACtB,OAAO;CACX;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { inject } from "vue";
|
|
2
|
+
//#region src/composables/useRequiredInject.ts
|
|
3
|
+
function useRequiredInject(key, componentName) {
|
|
4
|
+
const value = inject(key);
|
|
5
|
+
if (value == null) throw new Error(`[Ropav] <${componentName}> must be used inside its parent provider component.`);
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { useRequiredInject as t };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=useRequiredInject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRequiredInject.js","names":[],"sources":["../src/composables/useRequiredInject.ts"],"sourcesContent":["import { inject, type InjectionKey } from 'vue';\n\nexport function useRequiredInject<T>(key: InjectionKey<T>, componentName: string): T {\n const value = inject(key);\n if (value == null) {\n throw new Error(\n `[Ropav] <${componentName}> must be used inside its parent provider component.`,\n );\n }\n return value;\n}\n"],"mappings":";;AAEA,SAAgB,kBAAqB,KAAsB,eAA0B;CACjF,MAAM,QAAQ,OAAO,GAAG;CACxB,IAAI,SAAS,MACT,MAAM,IAAI,MACN,YAAY,cAAc,qDAC9B;CAEJ,OAAO;AACX"}
|
package/dist/x.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineVaporComponent, markRaw, template } from "vue";
|
|
2
|
+
//#region ~icons/lucide/x
|
|
3
|
+
var t0 = template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"M18 6L6 18M6 6l12 12\">", 3, 1);
|
|
4
|
+
function render(_ctx) {
|
|
5
|
+
return t0();
|
|
6
|
+
}
|
|
7
|
+
var x_default = markRaw(defineVaporComponent({
|
|
8
|
+
name: "lucide-x",
|
|
9
|
+
render
|
|
10
|
+
}));
|
|
11
|
+
//#endregion
|
|
12
|
+
export { x_default as t };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=x.js.map
|
package/dist/x.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x.js","names":[],"sources":[],"mappings":""}
|