@mdigital_ui/ui 0.4.4 → 0.4.6
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 +258 -662
- package/dist/anchor/index.js +4 -0
- package/dist/anchor/index.js.map +1 -0
- package/dist/autocomplete/index.js +6 -0
- package/dist/autocomplete/index.js.map +1 -0
- package/dist/breadcrumbs/index.js +3 -3
- package/dist/calendar/index.js +4 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/chunk-3Z7RLVWD.js +258 -0
- package/dist/chunk-3Z7RLVWD.js.map +1 -0
- package/dist/chunk-5YEC6FDN.js +263 -0
- package/dist/chunk-5YEC6FDN.js.map +1 -0
- package/dist/{chunk-GOBUFGGJ.js → chunk-6NXZWLSM.js} +3 -3
- package/dist/{chunk-GOBUFGGJ.js.map → chunk-6NXZWLSM.js.map} +1 -1
- package/dist/{chunk-FU5Q4WVX.js → chunk-6ROGWFQ2.js} +3 -3
- package/dist/{chunk-FU5Q4WVX.js.map → chunk-6ROGWFQ2.js.map} +1 -1
- package/dist/{chunk-LJOQ2C5W.js → chunk-6RZEJRTC.js} +3 -3
- package/dist/{chunk-LJOQ2C5W.js.map → chunk-6RZEJRTC.js.map} +1 -1
- package/dist/chunk-74AF6PO2.js +374 -0
- package/dist/chunk-74AF6PO2.js.map +1 -0
- package/dist/chunk-75N6T3IS.js +77 -0
- package/dist/chunk-75N6T3IS.js.map +1 -0
- package/dist/{chunk-BKLJDEUX.js → chunk-DBPLQZJ2.js} +38 -14
- package/dist/chunk-DBPLQZJ2.js.map +1 -0
- package/dist/chunk-ED4CQZ72.js +343 -0
- package/dist/chunk-ED4CQZ72.js.map +1 -0
- package/dist/{chunk-4ZXHLPRS.js → chunk-FY2TZ2NT.js} +4 -4
- package/dist/{chunk-4ZXHLPRS.js.map → chunk-FY2TZ2NT.js.map} +1 -1
- package/dist/{chunk-I5AD247M.js → chunk-HKQOAEFY.js} +13 -3
- package/dist/chunk-HKQOAEFY.js.map +1 -0
- package/dist/chunk-JWYBDNC6.js +307 -0
- package/dist/chunk-JWYBDNC6.js.map +1 -0
- package/dist/{chunk-W5VLFE4U.js → chunk-LHZJ2GJU.js} +32 -6
- package/dist/chunk-LHZJ2GJU.js.map +1 -0
- package/dist/{chunk-253JZOYG.js → chunk-NB66D6A5.js} +3 -2
- package/dist/chunk-NB66D6A5.js.map +1 -0
- package/dist/{chunk-BGMYX7L5.js → chunk-NF6JUJBE.js} +9 -7
- package/dist/chunk-NF6JUJBE.js.map +1 -0
- package/dist/chunk-NPK4ESMA.js +281 -0
- package/dist/chunk-NPK4ESMA.js.map +1 -0
- package/dist/{chunk-X7MF3TIF.js → chunk-PD3O6ZH4.js} +12 -5
- package/dist/chunk-PD3O6ZH4.js.map +1 -0
- package/dist/{chunk-XOEEAMMY.js → chunk-Q46WXJVW.js} +21 -21
- package/dist/chunk-Q46WXJVW.js.map +1 -0
- package/dist/chunk-QEYNOLRC.js +157 -0
- package/dist/chunk-QEYNOLRC.js.map +1 -0
- package/dist/chunk-RNG7HR6U.js +174 -0
- package/dist/chunk-RNG7HR6U.js.map +1 -0
- package/dist/{chunk-HJITFPBT.js → chunk-SZMIHNCZ.js} +13 -7
- package/dist/chunk-SZMIHNCZ.js.map +1 -0
- package/dist/chunk-TDPJYCNI.js +96 -0
- package/dist/chunk-TDPJYCNI.js.map +1 -0
- package/dist/chunk-UFYG3HKL.js +374 -0
- package/dist/chunk-UFYG3HKL.js.map +1 -0
- package/dist/chunk-VNH6R5EU.js +211 -0
- package/dist/chunk-VNH6R5EU.js.map +1 -0
- package/dist/{chunk-SFP77VS3.js → chunk-X7JN7WPF.js} +5 -2
- package/dist/chunk-X7JN7WPF.js.map +1 -0
- package/dist/chunk-YRSHBAUQ.js +201 -0
- package/dist/chunk-YRSHBAUQ.js.map +1 -0
- package/dist/chunk-YUACN5GJ.js +303 -0
- package/dist/chunk-YUACN5GJ.js.map +1 -0
- package/dist/{chunk-HVHQA34X.js → chunk-ZNGKUG2N.js} +11 -6
- package/dist/chunk-ZNGKUG2N.js.map +1 -0
- package/dist/color-picker/index.js +6 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/date-picker/RangePicker.d.ts.map +1 -1
- package/dist/date-picker/index.d.ts.map +1 -1
- package/dist/date-picker/index.js +1 -1
- package/dist/date-picker/shared.d.ts +5 -0
- package/dist/date-picker/shared.d.ts.map +1 -1
- package/dist/dropdown/index.js +2 -2
- package/dist/float-button/index.js +5 -0
- package/dist/float-button/index.js.map +1 -0
- package/dist/index.js +51 -2996
- package/dist/index.js.map +1 -1
- package/dist/input/index.d.ts.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input-password/index.js +2 -2
- package/dist/mentions/index.js +4 -0
- package/dist/mentions/index.js.map +1 -0
- package/dist/menubar/index.d.ts +3 -3
- package/dist/menubar/index.d.ts.map +1 -1
- package/dist/menubar/index.js +1 -1
- package/dist/multi-select/index.d.ts.map +1 -1
- package/dist/multi-select/index.js +3 -3
- package/dist/number-input/index.d.ts.map +1 -1
- package/dist/number-input/index.js +1 -1
- package/dist/qr-code/index.js +5 -0
- package/dist/qr-code/index.js.map +1 -0
- package/dist/resizable/index.js +4 -0
- package/dist/resizable/index.js.map +1 -0
- package/dist/result/index.js +4 -0
- package/dist/result/index.js.map +1 -0
- package/dist/select/index.d.ts.map +1 -1
- package/dist/select/index.js +3 -3
- package/dist/shared/useSelectBase.d.ts.map +1 -1
- package/dist/skeleton/index.d.ts.map +1 -1
- package/dist/skeleton/index.js +1 -1
- package/dist/table/index.js +4 -4
- package/dist/tabs/index.d.ts.map +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/tags-input/index.js +5 -0
- package/dist/tags-input/index.js.map +1 -0
- package/dist/toast/index.d.ts.map +1 -1
- package/dist/toast/index.js +1 -1
- package/dist/tooltip/index.d.ts.map +1 -1
- package/dist/tooltip/index.js +1 -1
- package/dist/tour/index.js +5 -0
- package/dist/tour/index.js.map +1 -0
- package/dist/typography/index.js +4 -0
- package/dist/typography/index.js.map +1 -0
- package/dist/watermark/index.js +4 -0
- package/dist/watermark/index.js.map +1 -0
- package/package.json +59 -11
- package/styles/global.css +498 -6016
- package/dist/chunk-253JZOYG.js.map +0 -1
- package/dist/chunk-BGMYX7L5.js.map +0 -1
- package/dist/chunk-BKLJDEUX.js.map +0 -1
- package/dist/chunk-BS4PZPY6.js +0 -322
- package/dist/chunk-BS4PZPY6.js.map +0 -1
- package/dist/chunk-HJITFPBT.js.map +0 -1
- package/dist/chunk-HVHQA34X.js.map +0 -1
- package/dist/chunk-I5AD247M.js.map +0 -1
- package/dist/chunk-SFP77VS3.js.map +0 -1
- package/dist/chunk-W5VLFE4U.js.map +0 -1
- package/dist/chunk-X7MF3TIF.js.map +0 -1
- package/dist/chunk-XOEEAMMY.js.map +0 -1
|
@@ -25,6 +25,9 @@ var Skeleton = React.memo(
|
|
|
25
25
|
"div",
|
|
26
26
|
{
|
|
27
27
|
"data-slot": "root",
|
|
28
|
+
role: "status",
|
|
29
|
+
"aria-busy": "true",
|
|
30
|
+
"aria-label": "Loading",
|
|
28
31
|
className: cn(
|
|
29
32
|
"skeleton_root",
|
|
30
33
|
skeletonVariants({ size, color }),
|
|
@@ -40,5 +43,5 @@ Skeleton.displayName = "Skeleton";
|
|
|
40
43
|
var skeleton_default = Skeleton;
|
|
41
44
|
|
|
42
45
|
export { skeleton_default };
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
46
|
+
//# sourceMappingURL=chunk-X7JN7WPF.js.map
|
|
47
|
+
//# sourceMappingURL=chunk-X7JN7WPF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/skeleton/index.tsx"],"names":[],"mappings":";;;;;;AASA,IAAM,gBAAA,GAAmB,IAAI,uBAAA,EAAyB;AAAA,EACpD,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;AAED,IAAM,WAAW,KAAA,CAAM,IAAA;AAAA,EACrB,CAAC,EAAE,KAAA,GAAQ,SAAA,EAAW,OAAO,IAAA,EAAM,SAAA,EAAW,MAAA,GAAS,KAAA,EAAM,KAAM;AACjE,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAW,SAAA;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,UACT,eAAA;AAAA,UACA,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,UAChC,YAAA;AAAA,UACA,MAAA,IAAU,4BAAA;AAAA,UACV;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;AAGvB,IAAO,gBAAA,GAAQ","file":"chunk-X7JN7WPF.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { SkeletonProps } from './types'\n\nconst skeletonVariants = cva('animate-pulse rounded', {\n variants: {\n size: {\n xs: 'h-3',\n sm: 'h-4',\n md: 'h-5',\n lg: 'h-6',\n },\n color: colorVars,\n },\n defaultVariants: {\n size: 'md',\n color: 'default',\n },\n})\n\nconst Skeleton = React.memo<SkeletonProps>(\n ({ color = 'default', size = 'md', className, circle = false }) => {\n return (\n <div\n data-slot=\"root\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n className={cn(\n 'skeleton_root',\n skeletonVariants({ size, color }),\n 'bg-slot-50',\n circle && 'rounded-full aspect-square',\n className,\n )}\n />\n )\n },\n)\n\nSkeleton.displayName = 'Skeleton'\n\nexport type * from './types'\nexport default Skeleton\n"]}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
2
|
+
import { cn } from './chunk-RAS6HUEI.js';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import React, { useState, useCallback, useEffect } from 'react';
|
|
5
|
+
import { ArrowUp, X, Plus } from 'lucide-react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var buttonVariants = cva(
|
|
9
|
+
"inline-flex items-center justify-center shadow-lg transition-all hover:scale-105 active:scale-95 disabled:opacity-50 disabled:pointer-events-none cursor-pointer",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
size: {
|
|
13
|
+
xs: "w-8 h-8 text-sm",
|
|
14
|
+
sm: "w-10 h-10 text-base",
|
|
15
|
+
md: "w-12 h-12 text-lg",
|
|
16
|
+
lg: "w-14 h-14 text-xl"
|
|
17
|
+
},
|
|
18
|
+
shape: {
|
|
19
|
+
circle: "rounded-full",
|
|
20
|
+
square: "rounded-lg"
|
|
21
|
+
},
|
|
22
|
+
variant: {
|
|
23
|
+
default: "bg-background border border-border text-text-primary hover:bg-surface",
|
|
24
|
+
colored: "bg-slot text-slot-fg hover:bg-slot-90"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
defaultVariants: { size: "md", shape: "circle", variant: "default" }
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
var FloatButton = React.memo(
|
|
31
|
+
({
|
|
32
|
+
icon,
|
|
33
|
+
label,
|
|
34
|
+
tooltip,
|
|
35
|
+
badge,
|
|
36
|
+
onClick,
|
|
37
|
+
href,
|
|
38
|
+
target,
|
|
39
|
+
color = "default",
|
|
40
|
+
size = "md",
|
|
41
|
+
shape = "circle",
|
|
42
|
+
disabled = false,
|
|
43
|
+
className,
|
|
44
|
+
classNames,
|
|
45
|
+
style
|
|
46
|
+
}) => {
|
|
47
|
+
const variant = color === "default" ? "default" : "colored";
|
|
48
|
+
const Component = href ? "a" : "button";
|
|
49
|
+
const content = /* @__PURE__ */ jsxs(
|
|
50
|
+
Component,
|
|
51
|
+
{
|
|
52
|
+
...href ? { href, target } : { type: "button", onClick, disabled },
|
|
53
|
+
"data-slot": "button",
|
|
54
|
+
title: tooltip,
|
|
55
|
+
className: cn(
|
|
56
|
+
"floatButton_button",
|
|
57
|
+
buttonVariants({ size, shape, variant }),
|
|
58
|
+
color !== "default" && colorVars[color],
|
|
59
|
+
"relative",
|
|
60
|
+
classNames?.button,
|
|
61
|
+
className
|
|
62
|
+
),
|
|
63
|
+
style,
|
|
64
|
+
children: [
|
|
65
|
+
icon,
|
|
66
|
+
label && !icon && /* @__PURE__ */ jsx("span", { className: "text-xs font-medium", children: label }),
|
|
67
|
+
badge !== void 0 && /* @__PURE__ */ jsx(
|
|
68
|
+
"span",
|
|
69
|
+
{
|
|
70
|
+
"data-slot": "badge",
|
|
71
|
+
className: cn(
|
|
72
|
+
"floatButton_badge",
|
|
73
|
+
"absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-error text-error-foreground text-[10px] font-medium flex items-center justify-center",
|
|
74
|
+
classNames?.badge
|
|
75
|
+
),
|
|
76
|
+
children: badge
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
return content;
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
FloatButton.displayName = "FloatButton";
|
|
86
|
+
var FloatButtonGroup = React.memo(
|
|
87
|
+
({
|
|
88
|
+
children,
|
|
89
|
+
trigger = "click",
|
|
90
|
+
icon,
|
|
91
|
+
closeIcon,
|
|
92
|
+
open: controlledOpen,
|
|
93
|
+
onOpenChange,
|
|
94
|
+
shape = "circle",
|
|
95
|
+
color = "primary",
|
|
96
|
+
size = "md",
|
|
97
|
+
placement = "top",
|
|
98
|
+
className,
|
|
99
|
+
classNames,
|
|
100
|
+
style
|
|
101
|
+
}) => {
|
|
102
|
+
const [internalOpen, setInternalOpen] = useState(false);
|
|
103
|
+
const isOpen = controlledOpen !== void 0 ? controlledOpen : internalOpen;
|
|
104
|
+
const setOpen = useCallback(
|
|
105
|
+
(v) => {
|
|
106
|
+
if (controlledOpen === void 0) setInternalOpen(v);
|
|
107
|
+
onOpenChange?.(v);
|
|
108
|
+
},
|
|
109
|
+
[controlledOpen, onOpenChange]
|
|
110
|
+
);
|
|
111
|
+
const placementClasses = {
|
|
112
|
+
top: "flex-col-reverse gap-3 bottom-0",
|
|
113
|
+
bottom: "flex-col gap-3 top-0",
|
|
114
|
+
left: "flex-row-reverse gap-3 right-0",
|
|
115
|
+
right: "flex-row gap-3 left-0"
|
|
116
|
+
};
|
|
117
|
+
const openIcon = icon ?? /* @__PURE__ */ jsx(Plus, { className: "w-5 h-5" });
|
|
118
|
+
const closedIcon = closeIcon ?? /* @__PURE__ */ jsx(X, { className: "w-5 h-5" });
|
|
119
|
+
return /* @__PURE__ */ jsxs(
|
|
120
|
+
"div",
|
|
121
|
+
{
|
|
122
|
+
"data-slot": "group",
|
|
123
|
+
className: cn("floatButton_group", "relative inline-flex", classNames?.group, className),
|
|
124
|
+
style,
|
|
125
|
+
onMouseEnter: trigger === "hover" ? () => setOpen(true) : void 0,
|
|
126
|
+
onMouseLeave: trigger === "hover" ? () => setOpen(false) : void 0,
|
|
127
|
+
children: [
|
|
128
|
+
/* @__PURE__ */ jsx(
|
|
129
|
+
FloatButton,
|
|
130
|
+
{
|
|
131
|
+
icon: /* @__PURE__ */ jsx("span", { className: cn("transition-transform duration-200", isOpen && "rotate-45"), children: isOpen ? closedIcon : openIcon }),
|
|
132
|
+
color,
|
|
133
|
+
size,
|
|
134
|
+
shape,
|
|
135
|
+
onClick: trigger === "click" ? () => setOpen(!isOpen) : void 0
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
isOpen && /* @__PURE__ */ jsx("div", { className: cn("absolute flex items-center", placementClasses[placement]), children: React.Children.map(children, (child, idx) => {
|
|
139
|
+
if (!React.isValidElement(child)) return child;
|
|
140
|
+
return /* @__PURE__ */ jsx(
|
|
141
|
+
"div",
|
|
142
|
+
{
|
|
143
|
+
className: "animate-in fade-in zoom-in-75",
|
|
144
|
+
style: { animationDelay: `${idx * 50}ms`, animationFillMode: "both", animationDuration: "150ms" },
|
|
145
|
+
children: React.cloneElement(child, {
|
|
146
|
+
size: child.props.size || size,
|
|
147
|
+
shape: child.props.shape || shape
|
|
148
|
+
})
|
|
149
|
+
},
|
|
150
|
+
idx
|
|
151
|
+
);
|
|
152
|
+
}) })
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
FloatButtonGroup.displayName = "FloatButtonGroup";
|
|
159
|
+
var BackTop = React.memo(
|
|
160
|
+
({
|
|
161
|
+
visibilityHeight = 400,
|
|
162
|
+
onClick,
|
|
163
|
+
icon,
|
|
164
|
+
size = "md",
|
|
165
|
+
shape = "circle",
|
|
166
|
+
color = "default",
|
|
167
|
+
...props
|
|
168
|
+
}) => {
|
|
169
|
+
const [visible, setVisible] = useState(false);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (typeof window === "undefined") return;
|
|
172
|
+
const handleScroll = () => setVisible(window.scrollY >= visibilityHeight);
|
|
173
|
+
handleScroll();
|
|
174
|
+
window.addEventListener("scroll", handleScroll, { passive: true });
|
|
175
|
+
return () => window.removeEventListener("scroll", handleScroll);
|
|
176
|
+
}, [visibilityHeight]);
|
|
177
|
+
const handleClick = useCallback(() => {
|
|
178
|
+
window.scrollTo({ top: 0, behavior: "smooth" });
|
|
179
|
+
onClick?.();
|
|
180
|
+
}, [onClick]);
|
|
181
|
+
if (!visible) return null;
|
|
182
|
+
return /* @__PURE__ */ jsx(
|
|
183
|
+
FloatButton,
|
|
184
|
+
{
|
|
185
|
+
icon: icon ?? /* @__PURE__ */ jsx(ArrowUp, { className: "w-5 h-5" }),
|
|
186
|
+
tooltip: "Back to top",
|
|
187
|
+
onClick: handleClick,
|
|
188
|
+
size,
|
|
189
|
+
shape,
|
|
190
|
+
color,
|
|
191
|
+
...props
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
);
|
|
196
|
+
BackTop.displayName = "BackTop";
|
|
197
|
+
var float_button_default = FloatButton;
|
|
198
|
+
|
|
199
|
+
export { BackTop, FloatButton, FloatButtonGroup, float_button_default };
|
|
200
|
+
//# sourceMappingURL=chunk-YRSHBAUQ.js.map
|
|
201
|
+
//# sourceMappingURL=chunk-YRSHBAUQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/float-button/index.tsx"],"names":[],"mappings":";;;;;;;AAUA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,kKAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,iBAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,mBAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,uEAAA;AAAA,QACT,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,iBAAiB,EAAE,IAAA,EAAM,MAAM,KAAA,EAAO,QAAA,EAAU,SAAS,SAAA;AAAU;AAEvE,CAAA;AAEA,IAAM,cAAc,KAAA,CAAM,IAAA;AAAA,EACxB,CAAC;AAAA,IACC,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,GAAQ,SAAA;AAAA,IACR,IAAA,GAAO,IAAA;AAAA,IACP,KAAA,GAAQ,QAAA;AAAA,IACR,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,KAAM;AACJ,IAAA,MAAM,OAAA,GAAU,KAAA,KAAU,SAAA,GAAY,SAAA,GAAY,SAAA;AAClD,IAAA,MAAM,SAAA,GAAY,OAAO,GAAA,GAAM,QAAA;AAE/B,IAAA,MAAM,OAAA,mBACJ,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACE,GAAI,IAAA,GAAO,EAAE,IAAA,EAAM,MAAA,KAAW,EAAE,IAAA,EAAM,QAAA,EAAmB,OAAA,EAAS,QAAA,EAAS;AAAA,QAC5E,WAAA,EAAU,QAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,SAAA,EAAW,EAAA;AAAA,UACT,oBAAA;AAAA,UACA,cAAA,CAAe,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,UACvC,KAAA,KAAU,SAAA,IAAa,SAAA,CAAU,KAAK,CAAA;AAAA,UACtC,UAAA;AAAA,UACA,UAAA,EAAY,MAAA;AAAA,UACZ;AAAA,SACF;AAAA,QACA,KAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACA,SAAS,CAAC,IAAA,wBAAS,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC/D,UAAU,MAAA,oBACT,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,OAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACT,mBAAA;AAAA,gBACA,0JAAA;AAAA,gBACA,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAGF,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AAE1B,IAAM,mBAAmB,KAAA,CAAM,IAAA;AAAA,EAC7B,CAAC;AAAA,IACC,QAAA;AAAA,IACA,OAAA,GAAU,OAAA;AAAA,IACV,IAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,YAAA;AAAA,IACA,KAAA,GAAQ,QAAA;AAAA,IACR,KAAA,GAAQ,SAAA;AAAA,IACR,IAAA,GAAO,IAAA;AAAA,IACP,SAAA,GAAY,KAAA;AAAA,IACZ,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,KAAM;AACJ,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,cAAA,KAAmB,MAAA,GAAY,cAAA,GAAiB,YAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,WAAA;AAAA,MACd,CAAC,CAAA,KAAe;AACd,QAAA,IAAI,cAAA,KAAmB,MAAA,EAAW,eAAA,CAAgB,CAAC,CAAA;AACnD,QAAA,YAAA,GAAe,CAAC,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,CAAC,gBAAgB,YAAY;AAAA,KAC/B;AAEA,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,GAAA,EAAK,iCAAA;AAAA,MACL,MAAA,EAAQ,sBAAA;AAAA,MACR,IAAA,EAAM,gCAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,oBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,SAAA,oBAAa,GAAA,CAAC,CAAA,EAAA,EAAE,WAAU,SAAA,EAAU,CAAA;AAEvD,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,OAAA;AAAA,QACV,WAAW,EAAA,CAAG,mBAAA,EAAqB,sBAAA,EAAwB,UAAA,EAAY,OAAO,SAAS,CAAA;AAAA,QACvF,KAAA;AAAA,QACA,cAAc,OAAA,KAAY,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,QAC1D,cAAc,OAAA,KAAY,OAAA,GAAU,MAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA;AAAA,QAE3D,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,mCAAA,EAAqC,MAAA,IAAU,WAAW,CAAA,EAC3E,QAAA,EAAA,MAAA,GAAS,UAAA,GAAa,QAAA,EACzB,CAAA;AAAA,cAEF,KAAA;AAAA,cACA,IAAA;AAAA,cACA,KAAA;AAAA,cACA,SAAS,OAAA,KAAY,OAAA,GAAU,MAAM,OAAA,CAAQ,CAAC,MAAM,CAAA,GAAI;AAAA;AAAA,WAC1D;AAAA,UAEC,0BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,8BAA8B,gBAAA,CAAiB,SAAS,CAAC,CAAA,EACzE,gBAAM,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,OAAO,GAAA,KAAQ;AAC5C,YAAA,IAAI,CAAC,KAAA,CAAM,cAAA,CAAe,KAAK,GAAG,OAAO,KAAA;AACzC,YAAA,uBACE,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,+BAAA;AAAA,gBACV,KAAA,EAAO,EAAE,cAAA,EAAgB,CAAA,EAAG,GAAA,GAAM,EAAE,CAAA,EAAA,CAAA,EAAM,iBAAA,EAAmB,MAAA,EAAQ,iBAAA,EAAmB,OAAA,EAAQ;AAAA,gBAE/F,QAAA,EAAA,KAAA,CAAM,aAAa,KAAA,EAA+C;AAAA,kBACjE,IAAA,EAAO,KAAA,CAA+C,KAAA,CAAM,IAAA,IAAQ,IAAA;AAAA,kBACpE,KAAA,EAAQ,KAAA,CAA+C,KAAA,CAAM,KAAA,IAAS;AAAA,iBACvE;AAAA,eAAA;AAAA,cAPI;AAAA,aAQP;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;AAE/B,IAAM,UAAU,KAAA,CAAM,IAAA;AAAA,EACpB,CAAC;AAAA,IACC,gBAAA,GAAmB,GAAA;AAAA,IACnB,OAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,KAAA,GAAQ,QAAA;AAAA,IACR,KAAA,GAAQ,SAAA;AAAA,IACR,GAAG;AAAA,GACL,KAAM;AACJ,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,MAAA,MAAM,YAAA,GAAe,MAAM,UAAA,CAAW,MAAA,CAAO,WAAW,gBAAgB,CAAA;AACxE,MAAA,YAAA,EAAa;AACb,MAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACjE,MAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,IAChE,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,IAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,MAAA,MAAA,CAAO,SAAS,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,UAAU,CAAA;AAC9C,MAAA,OAAA,IAAU;AAAA,IACZ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,uBACE,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,IAAA,oBAAQ,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,SAAA,EAAU,CAAA;AAAA,QAC3C,OAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AAItB,IAAO,oBAAA,GAAQ","file":"chunk-YRSHBAUQ.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React, { useState, useEffect, useCallback } from 'react'\n\nimport { ArrowUp, X, Plus } from 'lucide-react'\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { FloatButtonProps, FloatButtonGroupProps, BackTopProps } from './types'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center shadow-lg transition-all hover:scale-105 active:scale-95 disabled:opacity-50 disabled:pointer-events-none cursor-pointer',\n {\n variants: {\n size: {\n xs: 'w-8 h-8 text-sm',\n sm: 'w-10 h-10 text-base',\n md: 'w-12 h-12 text-lg',\n lg: 'w-14 h-14 text-xl',\n },\n shape: {\n circle: 'rounded-full',\n square: 'rounded-lg',\n },\n variant: {\n default: 'bg-background border border-border text-text-primary hover:bg-surface',\n colored: 'bg-slot text-slot-fg hover:bg-slot-90',\n },\n },\n defaultVariants: { size: 'md', shape: 'circle', variant: 'default' },\n },\n)\n\nconst FloatButton = React.memo<FloatButtonProps>(\n ({\n icon,\n label,\n tooltip,\n badge,\n onClick,\n href,\n target,\n color = 'default',\n size = 'md',\n shape = 'circle',\n disabled = false,\n className,\n classNames,\n style,\n }) => {\n const variant = color === 'default' ? 'default' : 'colored'\n const Component = href ? 'a' : 'button'\n\n const content = (\n <Component\n {...(href ? { href, target } : { type: 'button' as const, onClick, disabled })}\n data-slot=\"button\"\n title={tooltip}\n className={cn(\n 'floatButton_button',\n buttonVariants({ size, shape, variant }),\n color !== 'default' && colorVars[color],\n 'relative',\n classNames?.button,\n className,\n )}\n style={style}\n >\n {icon}\n {label && !icon && <span className=\"text-xs font-medium\">{label}</span>}\n {badge !== undefined && (\n <span\n data-slot=\"badge\"\n className={cn(\n 'floatButton_badge',\n 'absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-error text-error-foreground text-[10px] font-medium flex items-center justify-center',\n classNames?.badge,\n )}\n >\n {badge}\n </span>\n )}\n </Component>\n )\n\n return content\n },\n)\n\nFloatButton.displayName = 'FloatButton'\n\nconst FloatButtonGroup = React.memo<FloatButtonGroupProps>(\n ({\n children,\n trigger = 'click',\n icon,\n closeIcon,\n open: controlledOpen,\n onOpenChange,\n shape = 'circle',\n color = 'primary',\n size = 'md',\n placement = 'top',\n className,\n classNames,\n style,\n }) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(v)\n onOpenChange?.(v)\n },\n [controlledOpen, onOpenChange],\n )\n\n const placementClasses = {\n top: 'flex-col-reverse gap-3 bottom-0',\n bottom: 'flex-col gap-3 top-0',\n left: 'flex-row-reverse gap-3 right-0',\n right: 'flex-row gap-3 left-0',\n }\n\n const openIcon = icon ?? <Plus className=\"w-5 h-5\" />\n const closedIcon = closeIcon ?? <X className=\"w-5 h-5\" />\n\n return (\n <div\n data-slot=\"group\"\n className={cn('floatButton_group', 'relative inline-flex', classNames?.group, className)}\n style={style}\n onMouseEnter={trigger === 'hover' ? () => setOpen(true) : undefined}\n onMouseLeave={trigger === 'hover' ? () => setOpen(false) : undefined}\n >\n <FloatButton\n icon={\n <span className={cn('transition-transform duration-200', isOpen && 'rotate-45')}>\n {isOpen ? closedIcon : openIcon}\n </span>\n }\n color={color}\n size={size}\n shape={shape}\n onClick={trigger === 'click' ? () => setOpen(!isOpen) : undefined}\n />\n\n {isOpen && (\n <div className={cn('absolute flex items-center', placementClasses[placement])}>\n {React.Children.map(children, (child, idx) => {\n if (!React.isValidElement(child)) return child\n return (\n <div\n key={idx}\n className=\"animate-in fade-in zoom-in-75\"\n style={{ animationDelay: `${idx * 50}ms`, animationFillMode: 'both', animationDuration: '150ms' }}\n >\n {React.cloneElement(child as React.ReactElement<FloatButtonProps>, {\n size: (child as React.ReactElement<FloatButtonProps>).props.size || size,\n shape: (child as React.ReactElement<FloatButtonProps>).props.shape || shape,\n })}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n },\n)\n\nFloatButtonGroup.displayName = 'FloatButtonGroup'\n\nconst BackTop = React.memo<BackTopProps>(\n ({\n visibilityHeight = 400,\n onClick,\n icon,\n size = 'md',\n shape = 'circle',\n color = 'default',\n ...props\n }) => {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const handleScroll = () => setVisible(window.scrollY >= visibilityHeight)\n handleScroll()\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [visibilityHeight])\n\n const handleClick = useCallback(() => {\n window.scrollTo({ top: 0, behavior: 'smooth' })\n onClick?.()\n }, [onClick])\n\n if (!visible) return null\n\n return (\n <FloatButton\n icon={icon ?? <ArrowUp className=\"w-5 h-5\" />}\n tooltip=\"Back to top\"\n onClick={handleClick}\n size={size}\n shape={shape}\n color={color}\n {...props}\n />\n )\n },\n)\n\nBackTop.displayName = 'BackTop'\n\nexport type * from './types'\nexport { FloatButton, FloatButtonGroup, BackTop }\nexport default FloatButton\n"]}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
2
|
+
import { cn } from './chunk-RAS6HUEI.js';
|
|
3
|
+
import React, { useState, useRef, useCallback, useEffect } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function getTargetElement(target) {
|
|
7
|
+
if (typeof target === "function") return target();
|
|
8
|
+
return document.querySelector(target);
|
|
9
|
+
}
|
|
10
|
+
function getTargetBorderRadius(el) {
|
|
11
|
+
if (typeof window === "undefined") return "0px";
|
|
12
|
+
return getComputedStyle(el).borderRadius || "0px";
|
|
13
|
+
}
|
|
14
|
+
function computePopoverPosition(rect, placement, gap) {
|
|
15
|
+
const base = placement.split("-")[0];
|
|
16
|
+
const align = placement.split("-")[1];
|
|
17
|
+
let top = 0;
|
|
18
|
+
let left = 0;
|
|
19
|
+
const cx = rect.left + rect.width / 2;
|
|
20
|
+
const cy = rect.top + rect.height / 2;
|
|
21
|
+
if (base === "bottom") {
|
|
22
|
+
top = rect.bottom + gap;
|
|
23
|
+
left = align === "start" ? rect.left : align === "end" ? rect.right : cx;
|
|
24
|
+
} else if (base === "top") {
|
|
25
|
+
top = rect.top - gap;
|
|
26
|
+
left = align === "start" ? rect.left : align === "end" ? rect.right : cx;
|
|
27
|
+
} else if (base === "left") {
|
|
28
|
+
top = align === "start" ? rect.top : align === "end" ? rect.bottom : cy;
|
|
29
|
+
left = rect.left - gap;
|
|
30
|
+
} else {
|
|
31
|
+
top = align === "start" ? rect.top : align === "end" ? rect.bottom : cy;
|
|
32
|
+
left = rect.right + gap;
|
|
33
|
+
}
|
|
34
|
+
return { top, left };
|
|
35
|
+
}
|
|
36
|
+
function getPopoverStyle(rect, placement, gap) {
|
|
37
|
+
const base = placement.split("-")[0];
|
|
38
|
+
const align = placement.split("-")[1];
|
|
39
|
+
const pos = computePopoverPosition(rect, placement, gap);
|
|
40
|
+
const style = {
|
|
41
|
+
position: "fixed",
|
|
42
|
+
top: pos.top,
|
|
43
|
+
left: pos.left
|
|
44
|
+
};
|
|
45
|
+
if (base === "bottom") {
|
|
46
|
+
if (!align) style.transform = "translateX(-50%)";
|
|
47
|
+
else if (align === "end") style.transform = "translateX(-100%)";
|
|
48
|
+
} else if (base === "top") {
|
|
49
|
+
if (!align) style.transform = "translate(-50%, -100%)";
|
|
50
|
+
else if (align === "start") style.transform = "translateY(-100%)";
|
|
51
|
+
else style.transform = "translate(-100%, -100%)";
|
|
52
|
+
} else if (base === "left") {
|
|
53
|
+
if (!align) style.transform = "translate(-100%, -50%)";
|
|
54
|
+
else if (align === "start") style.transform = "translateX(-100%)";
|
|
55
|
+
else style.transform = "translate(-100%, -100%)";
|
|
56
|
+
} else {
|
|
57
|
+
if (!align) style.transform = "translateY(-50%)";
|
|
58
|
+
else if (align === "end") style.transform = "translateY(-100%)";
|
|
59
|
+
}
|
|
60
|
+
return style;
|
|
61
|
+
}
|
|
62
|
+
var sizeMap = {
|
|
63
|
+
xs: { padding: 4, gap: 8, popover: "p-3 max-w-[260px]", title: "text-sm font-semibold", desc: "text-xs", btn: "h-6 px-2.5 text-xs" },
|
|
64
|
+
sm: { padding: 6, gap: 10, popover: "p-3.5 max-w-[300px]", title: "text-sm font-semibold", desc: "text-sm", btn: "h-7 px-3 text-xs" },
|
|
65
|
+
md: { padding: 8, gap: 12, popover: "p-4 max-w-[340px]", title: "text-base font-semibold", desc: "text-sm", btn: "h-8 px-3 text-sm" },
|
|
66
|
+
lg: { padding: 10, gap: 14, popover: "p-5 max-w-[400px]", title: "text-lg font-semibold", desc: "text-base", btn: "h-9 px-4 text-sm" }
|
|
67
|
+
};
|
|
68
|
+
var EASE = "cubic-bezier(0.4, 0, 0.2, 1)";
|
|
69
|
+
var DURATION = "350ms";
|
|
70
|
+
var Tour = React.memo(
|
|
71
|
+
({
|
|
72
|
+
steps,
|
|
73
|
+
open: controlledOpen,
|
|
74
|
+
onOpenChange,
|
|
75
|
+
current: controlledCurrent,
|
|
76
|
+
onCurrentChange,
|
|
77
|
+
color = "primary",
|
|
78
|
+
size = "md",
|
|
79
|
+
showProgress = true,
|
|
80
|
+
showSkip = true,
|
|
81
|
+
skipText = "Skip",
|
|
82
|
+
finishText = "Finish",
|
|
83
|
+
nextText = "Next",
|
|
84
|
+
prevText = "Back",
|
|
85
|
+
onFinish,
|
|
86
|
+
onSkip,
|
|
87
|
+
overlayClickable = false,
|
|
88
|
+
className,
|
|
89
|
+
classNames
|
|
90
|
+
}) => {
|
|
91
|
+
const [internalOpen, setInternalOpen] = useState(false);
|
|
92
|
+
const [internalCurrent, setInternalCurrent] = useState(0);
|
|
93
|
+
const isOpen = controlledOpen !== void 0 ? controlledOpen : internalOpen;
|
|
94
|
+
const current = controlledCurrent !== void 0 ? controlledCurrent : internalCurrent;
|
|
95
|
+
const [targetRect, setTargetRect] = useState(null);
|
|
96
|
+
const [targetRadius, setTargetRadius] = useState("0px");
|
|
97
|
+
const [entering, setEntering] = useState(false);
|
|
98
|
+
const [contentFading, setContentFading] = useState(false);
|
|
99
|
+
const popoverRef = useRef(null);
|
|
100
|
+
const setOpen = useCallback(
|
|
101
|
+
(v) => {
|
|
102
|
+
if (controlledOpen === void 0) setInternalOpen(v);
|
|
103
|
+
onOpenChange?.(v);
|
|
104
|
+
},
|
|
105
|
+
[controlledOpen, onOpenChange]
|
|
106
|
+
);
|
|
107
|
+
const setCurrent = useCallback(
|
|
108
|
+
(v) => {
|
|
109
|
+
setContentFading(true);
|
|
110
|
+
setTimeout(() => {
|
|
111
|
+
if (controlledCurrent === void 0) setInternalCurrent(v);
|
|
112
|
+
onCurrentChange?.(v);
|
|
113
|
+
setContentFading(false);
|
|
114
|
+
}, 150);
|
|
115
|
+
},
|
|
116
|
+
[controlledCurrent, onCurrentChange]
|
|
117
|
+
);
|
|
118
|
+
const step = steps[current];
|
|
119
|
+
const s = sizeMap[size];
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (isOpen) {
|
|
122
|
+
setEntering(true);
|
|
123
|
+
const t = setTimeout(() => setEntering(false), 400);
|
|
124
|
+
return () => clearTimeout(t);
|
|
125
|
+
}
|
|
126
|
+
}, [isOpen]);
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
if (!isOpen || !step) {
|
|
129
|
+
setTargetRect(null);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const el = getTargetElement(step.target);
|
|
133
|
+
if (!el) {
|
|
134
|
+
setTargetRect(null);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const updateRect = () => {
|
|
138
|
+
setTargetRect(el.getBoundingClientRect());
|
|
139
|
+
setTargetRadius(getTargetBorderRadius(el));
|
|
140
|
+
};
|
|
141
|
+
updateRect();
|
|
142
|
+
el.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
143
|
+
const ro = new ResizeObserver(updateRect);
|
|
144
|
+
ro.observe(el);
|
|
145
|
+
window.addEventListener("scroll", updateRect, { passive: true });
|
|
146
|
+
window.addEventListener("resize", updateRect, { passive: true });
|
|
147
|
+
return () => {
|
|
148
|
+
ro.disconnect();
|
|
149
|
+
window.removeEventListener("scroll", updateRect);
|
|
150
|
+
window.removeEventListener("resize", updateRect);
|
|
151
|
+
};
|
|
152
|
+
}, [isOpen, current, step]);
|
|
153
|
+
const handleNext = () => {
|
|
154
|
+
step?.onNext?.();
|
|
155
|
+
if (current < steps.length - 1) setCurrent(current + 1);
|
|
156
|
+
else {
|
|
157
|
+
setOpen(false);
|
|
158
|
+
onFinish?.();
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
const handlePrev = () => {
|
|
162
|
+
step?.onPrev?.();
|
|
163
|
+
if (current > 0) setCurrent(current - 1);
|
|
164
|
+
};
|
|
165
|
+
const handleSkip = () => {
|
|
166
|
+
setOpen(false);
|
|
167
|
+
if (controlledCurrent === void 0) setInternalCurrent(0);
|
|
168
|
+
onSkip?.();
|
|
169
|
+
};
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (!isOpen) return;
|
|
172
|
+
const handleEsc = (e) => {
|
|
173
|
+
if (e.key === "Escape") handleSkip();
|
|
174
|
+
};
|
|
175
|
+
document.addEventListener("keydown", handleEsc);
|
|
176
|
+
return () => document.removeEventListener("keydown", handleEsc);
|
|
177
|
+
}, [isOpen]);
|
|
178
|
+
if (!isOpen || !step) return null;
|
|
179
|
+
const placement = step.placement || "bottom";
|
|
180
|
+
const isLast = current === steps.length - 1;
|
|
181
|
+
const spotlightStyle = targetRect ? {
|
|
182
|
+
position: "fixed",
|
|
183
|
+
top: targetRect.top - s.padding,
|
|
184
|
+
left: targetRect.left - s.padding,
|
|
185
|
+
width: targetRect.width + s.padding * 2,
|
|
186
|
+
height: targetRect.height + s.padding * 2,
|
|
187
|
+
borderRadius: targetRadius,
|
|
188
|
+
boxShadow: "0 0 0 9999px rgba(0, 0, 0, 0.5)",
|
|
189
|
+
transition: entering ? "none" : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`,
|
|
190
|
+
pointerEvents: "none",
|
|
191
|
+
opacity: entering ? 0 : 1,
|
|
192
|
+
animation: entering ? "none" : void 0
|
|
193
|
+
} : {
|
|
194
|
+
position: "fixed",
|
|
195
|
+
inset: 0,
|
|
196
|
+
background: "rgba(0,0,0,0.5)"
|
|
197
|
+
};
|
|
198
|
+
const popoverStyle = targetRect ? {
|
|
199
|
+
...getPopoverStyle(targetRect, placement, s.gap),
|
|
200
|
+
transition: entering ? "none" : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, bottom ${DURATION} ${EASE}, right ${DURATION} ${EASE}, opacity 150ms ease`,
|
|
201
|
+
opacity: contentFading ? 0 : 1
|
|
202
|
+
} : { position: "fixed", opacity: 0 };
|
|
203
|
+
return /* @__PURE__ */ jsxs(
|
|
204
|
+
"div",
|
|
205
|
+
{
|
|
206
|
+
"data-slot": "root",
|
|
207
|
+
className: cn("tour_root", colorVars[color], classNames?.root, className),
|
|
208
|
+
style: { opacity: entering ? 0 : 1, transition: `opacity 300ms ${EASE}` },
|
|
209
|
+
ref: (el) => {
|
|
210
|
+
if (el && entering) requestAnimationFrame(() => setEntering(false));
|
|
211
|
+
},
|
|
212
|
+
children: [
|
|
213
|
+
/* @__PURE__ */ jsx(
|
|
214
|
+
"div",
|
|
215
|
+
{
|
|
216
|
+
"data-slot": "overlay",
|
|
217
|
+
className: cn("tour_overlay", "z-[var(--z-overlay)]", classNames?.overlay),
|
|
218
|
+
onClick: overlayClickable ? handleSkip : void 0,
|
|
219
|
+
style: spotlightStyle
|
|
220
|
+
}
|
|
221
|
+
),
|
|
222
|
+
targetRect && /* @__PURE__ */ jsx(
|
|
223
|
+
"div",
|
|
224
|
+
{
|
|
225
|
+
"data-slot": "highlight",
|
|
226
|
+
className: "fixed z-[var(--z-overlay)] pointer-events-none",
|
|
227
|
+
style: {
|
|
228
|
+
top: targetRect.top - s.padding,
|
|
229
|
+
left: targetRect.left - s.padding,
|
|
230
|
+
width: targetRect.width + s.padding * 2,
|
|
231
|
+
height: targetRect.height + s.padding * 2,
|
|
232
|
+
borderRadius: targetRadius,
|
|
233
|
+
boxShadow: "0 0 0 2px var(--color-slot, #3b82f6), 0 0 12px 2px color-mix(in srgb, var(--color-slot, #3b82f6) 30%, transparent)",
|
|
234
|
+
transition: `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
),
|
|
238
|
+
/* @__PURE__ */ jsxs(
|
|
239
|
+
"div",
|
|
240
|
+
{
|
|
241
|
+
ref: popoverRef,
|
|
242
|
+
"data-slot": "popover",
|
|
243
|
+
className: cn(
|
|
244
|
+
"tour_popover",
|
|
245
|
+
"z-[calc(var(--z-overlay)+1)] rounded-lg border border-border bg-background shadow-lg",
|
|
246
|
+
s.popover,
|
|
247
|
+
classNames?.popover
|
|
248
|
+
),
|
|
249
|
+
style: popoverStyle,
|
|
250
|
+
children: [
|
|
251
|
+
step.cover && /* @__PURE__ */ jsx("div", { "data-slot": "cover", className: cn("tour_cover", "mb-3 rounded-md overflow-hidden", classNames?.cover), children: step.cover }),
|
|
252
|
+
/* @__PURE__ */ jsx("div", { "data-slot": "title", className: cn("tour_title", s.title, "text-text-primary", classNames?.title), children: step.title }),
|
|
253
|
+
step.description && /* @__PURE__ */ jsx("div", { "data-slot": "description", className: cn("tour_description", s.desc, "text-text-secondary mt-1", classNames?.description), children: step.description }),
|
|
254
|
+
/* @__PURE__ */ jsxs("div", { "data-slot": "footer", className: cn("tour_footer", "flex items-center justify-between mt-3 gap-2", classNames?.footer), children: [
|
|
255
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: showProgress && /* @__PURE__ */ jsxs("span", { "data-slot": "indicator", className: cn("tour_indicator", "text-xs text-text-secondary", classNames?.indicator), children: [
|
|
256
|
+
current + 1,
|
|
257
|
+
" / ",
|
|
258
|
+
steps.length
|
|
259
|
+
] }) }),
|
|
260
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
261
|
+
showSkip && !isLast && /* @__PURE__ */ jsx(
|
|
262
|
+
"button",
|
|
263
|
+
{
|
|
264
|
+
type: "button",
|
|
265
|
+
onClick: handleSkip,
|
|
266
|
+
className: cn("inline-flex items-center justify-center rounded-md text-text-secondary hover:text-text-primary transition-colors font-medium cursor-pointer", s.btn),
|
|
267
|
+
children: skipText
|
|
268
|
+
}
|
|
269
|
+
),
|
|
270
|
+
current > 0 && /* @__PURE__ */ jsx(
|
|
271
|
+
"button",
|
|
272
|
+
{
|
|
273
|
+
type: "button",
|
|
274
|
+
onClick: handlePrev,
|
|
275
|
+
className: cn("inline-flex items-center justify-center rounded-md border border-border bg-background text-text-primary hover:bg-surface transition-colors font-medium cursor-pointer", s.btn),
|
|
276
|
+
children: step.prevText || prevText
|
|
277
|
+
}
|
|
278
|
+
),
|
|
279
|
+
/* @__PURE__ */ jsx(
|
|
280
|
+
"button",
|
|
281
|
+
{
|
|
282
|
+
type: "button",
|
|
283
|
+
onClick: handleNext,
|
|
284
|
+
className: cn("inline-flex items-center justify-center rounded-md bg-slot text-slot-fg hover:bg-slot-90 transition-colors font-medium cursor-pointer", s.btn),
|
|
285
|
+
children: isLast ? finishText : step.nextText || nextText
|
|
286
|
+
}
|
|
287
|
+
)
|
|
288
|
+
] })
|
|
289
|
+
] })
|
|
290
|
+
]
|
|
291
|
+
}
|
|
292
|
+
)
|
|
293
|
+
]
|
|
294
|
+
}
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
);
|
|
298
|
+
Tour.displayName = "Tour";
|
|
299
|
+
var tour_default = Tour;
|
|
300
|
+
|
|
301
|
+
export { tour_default };
|
|
302
|
+
//# sourceMappingURL=chunk-YUACN5GJ.js.map
|
|
303
|
+
//# sourceMappingURL=chunk-YUACN5GJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tour/index.tsx"],"names":[],"mappings":"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","file":"chunk-YUACN5GJ.js","sourcesContent":["'use client'\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react'\n\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { TourProps, TourPlacement } from './types'\n\nfunction getTargetElement(target: string | (() => HTMLElement | null)): HTMLElement | null {\n if (typeof target === 'function') return target()\n return document.querySelector(target)\n}\n\nfunction getTargetBorderRadius(el: HTMLElement): string {\n if (typeof window === 'undefined') return '0px'\n return getComputedStyle(el).borderRadius || '0px'\n}\n\n// ── Popover positioning ─────────────────────────────────────\nfunction computePopoverPosition(\n rect: DOMRect,\n placement: TourPlacement,\n gap: number,\n): { top: number; left: number } {\n const base = placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left'\n const align = placement.split('-')[1] as 'start' | 'end' | undefined\n\n let top = 0\n let left = 0\n\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n\n if (base === 'bottom') {\n top = rect.bottom + gap\n left = align === 'start' ? rect.left : align === 'end' ? rect.right : cx\n } else if (base === 'top') {\n top = rect.top - gap\n left = align === 'start' ? rect.left : align === 'end' ? rect.right : cx\n } else if (base === 'left') {\n top = align === 'start' ? rect.top : align === 'end' ? rect.bottom : cy\n left = rect.left - gap\n } else {\n top = align === 'start' ? rect.top : align === 'end' ? rect.bottom : cy\n left = rect.right + gap\n }\n\n return { top, left }\n}\n\nfunction getPopoverStyle(\n rect: DOMRect,\n placement: TourPlacement,\n gap: number,\n): React.CSSProperties {\n const base = placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left'\n const align = placement.split('-')[1] as 'start' | 'end' | undefined\n\n const pos = computePopoverPosition(rect, placement, gap)\n const style: React.CSSProperties = {\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n }\n\n // Transform for anchoring\n if (base === 'bottom') {\n if (!align) style.transform = 'translateX(-50%)'\n else if (align === 'end') style.transform = 'translateX(-100%)'\n } else if (base === 'top') {\n if (!align) style.transform = 'translate(-50%, -100%)'\n else if (align === 'start') style.transform = 'translateY(-100%)'\n else style.transform = 'translate(-100%, -100%)'\n } else if (base === 'left') {\n if (!align) style.transform = 'translate(-100%, -50%)'\n else if (align === 'start') style.transform = 'translateX(-100%)'\n else style.transform = 'translate(-100%, -100%)'\n } else {\n if (!align) style.transform = 'translateY(-50%)'\n else if (align === 'end') style.transform = 'translateY(-100%)'\n }\n\n return style\n}\n\nconst sizeMap = {\n xs: { padding: 4, gap: 8, popover: 'p-3 max-w-[260px]', title: 'text-sm font-semibold', desc: 'text-xs', btn: 'h-6 px-2.5 text-xs' },\n sm: { padding: 6, gap: 10, popover: 'p-3.5 max-w-[300px]', title: 'text-sm font-semibold', desc: 'text-sm', btn: 'h-7 px-3 text-xs' },\n md: { padding: 8, gap: 12, popover: 'p-4 max-w-[340px]', title: 'text-base font-semibold', desc: 'text-sm', btn: 'h-8 px-3 text-sm' },\n lg: { padding: 10, gap: 14, popover: 'p-5 max-w-[400px]', title: 'text-lg font-semibold', desc: 'text-base', btn: 'h-9 px-4 text-sm' },\n}\n\n// Transition easing\nconst EASE = 'cubic-bezier(0.4, 0, 0.2, 1)'\nconst DURATION = '350ms'\n\nconst Tour = React.memo<TourProps>(\n ({\n steps,\n open: controlledOpen,\n onOpenChange,\n current: controlledCurrent,\n onCurrentChange,\n color = 'primary',\n size = 'md',\n showProgress = true,\n showSkip = true,\n skipText = 'Skip',\n finishText = 'Finish',\n nextText = 'Next',\n prevText = 'Back',\n onFinish,\n onSkip,\n overlayClickable = false,\n className,\n classNames,\n }) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const [internalCurrent, setInternalCurrent] = useState(0)\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const [targetRadius, setTargetRadius] = useState('0px')\n const [entering, setEntering] = useState(false)\n const [contentFading, setContentFading] = useState(false)\n const popoverRef = useRef<HTMLDivElement>(null)\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(v)\n onOpenChange?.(v)\n },\n [controlledOpen, onOpenChange],\n )\n\n const setCurrent = useCallback(\n (v: number) => {\n // Trigger content crossfade\n setContentFading(true)\n setTimeout(() => {\n if (controlledCurrent === undefined) setInternalCurrent(v)\n onCurrentChange?.(v)\n setContentFading(false)\n }, 150) // half of transition duration — content fades out then in\n },\n [controlledCurrent, onCurrentChange],\n )\n\n const step = steps[current]\n const s = sizeMap[size]\n\n // Initial entrance animation\n useEffect(() => {\n if (isOpen) {\n setEntering(true)\n const t = setTimeout(() => setEntering(false), 400)\n return () => clearTimeout(t)\n }\n }, [isOpen])\n\n // Track target rect + border-radius\n useEffect(() => {\n if (!isOpen || !step) { setTargetRect(null); return }\n const el = getTargetElement(step.target)\n if (!el) { setTargetRect(null); return }\n\n const updateRect = () => {\n setTargetRect(el.getBoundingClientRect())\n setTargetRadius(getTargetBorderRadius(el))\n }\n updateRect()\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n\n const ro = new ResizeObserver(updateRect)\n ro.observe(el)\n window.addEventListener('scroll', updateRect, { passive: true })\n window.addEventListener('resize', updateRect, { passive: true })\n\n return () => {\n ro.disconnect()\n window.removeEventListener('scroll', updateRect)\n window.removeEventListener('resize', updateRect)\n }\n }, [isOpen, current, step])\n\n const handleNext = () => {\n step?.onNext?.()\n if (current < steps.length - 1) setCurrent(current + 1)\n else { setOpen(false); onFinish?.() }\n }\n\n const handlePrev = () => {\n step?.onPrev?.()\n if (current > 0) setCurrent(current - 1)\n }\n\n const handleSkip = () => {\n setOpen(false)\n if (controlledCurrent === undefined) setInternalCurrent(0)\n onSkip?.()\n }\n\n useEffect(() => {\n if (!isOpen) return\n const handleEsc = (e: KeyboardEvent) => { if (e.key === 'Escape') handleSkip() }\n document.addEventListener('keydown', handleEsc)\n return () => document.removeEventListener('keydown', handleEsc)\n }, [isOpen])\n\n if (!isOpen || !step) return null\n\n const placement = step.placement || 'bottom'\n const isLast = current === steps.length - 1\n\n // The spotlight element — uses box-shadow to create the overlay\n // As this element transitions position/size/border-radius, the\n // entire overlay smoothly morphs to follow the target.\n const spotlightStyle: React.CSSProperties = targetRect\n ? {\n position: 'fixed',\n top: targetRect.top - s.padding,\n left: targetRect.left - s.padding,\n width: targetRect.width + s.padding * 2,\n height: targetRect.height + s.padding * 2,\n borderRadius: targetRadius,\n boxShadow: '0 0 0 9999px rgba(0, 0, 0, 0.5)',\n transition: entering\n ? 'none'\n : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`,\n pointerEvents: 'none' as const,\n opacity: entering ? 0 : 1,\n animation: entering ? 'none' : undefined,\n }\n : {\n position: 'fixed' as const,\n inset: 0,\n background: 'rgba(0,0,0,0.5)',\n }\n\n // Popover transitions position smoothly (no remount)\n const popoverStyle: React.CSSProperties = targetRect\n ? {\n ...getPopoverStyle(targetRect, placement, s.gap),\n transition: entering\n ? 'none'\n : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, bottom ${DURATION} ${EASE}, right ${DURATION} ${EASE}, opacity 150ms ease`,\n opacity: contentFading ? 0 : 1,\n }\n : { position: 'fixed', opacity: 0 }\n\n return (\n <div\n data-slot=\"root\"\n className={cn('tour_root', colorVars[color], classNames?.root, className)}\n style={{ opacity: entering ? 0 : 1, transition: `opacity 300ms ${EASE}` }}\n ref={(el) => {\n // Trigger entrance fade after mount\n if (el && entering) requestAnimationFrame(() => setEntering(false))\n }}\n >\n {/* Spotlight overlay — single div, box-shadow creates darkened backdrop */}\n <div\n data-slot=\"overlay\"\n className={cn('tour_overlay', 'z-[var(--z-overlay)]', classNames?.overlay)}\n onClick={overlayClickable ? handleSkip : undefined}\n style={spotlightStyle}\n />\n\n {/* Highlight ring — follows target shape */}\n {targetRect && (\n <div\n data-slot=\"highlight\"\n className=\"fixed z-[var(--z-overlay)] pointer-events-none\"\n style={{\n top: targetRect.top - s.padding,\n left: targetRect.left - s.padding,\n width: targetRect.width + s.padding * 2,\n height: targetRect.height + s.padding * 2,\n borderRadius: targetRadius,\n boxShadow: '0 0 0 2px var(--color-slot, #3b82f6), 0 0 12px 2px color-mix(in srgb, var(--color-slot, #3b82f6) 30%, transparent)',\n transition: `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`,\n }}\n />\n )}\n\n {/* Popover — position transitions, content crossfades */}\n <div\n ref={popoverRef}\n data-slot=\"popover\"\n className={cn(\n 'tour_popover',\n 'z-[calc(var(--z-overlay)+1)] rounded-lg border border-border bg-background shadow-lg',\n s.popover,\n classNames?.popover,\n )}\n style={popoverStyle}\n >\n {step.cover && (\n <div data-slot=\"cover\" className={cn('tour_cover', 'mb-3 rounded-md overflow-hidden', classNames?.cover)}>\n {step.cover}\n </div>\n )}\n\n <div data-slot=\"title\" className={cn('tour_title', s.title, 'text-text-primary', classNames?.title)}>\n {step.title}\n </div>\n\n {step.description && (\n <div data-slot=\"description\" className={cn('tour_description', s.desc, 'text-text-secondary mt-1', classNames?.description)}>\n {step.description}\n </div>\n )}\n\n <div data-slot=\"footer\" className={cn('tour_footer', 'flex items-center justify-between mt-3 gap-2', classNames?.footer)}>\n <div className=\"flex items-center gap-2\">\n {showProgress && (\n <span data-slot=\"indicator\" className={cn('tour_indicator', 'text-xs text-text-secondary', classNames?.indicator)}>\n {current + 1} / {steps.length}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {showSkip && !isLast && (\n <button\n type=\"button\"\n onClick={handleSkip}\n className={cn('inline-flex items-center justify-center rounded-md text-text-secondary hover:text-text-primary transition-colors font-medium cursor-pointer', s.btn)}\n >\n {skipText}\n </button>\n )}\n\n {current > 0 && (\n <button\n type=\"button\"\n onClick={handlePrev}\n className={cn('inline-flex items-center justify-center rounded-md border border-border bg-background text-text-primary hover:bg-surface transition-colors font-medium cursor-pointer', s.btn)}\n >\n {step.prevText || prevText}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleNext}\n className={cn('inline-flex items-center justify-center rounded-md bg-slot text-slot-fg hover:bg-slot-90 transition-colors font-medium cursor-pointer', s.btn)}\n >\n {isLast ? finishText : step.nextText || nextText}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n },\n)\n\nTour.displayName = 'Tour'\n\nexport type * from './types'\nexport default Tour\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { useSelectBase } from './chunk-
|
|
1
|
+
import { useSelectBase } from './chunk-SZMIHNCZ.js';
|
|
2
2
|
import { useControllable } from './chunk-PQOIW5CM.js';
|
|
3
|
-
import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
|
|
4
3
|
import { spinner_default } from './chunk-RRPMZYVN.js';
|
|
4
|
+
import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
|
|
5
5
|
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
6
6
|
import { cn, iconSizes, statusMessageVariants } from './chunk-RAS6HUEI.js';
|
|
7
7
|
import { cva } from 'class-variance-authority';
|
|
@@ -86,7 +86,11 @@ var Select = React.memo(
|
|
|
86
86
|
ref,
|
|
87
87
|
...props
|
|
88
88
|
}) => {
|
|
89
|
-
const [currentValue, setCurrentValue] = useControllable({
|
|
89
|
+
const [currentValue, setCurrentValue] = useControllable({
|
|
90
|
+
value,
|
|
91
|
+
defaultValue: defaultValue ?? "",
|
|
92
|
+
onChange
|
|
93
|
+
});
|
|
90
94
|
const {
|
|
91
95
|
// State
|
|
92
96
|
isOpen,
|
|
@@ -168,7 +172,7 @@ var Select = React.memo(
|
|
|
168
172
|
"div",
|
|
169
173
|
{
|
|
170
174
|
ref: scrollContainerRef,
|
|
171
|
-
className: "overflow-auto relative",
|
|
175
|
+
className: "overflow-auto relative p-1",
|
|
172
176
|
style: { maxHeight: maxDropdownHeight },
|
|
173
177
|
role: "listbox",
|
|
174
178
|
id: listboxId,
|
|
@@ -327,6 +331,7 @@ var Select = React.memo(
|
|
|
327
331
|
{
|
|
328
332
|
"data-slot": "option",
|
|
329
333
|
"data-value": option.value,
|
|
334
|
+
"data-option-index": index,
|
|
330
335
|
className: cn(
|
|
331
336
|
"select_option",
|
|
332
337
|
selectOptionVariants({
|
|
@@ -530,5 +535,5 @@ Select.displayName = "Select";
|
|
|
530
535
|
var select_default = Select;
|
|
531
536
|
|
|
532
537
|
export { select_default };
|
|
533
|
-
//# sourceMappingURL=chunk-
|
|
534
|
-
//# sourceMappingURL=chunk-
|
|
538
|
+
//# sourceMappingURL=chunk-ZNGKUG2N.js.map
|
|
539
|
+
//# sourceMappingURL=chunk-ZNGKUG2N.js.map
|