@underverse-ui/underverse 0.2.59 → 0.2.61
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/index.cjs +555 -224
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -4
- package/dist/index.d.ts +36 -4
- package/dist/index.js +594 -263
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -267,7 +267,7 @@ var Badge = ({
|
|
|
267
267
|
}
|
|
268
268
|
);
|
|
269
269
|
}
|
|
270
|
-
return /* @__PURE__ */ jsxs2("span", { className: cn(baseClasses, "rounded-
|
|
270
|
+
return /* @__PURE__ */ jsxs2("span", { className: cn(baseClasses, "rounded-full gap-1", sizeStyles[size], className), onClick: handleClick, role: "status", children: [
|
|
271
271
|
Icon && /* @__PURE__ */ jsx2(
|
|
272
272
|
Icon,
|
|
273
273
|
{
|
|
@@ -1957,7 +1957,7 @@ function SmartImage({
|
|
|
1957
1957
|
alt,
|
|
1958
1958
|
className,
|
|
1959
1959
|
ratioClass,
|
|
1960
|
-
roundedClass = "rounded-
|
|
1960
|
+
roundedClass = "rounded-2xl md:rounded-3xl",
|
|
1961
1961
|
fill = true,
|
|
1962
1962
|
width,
|
|
1963
1963
|
height,
|
|
@@ -2147,10 +2147,10 @@ var Avatar_default = Avatar;
|
|
|
2147
2147
|
import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
2148
2148
|
var Skeleton = ({ className, width, height, variant = "rectangular", animation = "pulse", lines = 1 }) => {
|
|
2149
2149
|
const variantClasses2 = {
|
|
2150
|
-
rectangular: "rounded-md",
|
|
2150
|
+
rectangular: "rounded-2xl md:rounded-3xl",
|
|
2151
2151
|
circular: "rounded-full",
|
|
2152
|
-
rounded: "rounded-
|
|
2153
|
-
text: "rounded"
|
|
2152
|
+
rounded: "rounded-2xl md:rounded-3xl",
|
|
2153
|
+
text: "rounded-xl"
|
|
2154
2154
|
};
|
|
2155
2155
|
const animationClasses = {
|
|
2156
2156
|
pulse: "animate-pulse",
|
|
@@ -2199,9 +2199,9 @@ var SkeletonText = ({ lines = 3, className, width = "100%" }) => {
|
|
|
2199
2199
|
};
|
|
2200
2200
|
var SkeletonCard = ({ showAvatar = true, showImage = false, textLines = 3, className, children }) => {
|
|
2201
2201
|
if (children) {
|
|
2202
|
-
return /* @__PURE__ */ jsx13("div", { className: cn("p-4 space-y-4 rounded-
|
|
2202
|
+
return /* @__PURE__ */ jsx13("div", { className: cn("p-4 space-y-4 rounded-2xl md:rounded-3xl bg-card outline-none focus:outline-none", className), children });
|
|
2203
2203
|
}
|
|
2204
|
-
return /* @__PURE__ */ jsxs10("div", { className: cn("p-4 space-y-4 rounded-2xl bg-card outline-none focus:outline-none", className), children: [
|
|
2204
|
+
return /* @__PURE__ */ jsxs10("div", { className: cn("p-4 space-y-4 rounded-2xl md:rounded-3xl bg-card outline-none focus:outline-none", className), children: [
|
|
2205
2205
|
showAvatar && /* @__PURE__ */ jsxs10("div", { className: "flex items-center space-x-3", children: [
|
|
2206
2206
|
/* @__PURE__ */ jsx13(SkeletonAvatar, {}),
|
|
2207
2207
|
/* @__PURE__ */ jsxs10("div", { className: "space-y-2", children: [
|
|
@@ -2209,7 +2209,7 @@ var SkeletonCard = ({ showAvatar = true, showImage = false, textLines = 3, class
|
|
|
2209
2209
|
/* @__PURE__ */ jsx13(Skeleton, { className: "h-3 w-16" })
|
|
2210
2210
|
] })
|
|
2211
2211
|
] }),
|
|
2212
|
-
showImage && /* @__PURE__ */ jsx13(Skeleton, { className: "h-48 w-full rounded-
|
|
2212
|
+
showImage && /* @__PURE__ */ jsx13(Skeleton, { className: "h-48 w-full rounded-2xl md:rounded-3xl" }),
|
|
2213
2213
|
/* @__PURE__ */ jsx13(SkeletonText, { lines: textLines }),
|
|
2214
2214
|
/* @__PURE__ */ jsxs10("div", { className: "flex space-x-2", children: [
|
|
2215
2215
|
/* @__PURE__ */ jsx13(SkeletonButton, { size: "sm" }),
|
|
@@ -2218,7 +2218,7 @@ var SkeletonCard = ({ showAvatar = true, showImage = false, textLines = 3, class
|
|
|
2218
2218
|
] });
|
|
2219
2219
|
};
|
|
2220
2220
|
var SkeletonPost = ({ className }) => {
|
|
2221
|
-
return /* @__PURE__ */ jsxs10("div", { className: cn("p-6 space-y-4 rounded-3xl bg-card outline-none focus:outline-none", className), children: [
|
|
2221
|
+
return /* @__PURE__ */ jsxs10("div", { className: cn("p-6 space-y-4 rounded-2xl md:rounded-3xl bg-card outline-none focus:outline-none", className), children: [
|
|
2222
2222
|
/* @__PURE__ */ jsxs10("div", { className: "flex items-center space-x-3", children: [
|
|
2223
2223
|
/* @__PURE__ */ jsx13(SkeletonAvatar, { size: "lg" }),
|
|
2224
2224
|
/* @__PURE__ */ jsxs10("div", { className: "space-y-2", children: [
|
|
@@ -2250,7 +2250,7 @@ var SkeletonMessage = ({ own = false, showAvatar = true, className }) => {
|
|
|
2250
2250
|
] });
|
|
2251
2251
|
};
|
|
2252
2252
|
var SkeletonList = ({ items = 5, itemHeight = 60, showAvatar = true, className }) => {
|
|
2253
|
-
return /* @__PURE__ */ jsx13("div", { className: cn("space-y-3", className), children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsxs10("div", { className: "flex items-center space-x-3 p-3 rounded-
|
|
2253
|
+
return /* @__PURE__ */ jsx13("div", { className: cn("space-y-3", className), children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsxs10("div", { className: "flex items-center space-x-3 p-3 rounded-2xl md:rounded-3xl", children: [
|
|
2254
2254
|
showAvatar && /* @__PURE__ */ jsx13(SkeletonAvatar, {}),
|
|
2255
2255
|
/* @__PURE__ */ jsxs10("div", { className: "flex-1 space-y-2", children: [
|
|
2256
2256
|
/* @__PURE__ */ jsx13(Skeleton, { className: "h-4 w-3/4" }),
|
|
@@ -4338,7 +4338,7 @@ var sizeStyles6 = {
|
|
|
4338
4338
|
content: "mt-3 p-3"
|
|
4339
4339
|
},
|
|
4340
4340
|
md: {
|
|
4341
|
-
tab: "py-2 px-4 text-sm",
|
|
4341
|
+
tab: "py-2.5 px-4 text-sm",
|
|
4342
4342
|
content: "mt-4 p-4"
|
|
4343
4343
|
},
|
|
4344
4344
|
lg: {
|
|
@@ -4348,33 +4348,33 @@ var sizeStyles6 = {
|
|
|
4348
4348
|
};
|
|
4349
4349
|
var variantStyles5 = {
|
|
4350
4350
|
default: {
|
|
4351
|
-
container: "border-b border-border",
|
|
4352
|
-
tab: "border-b-2 border-transparent hover:
|
|
4353
|
-
activeTab: "border-primary text-primary",
|
|
4351
|
+
container: "border-b border-border/60 bg-muted/30 p-1 rounded-t-2xl",
|
|
4352
|
+
tab: "rounded-full border-b-2 border-transparent hover:bg-accent/40",
|
|
4353
|
+
activeTab: "border-primary bg-background text-primary shadow-sm",
|
|
4354
4354
|
inactiveTab: "text-muted-foreground hover:text-foreground"
|
|
4355
4355
|
},
|
|
4356
4356
|
pills: {
|
|
4357
|
-
container: "bg-muted p-1 rounded-
|
|
4358
|
-
tab: "rounded-
|
|
4359
|
-
activeTab: "bg-background text-foreground shadow-
|
|
4357
|
+
container: "bg-muted/50 backdrop-blur-sm p-1.5 rounded-2xl border border-border/40",
|
|
4358
|
+
tab: "rounded-full transition-all duration-200",
|
|
4359
|
+
activeTab: "bg-background text-foreground shadow-md border border-border/50",
|
|
4360
4360
|
inactiveTab: "text-muted-foreground hover:text-foreground hover:bg-background/50"
|
|
4361
4361
|
},
|
|
4362
4362
|
underline: {
|
|
4363
|
-
container: "relative border-b border-border",
|
|
4364
|
-
tab: "relative transition-colors duration-200 pb-3 border-b-2 border-transparent hover:border-
|
|
4365
|
-
activeTab: "text-primary border-primary font-
|
|
4363
|
+
container: "relative border-b border-border/60",
|
|
4364
|
+
tab: "relative transition-colors duration-200 pb-3 border-b-2 border-transparent hover:border-primary/30",
|
|
4365
|
+
activeTab: "text-primary border-primary font-semibold",
|
|
4366
4366
|
inactiveTab: "text-muted-foreground hover:text-foreground"
|
|
4367
4367
|
},
|
|
4368
4368
|
card: {
|
|
4369
|
-
container: "space-y-1",
|
|
4369
|
+
container: "space-y-1.5 bg-muted/20 p-2 rounded-2xl border border-border/30",
|
|
4370
4370
|
tab: "rounded-xl border border-transparent transition-all duration-200",
|
|
4371
|
-
activeTab: "bg-primary text-primary-foreground border-primary",
|
|
4372
|
-
inactiveTab: "text-muted-foreground hover:text-foreground hover:bg-accent/50 hover:border-border
|
|
4371
|
+
activeTab: "bg-primary text-primary-foreground border-primary shadow-md",
|
|
4372
|
+
inactiveTab: "text-muted-foreground hover:text-foreground hover:bg-accent/50 hover:border-border/50"
|
|
4373
4373
|
},
|
|
4374
4374
|
"underline-card": {
|
|
4375
|
-
container: "border-b border-border bg-card rounded-t-2xl",
|
|
4376
|
-
tab: "relative transition-all duration-200 pb-3 px-4 border-b-2 border-transparent hover:border-primary/
|
|
4377
|
-
activeTab: "text-primary border-primary font-
|
|
4375
|
+
container: "border-b border-border/60 bg-card/80 backdrop-blur-sm rounded-t-2xl p-1",
|
|
4376
|
+
tab: "relative transition-all duration-200 pb-3 px-4 rounded-t-xl border-b-2 border-transparent hover:border-primary/30 hover:bg-accent/30",
|
|
4377
|
+
activeTab: "text-primary border-primary font-semibold bg-accent/30",
|
|
4378
4378
|
inactiveTab: "text-muted-foreground hover:text-foreground"
|
|
4379
4379
|
}
|
|
4380
4380
|
};
|
|
@@ -4494,7 +4494,8 @@ var Tabs = ({
|
|
|
4494
4494
|
id: `${baseId}-panel-${tabs.findIndex((t) => t.value === active)}`,
|
|
4495
4495
|
"aria-labelledby": `${baseId}-tab-${tabs.findIndex((t) => t.value === active)}`,
|
|
4496
4496
|
className: cn(
|
|
4497
|
-
"bg-card rounded-
|
|
4497
|
+
"bg-card rounded-2xl md:rounded-3xl border border-border/60 shadow-sm text-card-foreground transition-all duration-200",
|
|
4498
|
+
"backdrop-blur-sm",
|
|
4498
4499
|
sizeStyles6[size].content,
|
|
4499
4500
|
orientation === "vertical" && "flex-1"
|
|
4500
4501
|
),
|
|
@@ -4657,20 +4658,42 @@ var DropdownMenu = ({
|
|
|
4657
4658
|
}
|
|
4658
4659
|
);
|
|
4659
4660
|
};
|
|
4660
|
-
var DropdownMenuItem = ({
|
|
4661
|
+
var DropdownMenuItem = ({
|
|
4662
|
+
children,
|
|
4663
|
+
label,
|
|
4664
|
+
description,
|
|
4665
|
+
icon: Icon,
|
|
4666
|
+
onClick,
|
|
4667
|
+
disabled,
|
|
4668
|
+
destructive,
|
|
4669
|
+
active,
|
|
4670
|
+
shortcut,
|
|
4671
|
+
className
|
|
4672
|
+
}) => /* @__PURE__ */ jsxs21(
|
|
4661
4673
|
"button",
|
|
4662
4674
|
{
|
|
4663
4675
|
onClick,
|
|
4664
4676
|
disabled,
|
|
4677
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
4665
4678
|
className: cn(
|
|
4666
|
-
"flex w-full items-center gap-2 px-3 py-2 text-sm rounded-lg transition-colors",
|
|
4679
|
+
"flex w-full items-center gap-2 px-3 py-2 text-sm rounded-lg transition-colors group",
|
|
4667
4680
|
"hover:bg-accent hover:text-accent-foreground",
|
|
4668
4681
|
"focus:bg-accent focus:text-accent-foreground focus:outline-none",
|
|
4669
4682
|
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
4670
4683
|
destructive && "text-destructive hover:bg-destructive/10 focus:bg-destructive/10",
|
|
4684
|
+
active && "bg-primary/10 text-primary",
|
|
4671
4685
|
className
|
|
4672
4686
|
),
|
|
4673
|
-
children
|
|
4687
|
+
children: [
|
|
4688
|
+
Icon && /* @__PURE__ */ jsx24(Icon, { className: cn("w-4 h-4 shrink-0", active ? "text-primary" : "opacity-60 group-hover:opacity-100") }),
|
|
4689
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex-1 text-left", children: [
|
|
4690
|
+
label && /* @__PURE__ */ jsx24("div", { className: cn("font-medium", description && "leading-tight"), children: label }),
|
|
4691
|
+
description && /* @__PURE__ */ jsx24("div", { className: "text-xs text-muted-foreground", children: description }),
|
|
4692
|
+
children
|
|
4693
|
+
] }),
|
|
4694
|
+
shortcut && /* @__PURE__ */ jsx24("span", { className: "ml-2 text-xs text-muted-foreground opacity-60", children: shortcut }),
|
|
4695
|
+
active && /* @__PURE__ */ jsx24("svg", { className: "w-4 h-4 text-primary shrink-0", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx24("polyline", { points: "20 6 9 17 4 12" }) })
|
|
4696
|
+
]
|
|
4674
4697
|
}
|
|
4675
4698
|
);
|
|
4676
4699
|
var DropdownMenuSeparator = ({ className }) => /* @__PURE__ */ jsx24("div", { className: cn("h-px bg-border my-1", className) });
|
|
@@ -4707,7 +4730,7 @@ import { ChevronLeft, ChevronRight as ChevronRight2, ChevronsLeft, ChevronsRight
|
|
|
4707
4730
|
// ../../components/ui/Combobox.tsx
|
|
4708
4731
|
import * as React20 from "react";
|
|
4709
4732
|
import { useId as useId3 } from "react";
|
|
4710
|
-
import { ChevronDown, Search as Search3, SearchX, Check as Check3, X as X8
|
|
4733
|
+
import { ChevronDown, Search as Search3, SearchX, Check as Check3, X as X8 } from "lucide-react";
|
|
4711
4734
|
import { Fragment as Fragment5, jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
4712
4735
|
var getOptionLabel = (option) => {
|
|
4713
4736
|
return typeof option === "string" ? option : option.label;
|
|
@@ -4715,6 +4738,15 @@ var getOptionLabel = (option) => {
|
|
|
4715
4738
|
var getOptionValue = (option) => {
|
|
4716
4739
|
return typeof option === "string" ? option : option.value;
|
|
4717
4740
|
};
|
|
4741
|
+
var getOptionIcon = (option) => {
|
|
4742
|
+
return typeof option === "string" ? void 0 : option.icon;
|
|
4743
|
+
};
|
|
4744
|
+
var getOptionDescription = (option) => {
|
|
4745
|
+
return typeof option === "string" ? void 0 : option.description;
|
|
4746
|
+
};
|
|
4747
|
+
var getOptionDisabled = (option) => {
|
|
4748
|
+
return typeof option === "string" ? false : option.disabled ?? false;
|
|
4749
|
+
};
|
|
4718
4750
|
var findOptionByValue = (options, value) => {
|
|
4719
4751
|
return options.find((opt) => getOptionValue(opt) === value);
|
|
4720
4752
|
};
|
|
@@ -4729,13 +4761,21 @@ var Combobox = ({
|
|
|
4729
4761
|
className,
|
|
4730
4762
|
disabled = false,
|
|
4731
4763
|
size = "md",
|
|
4764
|
+
variant = "default",
|
|
4732
4765
|
allowClear = false,
|
|
4733
4766
|
usePortal = true,
|
|
4734
4767
|
label,
|
|
4735
4768
|
required,
|
|
4736
4769
|
fontBold = false,
|
|
4737
4770
|
loading: loading2 = false,
|
|
4738
|
-
loadingText = "Loading..."
|
|
4771
|
+
loadingText = "Loading...",
|
|
4772
|
+
showSelectedIcon = true,
|
|
4773
|
+
maxHeight = 280,
|
|
4774
|
+
groupBy,
|
|
4775
|
+
renderOption,
|
|
4776
|
+
renderValue,
|
|
4777
|
+
error,
|
|
4778
|
+
helperText
|
|
4739
4779
|
}) => {
|
|
4740
4780
|
const [open, setOpen] = React20.useState(false);
|
|
4741
4781
|
const [query, setQuery] = React20.useState("");
|
|
@@ -4753,6 +4793,7 @@ var Combobox = ({
|
|
|
4753
4793
|
);
|
|
4754
4794
|
const triggerRef = React20.useRef(null);
|
|
4755
4795
|
const handleSelect = (option) => {
|
|
4796
|
+
if (getOptionDisabled(option)) return;
|
|
4756
4797
|
const val = getOptionValue(option);
|
|
4757
4798
|
if (val !== void 0 && val !== null) {
|
|
4758
4799
|
onChange(val);
|
|
@@ -4777,9 +4818,66 @@ var Combobox = ({
|
|
|
4777
4818
|
}, [open, enableSearch]);
|
|
4778
4819
|
const selectedOption = findOptionByValue(options, value);
|
|
4779
4820
|
const displayValue = selectedOption ? getOptionLabel(selectedOption) : "";
|
|
4821
|
+
const selectedIcon = selectedOption ? getOptionIcon(selectedOption) : void 0;
|
|
4822
|
+
const groupedOptions = React20.useMemo(() => {
|
|
4823
|
+
if (!groupBy) return null;
|
|
4824
|
+
const groups = {};
|
|
4825
|
+
filteredOptions.forEach((opt) => {
|
|
4826
|
+
const group = groupBy(opt);
|
|
4827
|
+
if (!groups[group]) groups[group] = [];
|
|
4828
|
+
groups[group].push(opt);
|
|
4829
|
+
});
|
|
4830
|
+
return groups;
|
|
4831
|
+
}, [filteredOptions, groupBy]);
|
|
4832
|
+
const renderOptionItem = (item, index) => {
|
|
4833
|
+
const itemValue = getOptionValue(item);
|
|
4834
|
+
const itemLabel = getOptionLabel(item);
|
|
4835
|
+
const itemIcon = getOptionIcon(item);
|
|
4836
|
+
const itemDescription = getOptionDescription(item);
|
|
4837
|
+
const itemDisabled = getOptionDisabled(item);
|
|
4838
|
+
const isSelected = itemValue === value;
|
|
4839
|
+
const isEven = index % 2 === 0;
|
|
4840
|
+
return /* @__PURE__ */ jsxs22(
|
|
4841
|
+
"li",
|
|
4842
|
+
{
|
|
4843
|
+
ref: (node) => {
|
|
4844
|
+
listRef.current[index] = node;
|
|
4845
|
+
},
|
|
4846
|
+
id: `combobox-item-${index}`,
|
|
4847
|
+
role: "option",
|
|
4848
|
+
tabIndex: -1,
|
|
4849
|
+
"aria-selected": isSelected,
|
|
4850
|
+
"aria-disabled": itemDisabled,
|
|
4851
|
+
onClick: () => !itemDisabled && handleSelect(item),
|
|
4852
|
+
style: {
|
|
4853
|
+
animationDelay: open ? `${Math.min(index * 15, 150)}ms` : "0ms"
|
|
4854
|
+
},
|
|
4855
|
+
className: cn(
|
|
4856
|
+
"dropdown-item group flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm",
|
|
4857
|
+
"outline-none focus:outline-none focus-visible:outline-none",
|
|
4858
|
+
"transition-all duration-150",
|
|
4859
|
+
isEven && "bg-muted/40",
|
|
4860
|
+
!itemDisabled && "hover:bg-accent/70 hover:shadow-sm",
|
|
4861
|
+
!itemDisabled && "focus:bg-accent/80 focus:text-accent-foreground",
|
|
4862
|
+
index === activeIndex && !itemDisabled && "bg-accent/60",
|
|
4863
|
+
isSelected && "bg-primary/10 text-primary font-medium",
|
|
4864
|
+
itemDisabled && "opacity-50 cursor-not-allowed"
|
|
4865
|
+
),
|
|
4866
|
+
children: [
|
|
4867
|
+
itemIcon && /* @__PURE__ */ jsx25("span", { className: cn("shrink-0 w-5 h-5 flex items-center justify-center", isSelected ? "text-primary" : "text-muted-foreground"), children: itemIcon }),
|
|
4868
|
+
renderOption ? /* @__PURE__ */ jsx25("div", { className: "flex-1 min-w-0", children: renderOption(item, isSelected) }) : /* @__PURE__ */ jsxs22("div", { className: "flex-1 min-w-0", children: [
|
|
4869
|
+
/* @__PURE__ */ jsx25("span", { className: "block truncate", children: itemLabel }),
|
|
4870
|
+
itemDescription && /* @__PURE__ */ jsx25("span", { className: "block text-xs text-muted-foreground truncate mt-0.5", children: itemDescription })
|
|
4871
|
+
] }),
|
|
4872
|
+
isSelected && showSelectedIcon && /* @__PURE__ */ jsx25("span", { className: "shrink-0 ml-auto", children: /* @__PURE__ */ jsx25(Check3, { className: "h-4 w-4 text-primary" }) })
|
|
4873
|
+
]
|
|
4874
|
+
},
|
|
4875
|
+
`${itemValue}-${index}`
|
|
4876
|
+
);
|
|
4877
|
+
};
|
|
4780
4878
|
const dropdownBody = /* @__PURE__ */ jsxs22("div", { "data-combobox-dropdown": true, "data-state": open ? "open" : "closed", role: "listbox", id: `${resolvedId}-listbox`, className: "w-full", children: [
|
|
4781
|
-
enableSearch && /* @__PURE__ */
|
|
4782
|
-
/* @__PURE__ */ jsx25(Search3, { className: "absolute left-
|
|
4879
|
+
enableSearch && /* @__PURE__ */ jsx25("div", { className: "relative p-2.5 border-b border-border/30", children: /* @__PURE__ */ jsxs22("div", { className: "relative", children: [
|
|
4880
|
+
/* @__PURE__ */ jsx25(Search3, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground/60 transition-colors peer-focus:text-primary" }),
|
|
4783
4881
|
/* @__PURE__ */ jsx25(
|
|
4784
4882
|
"input",
|
|
4785
4883
|
{
|
|
@@ -4804,7 +4902,7 @@ var Combobox = ({
|
|
|
4804
4902
|
});
|
|
4805
4903
|
} else if (e.key === "Enter") {
|
|
4806
4904
|
e.preventDefault();
|
|
4807
|
-
if (activeIndex !== null && filteredOptions[activeIndex]) {
|
|
4905
|
+
if (activeIndex !== null && filteredOptions[activeIndex] && !getOptionDisabled(filteredOptions[activeIndex])) {
|
|
4808
4906
|
handleSelect(filteredOptions[activeIndex]);
|
|
4809
4907
|
}
|
|
4810
4908
|
} else if (e.key === "Escape") {
|
|
@@ -4813,63 +4911,75 @@ var Combobox = ({
|
|
|
4813
4911
|
}
|
|
4814
4912
|
},
|
|
4815
4913
|
placeholder: searchPlaceholder,
|
|
4816
|
-
className:
|
|
4914
|
+
className: cn(
|
|
4915
|
+
"peer w-full rounded-xl bg-muted/40 py-2.5 pl-9 pr-3 text-sm",
|
|
4916
|
+
"border border-transparent",
|
|
4917
|
+
"focus:outline-none focus:bg-background focus:border-primary/30 focus:ring-2 focus:ring-primary/10",
|
|
4918
|
+
"transition-all duration-200",
|
|
4919
|
+
"placeholder:text-muted-foreground/50"
|
|
4920
|
+
),
|
|
4817
4921
|
"aria-autocomplete": "list",
|
|
4818
4922
|
"aria-activedescendant": activeIndex != null ? `combobox-item-${activeIndex}` : void 0
|
|
4819
4923
|
}
|
|
4924
|
+
),
|
|
4925
|
+
query && /* @__PURE__ */ jsx25(
|
|
4926
|
+
"button",
|
|
4927
|
+
{
|
|
4928
|
+
type: "button",
|
|
4929
|
+
onClick: () => setQuery(""),
|
|
4930
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 p-0.5 rounded-md hover:bg-muted text-muted-foreground hover:text-foreground transition-colors",
|
|
4931
|
+
children: /* @__PURE__ */ jsx25(X8, { className: "h-3.5 w-3.5" })
|
|
4932
|
+
}
|
|
4820
4933
|
)
|
|
4821
|
-
] }),
|
|
4822
|
-
/* @__PURE__ */ jsx25("div", { className: "
|
|
4823
|
-
/* @__PURE__ */ jsx25(
|
|
4824
|
-
/* @__PURE__ */ jsx25("span", { className: "text-sm text-muted-foreground", children: loadingText
|
|
4825
|
-
] }) }) : filteredOptions.length > 0 ?
|
|
4826
|
-
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4934
|
+
] }) }),
|
|
4935
|
+
/* @__PURE__ */ jsx25("div", { className: "overflow-y-auto overscroll-contain", style: { maxHeight }, children: /* @__PURE__ */ jsx25("div", { className: "p-1.5", children: loading2 ? /* @__PURE__ */ jsx25("div", { className: "px-3 py-10 text-center", children: /* @__PURE__ */ jsxs22("div", { className: "flex flex-col items-center gap-3 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
4936
|
+
/* @__PURE__ */ jsx25("div", { className: "relative", children: /* @__PURE__ */ jsx25("div", { className: "w-10 h-10 rounded-full border-2 border-primary/20 border-t-primary animate-spin" }) }),
|
|
4937
|
+
/* @__PURE__ */ jsx25("span", { className: "text-sm text-muted-foreground", children: loadingText })
|
|
4938
|
+
] }) }) : filteredOptions.length > 0 ? groupedOptions ? (
|
|
4939
|
+
// Render grouped options with global index tracking
|
|
4940
|
+
(() => {
|
|
4941
|
+
let globalIndex = 0;
|
|
4942
|
+
return Object.entries(groupedOptions).map(([group, items]) => /* @__PURE__ */ jsxs22("div", { className: cn(globalIndex > 0 && "mt-2 pt-2 border-t border-border/30"), children: [
|
|
4943
|
+
/* @__PURE__ */ jsx25("div", { className: "px-3 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: group }),
|
|
4944
|
+
/* @__PURE__ */ jsx25("ul", { className: "space-y-0.5", children: items.map((item) => {
|
|
4945
|
+
const index = globalIndex++;
|
|
4946
|
+
return renderOptionItem(item, index);
|
|
4947
|
+
}) })
|
|
4948
|
+
] }, group));
|
|
4949
|
+
})()
|
|
4950
|
+
) : (
|
|
4951
|
+
// Render flat options
|
|
4952
|
+
/* @__PURE__ */ jsx25("ul", { className: "space-y-0.5", children: filteredOptions.map((item, index) => renderOptionItem(item, index)) })
|
|
4953
|
+
) : /* @__PURE__ */ jsx25("div", { className: "px-3 py-10 text-center", children: /* @__PURE__ */ jsxs22("div", { className: "flex flex-col items-center gap-3 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
4954
|
+
/* @__PURE__ */ jsx25("div", { className: "w-12 h-12 rounded-full bg-muted/50 flex items-center justify-center", children: /* @__PURE__ */ jsx25(SearchX, { className: "h-6 w-6 text-muted-foreground/60" }) }),
|
|
4955
|
+
/* @__PURE__ */ jsxs22("div", { className: "space-y-1", children: [
|
|
4956
|
+
/* @__PURE__ */ jsx25("span", { className: "block text-sm font-medium text-foreground", children: emptyText }),
|
|
4957
|
+
query && /* @__PURE__ */ jsx25("span", { className: "block text-xs text-muted-foreground", children: "Try a different search term" })
|
|
4958
|
+
] }),
|
|
4959
|
+
query && /* @__PURE__ */ jsx25(
|
|
4960
|
+
"button",
|
|
4831
4961
|
{
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
|
|
4838
|
-
"aria-selected": isSelected,
|
|
4839
|
-
onClick: () => handleSelect(item),
|
|
4840
|
-
style: {
|
|
4841
|
-
animationDelay: open ? `${Math.min(index * 20, 200)}ms` : "0ms"
|
|
4842
|
-
},
|
|
4843
|
-
className: cn(
|
|
4844
|
-
"dropdown-item group flex cursor-pointer items-center justify-between rounded-lg px-2.5 py-1.5 text-sm",
|
|
4845
|
-
"outline-none focus:outline-none focus-visible:outline-none",
|
|
4846
|
-
"hover:bg-accent hover:text-accent-foreground",
|
|
4847
|
-
"focus:bg-accent focus:text-accent-foreground",
|
|
4848
|
-
"data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
4849
|
-
index === activeIndex && "bg-accent text-accent-foreground",
|
|
4850
|
-
isSelected && "bg-accent text-accent-foreground"
|
|
4851
|
-
),
|
|
4852
|
-
children: [
|
|
4853
|
-
/* @__PURE__ */ jsx25("span", { className: "truncate", children: itemLabel }),
|
|
4854
|
-
isSelected && /* @__PURE__ */ jsx25(Check3, { className: "h-4 w-4 text-primary" })
|
|
4855
|
-
]
|
|
4856
|
-
},
|
|
4857
|
-
`${itemValue}-${index}`
|
|
4858
|
-
);
|
|
4859
|
-
}) : /* @__PURE__ */ jsx25("li", { className: "px-3 py-8 text-center text-muted-foreground text-sm", children: /* @__PURE__ */ jsxs22("div", { className: "flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
4860
|
-
/* @__PURE__ */ jsx25(SearchX, { className: "h-8 w-8 opacity-40 text-muted-foreground" }),
|
|
4861
|
-
/* @__PURE__ */ jsx25("span", { className: "text-sm", children: emptyText }),
|
|
4862
|
-
query && /* @__PURE__ */ jsx25("button", { type: "button", onClick: () => setQuery(""), className: "text-xs text-primary hover:underline", children: "Clear" })
|
|
4962
|
+
type: "button",
|
|
4963
|
+
onClick: () => setQuery(""),
|
|
4964
|
+
className: "px-3 py-1.5 text-xs font-medium text-primary bg-primary/10 rounded-full hover:bg-primary/20 transition-colors",
|
|
4965
|
+
children: "Clear search"
|
|
4966
|
+
}
|
|
4967
|
+
)
|
|
4863
4968
|
] }) }) }) })
|
|
4864
4969
|
] });
|
|
4865
4970
|
const sizeStyles8 = {
|
|
4866
|
-
// Keep consistent with Input size heights
|
|
4867
4971
|
sm: "h-8 py-1.5 text-sm md:h-7 md:text-xs",
|
|
4868
4972
|
md: "h-10 py-2 text-sm",
|
|
4869
4973
|
lg: "h-12 py-3 text-base"
|
|
4870
4974
|
};
|
|
4975
|
+
const variantStyles6 = {
|
|
4976
|
+
default: "border border-input bg-background hover:bg-accent/5 hover:border-primary/40",
|
|
4977
|
+
outline: "border-2 border-input bg-transparent hover:border-primary/60",
|
|
4978
|
+
ghost: "border-0 bg-transparent hover:bg-accent/50",
|
|
4979
|
+
filled: "border-0 bg-muted/50 hover:bg-muted/80"
|
|
4980
|
+
};
|
|
4871
4981
|
const labelSize = size === "sm" ? "text-xs" : size === "lg" ? "text-base" : "text-sm";
|
|
4872
|
-
const radiusClass = size === "sm" ? "rounded-
|
|
4982
|
+
const radiusClass = size === "sm" ? "rounded-lg" : "rounded-xl";
|
|
4873
4983
|
const verticalGap = size === "sm" ? "space-y-1.5" : "space-y-2";
|
|
4874
4984
|
const triggerButtonBaseProps = {
|
|
4875
4985
|
ref: triggerRef,
|
|
@@ -4879,6 +4989,7 @@ var Combobox = ({
|
|
|
4879
4989
|
"aria-haspopup": "listbox",
|
|
4880
4990
|
"aria-expanded": open,
|
|
4881
4991
|
"aria-controls": `${resolvedId}-listbox`,
|
|
4992
|
+
"aria-invalid": !!error,
|
|
4882
4993
|
id: resolvedId,
|
|
4883
4994
|
"aria-labelledby": labelId,
|
|
4884
4995
|
onKeyDown: (e) => {
|
|
@@ -4892,18 +5003,21 @@ var Combobox = ({
|
|
|
4892
5003
|
}
|
|
4893
5004
|
},
|
|
4894
5005
|
className: cn(
|
|
4895
|
-
"flex w-full items-center justify-between
|
|
5006
|
+
"group flex w-full items-center justify-between px-3 transition-all duration-200",
|
|
4896
5007
|
radiusClass,
|
|
4897
5008
|
sizeStyles8[size],
|
|
4898
|
-
|
|
5009
|
+
variantStyles6[variant],
|
|
5010
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30 focus-visible:border-primary",
|
|
4899
5011
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
4900
|
-
"
|
|
5012
|
+
open && "ring-2 ring-primary/20 border-primary",
|
|
5013
|
+
!!error && "border-destructive focus-visible:ring-destructive/30",
|
|
4901
5014
|
className
|
|
4902
5015
|
)
|
|
4903
5016
|
};
|
|
4904
5017
|
const triggerContents = /* @__PURE__ */ jsxs22(Fragment5, { children: [
|
|
4905
|
-
/* @__PURE__ */ jsx25("span", { className:
|
|
4906
|
-
/* @__PURE__ */
|
|
5018
|
+
selectedIcon && /* @__PURE__ */ jsx25("span", { className: "shrink-0 w-5 h-5 mr-2 flex items-center justify-center text-primary", children: selectedIcon }),
|
|
5019
|
+
/* @__PURE__ */ jsx25("span", { className: cn("flex-1 truncate text-left", !displayValue && "text-muted-foreground", fontBold && "font-semibold"), children: renderValue && selectedOption ? renderValue(selectedOption) : displayValue || placeholder }),
|
|
5020
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-1.5 ml-2 shrink-0", children: [
|
|
4907
5021
|
allowClear && value && !disabled && /* @__PURE__ */ jsx25(
|
|
4908
5022
|
"div",
|
|
4909
5023
|
{
|
|
@@ -4912,11 +5026,23 @@ var Combobox = ({
|
|
|
4912
5026
|
"aria-label": "Clear selection",
|
|
4913
5027
|
onClick: handleClear,
|
|
4914
5028
|
onKeyDown: (e) => (e.key === "Enter" || e.key === " ") && handleClear(e),
|
|
4915
|
-
className:
|
|
4916
|
-
|
|
5029
|
+
className: cn(
|
|
5030
|
+
"opacity-0 group-hover:opacity-100 transition-all duration-200",
|
|
5031
|
+
"p-1 rounded-lg hover:bg-destructive/10 text-muted-foreground hover:text-destructive"
|
|
5032
|
+
),
|
|
5033
|
+
children: /* @__PURE__ */ jsx25(X8, { className: "h-3.5 w-3.5" })
|
|
4917
5034
|
}
|
|
4918
5035
|
),
|
|
4919
|
-
/* @__PURE__ */ jsx25(
|
|
5036
|
+
/* @__PURE__ */ jsx25(
|
|
5037
|
+
ChevronDown,
|
|
5038
|
+
{
|
|
5039
|
+
className: cn(
|
|
5040
|
+
"h-4 w-4 text-muted-foreground transition-all duration-300 ease-out",
|
|
5041
|
+
open && "rotate-180 text-primary",
|
|
5042
|
+
!open && "group-hover:text-foreground"
|
|
5043
|
+
)
|
|
5044
|
+
}
|
|
5045
|
+
)
|
|
4920
5046
|
] })
|
|
4921
5047
|
] });
|
|
4922
5048
|
const triggerButtonForPopover = /* @__PURE__ */ jsx25("button", { ...triggerButtonBaseProps, children: triggerContents });
|
|
@@ -4963,7 +5089,18 @@ var Combobox = ({
|
|
|
4963
5089
|
}
|
|
4964
5090
|
) : /* @__PURE__ */ jsxs22("div", { className: "relative", children: [
|
|
4965
5091
|
triggerButtonInline,
|
|
4966
|
-
open && /* @__PURE__ */ jsx25("div", { className: "absolute left-0 top-full mt-1 z-50 w-full", children: /* @__PURE__ */ jsx25("div", { className: "rounded-2xl border
|
|
5092
|
+
open && /* @__PURE__ */ jsx25("div", { className: "absolute left-0 top-full mt-1 z-50 w-full", children: /* @__PURE__ */ jsx25("div", { className: "rounded-2xl border text-popover-foreground shadow-md backdrop-blur-sm bg-popover/95 border-border/60", children: dropdownBody }) })
|
|
5093
|
+
] }),
|
|
5094
|
+
(helperText || error) && /* @__PURE__ */ jsxs22("p", { className: cn("text-xs transition-colors duration-200 flex items-center gap-1.5", error ? "text-destructive" : "text-muted-foreground"), children: [
|
|
5095
|
+
error && /* @__PURE__ */ jsx25("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", className: "w-3.5 h-3.5 shrink-0", children: /* @__PURE__ */ jsx25(
|
|
5096
|
+
"path",
|
|
5097
|
+
{
|
|
5098
|
+
fillRule: "evenodd",
|
|
5099
|
+
d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",
|
|
5100
|
+
clipRule: "evenodd"
|
|
5101
|
+
}
|
|
5102
|
+
) }),
|
|
5103
|
+
error || helperText
|
|
4967
5104
|
] })
|
|
4968
5105
|
] });
|
|
4969
5106
|
};
|
|
@@ -5136,17 +5273,23 @@ var Pagination = ({
|
|
|
5136
5273
|
}
|
|
5137
5274
|
)
|
|
5138
5275
|
] }),
|
|
5139
|
-
pageSizeOptions && onPageSizeChange ? /* @__PURE__ */
|
|
5140
|
-
|
|
5141
|
-
|
|
5142
|
-
|
|
5143
|
-
|
|
5144
|
-
|
|
5145
|
-
|
|
5146
|
-
|
|
5147
|
-
|
|
5148
|
-
|
|
5149
|
-
|
|
5276
|
+
pageSizeOptions && onPageSizeChange ? /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2", children: [
|
|
5277
|
+
/* @__PURE__ */ jsxs23("span", { className: "text-xs text-muted-foreground/70 hidden sm:inline", children: [
|
|
5278
|
+
t("itemsPerPage"),
|
|
5279
|
+
":"
|
|
5280
|
+
] }),
|
|
5281
|
+
/* @__PURE__ */ jsx26(
|
|
5282
|
+
Combobox,
|
|
5283
|
+
{
|
|
5284
|
+
options: pageSizeOptionsStrings,
|
|
5285
|
+
value: pageSize?.toString() || "10",
|
|
5286
|
+
onChange: handlePageSizeChange,
|
|
5287
|
+
size: "sm",
|
|
5288
|
+
className: "w-20 sm:w-24",
|
|
5289
|
+
disabled
|
|
5290
|
+
}
|
|
5291
|
+
)
|
|
5292
|
+
] }) : /* @__PURE__ */ jsx26("div", {})
|
|
5150
5293
|
]
|
|
5151
5294
|
}
|
|
5152
5295
|
);
|
|
@@ -5372,7 +5515,12 @@ var ScrollArea = forwardRef7(
|
|
|
5372
5515
|
"div",
|
|
5373
5516
|
{
|
|
5374
5517
|
ref,
|
|
5375
|
-
className: cn(
|
|
5518
|
+
className: cn(
|
|
5519
|
+
"relative overflow-hidden rounded-2xl md:rounded-3xl",
|
|
5520
|
+
variantClasses[variant],
|
|
5521
|
+
outlined && "border border-border/60",
|
|
5522
|
+
className
|
|
5523
|
+
),
|
|
5376
5524
|
...props,
|
|
5377
5525
|
children: /* @__PURE__ */ jsx28("div", { className: cn("h-full w-full overflow-y-auto scroll-area-viewport", contentClassName), children })
|
|
5378
5526
|
}
|
|
@@ -5384,7 +5532,7 @@ ScrollArea.displayName = "ScrollArea";
|
|
|
5384
5532
|
// ../../components/ui/DatePicker.tsx
|
|
5385
5533
|
import * as React23 from "react";
|
|
5386
5534
|
import { useId as useId4 } from "react";
|
|
5387
|
-
import { Calendar, ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight3, X as XIcon, Sparkles } from "lucide-react";
|
|
5535
|
+
import { Calendar, ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight3, X as XIcon, Sparkles as Sparkles2 } from "lucide-react";
|
|
5388
5536
|
|
|
5389
5537
|
// ../../lib/utils/date.ts
|
|
5390
5538
|
function formatDateShort(date) {
|
|
@@ -5605,7 +5753,7 @@ var DatePicker = ({
|
|
|
5605
5753
|
"hover:scale-[1.02] active:scale-[0.98] hover:shadow-md hover:shadow-primary/10"
|
|
5606
5754
|
),
|
|
5607
5755
|
children: [
|
|
5608
|
-
/* @__PURE__ */ jsx29(
|
|
5756
|
+
/* @__PURE__ */ jsx29(Sparkles2, { className: "w-3.5 h-3.5" }),
|
|
5609
5757
|
todayLabel || t("today")
|
|
5610
5758
|
]
|
|
5611
5759
|
}
|
|
@@ -7292,14 +7440,15 @@ var DateTimePicker = ({
|
|
|
7292
7440
|
// ../../components/ui/MultiCombobox.tsx
|
|
7293
7441
|
import * as React27 from "react";
|
|
7294
7442
|
import { useId as useId5 } from "react";
|
|
7295
|
-
import { ChevronDown as ChevronDown2, Search as Search4, Check as Check5, SearchX as SearchX2, Loader2 as Loader24 } from "lucide-react";
|
|
7296
|
-
import { jsx as jsx33, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
7443
|
+
import { ChevronDown as ChevronDown2, Search as Search4, Check as Check5, SearchX as SearchX2, Loader2 as Loader24, X as X11, Sparkles as Sparkles3 } from "lucide-react";
|
|
7444
|
+
import { Fragment as Fragment10, jsx as jsx33, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
7297
7445
|
var MultiCombobox = ({
|
|
7298
7446
|
id,
|
|
7299
7447
|
options,
|
|
7300
7448
|
value,
|
|
7301
7449
|
onChange,
|
|
7302
|
-
placeholder = "
|
|
7450
|
+
placeholder = "Select...",
|
|
7451
|
+
searchPlaceholder = "Search...",
|
|
7303
7452
|
maxSelected,
|
|
7304
7453
|
disabledOptions = [],
|
|
7305
7454
|
showTags = true,
|
|
@@ -7307,13 +7456,22 @@ var MultiCombobox = ({
|
|
|
7307
7456
|
className,
|
|
7308
7457
|
disabled = false,
|
|
7309
7458
|
size = "md",
|
|
7459
|
+
variant = "default",
|
|
7310
7460
|
label,
|
|
7311
7461
|
title,
|
|
7312
7462
|
required,
|
|
7313
7463
|
displayFormat = (option) => option.label,
|
|
7314
7464
|
loading: loading2 = false,
|
|
7315
7465
|
loadingText = "Loading...",
|
|
7316
|
-
emptyText = "No results found"
|
|
7466
|
+
emptyText = "No results found",
|
|
7467
|
+
showSelectedIcons = true,
|
|
7468
|
+
maxHeight = 280,
|
|
7469
|
+
groupBy,
|
|
7470
|
+
renderOption,
|
|
7471
|
+
renderTag,
|
|
7472
|
+
error,
|
|
7473
|
+
helperText,
|
|
7474
|
+
maxTagsVisible = 3
|
|
7317
7475
|
}) => {
|
|
7318
7476
|
const [query, setQuery] = React27.useState("");
|
|
7319
7477
|
const [open, setOpen] = React27.useState(false);
|
|
@@ -7323,16 +7481,31 @@ var MultiCombobox = ({
|
|
|
7323
7481
|
const triggerRef = React27.useRef(null);
|
|
7324
7482
|
useShadCNAnimations();
|
|
7325
7483
|
const normalizedOptions = React27.useMemo(
|
|
7326
|
-
() => options.map(
|
|
7484
|
+
() => options.map(
|
|
7485
|
+
(o) => typeof o === "string" ? { value: o, label: o } : { value: o.value, label: o.label, icon: o.icon, description: o.description, disabled: o.disabled, group: o.group }
|
|
7486
|
+
),
|
|
7327
7487
|
[options]
|
|
7328
7488
|
);
|
|
7329
7489
|
const enableSearch = normalizedOptions.length > 10;
|
|
7330
7490
|
const filtered = React27.useMemo(
|
|
7331
|
-
() => enableSearch ? normalizedOptions.filter(
|
|
7491
|
+
() => enableSearch ? normalizedOptions.filter(
|
|
7492
|
+
(opt) => opt.label.toLowerCase().includes(query.toLowerCase()) || opt.description?.toLowerCase().includes(query.toLowerCase())
|
|
7493
|
+
) : normalizedOptions,
|
|
7332
7494
|
[normalizedOptions, query, enableSearch]
|
|
7333
7495
|
);
|
|
7496
|
+
const groupedOptions = React27.useMemo(() => {
|
|
7497
|
+
if (!groupBy) return null;
|
|
7498
|
+
const groups = /* @__PURE__ */ new Map();
|
|
7499
|
+
filtered.forEach((opt) => {
|
|
7500
|
+
const group = groupBy(opt);
|
|
7501
|
+
if (!groups.has(group)) groups.set(group, []);
|
|
7502
|
+
groups.get(group).push(opt);
|
|
7503
|
+
});
|
|
7504
|
+
return groups;
|
|
7505
|
+
}, [filtered, groupBy]);
|
|
7334
7506
|
const toggleSelect = (optionValue) => {
|
|
7335
|
-
|
|
7507
|
+
const option = normalizedOptions.find((o) => o.value === optionValue);
|
|
7508
|
+
if (option?.disabled || disabledOptions.includes(optionValue)) return;
|
|
7336
7509
|
if (value.includes(optionValue)) {
|
|
7337
7510
|
onChange(value.filter((v) => v !== optionValue));
|
|
7338
7511
|
} else {
|
|
@@ -7374,39 +7547,123 @@ var MultiCombobox = ({
|
|
|
7374
7547
|
md: {
|
|
7375
7548
|
trigger: "h-10 px-4 py-2 text-sm",
|
|
7376
7549
|
icon: "h-4 w-4",
|
|
7377
|
-
search: "px-
|
|
7550
|
+
search: "px-10 py-2 text-sm",
|
|
7378
7551
|
item: "text-sm px-3 py-2",
|
|
7379
7552
|
tag: "px-2 py-1 text-xs"
|
|
7380
7553
|
},
|
|
7381
7554
|
lg: {
|
|
7382
7555
|
trigger: "h-12 px-5 py-3 text-base",
|
|
7383
7556
|
icon: "h-5 w-5",
|
|
7384
|
-
search: "px-
|
|
7557
|
+
search: "px-10 py-3 text-base",
|
|
7385
7558
|
item: "text-base px-3 py-3",
|
|
7386
7559
|
tag: "px-2.5 py-1 text-sm"
|
|
7387
7560
|
}
|
|
7388
7561
|
};
|
|
7562
|
+
const variantStyles6 = {
|
|
7563
|
+
default: "border border-input bg-background shadow-sm hover:border-primary/50",
|
|
7564
|
+
outline: "border-2 border-input bg-transparent hover:border-primary",
|
|
7565
|
+
ghost: "border border-transparent bg-muted/50 hover:bg-muted"
|
|
7566
|
+
};
|
|
7389
7567
|
const autoId = useId5();
|
|
7390
7568
|
const resolvedId = id ? String(id) : `multicombobox-${autoId}`;
|
|
7391
7569
|
const labelId = label ? `${resolvedId}-label` : void 0;
|
|
7392
7570
|
const labelSize = size === "sm" ? "text-xs" : size === "lg" ? "text-base" : "text-sm";
|
|
7393
7571
|
const listboxId = `${resolvedId}-listbox`;
|
|
7394
|
-
const
|
|
7395
|
-
|
|
7396
|
-
|
|
7572
|
+
const renderOptionItem = (item, index) => {
|
|
7573
|
+
const isSelected = value.includes(item.value);
|
|
7574
|
+
const isDisabled = item.disabled || disabledOptions.includes(item.value);
|
|
7575
|
+
const optionIcon = item.icon;
|
|
7576
|
+
const optionDesc = item.description;
|
|
7577
|
+
const isEven = index % 2 === 0;
|
|
7578
|
+
if (renderOption) {
|
|
7579
|
+
return /* @__PURE__ */ jsx33(
|
|
7580
|
+
"li",
|
|
7581
|
+
{
|
|
7582
|
+
ref: (node) => {
|
|
7583
|
+
listRef.current[index] = node;
|
|
7584
|
+
},
|
|
7585
|
+
onClick: (e) => {
|
|
7586
|
+
e.preventDefault();
|
|
7587
|
+
e.stopPropagation();
|
|
7588
|
+
if (!isDisabled) toggleSelect(item.value);
|
|
7589
|
+
inputRef.current?.focus();
|
|
7590
|
+
},
|
|
7591
|
+
style: { animationDelay: open ? `${Math.min(index * 20, 200)}ms` : "0ms" },
|
|
7592
|
+
className: cn("dropdown-item", isEven && "bg-muted/25", isDisabled && "opacity-50 cursor-not-allowed pointer-events-none"),
|
|
7593
|
+
children: renderOption(item, isSelected)
|
|
7594
|
+
},
|
|
7595
|
+
item.value
|
|
7596
|
+
);
|
|
7597
|
+
}
|
|
7598
|
+
return /* @__PURE__ */ jsxs28(
|
|
7599
|
+
"li",
|
|
7397
7600
|
{
|
|
7398
|
-
|
|
7601
|
+
ref: (node) => {
|
|
7602
|
+
listRef.current[index] = node;
|
|
7603
|
+
},
|
|
7399
7604
|
onClick: (e) => {
|
|
7400
7605
|
e.preventDefault();
|
|
7401
7606
|
e.stopPropagation();
|
|
7402
|
-
|
|
7607
|
+
if (!isDisabled) toggleSelect(item.value);
|
|
7608
|
+
inputRef.current?.focus();
|
|
7403
7609
|
},
|
|
7404
|
-
|
|
7405
|
-
|
|
7406
|
-
|
|
7407
|
-
|
|
7408
|
-
|
|
7409
|
-
|
|
7610
|
+
style: { animationDelay: open ? `${Math.min(index * 20, 200)}ms` : "0ms" },
|
|
7611
|
+
className: cn(
|
|
7612
|
+
"dropdown-item flex cursor-pointer items-center gap-3 rounded-lg transition-all duration-200",
|
|
7613
|
+
sizeStyles8[size].item,
|
|
7614
|
+
isEven && "bg-muted/25",
|
|
7615
|
+
"hover:bg-accent/70 hover:shadow-sm",
|
|
7616
|
+
index === activeIndex && "bg-accent/60",
|
|
7617
|
+
isSelected && "bg-primary/10 text-primary font-medium",
|
|
7618
|
+
isDisabled && "opacity-40 cursor-not-allowed pointer-events-none"
|
|
7619
|
+
),
|
|
7620
|
+
children: [
|
|
7621
|
+
/* @__PURE__ */ jsx33(
|
|
7622
|
+
"span",
|
|
7623
|
+
{
|
|
7624
|
+
className: cn(
|
|
7625
|
+
"shrink-0 w-5 h-5 flex items-center justify-center rounded-md border-2 transition-all duration-200",
|
|
7626
|
+
isSelected ? "bg-primary border-primary text-primary-foreground" : "border-muted-foreground/30 bg-transparent"
|
|
7627
|
+
),
|
|
7628
|
+
children: isSelected && /* @__PURE__ */ jsx33(Check5, { className: "w-3 h-3" })
|
|
7629
|
+
}
|
|
7630
|
+
),
|
|
7631
|
+
optionIcon && /* @__PURE__ */ jsx33("span", { className: "shrink-0 w-5 h-5 flex items-center justify-center text-muted-foreground", children: optionIcon }),
|
|
7632
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex-1 min-w-0", children: [
|
|
7633
|
+
/* @__PURE__ */ jsx33("div", { className: cn("truncate", isSelected && "font-medium text-primary"), children: item.label }),
|
|
7634
|
+
optionDesc && /* @__PURE__ */ jsx33("div", { className: "text-xs text-muted-foreground truncate mt-0.5", children: optionDesc })
|
|
7635
|
+
] })
|
|
7636
|
+
]
|
|
7637
|
+
},
|
|
7638
|
+
item.value
|
|
7639
|
+
);
|
|
7640
|
+
};
|
|
7641
|
+
const dropdownBody = /* @__PURE__ */ jsxs28("div", { "data-combobox-dropdown": true, "data-state": open ? "open" : "closed", className: "w-full", children: [
|
|
7642
|
+
value.length > 0 && /* @__PURE__ */ jsxs28("div", { className: "px-3 py-2 border-b border-border/40 flex items-center justify-between bg-muted/30", children: [
|
|
7643
|
+
/* @__PURE__ */ jsxs28("span", { className: "text-xs font-medium text-muted-foreground", children: [
|
|
7644
|
+
value.length,
|
|
7645
|
+
" selected",
|
|
7646
|
+
maxSelected && ` / ${maxSelected} max`
|
|
7647
|
+
] }),
|
|
7648
|
+
showClear && /* @__PURE__ */ jsxs28(
|
|
7649
|
+
"button",
|
|
7650
|
+
{
|
|
7651
|
+
type: "button",
|
|
7652
|
+
onClick: (e) => {
|
|
7653
|
+
e.preventDefault();
|
|
7654
|
+
e.stopPropagation();
|
|
7655
|
+
handleClearAll();
|
|
7656
|
+
},
|
|
7657
|
+
className: "text-xs text-muted-foreground hover:text-destructive transition-colors cursor-pointer flex items-center gap-1",
|
|
7658
|
+
children: [
|
|
7659
|
+
/* @__PURE__ */ jsx33(X11, { className: "w-3 h-3" }),
|
|
7660
|
+
"Clear all"
|
|
7661
|
+
]
|
|
7662
|
+
}
|
|
7663
|
+
)
|
|
7664
|
+
] }),
|
|
7665
|
+
enableSearch && /* @__PURE__ */ jsxs28("div", { className: "relative border-b border-border/40", children: [
|
|
7666
|
+
/* @__PURE__ */ jsx33(Search4, { className: cn("absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground", sizeStyles8[size].icon) }),
|
|
7410
7667
|
/* @__PURE__ */ jsx33(
|
|
7411
7668
|
"input",
|
|
7412
7669
|
{
|
|
@@ -7417,8 +7674,17 @@ var MultiCombobox = ({
|
|
|
7417
7674
|
setActiveIndex(null);
|
|
7418
7675
|
},
|
|
7419
7676
|
onKeyDown: handleKeyDown,
|
|
7420
|
-
placeholder,
|
|
7421
|
-
className: cn("w-full
|
|
7677
|
+
placeholder: searchPlaceholder,
|
|
7678
|
+
className: cn("w-full bg-transparent focus:outline-none cursor-text placeholder:text-muted-foreground/60", sizeStyles8[size].search)
|
|
7679
|
+
}
|
|
7680
|
+
),
|
|
7681
|
+
query && /* @__PURE__ */ jsx33(
|
|
7682
|
+
"button",
|
|
7683
|
+
{
|
|
7684
|
+
type: "button",
|
|
7685
|
+
onClick: () => setQuery(""),
|
|
7686
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors",
|
|
7687
|
+
children: /* @__PURE__ */ jsx33(X11, { className: "w-4 h-4" })
|
|
7422
7688
|
}
|
|
7423
7689
|
)
|
|
7424
7690
|
] }),
|
|
@@ -7427,50 +7693,41 @@ var MultiCombobox = ({
|
|
|
7427
7693
|
{
|
|
7428
7694
|
id: listboxId,
|
|
7429
7695
|
role: "listbox",
|
|
7430
|
-
|
|
7431
|
-
|
|
7432
|
-
|
|
7433
|
-
|
|
7434
|
-
|
|
7435
|
-
|
|
7436
|
-
|
|
7437
|
-
|
|
7438
|
-
|
|
7439
|
-
|
|
7440
|
-
|
|
7441
|
-
|
|
7442
|
-
|
|
7443
|
-
|
|
7444
|
-
|
|
7445
|
-
|
|
7446
|
-
|
|
7447
|
-
|
|
7448
|
-
|
|
7449
|
-
|
|
7450
|
-
|
|
7451
|
-
|
|
7452
|
-
|
|
7453
|
-
|
|
7454
|
-
|
|
7455
|
-
|
|
7456
|
-
|
|
7457
|
-
|
|
7458
|
-
),
|
|
7459
|
-
children: [
|
|
7460
|
-
item.label,
|
|
7461
|
-
isSelected && /* @__PURE__ */ jsx33(Check5, { className: sizeStyles8[size].icon })
|
|
7462
|
-
]
|
|
7463
|
-
},
|
|
7464
|
-
item.value
|
|
7465
|
-
);
|
|
7466
|
-
}) : /* @__PURE__ */ jsx33("li", { className: cn("px-3 py-8 text-center text-muted-foreground", size === "lg" ? "text-base" : size === "sm" ? "text-xs" : "text-sm"), children: /* @__PURE__ */ jsxs28("div", { className: "flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
7467
|
-
/* @__PURE__ */ jsx33(SearchX2, { className: "h-8 w-8 opacity-40 text-muted-foreground" }),
|
|
7468
|
-
/* @__PURE__ */ jsx33("span", { children: emptyText }),
|
|
7469
|
-
query && /* @__PURE__ */ jsx33("button", { type: "button", onClick: () => setQuery(""), className: "text-xs text-primary hover:underline", children: "Clear search" })
|
|
7696
|
+
"aria-multiselectable": "true",
|
|
7697
|
+
style: { maxHeight },
|
|
7698
|
+
className: cn("overflow-y-auto p-1.5", size === "lg" ? "text-base" : size === "sm" ? "text-xs" : "text-sm"),
|
|
7699
|
+
children: loading2 ? /* @__PURE__ */ jsx33("li", { className: "px-3 py-8 text-center", children: /* @__PURE__ */ jsxs28("div", { className: "flex flex-col items-center gap-3 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
7700
|
+
/* @__PURE__ */ jsxs28("div", { className: "relative", children: [
|
|
7701
|
+
/* @__PURE__ */ jsx33(Loader24, { className: "h-8 w-8 animate-spin text-primary" }),
|
|
7702
|
+
/* @__PURE__ */ jsx33(Sparkles3, { className: "h-4 w-4 text-primary/60 absolute -top-1 -right-1 animate-pulse" })
|
|
7703
|
+
] }),
|
|
7704
|
+
/* @__PURE__ */ jsx33("span", { className: "text-muted-foreground font-medium", children: loadingText })
|
|
7705
|
+
] }) }) : filtered.length ? groupedOptions ? (
|
|
7706
|
+
// Render grouped options
|
|
7707
|
+
Array.from(groupedOptions.entries()).map(([group, items]) => /* @__PURE__ */ jsxs28("li", { className: "mb-2", children: [
|
|
7708
|
+
/* @__PURE__ */ jsx33("div", { className: "px-3 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider sticky top-0 bg-popover/95 backdrop-blur-sm", children: group }),
|
|
7709
|
+
/* @__PURE__ */ jsx33("ul", { children: items.map((item) => renderOptionItem(item, filtered.indexOf(item))) })
|
|
7710
|
+
] }, group))
|
|
7711
|
+
) : (
|
|
7712
|
+
// Render flat options
|
|
7713
|
+
filtered.map((item, index) => renderOptionItem(item, index))
|
|
7714
|
+
) : /* @__PURE__ */ jsx33("li", { className: cn("px-3 py-8 text-center text-muted-foreground"), children: /* @__PURE__ */ jsxs28("div", { className: "flex flex-col items-center gap-3 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
7715
|
+
/* @__PURE__ */ jsx33(SearchX2, { className: "h-10 w-10 opacity-30 text-muted-foreground" }),
|
|
7716
|
+
/* @__PURE__ */ jsxs28("div", { className: "space-y-1", children: [
|
|
7717
|
+
/* @__PURE__ */ jsx33("span", { className: "font-medium block", children: emptyText }),
|
|
7718
|
+
query && /* @__PURE__ */ jsx33("span", { className: "text-xs opacity-60", children: "Try a different search term" })
|
|
7719
|
+
] }),
|
|
7720
|
+
query && /* @__PURE__ */ jsxs28("button", { type: "button", onClick: () => setQuery(""), className: "text-xs text-primary hover:underline flex items-center gap-1", children: [
|
|
7721
|
+
/* @__PURE__ */ jsx33(X11, { className: "w-3 h-3" }),
|
|
7722
|
+
"Clear search"
|
|
7723
|
+
] })
|
|
7470
7724
|
] }) })
|
|
7471
7725
|
}
|
|
7472
7726
|
)
|
|
7473
7727
|
] });
|
|
7728
|
+
const selectedOptions = value.map((v) => normalizedOptions.find((o) => o.value === v)).filter(Boolean);
|
|
7729
|
+
const visibleTags = maxTagsVisible ? selectedOptions.slice(0, maxTagsVisible) : selectedOptions;
|
|
7730
|
+
const hiddenCount = maxTagsVisible ? Math.max(0, selectedOptions.length - maxTagsVisible) : 0;
|
|
7474
7731
|
const triggerButton = /* @__PURE__ */ jsxs28(
|
|
7475
7732
|
"button",
|
|
7476
7733
|
{
|
|
@@ -7483,50 +7740,99 @@ var MultiCombobox = ({
|
|
|
7483
7740
|
"aria-haspopup": "listbox",
|
|
7484
7741
|
"aria-expanded": open,
|
|
7485
7742
|
"aria-controls": listboxId,
|
|
7743
|
+
"aria-invalid": !!error,
|
|
7486
7744
|
className: cn(
|
|
7487
|
-
"flex w-full items-center gap-2 rounded-2xl
|
|
7745
|
+
"group flex w-full items-center gap-2 rounded-2xl min-h-10 transition-all duration-200",
|
|
7488
7746
|
"px-3 py-2",
|
|
7489
|
-
|
|
7490
|
-
"
|
|
7747
|
+
variantStyles6[variant],
|
|
7748
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30 focus-visible:border-primary",
|
|
7749
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
7750
|
+
open && "ring-2 ring-primary/20 border-primary",
|
|
7751
|
+
!!error && "border-destructive focus-visible:ring-destructive/30"
|
|
7491
7752
|
),
|
|
7492
7753
|
children: [
|
|
7493
|
-
/* @__PURE__ */ jsx33("div", { className: "flex items-center gap-1 flex-wrap min-h-6 flex-1", children: value.length > 0 ? showTags ?
|
|
7494
|
-
|
|
7495
|
-
|
|
7496
|
-
|
|
7497
|
-
|
|
7754
|
+
/* @__PURE__ */ jsx33("div", { className: "flex items-center gap-1.5 flex-wrap min-h-6 flex-1", children: value.length > 0 ? showTags ? /* @__PURE__ */ jsxs28(Fragment10, { children: [
|
|
7755
|
+
visibleTags.map((option) => {
|
|
7756
|
+
if (renderTag) {
|
|
7757
|
+
return /* @__PURE__ */ jsx33(React27.Fragment, { children: renderTag(option, () => handleRemove(option.value)) }, option.value);
|
|
7758
|
+
}
|
|
7759
|
+
return /* @__PURE__ */ jsxs28(
|
|
7498
7760
|
"span",
|
|
7499
7761
|
{
|
|
7500
|
-
|
|
7501
|
-
|
|
7502
|
-
|
|
7503
|
-
|
|
7504
|
-
|
|
7505
|
-
|
|
7506
|
-
|
|
7507
|
-
|
|
7508
|
-
|
|
7509
|
-
|
|
7510
|
-
|
|
7511
|
-
|
|
7512
|
-
|
|
7513
|
-
|
|
7514
|
-
|
|
7515
|
-
|
|
7516
|
-
|
|
7517
|
-
|
|
7518
|
-
|
|
7519
|
-
|
|
7520
|
-
|
|
7762
|
+
className: cn(
|
|
7763
|
+
"inline-flex items-center gap-1.5 bg-primary/10 text-primary rounded-lg transition-all duration-200",
|
|
7764
|
+
"hover:bg-primary/20",
|
|
7765
|
+
sizeStyles8[size].tag
|
|
7766
|
+
),
|
|
7767
|
+
children: [
|
|
7768
|
+
showSelectedIcons && option.icon && /* @__PURE__ */ jsx33("span", { className: "shrink-0 w-3.5 h-3.5 flex items-center justify-center", children: option.icon }),
|
|
7769
|
+
/* @__PURE__ */ jsx33("span", { className: "truncate max-w-24", children: displayFormat(option) }),
|
|
7770
|
+
/* @__PURE__ */ jsx33(
|
|
7771
|
+
"span",
|
|
7772
|
+
{
|
|
7773
|
+
role: "button",
|
|
7774
|
+
tabIndex: 0,
|
|
7775
|
+
"aria-label": `Remove ${displayFormat(option)}`,
|
|
7776
|
+
onClick: (e) => {
|
|
7777
|
+
e.preventDefault();
|
|
7778
|
+
e.stopPropagation();
|
|
7779
|
+
handleRemove(option.value);
|
|
7780
|
+
},
|
|
7781
|
+
onKeyDown: (e) => {
|
|
7782
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
7783
|
+
e.preventDefault();
|
|
7784
|
+
e.stopPropagation();
|
|
7785
|
+
handleRemove(option.value);
|
|
7786
|
+
}
|
|
7787
|
+
},
|
|
7788
|
+
className: "hover:text-destructive transition-colors cursor-pointer select-none hover:bg-destructive/10 rounded-full p-0.5",
|
|
7789
|
+
children: /* @__PURE__ */ jsx33(X11, { className: "w-3 h-3" })
|
|
7790
|
+
}
|
|
7791
|
+
)
|
|
7792
|
+
]
|
|
7793
|
+
},
|
|
7794
|
+
option.value
|
|
7795
|
+
);
|
|
7796
|
+
}),
|
|
7797
|
+
hiddenCount > 0 && /* @__PURE__ */ jsxs28("span", { className: cn("inline-flex items-center bg-muted text-muted-foreground rounded-lg", sizeStyles8[size].tag), children: [
|
|
7798
|
+
"+",
|
|
7799
|
+
hiddenCount,
|
|
7800
|
+
" more"
|
|
7801
|
+
] })
|
|
7802
|
+
] }) : /* @__PURE__ */ jsxs28("span", { className: "truncate text-sm font-medium", children: [
|
|
7521
7803
|
value.length,
|
|
7804
|
+
" item",
|
|
7805
|
+
value.length > 1 ? "s" : "",
|
|
7522
7806
|
" selected"
|
|
7523
|
-
] }) : /* @__PURE__ */ jsx33("span", { className: "text-muted-foreground", children: placeholder
|
|
7524
|
-
/* @__PURE__ */
|
|
7525
|
-
|
|
7526
|
-
|
|
7527
|
-
|
|
7528
|
-
|
|
7529
|
-
|
|
7807
|
+
] }) : /* @__PURE__ */ jsx33("span", { className: "text-muted-foreground", children: placeholder }) }),
|
|
7808
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-1.5 shrink-0", children: [
|
|
7809
|
+
showClear && value.length > 0 && /* @__PURE__ */ jsx33(
|
|
7810
|
+
"div",
|
|
7811
|
+
{
|
|
7812
|
+
role: "button",
|
|
7813
|
+
tabIndex: 0,
|
|
7814
|
+
"aria-label": "Clear all",
|
|
7815
|
+
onClick: (e) => {
|
|
7816
|
+
e.preventDefault();
|
|
7817
|
+
e.stopPropagation();
|
|
7818
|
+
handleClearAll();
|
|
7819
|
+
},
|
|
7820
|
+
onKeyDown: (e) => (e.key === "Enter" || e.key === " ") && handleClearAll(),
|
|
7821
|
+
className: "opacity-0 group-hover:opacity-100 transition-all duration-200 p-1 rounded-lg hover:bg-destructive/10 text-muted-foreground hover:text-destructive",
|
|
7822
|
+
children: /* @__PURE__ */ jsx33(X11, { className: "h-3.5 w-3.5" })
|
|
7823
|
+
}
|
|
7824
|
+
),
|
|
7825
|
+
/* @__PURE__ */ jsx33(
|
|
7826
|
+
ChevronDown2,
|
|
7827
|
+
{
|
|
7828
|
+
className: cn(
|
|
7829
|
+
"h-4 w-4 text-muted-foreground transition-all duration-300 ease-out",
|
|
7830
|
+
open && "rotate-180 text-primary",
|
|
7831
|
+
!open && "group-hover:text-foreground"
|
|
7832
|
+
)
|
|
7833
|
+
}
|
|
7834
|
+
)
|
|
7835
|
+
] })
|
|
7530
7836
|
]
|
|
7531
7837
|
}
|
|
7532
7838
|
);
|
|
@@ -7573,7 +7879,18 @@ var MultiCombobox = ({
|
|
|
7573
7879
|
contentClassName: "p-0",
|
|
7574
7880
|
children: dropdownBody
|
|
7575
7881
|
}
|
|
7576
|
-
)
|
|
7882
|
+
),
|
|
7883
|
+
(helperText || error) && /* @__PURE__ */ jsxs28("p", { className: cn("text-xs transition-colors duration-200 flex items-center gap-1.5", error ? "text-destructive" : "text-muted-foreground"), children: [
|
|
7884
|
+
error && /* @__PURE__ */ jsx33("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", className: "w-3.5 h-3.5 shrink-0", children: /* @__PURE__ */ jsx33(
|
|
7885
|
+
"path",
|
|
7886
|
+
{
|
|
7887
|
+
fillRule: "evenodd",
|
|
7888
|
+
d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",
|
|
7889
|
+
clipRule: "evenodd"
|
|
7890
|
+
}
|
|
7891
|
+
) }),
|
|
7892
|
+
error || helperText
|
|
7893
|
+
] })
|
|
7577
7894
|
] });
|
|
7578
7895
|
};
|
|
7579
7896
|
|
|
@@ -7984,7 +8301,7 @@ Slider.displayName = "Slider";
|
|
|
7984
8301
|
// ../../components/ui/OverlayControls.tsx
|
|
7985
8302
|
import { Dot, Maximize2, Pause, Play, RotateCcw, RotateCw, Volume2, VolumeX } from "lucide-react";
|
|
7986
8303
|
import React30 from "react";
|
|
7987
|
-
import { Fragment as
|
|
8304
|
+
import { Fragment as Fragment11, jsx as jsx36, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
7988
8305
|
function OverlayControls({
|
|
7989
8306
|
mode,
|
|
7990
8307
|
value,
|
|
@@ -8207,7 +8524,7 @@ function OverlayControls({
|
|
|
8207
8524
|
const handleSliderMouseLeave = () => {
|
|
8208
8525
|
setPreviewData(null);
|
|
8209
8526
|
};
|
|
8210
|
-
return /* @__PURE__ */ jsxs31(
|
|
8527
|
+
return /* @__PURE__ */ jsxs31(Fragment11, { children: [
|
|
8211
8528
|
keyboardFeedback && /* @__PURE__ */ jsx36(
|
|
8212
8529
|
"div",
|
|
8213
8530
|
{
|
|
@@ -8417,7 +8734,7 @@ function OverlayControls({
|
|
|
8417
8734
|
// ../../components/ui/CategoryTreeSelect.tsx
|
|
8418
8735
|
import { useState as useState26, useEffect as useEffect16 } from "react";
|
|
8419
8736
|
import { ChevronRight as ChevronRight5, ChevronDown as ChevronDown3, Check as Check6, FolderTree, Layers } from "lucide-react";
|
|
8420
|
-
import { Fragment as
|
|
8737
|
+
import { Fragment as Fragment12, jsx as jsx37, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
8421
8738
|
var defaultLabels = {
|
|
8422
8739
|
emptyText: "No categories",
|
|
8423
8740
|
selectedText: (count) => `${count} selected`
|
|
@@ -8500,26 +8817,23 @@ function CategoryTreeSelect(props) {
|
|
|
8500
8817
|
const hasChildren = children.length > 0;
|
|
8501
8818
|
const isExpanded = expandedNodes.has(category.id);
|
|
8502
8819
|
const isSelected = valueArray.includes(category.id);
|
|
8820
|
+
const isParent = level === 0;
|
|
8503
8821
|
return /* @__PURE__ */ jsxs32("div", { className: "animate-in fade-in-50 duration-200", style: { animationDelay: `${level * 30}ms` }, children: [
|
|
8504
8822
|
/* @__PURE__ */ jsxs32(
|
|
8505
8823
|
"div",
|
|
8506
8824
|
{
|
|
8507
8825
|
className: cn(
|
|
8508
|
-
"relative flex items-center gap-2.5 px-3 py-2.5
|
|
8826
|
+
"relative flex items-center gap-2.5 px-3 py-2.5 transition-all duration-200",
|
|
8827
|
+
"border-l-4 border-l-transparent",
|
|
8828
|
+
// Parent level styling
|
|
8829
|
+
isParent && "bg-muted/25 font-medium",
|
|
8509
8830
|
!viewOnly && "cursor-pointer",
|
|
8510
8831
|
!viewOnly && !isSelected && "hover:bg-accent/60 hover:shadow-sm",
|
|
8511
8832
|
// Selected state
|
|
8512
|
-
!viewOnly && isSelected && "bg-
|
|
8833
|
+
!viewOnly && isSelected && "bg-accent/30 border-l-primary shadow-sm"
|
|
8513
8834
|
),
|
|
8514
8835
|
style: { paddingLeft: `${level * 1.25 + 0.75}rem` },
|
|
8515
8836
|
children: [
|
|
8516
|
-
!viewOnly && isSelected && /* @__PURE__ */ jsx37(
|
|
8517
|
-
"span",
|
|
8518
|
-
{
|
|
8519
|
-
"aria-hidden": true,
|
|
8520
|
-
className: "absolute left-0 top-2 bottom-2 w-1 rounded-full bg-linear-to-b from-primary to-primary/70 shadow-sm shadow-primary/30"
|
|
8521
|
-
}
|
|
8522
|
-
),
|
|
8523
8837
|
hasChildren ? /* @__PURE__ */ jsx37(
|
|
8524
8838
|
"button",
|
|
8525
8839
|
{
|
|
@@ -8659,7 +8973,7 @@ function CategoryTreeSelect(props) {
|
|
|
8659
8973
|
]
|
|
8660
8974
|
}
|
|
8661
8975
|
),
|
|
8662
|
-
isOpen && !disabled && /* @__PURE__ */ jsxs32(
|
|
8976
|
+
isOpen && !disabled && /* @__PURE__ */ jsxs32(Fragment12, { children: [
|
|
8663
8977
|
/* @__PURE__ */ jsx37("div", { className: "fixed inset-0 z-10", onClick: () => setIsOpen(false) }),
|
|
8664
8978
|
/* @__PURE__ */ jsx37(
|
|
8665
8979
|
"div",
|
|
@@ -8680,7 +8994,7 @@ function CategoryTreeSelect(props) {
|
|
|
8680
8994
|
|
|
8681
8995
|
// ../../components/ui/ImageUpload.tsx
|
|
8682
8996
|
import { useState as useState27, useRef as useRef12, useCallback as useCallback9 } from "react";
|
|
8683
|
-
import { Upload, X as
|
|
8997
|
+
import { Upload, X as X12, Image as ImageIcon, Loader2 as Loader25, Check as Check7 } from "lucide-react";
|
|
8684
8998
|
import { jsx as jsx38, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
8685
8999
|
function ImageUpload({
|
|
8686
9000
|
onUpload,
|
|
@@ -8820,7 +9134,7 @@ function ImageUpload({
|
|
|
8820
9134
|
"div",
|
|
8821
9135
|
{
|
|
8822
9136
|
className: cn(
|
|
8823
|
-
"relative border-2 border-dashed rounded-
|
|
9137
|
+
"relative border-2 border-dashed rounded-2xl md:rounded-3xl p-8 text-center transition-all duration-200",
|
|
8824
9138
|
isDragging && !disabled ? "border-primary bg-primary/5 scale-[1.02]" : "border-border hover:border-primary/50",
|
|
8825
9139
|
disabled && "opacity-50 cursor-not-allowed",
|
|
8826
9140
|
uploading && "pointer-events-none"
|
|
@@ -8829,7 +9143,7 @@ function ImageUpload({
|
|
|
8829
9143
|
onDragLeave: handleDragLeave,
|
|
8830
9144
|
onDrop: handleDrop,
|
|
8831
9145
|
children: [
|
|
8832
|
-
uploading && /* @__PURE__ */ jsx38("div", { className: "absolute inset-0 bg-background/80 flex items-center justify-center rounded-
|
|
9146
|
+
uploading && /* @__PURE__ */ jsx38("div", { className: "absolute inset-0 bg-background/80 flex items-center justify-center rounded-2xl md:rounded-3xl", children: /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-3", children: [
|
|
8833
9147
|
/* @__PURE__ */ jsx38(Loader25, { className: "w-6 h-6 animate-spin text-primary" }),
|
|
8834
9148
|
/* @__PURE__ */ jsx38("span", { className: "text-sm font-medium", children: "Uploading..." })
|
|
8835
9149
|
] }) }),
|
|
@@ -8858,7 +9172,7 @@ function ImageUpload({
|
|
|
8858
9172
|
),
|
|
8859
9173
|
showPreview && uploadedImages.length > 0 && /* @__PURE__ */ jsxs33("div", { className: "space-y-3", children: [
|
|
8860
9174
|
/* @__PURE__ */ jsx38("h4", { className: "text-sm font-medium", children: "Uploaded Images" }),
|
|
8861
|
-
/* @__PURE__ */ jsx38("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-4", children: uploadedImages.map((image) => /* @__PURE__ */ jsxs33("div", { className: "relative group bg-card border border-border rounded-
|
|
9175
|
+
/* @__PURE__ */ jsx38("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-4", children: uploadedImages.map((image) => /* @__PURE__ */ jsxs33("div", { className: "relative group bg-card border border-border rounded-2xl md:rounded-3xl p-3", children: [
|
|
8862
9176
|
/* @__PURE__ */ jsx38(
|
|
8863
9177
|
Button_default,
|
|
8864
9178
|
{
|
|
@@ -8866,7 +9180,7 @@ function ImageUpload({
|
|
|
8866
9180
|
size: "icon",
|
|
8867
9181
|
className: "absolute -top-2 -right-2 w-6 h-6 opacity-0 group-hover:opacity-100 transition-opacity z-10",
|
|
8868
9182
|
onClick: () => handleRemoveImage(image.id),
|
|
8869
|
-
children: /* @__PURE__ */ jsx38(
|
|
9183
|
+
children: /* @__PURE__ */ jsx38(X12, { className: "w-3 h-3" })
|
|
8870
9184
|
}
|
|
8871
9185
|
),
|
|
8872
9186
|
/* @__PURE__ */ jsxs33("div", { className: cn("mx-auto mb-2 overflow-hidden rounded-lg", previewSizes[previewSize]), children: [
|
|
@@ -8903,7 +9217,7 @@ function ImageUpload({
|
|
|
8903
9217
|
// ../../components/ui/Carousel.tsx
|
|
8904
9218
|
import * as React32 from "react";
|
|
8905
9219
|
import { ChevronLeft as ChevronLeft4, ChevronRight as ChevronRight6 } from "lucide-react";
|
|
8906
|
-
import { Fragment as
|
|
9220
|
+
import { Fragment as Fragment13, jsx as jsx39, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
8907
9221
|
function Carousel({
|
|
8908
9222
|
children,
|
|
8909
9223
|
autoScroll = true,
|
|
@@ -9065,7 +9379,10 @@ function Carousel({
|
|
|
9065
9379
|
"div",
|
|
9066
9380
|
{
|
|
9067
9381
|
ref: carouselRef,
|
|
9068
|
-
className: cn(
|
|
9382
|
+
className: cn(
|
|
9383
|
+
"relative w-full overflow-hidden focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 rounded-2xl md:rounded-3xl",
|
|
9384
|
+
className
|
|
9385
|
+
),
|
|
9069
9386
|
onMouseEnter: () => setIsPaused(true),
|
|
9070
9387
|
onMouseLeave: () => setIsPaused(false),
|
|
9071
9388
|
role: "region",
|
|
@@ -9112,7 +9429,7 @@ function Carousel({
|
|
|
9112
9429
|
))
|
|
9113
9430
|
}
|
|
9114
9431
|
),
|
|
9115
|
-
showArrows && totalSlides > slidesToShow && /* @__PURE__ */ jsxs34(
|
|
9432
|
+
showArrows && totalSlides > slidesToShow && /* @__PURE__ */ jsxs34(Fragment13, { children: [
|
|
9116
9433
|
/* @__PURE__ */ jsx39(
|
|
9117
9434
|
Button_default,
|
|
9118
9435
|
{
|
|
@@ -9474,7 +9791,7 @@ function FallingIcons({
|
|
|
9474
9791
|
// ../../components/ui/List.tsx
|
|
9475
9792
|
import * as React34 from "react";
|
|
9476
9793
|
import { ChevronRight as ChevronRight7 } from "lucide-react";
|
|
9477
|
-
import { Fragment as
|
|
9794
|
+
import { Fragment as Fragment14, jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
9478
9795
|
var SIZE_STYLES2 = {
|
|
9479
9796
|
xs: { label: "text-xs", desc: "text-[11px]", icon: "h-3.5 w-3.5", avatar: "h-6 w-6" },
|
|
9480
9797
|
sm: { label: "text-[13px]", desc: "text-[12px]", icon: "h-4 w-4", avatar: "h-8 w-8" },
|
|
@@ -9522,12 +9839,12 @@ var ListRoot = React34.forwardRef(
|
|
|
9522
9839
|
const hasChildren = childCount > 0;
|
|
9523
9840
|
const variantClasses2 = {
|
|
9524
9841
|
plain: "",
|
|
9525
|
-
outlined: "rounded-
|
|
9526
|
-
soft: "rounded-
|
|
9527
|
-
bordered: "border border-border rounded-
|
|
9528
|
-
card: "rounded-
|
|
9842
|
+
outlined: "rounded-2xl md:rounded-3xl bg-card text-card-foreground border border-border shadow-sm",
|
|
9843
|
+
soft: "rounded-2xl md:rounded-3xl bg-muted/40 border border-border/60",
|
|
9844
|
+
bordered: "border border-border rounded-2xl md:rounded-3xl",
|
|
9845
|
+
card: "rounded-2xl md:rounded-3xl bg-card shadow-md border border-border",
|
|
9529
9846
|
flush: "",
|
|
9530
|
-
striped: "rounded-
|
|
9847
|
+
striped: "rounded-2xl md:rounded-3xl border border-border overflow-hidden"
|
|
9531
9848
|
};
|
|
9532
9849
|
if (loading2) {
|
|
9533
9850
|
return /* @__PURE__ */ jsx41(
|
|
@@ -9626,7 +9943,7 @@ var ListItem = React34.forwardRef(
|
|
|
9626
9943
|
}
|
|
9627
9944
|
}
|
|
9628
9945
|
} : {};
|
|
9629
|
-
const inner = /* @__PURE__ */ jsxs36(
|
|
9946
|
+
const inner = /* @__PURE__ */ jsxs36(Fragment14, { children: [
|
|
9630
9947
|
/* @__PURE__ */ jsxs36("div", { className: cn("flex items-center gap-3", contentClassName, "group/item relative"), ...headerProps, children: [
|
|
9631
9948
|
avatar && /* @__PURE__ */ jsx41("div", { className: cn("shrink-0", sz.avatar), children: typeof avatar === "string" ? /* @__PURE__ */ jsx41("img", { src: avatar, alt: "", className: cn("rounded-full object-cover", sz.avatar) }) : avatar }),
|
|
9632
9949
|
Left && !avatar && /* @__PURE__ */ jsx41("span", { className: cn("text-muted-foreground shrink-0", sz.icon), children: /* @__PURE__ */ jsx41(Left, { className: cn(sz.icon) }) }),
|
|
@@ -9671,7 +9988,7 @@ var List_default = List;
|
|
|
9671
9988
|
// ../../components/ui/Watermark.tsx
|
|
9672
9989
|
import * as React35 from "react";
|
|
9673
9990
|
import { createPortal as createPortal5 } from "react-dom";
|
|
9674
|
-
import { Fragment as
|
|
9991
|
+
import { Fragment as Fragment15, jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
9675
9992
|
var PRESETS2 = {
|
|
9676
9993
|
confidential: { text: "CONFIDENTIAL", color: "rgba(220, 38, 38, 0.15)", rotate: -22, fontSize: 16, fontWeight: "bold" },
|
|
9677
9994
|
draft: { text: "DRAFT", color: "rgba(59, 130, 246, 0.15)", rotate: -22, fontSize: 18, fontWeight: "bold" },
|
|
@@ -9950,7 +10267,7 @@ var Watermark = ({
|
|
|
9950
10267
|
}
|
|
9951
10268
|
);
|
|
9952
10269
|
if (fullPage) {
|
|
9953
|
-
return /* @__PURE__ */ jsxs37(
|
|
10270
|
+
return /* @__PURE__ */ jsxs37(Fragment15, { children: [
|
|
9954
10271
|
children,
|
|
9955
10272
|
typeof window !== "undefined" ? createPortal5(overlay, document.body) : null
|
|
9956
10273
|
] });
|
|
@@ -10240,7 +10557,7 @@ var Timeline_default = Timeline;
|
|
|
10240
10557
|
|
|
10241
10558
|
// ../../components/ui/ColorPicker.tsx
|
|
10242
10559
|
import * as React37 from "react";
|
|
10243
|
-
import { Pipette, X as
|
|
10560
|
+
import { Pipette, X as X13, Copy, Check as Check8, Palette, History } from "lucide-react";
|
|
10244
10561
|
import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
10245
10562
|
var clamp3 = (n, min, max) => Math.max(min, Math.min(max, n));
|
|
10246
10563
|
function hexToRgb(hex) {
|
|
@@ -10609,7 +10926,7 @@ function ColorPicker({
|
|
|
10609
10926
|
onClick: clear,
|
|
10610
10927
|
className: "ml-auto h-9 px-2 rounded-lg border border-border text-xs hover:bg-destructive/10 transition-colors flex items-center gap-1",
|
|
10611
10928
|
children: [
|
|
10612
|
-
/* @__PURE__ */ jsx44(
|
|
10929
|
+
/* @__PURE__ */ jsx44(X13, { className: "w-3.5 h-3.5" }),
|
|
10613
10930
|
variant === "full" && "Clear"
|
|
10614
10931
|
]
|
|
10615
10932
|
}
|
|
@@ -10762,7 +11079,7 @@ function ColorPicker({
|
|
|
10762
11079
|
|
|
10763
11080
|
// ../../components/ui/Grid.tsx
|
|
10764
11081
|
import React38, { useId as useId7 } from "react";
|
|
10765
|
-
import { Fragment as
|
|
11082
|
+
import { Fragment as Fragment16, jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
10766
11083
|
var BP_MIN = {
|
|
10767
11084
|
sm: 640,
|
|
10768
11085
|
md: 768,
|
|
@@ -10790,14 +11107,14 @@ function joinAreas(areas) {
|
|
|
10790
11107
|
}
|
|
10791
11108
|
function getVariantClasses(variant = "default", outlined) {
|
|
10792
11109
|
if (outlined) {
|
|
10793
|
-
return "rounded-
|
|
11110
|
+
return "rounded-2xl md:rounded-3xl bg-card text-card-foreground border border-border shadow-sm";
|
|
10794
11111
|
}
|
|
10795
11112
|
const variants = {
|
|
10796
11113
|
default: "",
|
|
10797
|
-
bordered: "border border-border rounded-
|
|
10798
|
-
card: "rounded-
|
|
10799
|
-
flat: "bg-muted/30 rounded-
|
|
10800
|
-
glass: "bg-background/80 backdrop-blur-sm border border-border/50 rounded-
|
|
11114
|
+
bordered: "border border-border rounded-2xl md:rounded-3xl",
|
|
11115
|
+
card: "rounded-2xl md:rounded-3xl bg-card text-card-foreground border border-border shadow-sm",
|
|
11116
|
+
flat: "bg-muted/30 rounded-2xl md:rounded-3xl",
|
|
11117
|
+
glass: "bg-background/80 backdrop-blur-sm border border-border/50 rounded-2xl md:rounded-3xl shadow-lg"
|
|
10801
11118
|
};
|
|
10802
11119
|
return variants[variant] || "";
|
|
10803
11120
|
}
|
|
@@ -10919,7 +11236,7 @@ var GridItem = React38.forwardRef(
|
|
|
10919
11236
|
st.opacity = 0;
|
|
10920
11237
|
st.animation = `uvGridItemFadeIn 0.5s ease-out forwards`;
|
|
10921
11238
|
}
|
|
10922
|
-
return /* @__PURE__ */ jsxs40(
|
|
11239
|
+
return /* @__PURE__ */ jsxs40(Fragment16, { children: [
|
|
10923
11240
|
animationDelay != null && /* @__PURE__ */ jsx45(
|
|
10924
11241
|
"style",
|
|
10925
11242
|
{
|
|
@@ -10932,7 +11249,11 @@ var GridItem = React38.forwardRef(
|
|
|
10932
11249
|
"div",
|
|
10933
11250
|
{
|
|
10934
11251
|
ref,
|
|
10935
|
-
className: cn(
|
|
11252
|
+
className: cn(
|
|
11253
|
+
"rounded-2xl md:rounded-3xl",
|
|
11254
|
+
hoverable && "transition-all duration-200 hover:scale-[1.02] hover:shadow-md cursor-pointer",
|
|
11255
|
+
className
|
|
11256
|
+
),
|
|
10936
11257
|
style: st,
|
|
10937
11258
|
...rest
|
|
10938
11259
|
}
|
|
@@ -10950,7 +11271,7 @@ import { useMemo as useMemo7, useState as useState34, useRef as useRef14 } from
|
|
|
10950
11271
|
// ../../components/ui/ChartTooltip.tsx
|
|
10951
11272
|
import { useEffect as useEffect20, useState as useState33 } from "react";
|
|
10952
11273
|
import { createPortal as createPortal6 } from "react-dom";
|
|
10953
|
-
import { Fragment as
|
|
11274
|
+
import { Fragment as Fragment17, jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
10954
11275
|
function ChartTooltip({ x, y, visible, label, value, color, secondaryLabel, secondaryValue, items, containerRef }) {
|
|
10955
11276
|
const [isMounted, setIsMounted] = useState33(false);
|
|
10956
11277
|
const [position, setPosition] = useState33(null);
|
|
@@ -10997,7 +11318,7 @@ function ChartTooltip({ x, y, visible, label, value, color, secondaryLabel, seco
|
|
|
10997
11318
|
":"
|
|
10998
11319
|
] }),
|
|
10999
11320
|
/* @__PURE__ */ jsx46("span", { className: "font-semibold ml-auto", children: item.value })
|
|
11000
|
-
] }, i)) }) : /* @__PURE__ */ jsxs41(
|
|
11321
|
+
] }, i)) }) : /* @__PURE__ */ jsxs41(Fragment17, { children: [
|
|
11001
11322
|
/* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-2", children: [
|
|
11002
11323
|
color && /* @__PURE__ */ jsx46("div", { className: "w-2 h-2 rounded-full shrink-0", style: { backgroundColor: color } }),
|
|
11003
11324
|
/* @__PURE__ */ jsx46("span", { className: "font-semibold", children: value })
|
|
@@ -11024,7 +11345,7 @@ function ChartTooltip({ x, y, visible, label, value, color, secondaryLabel, seco
|
|
|
11024
11345
|
}
|
|
11025
11346
|
|
|
11026
11347
|
// ../../components/ui/LineChart.tsx
|
|
11027
|
-
import { Fragment as
|
|
11348
|
+
import { Fragment as Fragment18, jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
11028
11349
|
function LineChart({
|
|
11029
11350
|
data,
|
|
11030
11351
|
width = 400,
|
|
@@ -11089,7 +11410,7 @@ function LineChart({
|
|
|
11089
11410
|
}
|
|
11090
11411
|
return lines;
|
|
11091
11412
|
}, [minValue, maxValue, chartHeight, padding.top]);
|
|
11092
|
-
return /* @__PURE__ */ jsxs42(
|
|
11413
|
+
return /* @__PURE__ */ jsxs42(Fragment18, { children: [
|
|
11093
11414
|
/* @__PURE__ */ jsxs42("svg", { ref: svgRef, width, height, className: `overflow-visible ${className}`, style: { fontFamily: "inherit" }, children: [
|
|
11094
11415
|
showGrid && /* @__PURE__ */ jsx47("g", { className: "text-muted-foreground/20", children: gridLines.map((line, i) => /* @__PURE__ */ jsxs42("g", { children: [
|
|
11095
11416
|
/* @__PURE__ */ jsx47("line", { x1: padding.left, y1: line.y, x2: width - padding.right, y2: line.y, stroke: "currentColor", strokeDasharray: "4 4" }),
|
|
@@ -11198,7 +11519,7 @@ function LineChart({
|
|
|
11198
11519
|
|
|
11199
11520
|
// ../../components/ui/BarChart.tsx
|
|
11200
11521
|
import { useMemo as useMemo8, useState as useState35, useRef as useRef15 } from "react";
|
|
11201
|
-
import { Fragment as
|
|
11522
|
+
import { Fragment as Fragment19, jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
11202
11523
|
function BarChart({
|
|
11203
11524
|
data,
|
|
11204
11525
|
width = 400,
|
|
@@ -11267,12 +11588,12 @@ function BarChart({
|
|
|
11267
11588
|
}
|
|
11268
11589
|
return { maxValue: max, bars: barsData, gridLines: lines };
|
|
11269
11590
|
}, [data, chartWidth, chartHeight, horizontal, barGap, padding, width, height]);
|
|
11270
|
-
return /* @__PURE__ */ jsxs43(
|
|
11591
|
+
return /* @__PURE__ */ jsxs43(Fragment19, { children: [
|
|
11271
11592
|
/* @__PURE__ */ jsxs43("svg", { ref: svgRef, width, height, className: `overflow-visible ${className}`, style: { fontFamily: "inherit" }, children: [
|
|
11272
|
-
showGrid && /* @__PURE__ */ jsx48("g", { className: "text-muted-foreground/20", children: gridLines.map((line, i) => /* @__PURE__ */ jsx48("g", { children: horizontal ? /* @__PURE__ */ jsxs43(
|
|
11593
|
+
showGrid && /* @__PURE__ */ jsx48("g", { className: "text-muted-foreground/20", children: gridLines.map((line, i) => /* @__PURE__ */ jsx48("g", { children: horizontal ? /* @__PURE__ */ jsxs43(Fragment19, { children: [
|
|
11273
11594
|
/* @__PURE__ */ jsx48("line", { x1: line.x, y1: line.y1, x2: line.x, y2: line.y2, stroke: "currentColor", strokeDasharray: "4 4" }),
|
|
11274
11595
|
/* @__PURE__ */ jsx48("text", { x: line.x, y: height - 8, textAnchor: "middle", fontSize: "10", className: "text-muted-foreground", fill: "currentColor", children: line.value.toFixed(0) })
|
|
11275
|
-
] }) : /* @__PURE__ */ jsxs43(
|
|
11596
|
+
] }) : /* @__PURE__ */ jsxs43(Fragment19, { children: [
|
|
11276
11597
|
/* @__PURE__ */ jsx48("line", { x1: line.x1, y1: line.y, x2: line.x2, y2: line.y, stroke: "currentColor", strokeDasharray: "4 4" }),
|
|
11277
11598
|
/* @__PURE__ */ jsx48("text", { x: padding.left - 8, y: line.y + 4, textAnchor: "end", fontSize: "10", className: "text-muted-foreground", fill: "currentColor", children: line.value.toFixed(0) })
|
|
11278
11599
|
] }) }, i)) }),
|
|
@@ -12310,16 +12631,16 @@ function GaugeChart({
|
|
|
12310
12631
|
|
|
12311
12632
|
// ../../components/ui/ClientOnly.tsx
|
|
12312
12633
|
import { useEffect as useEffect21, useState as useState39 } from "react";
|
|
12313
|
-
import { Fragment as
|
|
12634
|
+
import { Fragment as Fragment20, jsx as jsx54 } from "react/jsx-runtime";
|
|
12314
12635
|
function ClientOnly({ children, fallback = null }) {
|
|
12315
12636
|
const [hasMounted, setHasMounted] = useState39(false);
|
|
12316
12637
|
useEffect21(() => {
|
|
12317
12638
|
setHasMounted(true);
|
|
12318
12639
|
}, []);
|
|
12319
12640
|
if (!hasMounted) {
|
|
12320
|
-
return /* @__PURE__ */ jsx54(
|
|
12641
|
+
return /* @__PURE__ */ jsx54(Fragment20, { children: fallback });
|
|
12321
12642
|
}
|
|
12322
|
-
return /* @__PURE__ */ jsx54(
|
|
12643
|
+
return /* @__PURE__ */ jsx54(Fragment20, { children });
|
|
12323
12644
|
}
|
|
12324
12645
|
|
|
12325
12646
|
// ../../components/ui/Loading.tsx
|
|
@@ -12465,7 +12786,7 @@ TableCaption.displayName = "TableCaption";
|
|
|
12465
12786
|
// ../../components/ui/DataTable.tsx
|
|
12466
12787
|
import { Filter as FilterIcon } from "lucide-react";
|
|
12467
12788
|
import React48 from "react";
|
|
12468
|
-
import { Fragment as
|
|
12789
|
+
import { Fragment as Fragment21, jsx as jsx57, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
12469
12790
|
function useDebounced(value, delay = 300) {
|
|
12470
12791
|
const [debounced, setDebounced] = React48.useState(value);
|
|
12471
12792
|
React48.useEffect(() => {
|
|
@@ -12723,10 +13044,10 @@ function DataTable({
|
|
|
12723
13044
|
isCenterAlign && "justify-center",
|
|
12724
13045
|
!isRightAlign && !isCenterAlign && "justify-between"
|
|
12725
13046
|
),
|
|
12726
|
-
children: isRightAlign ? /* @__PURE__ */ jsxs51(
|
|
13047
|
+
children: isRightAlign ? /* @__PURE__ */ jsxs51(Fragment21, { children: [
|
|
12727
13048
|
filterContent,
|
|
12728
13049
|
titleContent
|
|
12729
|
-
] }) : /* @__PURE__ */ jsxs51(
|
|
13050
|
+
] }) : /* @__PURE__ */ jsxs51(Fragment21, { children: [
|
|
12730
13051
|
titleContent,
|
|
12731
13052
|
filterContent
|
|
12732
13053
|
] })
|
|
@@ -12908,7 +13229,17 @@ function DataTable({
|
|
|
12908
13229
|
totalItems
|
|
12909
13230
|
] }),
|
|
12910
13231
|
/* @__PURE__ */ jsxs51("div", { className: "flex items-center gap-0.5", children: [
|
|
12911
|
-
/* @__PURE__ */ jsx57(
|
|
13232
|
+
/* @__PURE__ */ jsx57(
|
|
13233
|
+
Button_default,
|
|
13234
|
+
{
|
|
13235
|
+
variant: "ghost",
|
|
13236
|
+
size: "sm",
|
|
13237
|
+
className: "h-7 w-7 p-0 rounded-full",
|
|
13238
|
+
onClick: () => setCurPage(Math.max(1, curPage - 1)),
|
|
13239
|
+
disabled: curPage === 1,
|
|
13240
|
+
children: /* @__PURE__ */ jsx57("svg", { className: "h-4 w-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx57("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) })
|
|
13241
|
+
}
|
|
13242
|
+
),
|
|
12912
13243
|
(() => {
|
|
12913
13244
|
const totalPages = Math.ceil(totalItems / curPageSize);
|
|
12914
13245
|
const pages = [];
|
|
@@ -12929,7 +13260,7 @@ function DataTable({
|
|
|
12929
13260
|
{
|
|
12930
13261
|
onClick: () => setCurPage(p),
|
|
12931
13262
|
className: cn(
|
|
12932
|
-
"h-7 min-w-7 px-
|
|
13263
|
+
"h-7 min-w-7 px-2 rounded-full text-xs font-medium transition-colors",
|
|
12933
13264
|
curPage === p ? "bg-primary text-primary-foreground" : "hover:bg-accent hover:text-accent-foreground"
|
|
12934
13265
|
),
|
|
12935
13266
|
children: p
|
|
@@ -12943,7 +13274,7 @@ function DataTable({
|
|
|
12943
13274
|
{
|
|
12944
13275
|
variant: "ghost",
|
|
12945
13276
|
size: "sm",
|
|
12946
|
-
className: "h-7 w-7 p-0",
|
|
13277
|
+
className: "h-7 w-7 p-0 rounded-full",
|
|
12947
13278
|
onClick: () => setCurPage(Math.min(Math.ceil(totalItems / curPageSize), curPage + 1)),
|
|
12948
13279
|
disabled: curPage === Math.ceil(totalItems / curPageSize),
|
|
12949
13280
|
children: /* @__PURE__ */ jsx57("svg", { className: "h-4 w-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx57("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
@@ -12960,7 +13291,7 @@ function DataTable({
|
|
|
12960
13291
|
setCurPageSize(Number(v));
|
|
12961
13292
|
},
|
|
12962
13293
|
size: "sm",
|
|
12963
|
-
className: "w-
|
|
13294
|
+
className: "w-20"
|
|
12964
13295
|
}
|
|
12965
13296
|
)
|
|
12966
13297
|
] })
|
|
@@ -13283,7 +13614,7 @@ function AccessDenied({
|
|
|
13283
13614
|
import { Moon as Moon2, Sun as Sun2, Monitor } from "lucide-react";
|
|
13284
13615
|
import { useEffect as useEffect23, useRef as useRef19, useState as useState40 } from "react";
|
|
13285
13616
|
import { createPortal as createPortal7 } from "react-dom";
|
|
13286
|
-
import { Fragment as
|
|
13617
|
+
import { Fragment as Fragment22, jsx as jsx62, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
13287
13618
|
function ThemeToggleHeadless({
|
|
13288
13619
|
theme,
|
|
13289
13620
|
onChange,
|
|
@@ -13334,7 +13665,7 @@ function ThemeToggleHeadless({
|
|
|
13334
13665
|
children: /* @__PURE__ */ jsx62(CurrentIcon, { className: "h-5 w-5" })
|
|
13335
13666
|
}
|
|
13336
13667
|
),
|
|
13337
|
-
isOpen && /* @__PURE__ */ jsxs56(
|
|
13668
|
+
isOpen && /* @__PURE__ */ jsxs56(Fragment22, { children: [
|
|
13338
13669
|
typeof window !== "undefined" && createPortal7(/* @__PURE__ */ jsx62("div", { className: "fixed inset-0 z-9998", onClick: () => setIsOpen(false) }), document.body),
|
|
13339
13670
|
typeof window !== "undefined" && dropdownPosition && createPortal7(
|
|
13340
13671
|
/* @__PURE__ */ jsx62(
|
|
@@ -13386,7 +13717,7 @@ function ThemeToggleHeadless({
|
|
|
13386
13717
|
import { useRef as useRef20, useState as useState41 } from "react";
|
|
13387
13718
|
import { createPortal as createPortal8 } from "react-dom";
|
|
13388
13719
|
import { Globe } from "lucide-react";
|
|
13389
|
-
import { Fragment as
|
|
13720
|
+
import { Fragment as Fragment23, jsx as jsx63, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
13390
13721
|
function LanguageSwitcherHeadless({
|
|
13391
13722
|
locales,
|
|
13392
13723
|
currentLocale,
|
|
@@ -13431,7 +13762,7 @@ function LanguageSwitcherHeadless({
|
|
|
13431
13762
|
children: /* @__PURE__ */ jsx63(Globe, { className: "h-5 w-5" })
|
|
13432
13763
|
}
|
|
13433
13764
|
),
|
|
13434
|
-
isOpen && /* @__PURE__ */ jsxs57(
|
|
13765
|
+
isOpen && /* @__PURE__ */ jsxs57(Fragment23, { children: [
|
|
13435
13766
|
typeof window !== "undefined" && createPortal8(/* @__PURE__ */ jsx63("div", { className: "fixed inset-0 z-9998", onClick: () => setIsOpen(false) }), document.body),
|
|
13436
13767
|
typeof window !== "undefined" && dropdownPosition && createPortal8(
|
|
13437
13768
|
/* @__PURE__ */ jsx63(
|