erp-pro-ui 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animations.css +40 -0
- package/dist/calendar.cjs +1 -1
- package/dist/calendar.mjs +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.mjs +1 -1
- package/dist/carousel.cjs +1 -1
- package/dist/carousel.mjs +1 -1
- package/dist/catalog.cjs +6 -0
- package/dist/catalog.cjs.map +1 -1
- package/dist/catalog.d.ts +11 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.mjs +6 -0
- package/dist/catalog.mjs.map +1 -1
- package/dist/charts.cjs +2 -1
- package/dist/charts.mjs +2 -2
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.mjs +1 -1
- package/dist/chip.cjs +1 -1
- package/dist/chip.mjs +1 -1
- package/dist/chroma-grid.cjs +1 -1
- package/dist/chroma-grid.mjs +1 -1
- package/dist/chunks/{calendar-xrGmvukr.cjs → calendar-Cpp_Rc7T.cjs} +58 -17
- package/dist/chunks/calendar-Cpp_Rc7T.cjs.map +1 -0
- package/dist/chunks/{calendar-BarcG6x_.mjs → calendar-DrCgT_pj.mjs} +58 -17
- package/dist/chunks/calendar-DrCgT_pj.mjs.map +1 -0
- package/dist/chunks/{card-gt-HZh0h.cjs → card-C5_tFK6Q.cjs} +1 -1
- package/dist/chunks/{card-gt-HZh0h.cjs.map → card-C5_tFK6Q.cjs.map} +1 -1
- package/dist/chunks/{card-CcIF6z2H.mjs → card-Dh8wNv8N.mjs} +1 -1
- package/dist/chunks/{card-CcIF6z2H.mjs.map → card-Dh8wNv8N.mjs.map} +1 -1
- package/dist/chunks/{carousel-DJdqBVRK.mjs → carousel-BYwqI4cA.mjs} +1 -1
- package/dist/chunks/{carousel-DJdqBVRK.mjs.map → carousel-BYwqI4cA.mjs.map} +1 -1
- package/dist/chunks/{carousel-Cq5uwqQt.cjs → carousel-C1338X8h.cjs} +1 -1
- package/dist/chunks/{carousel-Cq5uwqQt.cjs.map → carousel-C1338X8h.cjs.map} +1 -1
- package/dist/chunks/{charts-DugYWvEf.mjs → charts-BYvM4TMG.mjs} +371 -117
- package/dist/chunks/charts-BYvM4TMG.mjs.map +1 -0
- package/dist/chunks/{charts-BpElnsoR.cjs → charts-DbxyHtlX.cjs} +375 -115
- package/dist/chunks/charts-DbxyHtlX.cjs.map +1 -0
- package/dist/chunks/{checkbox-yHuSw-hV.cjs → checkbox-CxOcjoGP.cjs} +1 -1
- package/dist/chunks/{checkbox-yHuSw-hV.cjs.map → checkbox-CxOcjoGP.cjs.map} +1 -1
- package/dist/chunks/{checkbox-DvwlGwWe.mjs → checkbox-Pr49U9F1.mjs} +1 -1
- package/dist/chunks/{checkbox-DvwlGwWe.mjs.map → checkbox-Pr49U9F1.mjs.map} +1 -1
- package/dist/chunks/{chip-DcBji__g.cjs → chip-B4ol1yPk.cjs} +1 -1
- package/dist/chunks/{chip-DcBji__g.cjs.map → chip-B4ol1yPk.cjs.map} +1 -1
- package/dist/chunks/{chip-BGSUmnlO.mjs → chip-DdnBLdpl.mjs} +1 -1
- package/dist/chunks/{chip-BGSUmnlO.mjs.map → chip-DdnBLdpl.mjs.map} +1 -1
- package/dist/chunks/{chroma-grid-Cdeql_2C.mjs → chroma-grid-BAo6V5A7.mjs} +1 -1
- package/dist/chunks/{chroma-grid-Cdeql_2C.mjs.map → chroma-grid-BAo6V5A7.mjs.map} +1 -1
- package/dist/chunks/{chroma-grid-9E9j1s9I.cjs → chroma-grid-CIk0dsNS.cjs} +1 -1
- package/dist/chunks/{chroma-grid-9E9j1s9I.cjs.map → chroma-grid-CIk0dsNS.cjs.map} +1 -1
- package/dist/chunks/{color-palette-BLvDnCOD.cjs → color-palette-2TuEMkAn.cjs} +1 -1
- package/dist/chunks/{color-palette-BLvDnCOD.cjs.map → color-palette-2TuEMkAn.cjs.map} +1 -1
- package/dist/chunks/{color-palette-CXlCDiZz.mjs → color-palette-euKQMWlV.mjs} +1 -1
- package/dist/chunks/{color-palette-CXlCDiZz.mjs.map → color-palette-euKQMWlV.mjs.map} +1 -1
- package/dist/chunks/{combobox-BXu3s0dt.cjs → combobox-CwGubKTt.cjs} +2 -2
- package/dist/chunks/combobox-CwGubKTt.cjs.map +1 -0
- package/dist/chunks/{combobox-CjK-qG4k.mjs → combobox-DrFmkI0F.mjs} +2 -2
- package/dist/chunks/combobox-DrFmkI0F.mjs.map +1 -0
- package/dist/chunks/{data-table-DyEQn9Yj.mjs → data-table-Bo80m7qV.mjs} +8 -8
- package/dist/chunks/{data-table-DyEQn9Yj.mjs.map → data-table-Bo80m7qV.mjs.map} +1 -1
- package/dist/chunks/{data-table-9HELVsYR.cjs → data-table-W1sK5tkL.cjs} +8 -8
- package/dist/chunks/{data-table-9HELVsYR.cjs.map → data-table-W1sK5tkL.cjs.map} +1 -1
- package/dist/chunks/{date-picker-D8gaaMlJ.mjs → date-picker-CNPORxhv.mjs} +87 -17
- package/dist/chunks/date-picker-CNPORxhv.mjs.map +1 -0
- package/dist/chunks/{date-picker-W9om1j7A.cjs → date-picker-CZo68Fkl.cjs} +87 -17
- package/dist/chunks/date-picker-CZo68Fkl.cjs.map +1 -0
- package/dist/chunks/input-BWM6G7jq.cjs +117 -0
- package/dist/chunks/input-BWM6G7jq.cjs.map +1 -0
- package/dist/chunks/input-Bt_r_B_c.mjs +105 -0
- package/dist/chunks/input-Bt_r_B_c.mjs.map +1 -0
- package/dist/chunks/{multi-select-combobox-ELSH_Xr4.mjs → multi-select-combobox-D46M-AN9.mjs} +2 -2
- package/dist/chunks/multi-select-combobox-D46M-AN9.mjs.map +1 -0
- package/dist/chunks/{multi-select-combobox-UW0X15W7.cjs → multi-select-combobox-dS6bJE_e.cjs} +2 -2
- package/dist/chunks/multi-select-combobox-dS6bJE_e.cjs.map +1 -0
- package/dist/chunks/{otp-input-B6zzOEqw.cjs → otp-input-DSW9Ca_D.cjs} +2 -2
- package/dist/chunks/otp-input-DSW9Ca_D.cjs.map +1 -0
- package/dist/chunks/{otp-input-Bg4nQG6x.mjs → otp-input-DeAi4nJ_.mjs} +2 -2
- package/dist/chunks/otp-input-DeAi4nJ_.mjs.map +1 -0
- package/dist/chunks/{progress-bar-C9FZDrju.mjs → progress-bar-B9sy7WBT.mjs} +1 -1
- package/dist/chunks/{progress-bar-C9FZDrju.mjs.map → progress-bar-B9sy7WBT.mjs.map} +1 -1
- package/dist/chunks/{progress-bar-C1OvQ-NI.cjs → progress-bar-BdvQtpm3.cjs} +1 -1
- package/dist/chunks/{progress-bar-C1OvQ-NI.cjs.map → progress-bar-BdvQtpm3.cjs.map} +1 -1
- package/dist/chunks/select-B8UQ6Uq5.mjs +170 -0
- package/dist/chunks/select-B8UQ6Uq5.mjs.map +1 -0
- package/dist/chunks/select-CCUSMvfS.cjs +176 -0
- package/dist/chunks/select-CCUSMvfS.cjs.map +1 -0
- package/dist/chunks/skeleton-BNea1Rcp.cjs +422 -0
- package/dist/chunks/skeleton-BNea1Rcp.cjs.map +1 -0
- package/dist/chunks/skeleton-CtLumdRw.mjs +368 -0
- package/dist/chunks/skeleton-CtLumdRw.mjs.map +1 -0
- package/dist/chunks/stepper-D6qQbZdg.cjs +642 -0
- package/dist/chunks/stepper-D6qQbZdg.cjs.map +1 -0
- package/dist/chunks/stepper-DUknuW2E.mjs +618 -0
- package/dist/chunks/stepper-DUknuW2E.mjs.map +1 -0
- package/dist/chunks/{textarea-CU5C-Zw9.mjs → textarea-Blky_fLK.mjs} +2 -2
- package/dist/chunks/{textarea-CU5C-Zw9.mjs.map → textarea-Blky_fLK.mjs.map} +1 -1
- package/dist/chunks/{textarea-CAUsyu4-.cjs → textarea-ok_NlE2p.cjs} +2 -2
- package/dist/chunks/textarea-ok_NlE2p.cjs.map +1 -0
- package/dist/color-palette.cjs +1 -1
- package/dist/color-palette.mjs +1 -1
- package/dist/colors.css +3 -0
- package/dist/combobox.cjs +1 -1
- package/dist/combobox.mjs +1 -1
- package/dist/components/data-display/charts/AreaChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/BarChart.d.ts +1 -0
- package/dist/components/data-display/charts/BarChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/NeonLineChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/PieChart.d.ts +18 -2
- package/dist/components/data-display/charts/PieChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/PositiveNegativeBarChart.d.ts +21 -0
- package/dist/components/data-display/charts/PositiveNegativeBarChart.d.ts.map +1 -0
- package/dist/components/data-display/charts/StackedBarChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/ThinBreakdownBar.d.ts +3 -0
- package/dist/components/data-display/charts/ThinBreakdownBar.d.ts.map +1 -1
- package/dist/components/data-display/charts/chartStyles.d.ts +24 -0
- package/dist/components/data-display/charts/chartStyles.d.ts.map +1 -0
- package/dist/components/data-display/charts/index.d.ts +2 -0
- package/dist/components/data-display/charts/index.d.ts.map +1 -1
- package/dist/components/data-display/skeleton/Skeleton.d.ts +32 -5
- package/dist/components/data-display/skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/data-display/skeleton/index.d.ts +2 -2
- package/dist/components/data-display/skeleton/index.d.ts.map +1 -1
- package/dist/components/forms/calendar/Calendar.d.ts.map +1 -1
- package/dist/components/forms/date-picker/DatePicker.d.ts.map +1 -1
- package/dist/components/forms/input/Input.d.ts.map +1 -1
- package/dist/components/forms/input/types.d.ts +5 -0
- package/dist/components/forms/input/types.d.ts.map +1 -1
- package/dist/components/forms/select/Select.d.ts.map +1 -1
- package/dist/components/forms/select/types.d.ts +7 -1
- package/dist/components/forms/select/types.d.ts.map +1 -1
- package/dist/components/navigation/stepper/Stepper1.d.ts +4 -0
- package/dist/components/navigation/stepper/Stepper1.d.ts.map +1 -0
- package/dist/components/navigation/stepper/Stepper2.d.ts +5 -0
- package/dist/components/navigation/stepper/Stepper2.d.ts.map +1 -0
- package/dist/components/navigation/stepper/index.d.ts +4 -1
- package/dist/components/navigation/stepper/index.d.ts.map +1 -1
- package/dist/components/navigation/stepper/types.d.ts +85 -0
- package/dist/components/navigation/stepper/types.d.ts.map +1 -1
- package/dist/data-table.cjs +1 -1
- package/dist/data-table.mjs +1 -1
- package/dist/date-picker.cjs +1 -1
- package/dist/date-picker.mjs +1 -1
- package/dist/docs.cjs +12 -2
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.d.ts.map +1 -1
- package/dist/docs.mjs +12 -2
- package/dist/docs.mjs.map +1 -1
- package/dist/foundation.css +7 -0
- package/dist/index.cjs +32 -19
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +20 -20
- package/dist/input.cjs +1 -1
- package/dist/input.mjs +1 -1
- package/dist/multi-select-combobox.cjs +1 -1
- package/dist/multi-select-combobox.mjs +1 -1
- package/dist/otp-input.cjs +1 -1
- package/dist/otp-input.mjs +1 -1
- package/dist/progress-bar.cjs +1 -1
- package/dist/progress-bar.mjs +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.mjs +1 -1
- package/dist/skeleton.cjs +9 -1
- package/dist/skeleton.mjs +2 -2
- package/dist/stepper.cjs +5 -1
- package/dist/stepper.mjs +2 -2
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.mjs +1 -1
- package/dist/tokens.css +11 -2
- package/package.json +9 -9
- package/dist/chunks/calendar-BarcG6x_.mjs.map +0 -1
- package/dist/chunks/calendar-xrGmvukr.cjs.map +0 -1
- package/dist/chunks/charts-BpElnsoR.cjs.map +0 -1
- package/dist/chunks/charts-DugYWvEf.mjs.map +0 -1
- package/dist/chunks/combobox-BXu3s0dt.cjs.map +0 -1
- package/dist/chunks/combobox-CjK-qG4k.mjs.map +0 -1
- package/dist/chunks/date-picker-D8gaaMlJ.mjs.map +0 -1
- package/dist/chunks/date-picker-W9om1j7A.cjs.map +0 -1
- package/dist/chunks/input-D9qZNqXV.cjs +0 -99
- package/dist/chunks/input-D9qZNqXV.cjs.map +0 -1
- package/dist/chunks/input-wNqevfQ4.mjs +0 -87
- package/dist/chunks/input-wNqevfQ4.mjs.map +0 -1
- package/dist/chunks/multi-select-combobox-ELSH_Xr4.mjs.map +0 -1
- package/dist/chunks/multi-select-combobox-UW0X15W7.cjs.map +0 -1
- package/dist/chunks/otp-input-B6zzOEqw.cjs.map +0 -1
- package/dist/chunks/otp-input-Bg4nQG6x.mjs.map +0 -1
- package/dist/chunks/select-D71tk6-I.mjs +0 -152
- package/dist/chunks/select-D71tk6-I.mjs.map +0 -1
- package/dist/chunks/select-WC_kPqUP.cjs +0 -158
- package/dist/chunks/select-WC_kPqUP.cjs.map +0 -1
- package/dist/chunks/skeleton-BhYWOp0Q.mjs +0 -215
- package/dist/chunks/skeleton-BhYWOp0Q.mjs.map +0 -1
- package/dist/chunks/skeleton-DTXpHYYB.cjs +0 -221
- package/dist/chunks/skeleton-DTXpHYYB.cjs.map +0 -1
- package/dist/chunks/stepper-D4yQsQB0.mjs +0 -261
- package/dist/chunks/stepper-D4yQsQB0.mjs.map +0 -1
- package/dist/chunks/stepper-fY-Sx72k.cjs +0 -267
- package/dist/chunks/stepper-fY-Sx72k.cjs.map +0 -1
- package/dist/chunks/textarea-CAUsyu4-.cjs.map +0 -1
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { n as mergeClassNames } from "./utils-ati1KkDb.mjs";
|
|
2
|
-
import { J as CheckIcon, N as ChevronDownIcon } from "./icons-DuumN7z-.mjs";
|
|
3
|
-
import { forwardRef, useEffect, useRef, useState } from "react";
|
|
4
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import { motion, useMotionTemplate, useMotionValue } from "framer-motion";
|
|
6
|
-
//#region src/components/forms/select/Select.tsx
|
|
7
|
-
var Select = forwardRef(({ className = "", containerClassName = "", triggerClassName = "", label, error, helperText, options, value, onChange, placeholder = "Select...", disabled, bgClassName = "bg-background-secondary", ...props }, ref) => {
|
|
8
|
-
const [open, setOpen] = useState(false);
|
|
9
|
-
const [visible, setVisible] = useState(false);
|
|
10
|
-
const containerRef = useRef(null);
|
|
11
|
-
const hiddenSelectRef = useRef(null);
|
|
12
|
-
const mouseX = useMotionValue(0);
|
|
13
|
-
const mouseY = useMotionValue(0);
|
|
14
|
-
const radius = 100;
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
if (ref && typeof ref === "function") ref(hiddenSelectRef.current);
|
|
17
|
-
else if (ref) ref.current = hiddenSelectRef.current;
|
|
18
|
-
}, [ref]);
|
|
19
|
-
useEffect(() => {
|
|
20
|
-
const handleClick = (e) => {
|
|
21
|
-
if (containerRef.current && !containerRef.current.contains(e.target)) setOpen(false);
|
|
22
|
-
};
|
|
23
|
-
if (open) document.addEventListener("mousedown", handleClick);
|
|
24
|
-
return () => document.removeEventListener("mousedown", handleClick);
|
|
25
|
-
}, [open]);
|
|
26
|
-
const handleMouseMove = (event) => {
|
|
27
|
-
const { left, top } = event.currentTarget.getBoundingClientRect();
|
|
28
|
-
mouseX.set(event.clientX - left);
|
|
29
|
-
mouseY.set(event.clientY - top);
|
|
30
|
-
};
|
|
31
|
-
const selectedOption = options.find((opt) => opt.value === value);
|
|
32
|
-
const handleSelect = (optValue) => {
|
|
33
|
-
if (onChange && hiddenSelectRef.current) onChange({
|
|
34
|
-
target: {
|
|
35
|
-
value: optValue,
|
|
36
|
-
name: props.name
|
|
37
|
-
},
|
|
38
|
-
currentTarget: {
|
|
39
|
-
value: optValue,
|
|
40
|
-
name: props.name
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
setOpen(false);
|
|
44
|
-
};
|
|
45
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
46
|
-
className: mergeClassNames("w-full min-w-48", containerClassName),
|
|
47
|
-
children: [
|
|
48
|
-
label && /* @__PURE__ */ jsx("label", {
|
|
49
|
-
className: "mb-2 block text-sm leading-none font-medium text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
50
|
-
children: label
|
|
51
|
-
}),
|
|
52
|
-
/* @__PURE__ */ jsxs("select", {
|
|
53
|
-
ref: hiddenSelectRef,
|
|
54
|
-
className: "sr-only",
|
|
55
|
-
value,
|
|
56
|
-
onChange,
|
|
57
|
-
disabled,
|
|
58
|
-
...props,
|
|
59
|
-
children: [/* @__PURE__ */ jsx("option", {
|
|
60
|
-
value: "",
|
|
61
|
-
children: placeholder
|
|
62
|
-
}), options.map((option) => /* @__PURE__ */ jsx("option", {
|
|
63
|
-
value: option.value,
|
|
64
|
-
children: option.label
|
|
65
|
-
}, option.value))]
|
|
66
|
-
}),
|
|
67
|
-
/* @__PURE__ */ jsxs("div", {
|
|
68
|
-
ref: containerRef,
|
|
69
|
-
className: mergeClassNames("relative w-full", className),
|
|
70
|
-
children: [/* @__PURE__ */ jsx(motion.div, {
|
|
71
|
-
style: { backgroundImage: disabled ? "none" : useMotionTemplate`
|
|
72
|
-
radial-gradient(
|
|
73
|
-
${visible ? `${radius}px` : "0px"} circle at ${mouseX}px ${mouseY}px,
|
|
74
|
-
var(--ds-color-accent),
|
|
75
|
-
transparent 90%
|
|
76
|
-
)
|
|
77
|
-
` },
|
|
78
|
-
onMouseMove: !disabled ? handleMouseMove : void 0,
|
|
79
|
-
onMouseEnter: !disabled ? () => setVisible(true) : void 0,
|
|
80
|
-
onMouseLeave: !disabled ? () => setVisible(false) : void 0,
|
|
81
|
-
className: mergeClassNames("group/select rounded-lg p-[2px] transition duration-300 hover:border-accent", disabled ? "bg-muted border-none" : error ? "border-destructive" : "border-border"),
|
|
82
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
83
|
-
className: mergeClassNames("shadow-input flex h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm transition duration-400 ease-in-out group-hover/select:shadow-none", bgClassName, disabled ? "cursor-not-allowed opacity-50" : "text-foreground", error && "border-destructive text-destructive focus-visible:ring-destructive", triggerClassName),
|
|
84
|
-
onClick: () => {
|
|
85
|
-
if (!disabled) setOpen((o) => !o);
|
|
86
|
-
},
|
|
87
|
-
onKeyDown: (event) => {
|
|
88
|
-
if (disabled) return;
|
|
89
|
-
if (event.key === "Enter" || event.key === " ") {
|
|
90
|
-
event.preventDefault();
|
|
91
|
-
setOpen((current) => !current);
|
|
92
|
-
}
|
|
93
|
-
if (event.key === "Escape") setOpen(false);
|
|
94
|
-
},
|
|
95
|
-
role: "button",
|
|
96
|
-
tabIndex: disabled ? -1 : 0,
|
|
97
|
-
"aria-haspopup": "listbox",
|
|
98
|
-
"aria-expanded": open,
|
|
99
|
-
children: [selectedOption ? /* @__PURE__ */ jsx("span", {
|
|
100
|
-
className: "flex-1 truncate text-foreground",
|
|
101
|
-
children: selectedOption.label
|
|
102
|
-
}) : /* @__PURE__ */ jsx("span", {
|
|
103
|
-
className: "flex-1 text-muted-foreground",
|
|
104
|
-
children: placeholder
|
|
105
|
-
}), /* @__PURE__ */ jsx("span", {
|
|
106
|
-
className: mergeClassNames("ml-2 text-muted-foreground transition-transform duration-300", open ? "rotate-180" : "rotate-0"),
|
|
107
|
-
children: /* @__PURE__ */ jsx(ChevronDownIcon, {
|
|
108
|
-
width: 24,
|
|
109
|
-
height: 24,
|
|
110
|
-
color: "currentColor",
|
|
111
|
-
className: "h-5 w-5"
|
|
112
|
-
})
|
|
113
|
-
})]
|
|
114
|
-
})
|
|
115
|
-
}), open && !disabled && /* @__PURE__ */ jsxs("div", {
|
|
116
|
-
className: mergeClassNames("absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col overflow-auto rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition"),
|
|
117
|
-
children: [options.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
118
|
-
className: "px-3 py-2 text-muted-foreground",
|
|
119
|
-
children: "No options"
|
|
120
|
-
}), options.map((opt) => /* @__PURE__ */ jsxs("div", {
|
|
121
|
-
className: mergeClassNames("mx-1 my-1 flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-sm text-foreground transition", opt.value === value ? "bg-accent-subtle text-accent font-semibold" : "", "hover:bg-accent hover:text-on-accent"),
|
|
122
|
-
onClick: () => handleSelect(opt.value),
|
|
123
|
-
children: [/* @__PURE__ */ jsx("span", {
|
|
124
|
-
className: "flex w-5 items-center justify-center",
|
|
125
|
-
children: opt.value === value && /* @__PURE__ */ jsx(CheckIcon, {
|
|
126
|
-
className: "text-accent",
|
|
127
|
-
width: 18,
|
|
128
|
-
height: 18
|
|
129
|
-
})
|
|
130
|
-
}), /* @__PURE__ */ jsx("span", {
|
|
131
|
-
className: "min-w-0 flex-1 truncate",
|
|
132
|
-
children: opt.label
|
|
133
|
-
})]
|
|
134
|
-
}, opt.value))]
|
|
135
|
-
})]
|
|
136
|
-
}),
|
|
137
|
-
error && /* @__PURE__ */ jsx("p", {
|
|
138
|
-
className: "mt-1 text-sm font-medium text-destructive",
|
|
139
|
-
children: error
|
|
140
|
-
}),
|
|
141
|
-
helperText && !error && /* @__PURE__ */ jsx("p", {
|
|
142
|
-
className: "mt-1 text-sm text-muted-foreground",
|
|
143
|
-
children: helperText
|
|
144
|
-
})
|
|
145
|
-
]
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
Select.displayName = "Select";
|
|
149
|
-
//#endregion
|
|
150
|
-
export { Select as t };
|
|
151
|
-
|
|
152
|
-
//# sourceMappingURL=select-D71tk6-I.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-D71tk6-I.mjs","names":[],"sources":["../../src/components/forms/select/Select.tsx"],"sourcesContent":["import type { SelectProps } from \"./types\";\nimport { forwardRef, useState, useRef, useEffect } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon } from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n className = \"\",\n containerClassName = \"\",\n triggerClassName = \"\",\n label,\n error,\n helperText,\n options,\n value,\n onChange,\n placeholder = \"Select...\",\n disabled,\n bgClassName = \"bg-background-secondary\",\n ...props\n },\n ref,\n ) => {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const hiddenSelectRef = useRef<HTMLSelectElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Combine refs\n useEffect(() => {\n if (ref && typeof ref === \"function\") {\n ref(hiddenSelectRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLSelectElement | null>).current =\n hiddenSelectRef.current;\n }\n }, [ref]);\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n if (open) {\n document.addEventListener(\"mousedown\", handleClick);\n }\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const selectedOption = options.find((opt) => opt.value === value);\n\n const handleSelect = (optValue: string) => {\n // Trigger onChange with a synthetic event\n if (onChange && hiddenSelectRef.current) {\n const event = {\n target: { value: optValue, name: props.name },\n currentTarget: { value: optValue, name: props.name },\n } as React.ChangeEvent<HTMLSelectElement>;\n onChange(event);\n }\n setOpen(false);\n };\n\n return (\n <div className={mergeClassNames(\"w-full min-w-48\", containerClassName)}>\n {label && (\n <label className=\"mb-2 block text-sm leading-none font-medium text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n </label>\n )}\n\n {/* Hidden native select for form compatibility */}\n <select\n ref={hiddenSelectRef}\n className=\"sr-only\"\n value={value}\n onChange={onChange}\n disabled={disabled}\n {...props}\n >\n <option value=\"\">{placeholder}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n {/* Custom styled dropdown */}\n <div\n ref={containerRef}\n className={mergeClassNames(\"relative w-full\", className)}\n >\n <motion.div\n style={{\n backgroundImage: disabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!disabled ? handleMouseMove : undefined}\n onMouseEnter={!disabled ? () => setVisible(true) : undefined}\n onMouseLeave={!disabled ? () => setVisible(false) : undefined}\n className={mergeClassNames(\n \"group/select rounded-lg p-[2px] transition duration-300 hover:border-accent\",\n disabled\n ? \"bg-muted border-none\"\n : error\n ? \"border-destructive\"\n : \"border-border\",\n )}\n >\n <div\n className={mergeClassNames(\n \"shadow-input flex h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm transition duration-400 ease-in-out group-hover/select:shadow-none\",\n bgClassName,\n disabled ? \"cursor-not-allowed opacity-50\" : \"text-foreground\",\n error &&\n \"border-destructive text-destructive focus-visible:ring-destructive\",\n triggerClassName,\n )}\n onClick={() => {\n if (!disabled) {\n setOpen((o) => !o);\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return;\n }\n\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen((current) => !current);\n }\n\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n }}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n {selectedOption ? (\n <span className=\"flex-1 truncate text-foreground\">\n {selectedOption.label}\n </span>\n ) : (\n <span className=\"flex-1 text-muted-foreground\">\n {placeholder}\n </span>\n )}\n <span\n className={mergeClassNames(\n \"ml-2 text-muted-foreground transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n\n {open && !disabled && (\n <div\n className={mergeClassNames(\n \"absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col overflow-auto rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition\",\n )}\n >\n {options.length === 0 && (\n <div className=\"px-3 py-2 text-muted-foreground\">\n No options\n </div>\n )}\n {options.map((opt) => (\n <div\n key={opt.value}\n className={mergeClassNames(\n \"mx-1 my-1 flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-sm text-foreground transition\",\n opt.value === value\n ? \"bg-accent-subtle text-accent font-semibold\"\n : \"\",\n \"hover:bg-accent hover:text-on-accent\",\n )}\n onClick={() => handleSelect(opt.value)}\n >\n <span className=\"flex w-5 items-center justify-center\">\n {opt.value === value && (\n <CheckIcon\n className=\"text-accent\"\n width={18}\n height={18}\n />\n )}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{opt.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-sm font-medium text-destructive\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{helperText}</p>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = \"Select\";\n"],"mappings":";;;;;;AAOA,IAAa,SAAS,YAElB,EACE,YAAY,IACZ,qBAAqB,IACrB,mBAAmB,IACnB,OACA,OACA,YACA,SACA,OACA,UACA,cAAc,aACd,UACA,cAAc,2BACd,GAAG,SAEL,QACG;CACH,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CACvC,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,kBAAkB,OAA0B,KAAK;CACvD,MAAM,SAAS,eAAe,EAAE;CAChC,MAAM,SAAS,eAAe,EAAE;CAChC,MAAM,SAAS;AAGf,iBAAgB;AACd,MAAI,OAAO,OAAO,QAAQ,WACxB,KAAI,gBAAgB,QAAQ;WACnB,IACR,KAAyD,UACxD,gBAAgB;IAEnB,CAAC,IAAI,CAAC;AAGT,iBAAgB;EACd,MAAM,eAAe,MAAkB;AACrC,OACE,aAAa,WACb,CAAC,aAAa,QAAQ,SAAS,EAAE,OAAe,CAEhD,SAAQ,MAAM;;AAGlB,MAAI,KACF,UAAS,iBAAiB,aAAa,YAAY;AAErD,eAAa,SAAS,oBAAoB,aAAa,YAAY;IAClE,CAAC,KAAK,CAAC;CAEV,MAAM,mBAAmB,UAA4C;EACnE,MAAM,EAAE,MAAM,QAAQ,MAAM,cAAc,uBAAuB;AACjE,SAAO,IAAI,MAAM,UAAU,KAAK;AAChC,SAAO,IAAI,MAAM,UAAU,IAAI;;CAGjC,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,IAAI,UAAU,MAAM;CAEjE,MAAM,gBAAgB,aAAqB;AAEzC,MAAI,YAAY,gBAAgB,QAK9B,UAJc;GACZ,QAAQ;IAAE,OAAO;IAAU,MAAM,MAAM;IAAM;GAC7C,eAAe;IAAE,OAAO;IAAU,MAAM,MAAM;IAAM;GACrD,CACc;AAEjB,UAAQ,MAAM;;AAGhB,QACE,qBAAC,OAAD;EAAK,WAAW,gBAAgB,mBAAmB,mBAAmB;YAAtE;GACG,SACC,oBAAC,SAAD;IAAO,WAAU;cACd;IACK,CAAA;GAIV,qBAAC,UAAD;IACE,KAAK;IACL,WAAU;IACH;IACG;IACA;IACV,GAAI;cANN,CAQE,oBAAC,UAAD;KAAQ,OAAM;eAAI;KAAqB,CAAA,EACtC,QAAQ,KAAK,WACZ,oBAAC,UAAD;KAA2B,OAAO,OAAO;eACtC,OAAO;KACD,EAFI,OAAO,MAEX,CACT,CACK;;GAGT,qBAAC,OAAD;IACE,KAAK;IACL,WAAW,gBAAgB,mBAAmB,UAAU;cAF1D,CAIE,oBAAC,OAAO,KAAR;KACE,OAAO,EACL,iBAAiB,WACb,SACA,iBAAiB;;wBAGX,UAAU,GAAG,OAAO,MAAM,MAC3B,aAAa,OAAO,KAAK,OAAO;;;;qBAK1C;KACD,aAAa,CAAC,WAAW,kBAAkB,KAAA;KAC3C,cAAc,CAAC,iBAAiB,WAAW,KAAK,GAAG,KAAA;KACnD,cAAc,CAAC,iBAAiB,WAAW,MAAM,GAAG,KAAA;KACpD,WAAW,gBACT,+EACA,WACI,yBACA,QACE,uBACA,gBACP;eAED,qBAAC,OAAD;MACE,WAAW,gBACT,iMACA,aACA,WAAW,kCAAkC,mBAC7C,SACE,sEACF,iBACD;MACD,eAAe;AACb,WAAI,CAAC,SACH,UAAS,MAAM,CAAC,EAAE;;MAGtB,YAAY,UAAU;AACpB,WAAI,SACF;AAGF,WAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,cAAM,gBAAgB;AACtB,iBAAS,YAAY,CAAC,QAAQ;;AAGhC,WAAI,MAAM,QAAQ,SAChB,SAAQ,MAAM;;MAGlB,MAAK;MACL,UAAU,WAAW,KAAK;MAC1B,iBAAc;MACd,iBAAe;gBA/BjB,CAiCG,iBACC,oBAAC,QAAD;OAAM,WAAU;iBACb,eAAe;OACX,CAAA,GAEP,oBAAC,QAAD;OAAM,WAAU;iBACb;OACI,CAAA,EAET,oBAAC,QAAD;OACE,WAAW,gBACT,gEACA,OAAO,eAAe,WACvB;iBAED,oBAAC,iBAAD;QACE,OAAO;QACP,QAAQ;QACR,OAAM;QACN,WAAU;QACV,CAAA;OACG,CAAA,CACH;;KACK,CAAA,EAEZ,QAAQ,CAAC,YACR,qBAAC,OAAD;KACE,WAAW,gBACT,sKACD;eAHH,CAKG,QAAQ,WAAW,KAClB,oBAAC,OAAD;MAAK,WAAU;gBAAkC;MAE3C,CAAA,EAEP,QAAQ,KAAK,QACZ,qBAAC,OAAD;MAEE,WAAW,gBACT,4GACA,IAAI,UAAU,QACV,+CACA,IACJ,uCACD;MACD,eAAe,aAAa,IAAI,MAAM;gBATxC,CAWE,oBAAC,QAAD;OAAM,WAAU;iBACb,IAAI,UAAU,SACb,oBAAC,WAAD;QACE,WAAU;QACV,OAAO;QACP,QAAQ;QACR,CAAA;OAEC,CAAA,EACP,oBAAC,QAAD;OAAM,WAAU;iBAA2B,IAAI;OAAa,CAAA,CACxD;QApBC,IAAI,MAoBL,CACN,CACE;OAEJ;;GAEL,SACC,oBAAC,KAAD;IAAG,WAAU;cAA6C;IAAU,CAAA;GAErE,cAAc,CAAC,SACd,oBAAC,KAAD;IAAG,WAAU;cAAsC;IAAe,CAAA;GAEhE;;EAGX;AAED,OAAO,cAAc"}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
require("./chunk-B_GkZjkl.cjs");
|
|
2
|
-
const require_utils = require("./utils-B4SmmY4J.cjs");
|
|
3
|
-
const require_icons = require("./icons-BxIzP2jd.cjs");
|
|
4
|
-
let react = require("react");
|
|
5
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
|
-
let framer_motion = require("framer-motion");
|
|
7
|
-
//#region src/components/forms/select/Select.tsx
|
|
8
|
-
var Select = (0, react.forwardRef)(({ className = "", containerClassName = "", triggerClassName = "", label, error, helperText, options, value, onChange, placeholder = "Select...", disabled, bgClassName = "bg-background-secondary", ...props }, ref) => {
|
|
9
|
-
const [open, setOpen] = (0, react.useState)(false);
|
|
10
|
-
const [visible, setVisible] = (0, react.useState)(false);
|
|
11
|
-
const containerRef = (0, react.useRef)(null);
|
|
12
|
-
const hiddenSelectRef = (0, react.useRef)(null);
|
|
13
|
-
const mouseX = (0, framer_motion.useMotionValue)(0);
|
|
14
|
-
const mouseY = (0, framer_motion.useMotionValue)(0);
|
|
15
|
-
const radius = 100;
|
|
16
|
-
(0, react.useEffect)(() => {
|
|
17
|
-
if (ref && typeof ref === "function") ref(hiddenSelectRef.current);
|
|
18
|
-
else if (ref) ref.current = hiddenSelectRef.current;
|
|
19
|
-
}, [ref]);
|
|
20
|
-
(0, react.useEffect)(() => {
|
|
21
|
-
const handleClick = (e) => {
|
|
22
|
-
if (containerRef.current && !containerRef.current.contains(e.target)) setOpen(false);
|
|
23
|
-
};
|
|
24
|
-
if (open) document.addEventListener("mousedown", handleClick);
|
|
25
|
-
return () => document.removeEventListener("mousedown", handleClick);
|
|
26
|
-
}, [open]);
|
|
27
|
-
const handleMouseMove = (event) => {
|
|
28
|
-
const { left, top } = event.currentTarget.getBoundingClientRect();
|
|
29
|
-
mouseX.set(event.clientX - left);
|
|
30
|
-
mouseY.set(event.clientY - top);
|
|
31
|
-
};
|
|
32
|
-
const selectedOption = options.find((opt) => opt.value === value);
|
|
33
|
-
const handleSelect = (optValue) => {
|
|
34
|
-
if (onChange && hiddenSelectRef.current) onChange({
|
|
35
|
-
target: {
|
|
36
|
-
value: optValue,
|
|
37
|
-
name: props.name
|
|
38
|
-
},
|
|
39
|
-
currentTarget: {
|
|
40
|
-
value: optValue,
|
|
41
|
-
name: props.name
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
setOpen(false);
|
|
45
|
-
};
|
|
46
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
47
|
-
className: require_utils.mergeClassNames("w-full min-w-48", containerClassName),
|
|
48
|
-
children: [
|
|
49
|
-
label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
50
|
-
className: "mb-2 block text-sm leading-none font-medium text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
51
|
-
children: label
|
|
52
|
-
}),
|
|
53
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
54
|
-
ref: hiddenSelectRef,
|
|
55
|
-
className: "sr-only",
|
|
56
|
-
value,
|
|
57
|
-
onChange,
|
|
58
|
-
disabled,
|
|
59
|
-
...props,
|
|
60
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
61
|
-
value: "",
|
|
62
|
-
children: placeholder
|
|
63
|
-
}), options.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
64
|
-
value: option.value,
|
|
65
|
-
children: option.label
|
|
66
|
-
}, option.value))]
|
|
67
|
-
}),
|
|
68
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
69
|
-
ref: containerRef,
|
|
70
|
-
className: require_utils.mergeClassNames("relative w-full", className),
|
|
71
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(framer_motion.motion.div, {
|
|
72
|
-
style: { backgroundImage: disabled ? "none" : framer_motion.useMotionTemplate`
|
|
73
|
-
radial-gradient(
|
|
74
|
-
${visible ? `${radius}px` : "0px"} circle at ${mouseX}px ${mouseY}px,
|
|
75
|
-
var(--ds-color-accent),
|
|
76
|
-
transparent 90%
|
|
77
|
-
)
|
|
78
|
-
` },
|
|
79
|
-
onMouseMove: !disabled ? handleMouseMove : void 0,
|
|
80
|
-
onMouseEnter: !disabled ? () => setVisible(true) : void 0,
|
|
81
|
-
onMouseLeave: !disabled ? () => setVisible(false) : void 0,
|
|
82
|
-
className: require_utils.mergeClassNames("group/select rounded-lg p-[2px] transition duration-300 hover:border-accent", disabled ? "bg-muted border-none" : error ? "border-destructive" : "border-border"),
|
|
83
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
84
|
-
className: require_utils.mergeClassNames("shadow-input flex h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm transition duration-400 ease-in-out group-hover/select:shadow-none", bgClassName, disabled ? "cursor-not-allowed opacity-50" : "text-foreground", error && "border-destructive text-destructive focus-visible:ring-destructive", triggerClassName),
|
|
85
|
-
onClick: () => {
|
|
86
|
-
if (!disabled) setOpen((o) => !o);
|
|
87
|
-
},
|
|
88
|
-
onKeyDown: (event) => {
|
|
89
|
-
if (disabled) return;
|
|
90
|
-
if (event.key === "Enter" || event.key === " ") {
|
|
91
|
-
event.preventDefault();
|
|
92
|
-
setOpen((current) => !current);
|
|
93
|
-
}
|
|
94
|
-
if (event.key === "Escape") setOpen(false);
|
|
95
|
-
},
|
|
96
|
-
role: "button",
|
|
97
|
-
tabIndex: disabled ? -1 : 0,
|
|
98
|
-
"aria-haspopup": "listbox",
|
|
99
|
-
"aria-expanded": open,
|
|
100
|
-
children: [selectedOption ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
101
|
-
className: "flex-1 truncate text-foreground",
|
|
102
|
-
children: selectedOption.label
|
|
103
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
104
|
-
className: "flex-1 text-muted-foreground",
|
|
105
|
-
children: placeholder
|
|
106
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
107
|
-
className: require_utils.mergeClassNames("ml-2 text-muted-foreground transition-transform duration-300", open ? "rotate-180" : "rotate-0"),
|
|
108
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.ChevronDownIcon, {
|
|
109
|
-
width: 24,
|
|
110
|
-
height: 24,
|
|
111
|
-
color: "currentColor",
|
|
112
|
-
className: "h-5 w-5"
|
|
113
|
-
})
|
|
114
|
-
})]
|
|
115
|
-
})
|
|
116
|
-
}), open && !disabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
117
|
-
className: require_utils.mergeClassNames("absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col overflow-auto rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition"),
|
|
118
|
-
children: [options.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
119
|
-
className: "px-3 py-2 text-muted-foreground",
|
|
120
|
-
children: "No options"
|
|
121
|
-
}), options.map((opt) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
122
|
-
className: require_utils.mergeClassNames("mx-1 my-1 flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-sm text-foreground transition", opt.value === value ? "bg-accent-subtle text-accent font-semibold" : "", "hover:bg-accent hover:text-on-accent"),
|
|
123
|
-
onClick: () => handleSelect(opt.value),
|
|
124
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
125
|
-
className: "flex w-5 items-center justify-center",
|
|
126
|
-
children: opt.value === value && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.CheckIcon, {
|
|
127
|
-
className: "text-accent",
|
|
128
|
-
width: 18,
|
|
129
|
-
height: 18
|
|
130
|
-
})
|
|
131
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
132
|
-
className: "min-w-0 flex-1 truncate",
|
|
133
|
-
children: opt.label
|
|
134
|
-
})]
|
|
135
|
-
}, opt.value))]
|
|
136
|
-
})]
|
|
137
|
-
}),
|
|
138
|
-
error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
139
|
-
className: "mt-1 text-sm font-medium text-destructive",
|
|
140
|
-
children: error
|
|
141
|
-
}),
|
|
142
|
-
helperText && !error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
143
|
-
className: "mt-1 text-sm text-muted-foreground",
|
|
144
|
-
children: helperText
|
|
145
|
-
})
|
|
146
|
-
]
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
Select.displayName = "Select";
|
|
150
|
-
//#endregion
|
|
151
|
-
Object.defineProperty(exports, "Select", {
|
|
152
|
-
enumerable: true,
|
|
153
|
-
get: function() {
|
|
154
|
-
return Select;
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
//# sourceMappingURL=select-WC_kPqUP.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-WC_kPqUP.cjs","names":[],"sources":["../../src/components/forms/select/Select.tsx"],"sourcesContent":["import type { SelectProps } from \"./types\";\nimport { forwardRef, useState, useRef, useEffect } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon } from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n className = \"\",\n containerClassName = \"\",\n triggerClassName = \"\",\n label,\n error,\n helperText,\n options,\n value,\n onChange,\n placeholder = \"Select...\",\n disabled,\n bgClassName = \"bg-background-secondary\",\n ...props\n },\n ref,\n ) => {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const hiddenSelectRef = useRef<HTMLSelectElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Combine refs\n useEffect(() => {\n if (ref && typeof ref === \"function\") {\n ref(hiddenSelectRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLSelectElement | null>).current =\n hiddenSelectRef.current;\n }\n }, [ref]);\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n if (open) {\n document.addEventListener(\"mousedown\", handleClick);\n }\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const selectedOption = options.find((opt) => opt.value === value);\n\n const handleSelect = (optValue: string) => {\n // Trigger onChange with a synthetic event\n if (onChange && hiddenSelectRef.current) {\n const event = {\n target: { value: optValue, name: props.name },\n currentTarget: { value: optValue, name: props.name },\n } as React.ChangeEvent<HTMLSelectElement>;\n onChange(event);\n }\n setOpen(false);\n };\n\n return (\n <div className={mergeClassNames(\"w-full min-w-48\", containerClassName)}>\n {label && (\n <label className=\"mb-2 block text-sm leading-none font-medium text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n </label>\n )}\n\n {/* Hidden native select for form compatibility */}\n <select\n ref={hiddenSelectRef}\n className=\"sr-only\"\n value={value}\n onChange={onChange}\n disabled={disabled}\n {...props}\n >\n <option value=\"\">{placeholder}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n {/* Custom styled dropdown */}\n <div\n ref={containerRef}\n className={mergeClassNames(\"relative w-full\", className)}\n >\n <motion.div\n style={{\n backgroundImage: disabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!disabled ? handleMouseMove : undefined}\n onMouseEnter={!disabled ? () => setVisible(true) : undefined}\n onMouseLeave={!disabled ? () => setVisible(false) : undefined}\n className={mergeClassNames(\n \"group/select rounded-lg p-[2px] transition duration-300 hover:border-accent\",\n disabled\n ? \"bg-muted border-none\"\n : error\n ? \"border-destructive\"\n : \"border-border\",\n )}\n >\n <div\n className={mergeClassNames(\n \"shadow-input flex h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm transition duration-400 ease-in-out group-hover/select:shadow-none\",\n bgClassName,\n disabled ? \"cursor-not-allowed opacity-50\" : \"text-foreground\",\n error &&\n \"border-destructive text-destructive focus-visible:ring-destructive\",\n triggerClassName,\n )}\n onClick={() => {\n if (!disabled) {\n setOpen((o) => !o);\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return;\n }\n\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen((current) => !current);\n }\n\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n }}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n {selectedOption ? (\n <span className=\"flex-1 truncate text-foreground\">\n {selectedOption.label}\n </span>\n ) : (\n <span className=\"flex-1 text-muted-foreground\">\n {placeholder}\n </span>\n )}\n <span\n className={mergeClassNames(\n \"ml-2 text-muted-foreground transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n\n {open && !disabled && (\n <div\n className={mergeClassNames(\n \"absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col overflow-auto rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition\",\n )}\n >\n {options.length === 0 && (\n <div className=\"px-3 py-2 text-muted-foreground\">\n No options\n </div>\n )}\n {options.map((opt) => (\n <div\n key={opt.value}\n className={mergeClassNames(\n \"mx-1 my-1 flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-sm text-foreground transition\",\n opt.value === value\n ? \"bg-accent-subtle text-accent font-semibold\"\n : \"\",\n \"hover:bg-accent hover:text-on-accent\",\n )}\n onClick={() => handleSelect(opt.value)}\n >\n <span className=\"flex w-5 items-center justify-center\">\n {opt.value === value && (\n <CheckIcon\n className=\"text-accent\"\n width={18}\n height={18}\n />\n )}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{opt.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-sm font-medium text-destructive\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{helperText}</p>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = \"Select\";\n"],"mappings":";;;;;;;AAOA,IAAa,UAAA,GAAA,MAAA,aAET,EACE,YAAY,IACZ,qBAAqB,IACrB,mBAAmB,IACnB,OACA,OACA,YACA,SACA,OACA,UACA,cAAc,aACd,UACA,cAAc,2BACd,GAAG,SAEL,QACG;CACH,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAoB,MAAM;CACvC,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAuB,MAAM;CAC7C,MAAM,gBAAA,GAAA,MAAA,QAAsC,KAAK;CACjD,MAAM,mBAAA,GAAA,MAAA,QAA4C,KAAK;CACvD,MAAM,UAAA,GAAA,cAAA,gBAAwB,EAAE;CAChC,MAAM,UAAA,GAAA,cAAA,gBAAwB,EAAE;CAChC,MAAM,SAAS;AAGf,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,OAAO,OAAO,QAAQ,WACxB,KAAI,gBAAgB,QAAQ;WACnB,IACR,KAAyD,UACxD,gBAAgB;IAEnB,CAAC,IAAI,CAAC;AAGT,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,eAAe,MAAkB;AACrC,OACE,aAAa,WACb,CAAC,aAAa,QAAQ,SAAS,EAAE,OAAe,CAEhD,SAAQ,MAAM;;AAGlB,MAAI,KACF,UAAS,iBAAiB,aAAa,YAAY;AAErD,eAAa,SAAS,oBAAoB,aAAa,YAAY;IAClE,CAAC,KAAK,CAAC;CAEV,MAAM,mBAAmB,UAA4C;EACnE,MAAM,EAAE,MAAM,QAAQ,MAAM,cAAc,uBAAuB;AACjE,SAAO,IAAI,MAAM,UAAU,KAAK;AAChC,SAAO,IAAI,MAAM,UAAU,IAAI;;CAGjC,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,IAAI,UAAU,MAAM;CAEjE,MAAM,gBAAgB,aAAqB;AAEzC,MAAI,YAAY,gBAAgB,QAK9B,UAJc;GACZ,QAAQ;IAAE,OAAO;IAAU,MAAM,MAAM;IAAM;GAC7C,eAAe;IAAE,OAAO;IAAU,MAAM,MAAM;IAAM;GACrD,CACc;AAEjB,UAAQ,MAAM;;AAGhB,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAW,cAAA,gBAAgB,mBAAmB,mBAAmB;YAAtE;GACG,SACC,iBAAA,GAAA,kBAAA,KAAC,SAAD;IAAO,WAAU;cACd;IACK,CAAA;GAIV,iBAAA,GAAA,kBAAA,MAAC,UAAD;IACE,KAAK;IACL,WAAU;IACH;IACG;IACA;IACV,GAAI;cANN,CAQE,iBAAA,GAAA,kBAAA,KAAC,UAAD;KAAQ,OAAM;eAAI;KAAqB,CAAA,EACtC,QAAQ,KAAK,WACZ,iBAAA,GAAA,kBAAA,KAAC,UAAD;KAA2B,OAAO,OAAO;eACtC,OAAO;KACD,EAFI,OAAO,MAEX,CACT,CACK;;GAGT,iBAAA,GAAA,kBAAA,MAAC,OAAD;IACE,KAAK;IACL,WAAW,cAAA,gBAAgB,mBAAmB,UAAU;cAF1D,CAIE,iBAAA,GAAA,kBAAA,KAAC,cAAA,OAAO,KAAR;KACE,OAAO,EACL,iBAAiB,WACb,SACA,cAAA,iBAAiB;;wBAGX,UAAU,GAAG,OAAO,MAAM,MAC3B,aAAa,OAAO,KAAK,OAAO;;;;qBAK1C;KACD,aAAa,CAAC,WAAW,kBAAkB,KAAA;KAC3C,cAAc,CAAC,iBAAiB,WAAW,KAAK,GAAG,KAAA;KACnD,cAAc,CAAC,iBAAiB,WAAW,MAAM,GAAG,KAAA;KACpD,WAAW,cAAA,gBACT,+EACA,WACI,yBACA,QACE,uBACA,gBACP;eAED,iBAAA,GAAA,kBAAA,MAAC,OAAD;MACE,WAAW,cAAA,gBACT,iMACA,aACA,WAAW,kCAAkC,mBAC7C,SACE,sEACF,iBACD;MACD,eAAe;AACb,WAAI,CAAC,SACH,UAAS,MAAM,CAAC,EAAE;;MAGtB,YAAY,UAAU;AACpB,WAAI,SACF;AAGF,WAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,cAAM,gBAAgB;AACtB,iBAAS,YAAY,CAAC,QAAQ;;AAGhC,WAAI,MAAM,QAAQ,SAChB,SAAQ,MAAM;;MAGlB,MAAK;MACL,UAAU,WAAW,KAAK;MAC1B,iBAAc;MACd,iBAAe;gBA/BjB,CAiCG,iBACC,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBACb,eAAe;OACX,CAAA,GAEP,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBACb;OACI,CAAA,EAET,iBAAA,GAAA,kBAAA,KAAC,QAAD;OACE,WAAW,cAAA,gBACT,gEACA,OAAO,eAAe,WACvB;iBAED,iBAAA,GAAA,kBAAA,KAAC,cAAA,iBAAD;QACE,OAAO;QACP,QAAQ;QACR,OAAM;QACN,WAAU;QACV,CAAA;OACG,CAAA,CACH;;KACK,CAAA,EAEZ,QAAQ,CAAC,YACR,iBAAA,GAAA,kBAAA,MAAC,OAAD;KACE,WAAW,cAAA,gBACT,sKACD;eAHH,CAKG,QAAQ,WAAW,KAClB,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBAAkC;MAE3C,CAAA,EAEP,QAAQ,KAAK,QACZ,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAEE,WAAW,cAAA,gBACT,4GACA,IAAI,UAAU,QACV,+CACA,IACJ,uCACD;MACD,eAAe,aAAa,IAAI,MAAM;gBATxC,CAWE,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBACb,IAAI,UAAU,SACb,iBAAA,GAAA,kBAAA,KAAC,cAAA,WAAD;QACE,WAAU;QACV,OAAO;QACP,QAAQ;QACR,CAAA;OAEC,CAAA,EACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBAA2B,IAAI;OAAa,CAAA,CACxD;QApBC,IAAI,MAoBL,CACN,CACE;OAEJ;;GAEL,SACC,iBAAA,GAAA,kBAAA,KAAC,KAAD;IAAG,WAAU;cAA6C;IAAU,CAAA;GAErE,cAAc,CAAC,SACd,iBAAA,GAAA,kBAAA,KAAC,KAAD;IAAG,WAAU;cAAsC;IAAe,CAAA;GAEhE;;EAGX;AAED,OAAO,cAAc"}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { forwardRef } from "react";
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
//#region src/components/data-display/skeleton/Skeleton.tsx
|
|
4
|
-
var animationStyles = {
|
|
5
|
-
pulse: "animate-pulse",
|
|
6
|
-
wave: "animate-shimmer bg-gradient-to-r from-neutral-200 via-neutral-100 to-neutral-200 dark:from-neutral-700 dark:via-neutral-600 dark:to-neutral-700 bg-[length:200%_100%]",
|
|
7
|
-
none: ""
|
|
8
|
-
};
|
|
9
|
-
var variantStyles = {
|
|
10
|
-
text: "rounded",
|
|
11
|
-
circular: "rounded-full",
|
|
12
|
-
rectangular: "rounded-none",
|
|
13
|
-
rounded: "rounded-lg"
|
|
14
|
-
};
|
|
15
|
-
var Skeleton = forwardRef(({ variant = "text", animation = "pulse", width, height, borderRadius, className = "", lines = 1, lineGap = 8, lastLineWidth = "80%" }, ref) => {
|
|
16
|
-
const baseStyles = `
|
|
17
|
-
bg-neutral-200 dark:bg-neutral-700
|
|
18
|
-
${animation !== "wave" ? animationStyles[animation] : ""}
|
|
19
|
-
${animation === "wave" ? animationStyles.wave : ""}
|
|
20
|
-
${variantStyles[variant]}
|
|
21
|
-
`;
|
|
22
|
-
const getSize = () => {
|
|
23
|
-
const style = {};
|
|
24
|
-
if (width) style.width = typeof width === "number" ? `${width}px` : width;
|
|
25
|
-
else if (variant === "text") style.width = "100%";
|
|
26
|
-
if (height) style.height = typeof height === "number" ? `${height}px` : height;
|
|
27
|
-
else if (variant === "text") style.height = "1em";
|
|
28
|
-
else if (variant === "circular") {
|
|
29
|
-
style.width = style.width || "40px";
|
|
30
|
-
style.height = style.width;
|
|
31
|
-
}
|
|
32
|
-
if (borderRadius) style.borderRadius = typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius;
|
|
33
|
-
return style;
|
|
34
|
-
};
|
|
35
|
-
if (variant === "text" && lines > 1) return /* @__PURE__ */ jsx("div", {
|
|
36
|
-
ref,
|
|
37
|
-
className: `flex flex-col ${className}`,
|
|
38
|
-
style: { gap: typeof lineGap === "number" ? `${lineGap}px` : lineGap },
|
|
39
|
-
children: Array.from({ length: lines }).map((_, index) => /* @__PURE__ */ jsx("div", {
|
|
40
|
-
className: baseStyles,
|
|
41
|
-
style: {
|
|
42
|
-
...getSize(),
|
|
43
|
-
width: index === lines - 1 ? lastLineWidth : width || "100%"
|
|
44
|
-
}
|
|
45
|
-
}, index))
|
|
46
|
-
});
|
|
47
|
-
return /* @__PURE__ */ jsx("div", {
|
|
48
|
-
ref,
|
|
49
|
-
className: `${baseStyles} ${className}`,
|
|
50
|
-
style: getSize()
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
Skeleton.displayName = "Skeleton";
|
|
54
|
-
var SkeletonText = forwardRef(({ lines = 3, ...props }, ref) => {
|
|
55
|
-
return /* @__PURE__ */ jsx(Skeleton, {
|
|
56
|
-
ref,
|
|
57
|
-
variant: "text",
|
|
58
|
-
lines,
|
|
59
|
-
...props
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
SkeletonText.displayName = "SkeletonText";
|
|
63
|
-
var SkeletonAvatar = forwardRef(({ size = 40, animation = "pulse", className = "", ...props }, ref) => {
|
|
64
|
-
const sizeValue = typeof size === "number" ? `${size}px` : size;
|
|
65
|
-
return /* @__PURE__ */ jsx(Skeleton, {
|
|
66
|
-
ref,
|
|
67
|
-
variant: "circular",
|
|
68
|
-
width: sizeValue,
|
|
69
|
-
height: sizeValue,
|
|
70
|
-
animation,
|
|
71
|
-
className,
|
|
72
|
-
...props
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
SkeletonAvatar.displayName = "SkeletonAvatar";
|
|
76
|
-
var SkeletonButton = forwardRef(({ size = "md", animation = "pulse", className = "", ...props }, ref) => {
|
|
77
|
-
const sizeStyles = {
|
|
78
|
-
sm: {
|
|
79
|
-
width: 80,
|
|
80
|
-
height: 32
|
|
81
|
-
},
|
|
82
|
-
md: {
|
|
83
|
-
width: 100,
|
|
84
|
-
height: 40
|
|
85
|
-
},
|
|
86
|
-
lg: {
|
|
87
|
-
width: 120,
|
|
88
|
-
height: 48
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
return /* @__PURE__ */ jsx(Skeleton, {
|
|
92
|
-
ref,
|
|
93
|
-
variant: "rounded",
|
|
94
|
-
width: sizeStyles[size].width,
|
|
95
|
-
height: sizeStyles[size].height,
|
|
96
|
-
animation,
|
|
97
|
-
className,
|
|
98
|
-
...props
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
SkeletonButton.displayName = "SkeletonButton";
|
|
102
|
-
var SkeletonImage = forwardRef(({ width = "100%", height = 200, animation = "pulse", className = "", ...props }, ref) => {
|
|
103
|
-
return /* @__PURE__ */ jsx(Skeleton, {
|
|
104
|
-
ref,
|
|
105
|
-
variant: "rounded",
|
|
106
|
-
width,
|
|
107
|
-
height,
|
|
108
|
-
animation,
|
|
109
|
-
className,
|
|
110
|
-
...props
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
SkeletonImage.displayName = "SkeletonImage";
|
|
114
|
-
var SkeletonCard = forwardRef(({ showImage = true, imageHeight = 200, lines = 3, showAvatar = false, showActions = false, className = "", animation = "pulse" }, ref) => {
|
|
115
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
116
|
-
ref,
|
|
117
|
-
className: `bg-white dark:bg-neutral-800 rounded-xl overflow-hidden shadow-sm border border-neutral-200 dark:border-neutral-700 ${className}`,
|
|
118
|
-
children: [showImage && /* @__PURE__ */ jsx(SkeletonImage, {
|
|
119
|
-
height: imageHeight,
|
|
120
|
-
animation,
|
|
121
|
-
borderRadius: 0
|
|
122
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
123
|
-
className: "p-4 flex flex-col gap-4",
|
|
124
|
-
children: [
|
|
125
|
-
showAvatar && /* @__PURE__ */ jsxs("div", {
|
|
126
|
-
className: "flex items-center gap-3",
|
|
127
|
-
children: [/* @__PURE__ */ jsx(SkeletonAvatar, {
|
|
128
|
-
size: 40,
|
|
129
|
-
animation
|
|
130
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
131
|
-
className: "flex-1",
|
|
132
|
-
children: [/* @__PURE__ */ jsx(Skeleton, {
|
|
133
|
-
variant: "text",
|
|
134
|
-
width: "60%",
|
|
135
|
-
height: 14,
|
|
136
|
-
animation
|
|
137
|
-
}), /* @__PURE__ */ jsx(Skeleton, {
|
|
138
|
-
variant: "text",
|
|
139
|
-
width: "40%",
|
|
140
|
-
height: 12,
|
|
141
|
-
animation,
|
|
142
|
-
className: "mt-2"
|
|
143
|
-
})]
|
|
144
|
-
})]
|
|
145
|
-
}),
|
|
146
|
-
/* @__PURE__ */ jsx(SkeletonText, {
|
|
147
|
-
lines,
|
|
148
|
-
animation,
|
|
149
|
-
height: 14,
|
|
150
|
-
lineGap: 10
|
|
151
|
-
}),
|
|
152
|
-
showActions && /* @__PURE__ */ jsxs("div", {
|
|
153
|
-
className: "flex gap-3 mt-2",
|
|
154
|
-
children: [/* @__PURE__ */ jsx(SkeletonButton, {
|
|
155
|
-
size: "sm",
|
|
156
|
-
animation
|
|
157
|
-
}), /* @__PURE__ */ jsx(SkeletonButton, {
|
|
158
|
-
size: "sm",
|
|
159
|
-
animation
|
|
160
|
-
})]
|
|
161
|
-
})
|
|
162
|
-
]
|
|
163
|
-
})]
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
SkeletonCard.displayName = "SkeletonCard";
|
|
167
|
-
var SkeletonTableRow = forwardRef(({ columns = 4, animation = "pulse", className = "" }, ref) => {
|
|
168
|
-
return /* @__PURE__ */ jsx("div", {
|
|
169
|
-
ref,
|
|
170
|
-
className: `flex items-center gap-4 py-3 ${className}`,
|
|
171
|
-
children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ jsx(Skeleton, {
|
|
172
|
-
variant: "text",
|
|
173
|
-
width: index === 0 ? "20%" : `${Math.floor(80 / (columns - 1))}%`,
|
|
174
|
-
height: 16,
|
|
175
|
-
animation
|
|
176
|
-
}, index))
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
SkeletonTableRow.displayName = "SkeletonTableRow";
|
|
180
|
-
var SkeletonListItem = forwardRef(({ showAvatar = true, showSecondaryText = true, showAction = false, animation = "pulse", className = "" }, ref) => {
|
|
181
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
182
|
-
ref,
|
|
183
|
-
className: `flex items-center gap-3 py-3 ${className}`,
|
|
184
|
-
children: [
|
|
185
|
-
showAvatar && /* @__PURE__ */ jsx(SkeletonAvatar, {
|
|
186
|
-
size: 48,
|
|
187
|
-
animation
|
|
188
|
-
}),
|
|
189
|
-
/* @__PURE__ */ jsxs("div", {
|
|
190
|
-
className: "flex-1",
|
|
191
|
-
children: [/* @__PURE__ */ jsx(Skeleton, {
|
|
192
|
-
variant: "text",
|
|
193
|
-
width: "70%",
|
|
194
|
-
height: 16,
|
|
195
|
-
animation
|
|
196
|
-
}), showSecondaryText && /* @__PURE__ */ jsx(Skeleton, {
|
|
197
|
-
variant: "text",
|
|
198
|
-
width: "50%",
|
|
199
|
-
height: 14,
|
|
200
|
-
animation,
|
|
201
|
-
className: "mt-2"
|
|
202
|
-
})]
|
|
203
|
-
}),
|
|
204
|
-
showAction && /* @__PURE__ */ jsx(SkeletonButton, {
|
|
205
|
-
size: "sm",
|
|
206
|
-
animation
|
|
207
|
-
})
|
|
208
|
-
]
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
SkeletonListItem.displayName = "SkeletonListItem";
|
|
212
|
-
//#endregion
|
|
213
|
-
export { Skeleton as t };
|
|
214
|
-
|
|
215
|
-
//# sourceMappingURL=skeleton-BhYWOp0Q.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton-BhYWOp0Q.mjs","names":[],"sources":["../../src/components/data-display/skeleton/Skeleton.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\n\nexport type SkeletonVariant = \"text\" | \"circular\" | \"rectangular\" | \"rounded\";\nexport type SkeletonAnimation = \"pulse\" | \"wave\" | \"none\";\n\nexport interface SkeletonProps {\n /** The variant shape of the skeleton */\n variant?: SkeletonVariant;\n /** The animation type */\n animation?: SkeletonAnimation;\n /** Width of the skeleton */\n width?: number | string;\n /** Height of the skeleton */\n height?: number | string;\n /** Border radius for rounded variant */\n borderRadius?: number | string;\n /** Custom className */\n className?: string;\n /** Number of lines for text variant */\n lines?: number;\n /** Gap between lines */\n lineGap?: number | string;\n /** Whether the last line should be shorter */\n lastLineWidth?: number | string;\n}\n\nexport interface SkeletonTextProps extends Omit<SkeletonProps, \"variant\"> {\n /** Number of text lines */\n lines?: number;\n}\n\nexport interface SkeletonAvatarProps extends Omit<\n SkeletonProps,\n \"variant\" | \"width\" | \"height\"\n> {\n /** Size of the avatar */\n size?: number | string;\n}\n\nexport interface SkeletonCardProps {\n /** Whether to show image placeholder */\n showImage?: boolean;\n /** Image height */\n imageHeight?: number | string;\n /** Number of text lines */\n lines?: number;\n /** Whether to show avatar */\n showAvatar?: boolean;\n /** Whether to show action buttons */\n showActions?: boolean;\n /** Custom className */\n className?: string;\n /** Animation type */\n animation?: SkeletonAnimation;\n}\n\nconst animationStyles: Record<SkeletonAnimation, string> = {\n pulse: \"animate-pulse\",\n wave: \"animate-shimmer bg-gradient-to-r from-neutral-200 via-neutral-100 to-neutral-200 dark:from-neutral-700 dark:via-neutral-600 dark:to-neutral-700 bg-[length:200%_100%]\",\n none: \"\",\n};\n\nconst variantStyles: Record<SkeletonVariant, string> = {\n text: \"rounded\",\n circular: \"rounded-full\",\n rectangular: \"rounded-none\",\n rounded: \"rounded-lg\",\n};\n\n// Base Skeleton Component\nconst Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n (\n {\n variant = \"text\",\n animation = \"pulse\",\n width,\n height,\n borderRadius,\n className = \"\",\n lines = 1,\n lineGap = 8,\n lastLineWidth = \"80%\",\n },\n ref,\n ) => {\n const baseStyles = `\n bg-neutral-200 dark:bg-neutral-700\n ${animation !== \"wave\" ? animationStyles[animation] : \"\"}\n ${animation === \"wave\" ? animationStyles.wave : \"\"}\n ${variantStyles[variant]}\n `;\n\n const getSize = () => {\n const style: React.CSSProperties = {};\n\n if (width) {\n style.width = typeof width === \"number\" ? `${width}px` : width;\n } else if (variant === \"text\") {\n style.width = \"100%\";\n }\n\n if (height) {\n style.height = typeof height === \"number\" ? `${height}px` : height;\n } else if (variant === \"text\") {\n style.height = \"1em\";\n } else if (variant === \"circular\") {\n style.width = style.width || \"40px\";\n style.height = style.width;\n }\n\n if (borderRadius) {\n style.borderRadius =\n typeof borderRadius === \"number\" ? `${borderRadius}px` : borderRadius;\n }\n\n return style;\n };\n\n // Render multiple lines for text variant\n if (variant === \"text\" && lines > 1) {\n return (\n <div\n ref={ref}\n className={`flex flex-col ${className}`}\n style={{\n gap: typeof lineGap === \"number\" ? `${lineGap}px` : lineGap,\n }}\n >\n {Array.from({ length: lines }).map((_, index) => (\n <div\n key={index}\n className={baseStyles}\n style={{\n ...getSize(),\n width: index === lines - 1 ? lastLineWidth : width || \"100%\",\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={`${baseStyles} ${className}`}\n style={getSize()}\n />\n );\n },\n);\n\nSkeleton.displayName = \"Skeleton\";\n\n// Skeleton Text Component\nconst SkeletonText = forwardRef<HTMLDivElement, SkeletonTextProps>(\n ({ lines = 3, ...props }, ref) => {\n return <Skeleton ref={ref} variant=\"text\" lines={lines} {...props} />;\n },\n);\n\nSkeletonText.displayName = \"SkeletonText\";\n\n// Skeleton Avatar Component\nconst SkeletonAvatar = forwardRef<HTMLDivElement, SkeletonAvatarProps>(\n ({ size = 40, animation = \"pulse\", className = \"\", ...props }, ref) => {\n const sizeValue = typeof size === \"number\" ? `${size}px` : size;\n\n return (\n <Skeleton\n ref={ref}\n variant=\"circular\"\n width={sizeValue}\n height={sizeValue}\n animation={animation}\n className={className}\n {...props}\n />\n );\n },\n);\n\nSkeletonAvatar.displayName = \"SkeletonAvatar\";\n\n// Skeleton Button Component\nconst SkeletonButton = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, \"variant\"> & { size?: \"sm\" | \"md\" | \"lg\" }\n>(({ size = \"md\", animation = \"pulse\", className = \"\", ...props }, ref) => {\n const sizeStyles = {\n sm: { width: 80, height: 32 },\n md: { width: 100, height: 40 },\n lg: { width: 120, height: 48 },\n };\n\n return (\n <Skeleton\n ref={ref}\n variant=\"rounded\"\n width={sizeStyles[size].width}\n height={sizeStyles[size].height}\n animation={animation}\n className={className}\n {...props}\n />\n );\n});\n\nSkeletonButton.displayName = \"SkeletonButton\";\n\n// Skeleton Image Component\nconst SkeletonImage = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, \"variant\">\n>(\n (\n {\n width = \"100%\",\n height = 200,\n animation = \"pulse\",\n className = \"\",\n ...props\n },\n ref,\n ) => {\n return (\n <Skeleton\n ref={ref}\n variant=\"rounded\"\n width={width}\n height={height}\n animation={animation}\n className={className}\n {...props}\n />\n );\n },\n);\n\nSkeletonImage.displayName = \"SkeletonImage\";\n\n// Skeleton Card Component\nconst SkeletonCard = forwardRef<HTMLDivElement, SkeletonCardProps>(\n (\n {\n showImage = true,\n imageHeight = 200,\n lines = 3,\n showAvatar = false,\n showActions = false,\n className = \"\",\n animation = \"pulse\",\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n className={`bg-white dark:bg-neutral-800 rounded-xl overflow-hidden shadow-sm border border-neutral-200 dark:border-neutral-700 ${className}`}\n >\n {showImage && (\n <SkeletonImage\n height={imageHeight}\n animation={animation}\n borderRadius={0}\n />\n )}\n\n <div className=\"p-4 flex flex-col gap-4\">\n {showAvatar && (\n <div className=\"flex items-center gap-3\">\n <SkeletonAvatar size={40} animation={animation} />\n <div className=\"flex-1\">\n <Skeleton\n variant=\"text\"\n width=\"60%\"\n height={14}\n animation={animation}\n />\n <Skeleton\n variant=\"text\"\n width=\"40%\"\n height={12}\n animation={animation}\n className=\"mt-2\"\n />\n </div>\n </div>\n )}\n\n <SkeletonText\n lines={lines}\n animation={animation}\n height={14}\n lineGap={10}\n />\n\n {showActions && (\n <div className=\"flex gap-3 mt-2\">\n <SkeletonButton size=\"sm\" animation={animation} />\n <SkeletonButton size=\"sm\" animation={animation} />\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nSkeletonCard.displayName = \"SkeletonCard\";\n\n// Skeleton Table Row Component\nconst SkeletonTableRow = forwardRef<\n HTMLDivElement,\n { columns?: number; animation?: SkeletonAnimation; className?: string }\n>(({ columns = 4, animation = \"pulse\", className = \"\" }, ref) => {\n return (\n <div ref={ref} className={`flex items-center gap-4 py-3 ${className}`}>\n {Array.from({ length: columns }).map((_, index) => (\n <Skeleton\n key={index}\n variant=\"text\"\n width={index === 0 ? \"20%\" : `${Math.floor(80 / (columns - 1))}%`}\n height={16}\n animation={animation}\n />\n ))}\n </div>\n );\n});\n\nSkeletonTableRow.displayName = \"SkeletonTableRow\";\n\n// Skeleton List Item Component\nconst SkeletonListItem = forwardRef<\n HTMLDivElement,\n {\n showAvatar?: boolean;\n showSecondaryText?: boolean;\n showAction?: boolean;\n animation?: SkeletonAnimation;\n className?: string;\n }\n>(\n (\n {\n showAvatar = true,\n showSecondaryText = true,\n showAction = false,\n animation = \"pulse\",\n className = \"\",\n },\n ref,\n ) => {\n return (\n <div ref={ref} className={`flex items-center gap-3 py-3 ${className}`}>\n {showAvatar && <SkeletonAvatar size={48} animation={animation} />}\n <div className=\"flex-1\">\n <Skeleton\n variant=\"text\"\n width=\"70%\"\n height={16}\n animation={animation}\n />\n {showSecondaryText && (\n <Skeleton\n variant=\"text\"\n width=\"50%\"\n height={14}\n animation={animation}\n className=\"mt-2\"\n />\n )}\n </div>\n {showAction && <SkeletonButton size=\"sm\" animation={animation} />}\n </div>\n );\n },\n);\n\nSkeletonListItem.displayName = \"SkeletonListItem\";\n\nexport default Skeleton;\nexport {\n Skeleton,\n SkeletonText,\n SkeletonAvatar,\n SkeletonButton,\n SkeletonImage,\n SkeletonCard,\n SkeletonTableRow,\n SkeletonListItem,\n};\n"],"mappings":"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"}
|