@underverse-ui/underverse 0.2.12 → 0.2.14
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 +1017 -1084
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +780 -847
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2687,90 +2687,216 @@ var import_react_dom3 = require("react-dom");
|
|
|
2687
2687
|
|
|
2688
2688
|
// ../../lib/utils/shadcn-animations.ts
|
|
2689
2689
|
var shadcnAnimationStyles = `
|
|
2690
|
+
/* ============================================
|
|
2691
|
+
* DROPDOWN / POPOVER ANIMATIONS
|
|
2692
|
+
* Uses spring-like cubic-bezier for natural feel
|
|
2693
|
+
* ============================================ */
|
|
2694
|
+
|
|
2695
|
+
[data-state="open"][data-combobox-dropdown] {
|
|
2696
|
+
animation: comboboxOpen 280ms cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
2697
|
+
transform-origin: top center;
|
|
2698
|
+
}
|
|
2699
|
+
|
|
2700
|
+
[data-state="closed"][data-combobox-dropdown] {
|
|
2701
|
+
animation: comboboxClose 200ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
2702
|
+
transform-origin: top center;
|
|
2703
|
+
}
|
|
2704
|
+
|
|
2705
|
+
@keyframes comboboxOpen {
|
|
2706
|
+
0% {
|
|
2707
|
+
opacity: 0;
|
|
2708
|
+
transform: translateY(-8px) scale(0.96);
|
|
2709
|
+
}
|
|
2710
|
+
50% {
|
|
2711
|
+
opacity: 0.8;
|
|
2712
|
+
transform: translateY(2px) scale(1.01);
|
|
2713
|
+
}
|
|
2714
|
+
100% {
|
|
2715
|
+
opacity: 1;
|
|
2716
|
+
transform: translateY(0) scale(1);
|
|
2717
|
+
}
|
|
2718
|
+
}
|
|
2719
|
+
|
|
2720
|
+
@keyframes comboboxClose {
|
|
2721
|
+
0% {
|
|
2722
|
+
opacity: 1;
|
|
2723
|
+
transform: translateY(0) scale(1);
|
|
2724
|
+
}
|
|
2725
|
+
100% {
|
|
2726
|
+
opacity: 0;
|
|
2727
|
+
transform: translateY(-6px) scale(0.97);
|
|
2728
|
+
}
|
|
2729
|
+
}
|
|
2730
|
+
|
|
2731
|
+
/* Generic dropdown open/close */
|
|
2690
2732
|
[data-state="open"] {
|
|
2691
|
-
animation: slideDownAndFade
|
|
2733
|
+
animation: slideDownAndFade 220ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
2692
2734
|
}
|
|
2693
2735
|
|
|
2694
2736
|
[data-state="closed"] {
|
|
2695
|
-
animation: slideUpAndFade
|
|
2737
|
+
animation: slideUpAndFade 180ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
2696
2738
|
}
|
|
2697
2739
|
|
|
2698
2740
|
@keyframes slideDownAndFade {
|
|
2699
2741
|
from {
|
|
2700
2742
|
opacity: 0;
|
|
2701
|
-
transform: translateY(-
|
|
2743
|
+
transform: translateY(-4px) scale(0.98);
|
|
2702
2744
|
}
|
|
2703
2745
|
to {
|
|
2704
2746
|
opacity: 1;
|
|
2705
|
-
transform: translateY(0);
|
|
2747
|
+
transform: translateY(0) scale(1);
|
|
2706
2748
|
}
|
|
2707
2749
|
}
|
|
2708
2750
|
|
|
2709
2751
|
@keyframes slideUpAndFade {
|
|
2710
2752
|
from {
|
|
2711
2753
|
opacity: 1;
|
|
2712
|
-
transform: translateY(0);
|
|
2754
|
+
transform: translateY(0) scale(1);
|
|
2713
2755
|
}
|
|
2714
2756
|
to {
|
|
2715
2757
|
opacity: 0;
|
|
2716
|
-
transform: translateY(-
|
|
2758
|
+
transform: translateY(-4px) scale(0.98);
|
|
2717
2759
|
}
|
|
2718
2760
|
}
|
|
2719
2761
|
|
|
2762
|
+
/* ============================================
|
|
2763
|
+
* DROPDOWN ITEMS - Staggered cascade effect
|
|
2764
|
+
* ============================================ */
|
|
2765
|
+
|
|
2720
2766
|
.dropdown-item {
|
|
2721
2767
|
opacity: 0;
|
|
2722
|
-
animation:
|
|
2768
|
+
animation: itemSlideIn 200ms cubic-bezier(0.22, 1, 0.36, 1) forwards;
|
|
2769
|
+
will-change: opacity, transform;
|
|
2723
2770
|
}
|
|
2724
2771
|
|
|
2725
|
-
@keyframes
|
|
2726
|
-
|
|
2772
|
+
@keyframes itemSlideIn {
|
|
2773
|
+
0% {
|
|
2727
2774
|
opacity: 0;
|
|
2728
|
-
transform:
|
|
2775
|
+
transform: translateX(-8px);
|
|
2729
2776
|
}
|
|
2730
|
-
|
|
2777
|
+
60% {
|
|
2778
|
+
opacity: 0.9;
|
|
2779
|
+
transform: translateX(2px);
|
|
2780
|
+
}
|
|
2781
|
+
100% {
|
|
2731
2782
|
opacity: 1;
|
|
2732
|
-
transform:
|
|
2783
|
+
transform: translateX(0);
|
|
2733
2784
|
}
|
|
2734
2785
|
}
|
|
2735
2786
|
|
|
2736
|
-
/*
|
|
2787
|
+
/* Hover effect for items */
|
|
2788
|
+
.dropdown-item {
|
|
2789
|
+
transition: background-color 150ms ease, transform 100ms ease;
|
|
2790
|
+
}
|
|
2791
|
+
|
|
2792
|
+
.dropdown-item:hover {
|
|
2793
|
+
transform: translateX(2px);
|
|
2794
|
+
}
|
|
2795
|
+
|
|
2796
|
+
.dropdown-item:active {
|
|
2797
|
+
transform: scale(0.98);
|
|
2798
|
+
}
|
|
2799
|
+
|
|
2800
|
+
/* ============================================
|
|
2801
|
+
* TOOLTIP / SIDE ANIMATIONS
|
|
2802
|
+
* ============================================ */
|
|
2803
|
+
|
|
2737
2804
|
[data-side="top"] {
|
|
2738
|
-
animation:
|
|
2805
|
+
animation: slideFromBottom 200ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
2739
2806
|
}
|
|
2740
2807
|
|
|
2741
2808
|
[data-side="bottom"] {
|
|
2742
|
-
animation:
|
|
2809
|
+
animation: slideFromTop 200ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
2743
2810
|
}
|
|
2744
2811
|
|
|
2745
2812
|
[data-side="left"] {
|
|
2746
|
-
animation:
|
|
2813
|
+
animation: slideFromRight 200ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
2747
2814
|
}
|
|
2748
2815
|
|
|
2749
2816
|
[data-side="right"] {
|
|
2750
|
-
animation:
|
|
2817
|
+
animation: slideFromLeft 200ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
2751
2818
|
}
|
|
2752
2819
|
|
|
2753
|
-
@keyframes
|
|
2820
|
+
@keyframes slideFromTop {
|
|
2754
2821
|
from {
|
|
2755
2822
|
opacity: 0;
|
|
2756
|
-
transform:
|
|
2823
|
+
transform: translateY(-6px) scale(0.96);
|
|
2757
2824
|
}
|
|
2758
2825
|
to {
|
|
2759
2826
|
opacity: 1;
|
|
2760
|
-
transform:
|
|
2827
|
+
transform: translateY(0) scale(1);
|
|
2761
2828
|
}
|
|
2762
2829
|
}
|
|
2763
2830
|
|
|
2764
|
-
@keyframes
|
|
2831
|
+
@keyframes slideFromBottom {
|
|
2765
2832
|
from {
|
|
2766
2833
|
opacity: 0;
|
|
2767
|
-
transform:
|
|
2834
|
+
transform: translateY(6px) scale(0.96);
|
|
2768
2835
|
}
|
|
2769
2836
|
to {
|
|
2770
2837
|
opacity: 1;
|
|
2771
|
-
transform:
|
|
2838
|
+
transform: translateY(0) scale(1);
|
|
2839
|
+
}
|
|
2840
|
+
}
|
|
2841
|
+
|
|
2842
|
+
@keyframes slideFromLeft {
|
|
2843
|
+
from {
|
|
2844
|
+
opacity: 0;
|
|
2845
|
+
transform: translateX(-6px) scale(0.96);
|
|
2846
|
+
}
|
|
2847
|
+
to {
|
|
2848
|
+
opacity: 1;
|
|
2849
|
+
transform: translateX(0) scale(1);
|
|
2850
|
+
}
|
|
2851
|
+
}
|
|
2852
|
+
|
|
2853
|
+
@keyframes slideFromRight {
|
|
2854
|
+
from {
|
|
2855
|
+
opacity: 0;
|
|
2856
|
+
transform: translateX(6px) scale(0.96);
|
|
2857
|
+
}
|
|
2858
|
+
to {
|
|
2859
|
+
opacity: 1;
|
|
2860
|
+
transform: translateX(0) scale(1);
|
|
2861
|
+
}
|
|
2862
|
+
}
|
|
2863
|
+
|
|
2864
|
+
/* ============================================
|
|
2865
|
+
* UTILITY ANIMATIONS
|
|
2866
|
+
* ============================================ */
|
|
2867
|
+
|
|
2868
|
+
.animate-bounce-subtle {
|
|
2869
|
+
animation: bounceSubtle 600ms cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
2870
|
+
}
|
|
2871
|
+
|
|
2872
|
+
@keyframes bounceSubtle {
|
|
2873
|
+
0%, 100% {
|
|
2874
|
+
transform: translateY(0);
|
|
2875
|
+
}
|
|
2876
|
+
50% {
|
|
2877
|
+
transform: translateY(-4px);
|
|
2772
2878
|
}
|
|
2773
2879
|
}
|
|
2880
|
+
|
|
2881
|
+
.animate-scale-in {
|
|
2882
|
+
animation: scaleIn 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
2883
|
+
}
|
|
2884
|
+
|
|
2885
|
+
@keyframes scaleIn {
|
|
2886
|
+
from {
|
|
2887
|
+
opacity: 0;
|
|
2888
|
+
transform: scale(0.9);
|
|
2889
|
+
}
|
|
2890
|
+
to {
|
|
2891
|
+
opacity: 1;
|
|
2892
|
+
transform: scale(1);
|
|
2893
|
+
}
|
|
2894
|
+
}
|
|
2895
|
+
|
|
2896
|
+
/* Smooth backdrop blur transition */
|
|
2897
|
+
.backdrop-animate {
|
|
2898
|
+
transition: backdrop-filter 200ms ease, background-color 200ms ease;
|
|
2899
|
+
}
|
|
2774
2900
|
`;
|
|
2775
2901
|
var useShadCNAnimations = () => {
|
|
2776
2902
|
if (typeof document !== "undefined") {
|
|
@@ -3166,25 +3292,7 @@ var SidebarSheet = ({ navigation, children, ...props }) => {
|
|
|
3166
3292
|
|
|
3167
3293
|
// ../../components/ui/Alert.tsx
|
|
3168
3294
|
var import_react8 = require("react");
|
|
3169
|
-
|
|
3170
|
-
// ../../components/icons/AlertIcons.tsx
|
|
3171
3295
|
var import_lucide_react8 = require("lucide-react");
|
|
3172
|
-
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
3173
|
-
function InfoIcon(props) {
|
|
3174
|
-
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.Info, { "aria-hidden": true, className: props.className });
|
|
3175
|
-
}
|
|
3176
|
-
function WarningIcon(props) {
|
|
3177
|
-
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.AlertTriangle, { "aria-hidden": true, className: props.className });
|
|
3178
|
-
}
|
|
3179
|
-
function CheckCircleIcon(props) {
|
|
3180
|
-
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.CheckCircle2, { "aria-hidden": true, className: props.className });
|
|
3181
|
-
}
|
|
3182
|
-
function ErrorIcon(props) {
|
|
3183
|
-
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.OctagonX, { "aria-hidden": true, className: props.className });
|
|
3184
|
-
}
|
|
3185
|
-
|
|
3186
|
-
// ../../components/ui/Alert.tsx
|
|
3187
|
-
var import_lucide_react9 = require("lucide-react");
|
|
3188
3296
|
var import_next_intl2 = require("next-intl");
|
|
3189
3297
|
|
|
3190
3298
|
// ../../lib/constants/constants-ui/alert.ts
|
|
@@ -3198,13 +3306,13 @@ var VARIANT_STYLES_ALERT = {
|
|
|
3198
3306
|
};
|
|
3199
3307
|
|
|
3200
3308
|
// ../../components/ui/Alert.tsx
|
|
3201
|
-
var
|
|
3309
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
3202
3310
|
var variantIcons = {
|
|
3203
|
-
default: /* @__PURE__ */ (0,
|
|
3204
|
-
info: /* @__PURE__ */ (0,
|
|
3205
|
-
success: /* @__PURE__ */ (0,
|
|
3206
|
-
warning: /* @__PURE__ */ (0,
|
|
3207
|
-
error: /* @__PURE__ */ (0,
|
|
3311
|
+
default: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.Info, { className: "h-4 w-4 text-muted-foreground" }),
|
|
3312
|
+
info: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.Info, { className: "h-4 w-4 text-info" }),
|
|
3313
|
+
success: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.CheckCircle, { className: "h-4 w-4 text-success" }),
|
|
3314
|
+
warning: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.AlertTriangle, { className: "h-4 w-4 text-warning" }),
|
|
3315
|
+
error: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.XCircle, { className: "h-4 w-4 text-destructive" })
|
|
3208
3316
|
};
|
|
3209
3317
|
var Alert = ({ title, description, variant = "default", className, icon, dismissible = false, onClose, actions, closeAriaLabel }) => {
|
|
3210
3318
|
const [open, setOpen] = (0, import_react8.useState)(true);
|
|
@@ -3214,26 +3322,26 @@ var Alert = ({ title, description, variant = "default", className, icon, dismiss
|
|
|
3214
3322
|
setOpen(false);
|
|
3215
3323
|
onClose?.();
|
|
3216
3324
|
};
|
|
3217
|
-
return /* @__PURE__ */ (0,
|
|
3325
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
3218
3326
|
"div",
|
|
3219
3327
|
{
|
|
3220
3328
|
className: cn("w-full p-4 rounded-md flex items-start gap-3", VARIANT_STYLES_ALERT[variant], className),
|
|
3221
3329
|
role: "alert",
|
|
3222
3330
|
"aria-live": variant === "error" ? "assertive" : "polite",
|
|
3223
3331
|
children: [
|
|
3224
|
-
/* @__PURE__ */ (0,
|
|
3225
|
-
/* @__PURE__ */ (0,
|
|
3226
|
-
title && /* @__PURE__ */ (0,
|
|
3227
|
-
description && (typeof description === "string" ? /* @__PURE__ */ (0,
|
|
3228
|
-
actions && /* @__PURE__ */ (0,
|
|
3332
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "pt-1", children: icon ?? variantIcons[variant] }),
|
|
3333
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
3334
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "font-semibold text-sm leading-none mb-1 text-foreground", children: title }),
|
|
3335
|
+
description && (typeof description === "string" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-sm text-muted-foreground leading-relaxed break-words", children: description }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-sm text-muted-foreground leading-relaxed break-words", children: description })),
|
|
3336
|
+
actions && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "mt-2 flex flex-wrap gap-2", children: actions })
|
|
3229
3337
|
] }),
|
|
3230
|
-
dismissible && /* @__PURE__ */ (0,
|
|
3338
|
+
dismissible && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
3231
3339
|
"button",
|
|
3232
3340
|
{
|
|
3233
3341
|
onClick: handleClose,
|
|
3234
3342
|
className: "rounded-md p-1 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
3235
3343
|
"aria-label": closeAriaLabel || t("closeAlert"),
|
|
3236
|
-
children: /* @__PURE__ */ (0,
|
|
3344
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react8.X, { className: "h-4 w-4" })
|
|
3237
3345
|
}
|
|
3238
3346
|
)
|
|
3239
3347
|
]
|
|
@@ -3244,7 +3352,7 @@ var Alert_default = Alert;
|
|
|
3244
3352
|
|
|
3245
3353
|
// ../../components/ui/GlobalLoading.tsx
|
|
3246
3354
|
var import_react9 = __toESM(require("react"), 1);
|
|
3247
|
-
var
|
|
3355
|
+
var import_lucide_react9 = require("lucide-react");
|
|
3248
3356
|
|
|
3249
3357
|
// ../../lib/utils/loading.ts
|
|
3250
3358
|
var LoadingManager = class {
|
|
@@ -3289,7 +3397,7 @@ var loading = new LoadingManager();
|
|
|
3289
3397
|
|
|
3290
3398
|
// ../../components/ui/GlobalLoading.tsx
|
|
3291
3399
|
var import_next_intl3 = require("next-intl");
|
|
3292
|
-
var
|
|
3400
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
3293
3401
|
var GlobalLoading = ({
|
|
3294
3402
|
className,
|
|
3295
3403
|
backdrop = true,
|
|
@@ -3302,7 +3410,7 @@ var GlobalLoading = ({
|
|
|
3302
3410
|
return unsubscribe;
|
|
3303
3411
|
}, []);
|
|
3304
3412
|
if (!state.isVisible) return null;
|
|
3305
|
-
return /* @__PURE__ */ (0,
|
|
3413
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
3306
3414
|
"div",
|
|
3307
3415
|
{
|
|
3308
3416
|
className: cn(
|
|
@@ -3314,9 +3422,9 @@ var GlobalLoading = ({
|
|
|
3314
3422
|
role: "dialog",
|
|
3315
3423
|
"aria-modal": true,
|
|
3316
3424
|
"aria-label": "Loading",
|
|
3317
|
-
children: /* @__PURE__ */ (0,
|
|
3318
|
-
/* @__PURE__ */ (0,
|
|
3319
|
-
state.text && /* @__PURE__ */ (0,
|
|
3425
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex items-center justify-center space-x-3 backdrop-blur-sm rounded-lg px-6 py-4 shadow-lg", role: "status", "aria-live": "assertive", "aria-busy": true, children: [
|
|
3426
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react9.Activity, { className: "w-6 h-6 animate-spin text-primary-background", "aria-hidden": true }),
|
|
3427
|
+
state.text && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "text-base font-medium text-foreground", children: state.text })
|
|
3320
3428
|
] })
|
|
3321
3429
|
}
|
|
3322
3430
|
);
|
|
@@ -3327,14 +3435,14 @@ var PageLoading = ({
|
|
|
3327
3435
|
}) => {
|
|
3328
3436
|
const t = (0, import_next_intl3.useTranslations)("Loading");
|
|
3329
3437
|
const defaultMessage = message || t("loadingPage");
|
|
3330
|
-
return /* @__PURE__ */ (0,
|
|
3438
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: cn(
|
|
3331
3439
|
"min-h-screen flex items-center justify-center bg-background",
|
|
3332
3440
|
className
|
|
3333
|
-
), children: /* @__PURE__ */ (0,
|
|
3334
|
-
/* @__PURE__ */ (0,
|
|
3335
|
-
/* @__PURE__ */ (0,
|
|
3336
|
-
/* @__PURE__ */ (0,
|
|
3337
|
-
/* @__PURE__ */ (0,
|
|
3441
|
+
), children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "text-center space-y-4", children: [
|
|
3442
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react9.Activity, { className: "w-8 h-8 animate-spin text-primary mx-auto" }),
|
|
3443
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { children: [
|
|
3444
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-lg font-medium text-foreground", children: defaultMessage }),
|
|
3445
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-sm text-muted-foreground mt-2", children: t("pleaseWait") })
|
|
3338
3446
|
] })
|
|
3339
3447
|
] }) });
|
|
3340
3448
|
};
|
|
@@ -3350,9 +3458,9 @@ var InlineLoading = ({
|
|
|
3350
3458
|
md: "w-6 h-6",
|
|
3351
3459
|
lg: "w-8 h-8"
|
|
3352
3460
|
};
|
|
3353
|
-
return /* @__PURE__ */ (0,
|
|
3354
|
-
/* @__PURE__ */ (0,
|
|
3355
|
-
text && /* @__PURE__ */ (0,
|
|
3461
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: cn("flex items-center justify-center space-x-2", className), children: [
|
|
3462
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react9.Activity, { className: cn("animate-spin text-primary", sizeClasses2[size]) }),
|
|
3463
|
+
text && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "text-sm text-muted-foreground animate-pulse", children: text })
|
|
3356
3464
|
] });
|
|
3357
3465
|
};
|
|
3358
3466
|
var ButtonLoading = ({
|
|
@@ -3366,7 +3474,7 @@ var ButtonLoading = ({
|
|
|
3366
3474
|
disabled: (children.props?.disabled ?? false) || disabled || isLoading,
|
|
3367
3475
|
"aria-busy": isLoading || void 0
|
|
3368
3476
|
}) : children;
|
|
3369
|
-
return /* @__PURE__ */ (0,
|
|
3477
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
3370
3478
|
"div",
|
|
3371
3479
|
{
|
|
3372
3480
|
className: cn(
|
|
@@ -3375,11 +3483,11 @@ var ButtonLoading = ({
|
|
|
3375
3483
|
className
|
|
3376
3484
|
),
|
|
3377
3485
|
children: [
|
|
3378
|
-
isLoading && /* @__PURE__ */ (0,
|
|
3379
|
-
/* @__PURE__ */ (0,
|
|
3380
|
-
loadingText && /* @__PURE__ */ (0,
|
|
3486
|
+
isLoading && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: [
|
|
3487
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react9.Activity, { className: "w-4 h-4 animate-spin text-primary-foreground" }),
|
|
3488
|
+
loadingText && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ml-2 text-sm", children: loadingText })
|
|
3381
3489
|
] }),
|
|
3382
|
-
/* @__PURE__ */ (0,
|
|
3490
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: cn(isLoading && "opacity-50 pointer-events-none"), children: child })
|
|
3383
3491
|
]
|
|
3384
3492
|
}
|
|
3385
3493
|
);
|
|
@@ -3388,8 +3496,8 @@ var ButtonLoading = ({
|
|
|
3388
3496
|
// ../../components/ui/Breadcrumb.tsx
|
|
3389
3497
|
var React15 = __toESM(require("react"), 1);
|
|
3390
3498
|
var import_link = __toESM(require("next/link"), 1);
|
|
3391
|
-
var
|
|
3392
|
-
var
|
|
3499
|
+
var import_lucide_react10 = require("lucide-react");
|
|
3500
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
3393
3501
|
var sizeStyles5 = {
|
|
3394
3502
|
sm: {
|
|
3395
3503
|
text: "text-xs",
|
|
@@ -3420,7 +3528,7 @@ var variantStyles4 = {
|
|
|
3420
3528
|
var Breadcrumb = ({
|
|
3421
3529
|
items,
|
|
3422
3530
|
className,
|
|
3423
|
-
separator =
|
|
3531
|
+
separator = import_lucide_react10.ChevronRight,
|
|
3424
3532
|
size = "md",
|
|
3425
3533
|
variant = "default",
|
|
3426
3534
|
maxItems = 5,
|
|
@@ -3436,16 +3544,16 @@ var Breadcrumb = ({
|
|
|
3436
3544
|
}, [items.length, maxItems, collapsible]);
|
|
3437
3545
|
const getSeparator = () => {
|
|
3438
3546
|
if (typeof separator === "string") {
|
|
3439
|
-
return /* @__PURE__ */ (0,
|
|
3547
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "text-muted-foreground", children: separator });
|
|
3440
3548
|
}
|
|
3441
3549
|
if (variant === "slash") {
|
|
3442
|
-
return /* @__PURE__ */ (0,
|
|
3550
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "text-muted-foreground", children: "/" });
|
|
3443
3551
|
}
|
|
3444
3552
|
if (variant === "arrow") {
|
|
3445
|
-
return /* @__PURE__ */ (0,
|
|
3553
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "text-muted-foreground", children: "\u2192" });
|
|
3446
3554
|
}
|
|
3447
3555
|
const SeparatorComponent = separator;
|
|
3448
|
-
return /* @__PURE__ */ (0,
|
|
3556
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SeparatorComponent, { className: cn("text-muted-foreground", sizeStyles5[size].icon) });
|
|
3449
3557
|
};
|
|
3450
3558
|
const processedItems = React15.useMemo(() => {
|
|
3451
3559
|
let finalItems = [...items];
|
|
@@ -3453,7 +3561,7 @@ var Breadcrumb = ({
|
|
|
3453
3561
|
finalItems.unshift({
|
|
3454
3562
|
label: "Home",
|
|
3455
3563
|
href: homeHref,
|
|
3456
|
-
icon:
|
|
3564
|
+
icon: import_lucide_react10.Home
|
|
3457
3565
|
});
|
|
3458
3566
|
}
|
|
3459
3567
|
if (isCollapsed && finalItems.length > maxItems) {
|
|
@@ -3466,17 +3574,17 @@ var Breadcrumb = ({
|
|
|
3466
3574
|
const handleCollapseToggle = () => {
|
|
3467
3575
|
setIsCollapsed(!isCollapsed);
|
|
3468
3576
|
};
|
|
3469
|
-
return /* @__PURE__ */ (0,
|
|
3577
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
3470
3578
|
"nav",
|
|
3471
3579
|
{
|
|
3472
3580
|
className: cn("flex w-full items-center", sizeStyles5[size].text, className),
|
|
3473
3581
|
"aria-label": "Breadcrumb navigation",
|
|
3474
|
-
children: /* @__PURE__ */ (0,
|
|
3582
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("ol", { className: cn("flex items-center", sizeStyles5[size].spacing), children: processedItems.map((item, index) => {
|
|
3475
3583
|
const isLast = index === processedItems.length - 1;
|
|
3476
3584
|
const isCollapsedIndicator = item.label === "...";
|
|
3477
3585
|
const Icon = item.icon;
|
|
3478
|
-
return /* @__PURE__ */ (0,
|
|
3479
|
-
isCollapsedIndicator ? /* @__PURE__ */ (0,
|
|
3586
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("li", { className: "flex items-center", children: [
|
|
3587
|
+
isCollapsedIndicator ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
3480
3588
|
"button",
|
|
3481
3589
|
{
|
|
3482
3590
|
onClick: handleCollapseToggle,
|
|
@@ -3487,9 +3595,9 @@ var Breadcrumb = ({
|
|
|
3487
3595
|
"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1"
|
|
3488
3596
|
),
|
|
3489
3597
|
"aria-label": "Show all breadcrumb items",
|
|
3490
|
-
children: /* @__PURE__ */ (0,
|
|
3598
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react10.MoreHorizontal, { className: sizeStyles5[size].icon })
|
|
3491
3599
|
}
|
|
3492
|
-
) : item.href && !isLast && !item.disabled ? /* @__PURE__ */ (0,
|
|
3600
|
+
) : item.href && !isLast && !item.disabled ? /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
3493
3601
|
import_link.default,
|
|
3494
3602
|
{
|
|
3495
3603
|
href: item.href,
|
|
@@ -3500,11 +3608,11 @@ var Breadcrumb = ({
|
|
|
3500
3608
|
"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 rounded-sm"
|
|
3501
3609
|
),
|
|
3502
3610
|
children: [
|
|
3503
|
-
Icon && /* @__PURE__ */ (0,
|
|
3504
|
-
/* @__PURE__ */ (0,
|
|
3611
|
+
Icon && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { className: sizeStyles5[size].icon }),
|
|
3612
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: item.label })
|
|
3505
3613
|
]
|
|
3506
3614
|
}
|
|
3507
|
-
) : /* @__PURE__ */ (0,
|
|
3615
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
3508
3616
|
"span",
|
|
3509
3617
|
{
|
|
3510
3618
|
className: cn(
|
|
@@ -3514,12 +3622,12 @@ var Breadcrumb = ({
|
|
|
3514
3622
|
),
|
|
3515
3623
|
"aria-current": isLast ? "page" : void 0,
|
|
3516
3624
|
children: [
|
|
3517
|
-
Icon && /* @__PURE__ */ (0,
|
|
3518
|
-
/* @__PURE__ */ (0,
|
|
3625
|
+
Icon && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { className: sizeStyles5[size].icon }),
|
|
3626
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: item.label })
|
|
3519
3627
|
]
|
|
3520
3628
|
}
|
|
3521
3629
|
),
|
|
3522
|
-
!isLast && /* @__PURE__ */ (0,
|
|
3630
|
+
!isLast && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
3523
3631
|
"span",
|
|
3524
3632
|
{
|
|
3525
3633
|
className: cn("mx-1", sizeStyles5[size].spacing),
|
|
@@ -3537,7 +3645,7 @@ var Breadcrumb_default = Breadcrumb;
|
|
|
3537
3645
|
|
|
3538
3646
|
// ../../components/ui/Tab.tsx
|
|
3539
3647
|
var React16 = __toESM(require("react"), 1);
|
|
3540
|
-
var
|
|
3648
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
3541
3649
|
var sizeStyles6 = {
|
|
3542
3650
|
sm: {
|
|
3543
3651
|
tab: "py-1.5 px-3 text-xs",
|
|
@@ -3625,14 +3733,14 @@ var Tabs = ({
|
|
|
3625
3733
|
className
|
|
3626
3734
|
);
|
|
3627
3735
|
const activeTab = tabs.find((tab) => tab.value === active);
|
|
3628
|
-
return /* @__PURE__ */ (0,
|
|
3629
|
-
/* @__PURE__ */ (0,
|
|
3736
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: cn("w-full", orientation === "vertical" && "flex gap-6"), children: [
|
|
3737
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: containerClasses, role: "tablist", "aria-orientation": orientation, children: [
|
|
3630
3738
|
tabs.map((tab, index) => {
|
|
3631
3739
|
const isActive = active === tab.value;
|
|
3632
3740
|
const Icon = tab.icon;
|
|
3633
3741
|
const tabId = `${baseId}-tab-${index}`;
|
|
3634
3742
|
const panelId = `${baseId}-panel-${index}`;
|
|
3635
|
-
return /* @__PURE__ */ (0,
|
|
3743
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
3636
3744
|
"button",
|
|
3637
3745
|
{
|
|
3638
3746
|
ref: (el) => {
|
|
@@ -3684,14 +3792,14 @@ var Tabs = ({
|
|
|
3684
3792
|
}
|
|
3685
3793
|
},
|
|
3686
3794
|
children: [
|
|
3687
|
-
Icon && /* @__PURE__ */ (0,
|
|
3795
|
+
Icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Icon, { className: "h-4 w-4" }),
|
|
3688
3796
|
tab.label
|
|
3689
3797
|
]
|
|
3690
3798
|
},
|
|
3691
3799
|
tab.value
|
|
3692
3800
|
);
|
|
3693
3801
|
}),
|
|
3694
|
-
variant === "underline" && orientation === "horizontal" && /* @__PURE__ */ (0,
|
|
3802
|
+
variant === "underline" && orientation === "horizontal" && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
3695
3803
|
"div",
|
|
3696
3804
|
{
|
|
3697
3805
|
className: "absolute bottom-0 h-0.5 bg-primary transition-all duration-300 ease-out",
|
|
@@ -3699,7 +3807,7 @@ var Tabs = ({
|
|
|
3699
3807
|
}
|
|
3700
3808
|
)
|
|
3701
3809
|
] }),
|
|
3702
|
-
/* @__PURE__ */ (0,
|
|
3810
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
3703
3811
|
"div",
|
|
3704
3812
|
{
|
|
3705
3813
|
role: "tabpanel",
|
|
@@ -3717,7 +3825,7 @@ var Tabs = ({
|
|
|
3717
3825
|
] });
|
|
3718
3826
|
};
|
|
3719
3827
|
var SimpleTabs = ({ tabs, defaultValue, className }) => {
|
|
3720
|
-
return /* @__PURE__ */ (0,
|
|
3828
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
3721
3829
|
Tabs,
|
|
3722
3830
|
{
|
|
3723
3831
|
tabs,
|
|
@@ -3729,7 +3837,7 @@ var SimpleTabs = ({ tabs, defaultValue, className }) => {
|
|
|
3729
3837
|
);
|
|
3730
3838
|
};
|
|
3731
3839
|
var PillTabs = ({ contained = true, ...props }) => {
|
|
3732
|
-
return /* @__PURE__ */ (0,
|
|
3840
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
3733
3841
|
Tabs,
|
|
3734
3842
|
{
|
|
3735
3843
|
...props,
|
|
@@ -3743,7 +3851,7 @@ var VerticalTabs = ({
|
|
|
3743
3851
|
className,
|
|
3744
3852
|
...props
|
|
3745
3853
|
}) => {
|
|
3746
|
-
return /* @__PURE__ */ (0,
|
|
3854
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: cn("flex gap-6", className), children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: cn(sidebarWidth, "flex-shrink-0"), children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
3747
3855
|
Tabs,
|
|
3748
3856
|
{
|
|
3749
3857
|
...props,
|
|
@@ -3757,7 +3865,7 @@ var VerticalTabs = ({
|
|
|
3757
3865
|
// ../../components/ui/DropdownMenu.tsx
|
|
3758
3866
|
var import_react10 = __toESM(require("react"), 1);
|
|
3759
3867
|
var import_react_dom5 = require("react-dom");
|
|
3760
|
-
var
|
|
3868
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
3761
3869
|
var DropdownMenu = ({
|
|
3762
3870
|
trigger,
|
|
3763
3871
|
children,
|
|
@@ -3879,28 +3987,24 @@ var DropdownMenu = ({
|
|
|
3879
3987
|
setOpen(false);
|
|
3880
3988
|
}
|
|
3881
3989
|
};
|
|
3882
|
-
const dropdownContent = open ? /* @__PURE__ */ (0,
|
|
3990
|
+
const dropdownContent = open ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
3883
3991
|
"div",
|
|
3884
3992
|
{
|
|
3885
3993
|
"data-dropdown-menu": true,
|
|
3994
|
+
"data-combobox-dropdown": true,
|
|
3886
3995
|
ref: contentRef,
|
|
3887
3996
|
style: {
|
|
3888
3997
|
position: "absolute",
|
|
3889
3998
|
top: position?.top ?? -9999,
|
|
3890
3999
|
left: position?.left ?? -9999,
|
|
3891
4000
|
zIndex: 9999,
|
|
3892
|
-
visibility: position ? "visible" : "hidden"
|
|
4001
|
+
visibility: position ? "visible" : "hidden",
|
|
4002
|
+
transformOrigin: "top center"
|
|
3893
4003
|
},
|
|
3894
4004
|
"data-state": open ? "open" : "closed",
|
|
3895
4005
|
role: "menu",
|
|
3896
|
-
className: cn(
|
|
3897
|
-
|
|
3898
|
-
// shadcn-like enter/exit animations
|
|
3899
|
-
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
3900
|
-
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
|
|
3901
|
-
className
|
|
3902
|
-
),
|
|
3903
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
4006
|
+
className: cn("z-9999 min-w-40", className),
|
|
4007
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
3904
4008
|
"div",
|
|
3905
4009
|
{
|
|
3906
4010
|
className: cn(
|
|
@@ -3910,7 +4014,7 @@ var DropdownMenu = ({
|
|
|
3910
4014
|
),
|
|
3911
4015
|
children: items ? items.map((item, index) => {
|
|
3912
4016
|
const IconComponent = item.icon;
|
|
3913
|
-
return /* @__PURE__ */ (0,
|
|
4017
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
3914
4018
|
"button",
|
|
3915
4019
|
{
|
|
3916
4020
|
ref: (el) => {
|
|
@@ -3921,7 +4025,7 @@ var DropdownMenu = ({
|
|
|
3921
4025
|
role: "menuitem",
|
|
3922
4026
|
tabIndex: -1,
|
|
3923
4027
|
style: {
|
|
3924
|
-
animationDelay: open ? `${index *
|
|
4028
|
+
animationDelay: open ? `${Math.min(index * 20, 200)}ms` : "0ms"
|
|
3925
4029
|
},
|
|
3926
4030
|
className: cn(
|
|
3927
4031
|
"dropdown-item flex w-full items-center gap-2 px-2.5 py-1.5 text-sm rounded-sm",
|
|
@@ -3932,7 +4036,7 @@ var DropdownMenu = ({
|
|
|
3932
4036
|
item.destructive && "text-destructive hover:bg-destructive/10 focus:bg-destructive/10"
|
|
3933
4037
|
),
|
|
3934
4038
|
children: [
|
|
3935
|
-
IconComponent && /* @__PURE__ */ (0,
|
|
4039
|
+
IconComponent && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(IconComponent, { className: "h-4 w-4" }),
|
|
3936
4040
|
item.label
|
|
3937
4041
|
]
|
|
3938
4042
|
},
|
|
@@ -3943,7 +4047,7 @@ var DropdownMenu = ({
|
|
|
3943
4047
|
)
|
|
3944
4048
|
}
|
|
3945
4049
|
) : null;
|
|
3946
|
-
return /* @__PURE__ */ (0,
|
|
4050
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
|
|
3947
4051
|
import_react10.default.cloneElement(trigger, {
|
|
3948
4052
|
ref: triggerRef,
|
|
3949
4053
|
onClick: handleTriggerClick,
|
|
@@ -3959,7 +4063,7 @@ var DropdownMenu = ({
|
|
|
3959
4063
|
dropdownContent && typeof window !== "undefined" && (0, import_react_dom5.createPortal)(dropdownContent, document.body)
|
|
3960
4064
|
] });
|
|
3961
4065
|
};
|
|
3962
|
-
var DropdownMenuItem = ({ children, onClick, disabled, destructive, className }) => /* @__PURE__ */ (0,
|
|
4066
|
+
var DropdownMenuItem = ({ children, onClick, disabled, destructive, className }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
3963
4067
|
"button",
|
|
3964
4068
|
{
|
|
3965
4069
|
onClick,
|
|
@@ -3975,11 +4079,11 @@ var DropdownMenuItem = ({ children, onClick, disabled, destructive, className })
|
|
|
3975
4079
|
children
|
|
3976
4080
|
}
|
|
3977
4081
|
);
|
|
3978
|
-
var DropdownMenuSeparator = ({ className }) => /* @__PURE__ */ (0,
|
|
3979
|
-
var SelectDropdown = ({ options, value, onChange, placeholder = "Select...", className }) => /* @__PURE__ */ (0,
|
|
4082
|
+
var DropdownMenuSeparator = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: cn("h-px bg-border my-1", className) });
|
|
4083
|
+
var SelectDropdown = ({ options, value, onChange, placeholder = "Select...", className }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
3980
4084
|
DropdownMenu,
|
|
3981
4085
|
{
|
|
3982
|
-
trigger: /* @__PURE__ */ (0,
|
|
4086
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
3983
4087
|
"button",
|
|
3984
4088
|
{
|
|
3985
4089
|
className: cn(
|
|
@@ -3989,8 +4093,8 @@ var SelectDropdown = ({ options, value, onChange, placeholder = "Select...", cla
|
|
|
3989
4093
|
className
|
|
3990
4094
|
),
|
|
3991
4095
|
children: [
|
|
3992
|
-
/* @__PURE__ */ (0,
|
|
3993
|
-
/* @__PURE__ */ (0,
|
|
4096
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "truncate max-w-64 text-foreground/90", children: value || placeholder }),
|
|
4097
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 20 20", fill: "none", className: "opacity-70", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("path", { d: "M6 8l4 4 4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
3994
4098
|
]
|
|
3995
4099
|
}
|
|
3996
4100
|
),
|
|
@@ -4004,14 +4108,14 @@ var DropdownMenu_default = DropdownMenu;
|
|
|
4004
4108
|
|
|
4005
4109
|
// ../../components/ui/Pagination.tsx
|
|
4006
4110
|
var React19 = __toESM(require("react"), 1);
|
|
4007
|
-
var
|
|
4111
|
+
var import_lucide_react12 = require("lucide-react");
|
|
4008
4112
|
|
|
4009
4113
|
// ../../components/ui/Combobox.tsx
|
|
4010
4114
|
var React18 = __toESM(require("react"), 1);
|
|
4011
4115
|
var import_react11 = require("react");
|
|
4012
4116
|
var import_react_dom6 = require("react-dom");
|
|
4013
|
-
var
|
|
4014
|
-
var
|
|
4117
|
+
var import_lucide_react11 = require("lucide-react");
|
|
4118
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
4015
4119
|
var getOptionLabel = (option) => {
|
|
4016
4120
|
return typeof option === "string" ? option : option.label;
|
|
4017
4121
|
};
|
|
@@ -4128,7 +4232,7 @@ var Combobox = ({
|
|
|
4128
4232
|
}, [open, enableSearch]);
|
|
4129
4233
|
const selectedOption = findOptionByValue(options, value);
|
|
4130
4234
|
const displayValue = selectedOption ? getOptionLabel(selectedOption) : "";
|
|
4131
|
-
const dropdownContent = /* @__PURE__ */ (0,
|
|
4235
|
+
const dropdownContent = /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
4132
4236
|
"div",
|
|
4133
4237
|
{
|
|
4134
4238
|
"data-combobox-dropdown": true,
|
|
@@ -4138,20 +4242,17 @@ var Combobox = ({
|
|
|
4138
4242
|
top: dropdownPosition?.top || 0,
|
|
4139
4243
|
left: dropdownPosition?.left || 0,
|
|
4140
4244
|
width: dropdownPosition?.width || 200,
|
|
4141
|
-
zIndex: 9999
|
|
4245
|
+
zIndex: 9999,
|
|
4246
|
+
transformOrigin: "top center"
|
|
4142
4247
|
},
|
|
4143
4248
|
"data-state": open ? "open" : "closed",
|
|
4144
4249
|
role: "listbox",
|
|
4145
4250
|
id: `${resolvedId}-listbox`,
|
|
4146
|
-
className:
|
|
4147
|
-
|
|
4148
|
-
"
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: cn("rounded-md border bg-popover text-popover-foreground shadow-md", "backdrop-blur-sm bg-popover/95 border-border/60"), children: [
|
|
4152
|
-
enableSearch && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "relative p-3 border-b border-border/50 bg-muted/20", children: [
|
|
4153
|
-
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_lucide_react12.Search, { className: "absolute left-6 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground transition-colors" }),
|
|
4154
|
-
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4251
|
+
className: "z-9999",
|
|
4252
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: cn("rounded-md border bg-popover text-popover-foreground shadow-md", "backdrop-blur-sm bg-popover/95 border-border/60"), children: [
|
|
4253
|
+
enableSearch && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "relative p-3 border-b border-border/50 bg-muted/20", children: [
|
|
4254
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react11.Search, { className: "absolute left-6 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground transition-colors" }),
|
|
4255
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
4155
4256
|
"input",
|
|
4156
4257
|
{
|
|
4157
4258
|
ref: inputRef,
|
|
@@ -4190,14 +4291,14 @@ var Combobox = ({
|
|
|
4190
4291
|
}
|
|
4191
4292
|
)
|
|
4192
4293
|
] }),
|
|
4193
|
-
/* @__PURE__ */ (0,
|
|
4194
|
-
/* @__PURE__ */ (0,
|
|
4195
|
-
/* @__PURE__ */ (0,
|
|
4294
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "max-h-64 overflow-y-auto overscroll-contain", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("ul", { className: "p-1 space-y-1", children: loading2 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { className: "px-3 py-8 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
4295
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react11.Loader2, { className: "h-6 w-6 animate-spin text-primary" }),
|
|
4296
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "text-sm text-muted-foreground", children: loadingText || "Loading..." })
|
|
4196
4297
|
] }) }) : filteredOptions.length > 0 ? filteredOptions.map((item, index) => {
|
|
4197
4298
|
const itemValue = getOptionValue(item);
|
|
4198
4299
|
const itemLabel = getOptionLabel(item);
|
|
4199
4300
|
const isSelected = itemValue === value;
|
|
4200
|
-
return /* @__PURE__ */ (0,
|
|
4301
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
4201
4302
|
"li",
|
|
4202
4303
|
{
|
|
4203
4304
|
ref: (node) => {
|
|
@@ -4209,7 +4310,7 @@ var Combobox = ({
|
|
|
4209
4310
|
"aria-selected": isSelected,
|
|
4210
4311
|
onClick: () => handleSelect(item),
|
|
4211
4312
|
style: {
|
|
4212
|
-
animationDelay: open ? `${index *
|
|
4313
|
+
animationDelay: open ? `${Math.min(index * 20, 200)}ms` : "0ms"
|
|
4213
4314
|
},
|
|
4214
4315
|
className: cn(
|
|
4215
4316
|
"dropdown-item group flex cursor-pointer items-center justify-between rounded-sm px-2.5 py-1.5 text-sm",
|
|
@@ -4221,24 +4322,16 @@ var Combobox = ({
|
|
|
4221
4322
|
isSelected && "bg-accent text-accent-foreground"
|
|
4222
4323
|
),
|
|
4223
4324
|
children: [
|
|
4224
|
-
/* @__PURE__ */ (0,
|
|
4225
|
-
isSelected && /* @__PURE__ */ (0,
|
|
4325
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "truncate", children: itemLabel }),
|
|
4326
|
+
isSelected && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react11.Check, { className: "h-4 w-4 text-primary" })
|
|
4226
4327
|
]
|
|
4227
4328
|
},
|
|
4228
4329
|
`${itemValue}-${index}`
|
|
4229
4330
|
);
|
|
4230
|
-
}) : /* @__PURE__ */ (0,
|
|
4231
|
-
/* @__PURE__ */ (0,
|
|
4232
|
-
/* @__PURE__ */ (0,
|
|
4233
|
-
query && /* @__PURE__ */ (0,
|
|
4234
|
-
"button",
|
|
4235
|
-
{
|
|
4236
|
-
type: "button",
|
|
4237
|
-
onClick: () => setQuery(""),
|
|
4238
|
-
className: "text-xs text-primary hover:underline",
|
|
4239
|
-
children: "Clear search"
|
|
4240
|
-
}
|
|
4241
|
-
)
|
|
4331
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { className: "px-3 py-8 text-center text-muted-foreground text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
4332
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react11.SearchX, { className: "h-8 w-8 opacity-40 text-muted-foreground" }),
|
|
4333
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "text-sm", children: emptyText }),
|
|
4334
|
+
query && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("button", { type: "button", onClick: () => setQuery(""), className: "text-xs text-primary hover:underline", children: "Clear search" })
|
|
4242
4335
|
] }) }) }) })
|
|
4243
4336
|
] })
|
|
4244
4337
|
}
|
|
@@ -4252,8 +4345,8 @@ var Combobox = ({
|
|
|
4252
4345
|
const labelSize = size === "sm" ? "text-xs" : size === "lg" ? "text-base" : "text-sm";
|
|
4253
4346
|
const radiusClass = size === "sm" ? "rounded-md" : "rounded-lg";
|
|
4254
4347
|
const verticalGap = size === "sm" ? "space-y-1.5" : "space-y-2";
|
|
4255
|
-
return /* @__PURE__ */ (0,
|
|
4256
|
-
label && /* @__PURE__ */ (0,
|
|
4348
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: cn("w-full group", verticalGap), children: [
|
|
4349
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
4257
4350
|
"label",
|
|
4258
4351
|
{
|
|
4259
4352
|
id: labelId,
|
|
@@ -4265,11 +4358,11 @@ var Combobox = ({
|
|
|
4265
4358
|
),
|
|
4266
4359
|
children: [
|
|
4267
4360
|
label,
|
|
4268
|
-
required && /* @__PURE__ */ (0,
|
|
4361
|
+
required && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "text-destructive ml-1", children: "*" })
|
|
4269
4362
|
]
|
|
4270
4363
|
}
|
|
4271
4364
|
) }),
|
|
4272
|
-
/* @__PURE__ */ (0,
|
|
4365
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
4273
4366
|
"button",
|
|
4274
4367
|
{
|
|
4275
4368
|
ref: triggerRef,
|
|
@@ -4299,10 +4392,10 @@ var Combobox = ({
|
|
|
4299
4392
|
className
|
|
4300
4393
|
),
|
|
4301
4394
|
children: [
|
|
4302
|
-
/* @__PURE__ */ (0,
|
|
4303
|
-
/* @__PURE__ */ (0,
|
|
4395
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: cn("truncate", !displayValue && "text-muted-foreground", fontBold && "font-bold"), children: displayValue || placeholder }),
|
|
4396
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-1 ml-2", children: [
|
|
4304
4397
|
allowClear && value && !disabled && // FIX: Use a div instead of a nested button
|
|
4305
|
-
/* @__PURE__ */ (0,
|
|
4398
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
4306
4399
|
"div",
|
|
4307
4400
|
{
|
|
4308
4401
|
role: "button",
|
|
@@ -4311,18 +4404,10 @@ var Combobox = ({
|
|
|
4311
4404
|
onClick: handleClear,
|
|
4312
4405
|
onKeyDown: (e) => (e.key === "Enter" || e.key === " ") && handleClear(e),
|
|
4313
4406
|
className: "opacity-0 group-hover:opacity-100 transition-opacity p-0.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive",
|
|
4314
|
-
children: /* @__PURE__ */ (0,
|
|
4407
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react11.X, { className: "h-3 w-3" })
|
|
4315
4408
|
}
|
|
4316
4409
|
),
|
|
4317
|
-
/* @__PURE__ */ (0,
|
|
4318
|
-
import_lucide_react12.ChevronDown,
|
|
4319
|
-
{
|
|
4320
|
-
className: cn(
|
|
4321
|
-
"h-4 w-4 text-muted-foreground transition-all duration-200",
|
|
4322
|
-
open && "rotate-180 scale-110 text-primary"
|
|
4323
|
-
)
|
|
4324
|
-
}
|
|
4325
|
-
)
|
|
4410
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react11.ChevronDown, { className: cn("h-4 w-4 text-muted-foreground transition-all duration-200", open && "rotate-180 scale-110 text-primary") })
|
|
4326
4411
|
] })
|
|
4327
4412
|
]
|
|
4328
4413
|
}
|
|
@@ -4333,7 +4418,7 @@ var Combobox = ({
|
|
|
4333
4418
|
|
|
4334
4419
|
// ../../components/ui/Pagination.tsx
|
|
4335
4420
|
var import_next_intl4 = require("next-intl");
|
|
4336
|
-
var
|
|
4421
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
4337
4422
|
var Pagination = ({
|
|
4338
4423
|
page,
|
|
4339
4424
|
totalPages,
|
|
@@ -4416,18 +4501,18 @@ var Pagination = ({
|
|
|
4416
4501
|
}
|
|
4417
4502
|
};
|
|
4418
4503
|
if (totalPages <= 1) return null;
|
|
4419
|
-
return /* @__PURE__ */ (0,
|
|
4420
|
-
showInfo && totalItems && /* @__PURE__ */ (0,
|
|
4421
|
-
/* @__PURE__ */ (0,
|
|
4504
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("nav", { className: cn("flex flex-col gap-4", className), "aria-label": labels?.navigationLabel || t("navigationLabel"), children: [
|
|
4505
|
+
showInfo && totalItems && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: cn("text-sm text-muted-foreground", textAlignmentClass), children: labels?.showingResults ? labels.showingResults({ startItem: startItem || 0, endItem: endItem || 0, totalItems }) : t("showingResults", { startItem: startItem || 0, endItem: endItem || 0, totalItems }) }),
|
|
4506
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: cn("flex items-center justify-between", {
|
|
4422
4507
|
"flex-row-reverse": alignment === "right" || alignment === "center"
|
|
4423
4508
|
}), children: [
|
|
4424
|
-
/* @__PURE__ */ (0,
|
|
4425
|
-
showFirstLast && /* @__PURE__ */ (0,
|
|
4509
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: cn("flex items-center gap-1"), children: [
|
|
4510
|
+
showFirstLast && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4426
4511
|
Button_default,
|
|
4427
4512
|
{
|
|
4428
4513
|
variant: getButtonVariant(false),
|
|
4429
4514
|
size,
|
|
4430
|
-
icon:
|
|
4515
|
+
icon: import_lucide_react12.ChevronsLeft,
|
|
4431
4516
|
onClick: () => onChange(1),
|
|
4432
4517
|
disabled: disabled || page === 1,
|
|
4433
4518
|
className: "hidden sm:flex",
|
|
@@ -4436,27 +4521,27 @@ var Pagination = ({
|
|
|
4436
4521
|
"aria-disabled": disabled || page === 1
|
|
4437
4522
|
}
|
|
4438
4523
|
),
|
|
4439
|
-
showPrevNext && /* @__PURE__ */ (0,
|
|
4524
|
+
showPrevNext && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4440
4525
|
Button_default,
|
|
4441
4526
|
{
|
|
4442
4527
|
variant: getButtonVariant(false),
|
|
4443
4528
|
size,
|
|
4444
|
-
icon:
|
|
4529
|
+
icon: import_lucide_react12.ChevronLeft,
|
|
4445
4530
|
onClick: () => onChange(Math.max(1, page - 1)),
|
|
4446
4531
|
disabled: disabled || page === 1,
|
|
4447
4532
|
title: labels?.previousPage || t("previousPage"),
|
|
4448
4533
|
"aria-label": labels?.previousPage || t("previousPage"),
|
|
4449
4534
|
"aria-disabled": disabled || page === 1,
|
|
4450
|
-
children: /* @__PURE__ */ (0,
|
|
4535
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "hidden sm:inline", children: labels?.previous || t("previous") })
|
|
4451
4536
|
}
|
|
4452
4537
|
),
|
|
4453
4538
|
showPageNumbers && createPageArray().map((p, i) => {
|
|
4454
4539
|
if (p === "...") {
|
|
4455
|
-
return /* @__PURE__ */ (0,
|
|
4540
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Button_default, { variant: "ghost", size, disabled: true, icon: import_lucide_react12.MoreHorizontal, className: "cursor-default" }, i);
|
|
4456
4541
|
}
|
|
4457
4542
|
const pageNumber = p;
|
|
4458
4543
|
const isActive = page === pageNumber;
|
|
4459
|
-
return /* @__PURE__ */ (0,
|
|
4544
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4460
4545
|
Button_default,
|
|
4461
4546
|
{
|
|
4462
4547
|
variant: getButtonVariant(isActive),
|
|
@@ -4471,26 +4556,26 @@ var Pagination = ({
|
|
|
4471
4556
|
i
|
|
4472
4557
|
);
|
|
4473
4558
|
}),
|
|
4474
|
-
showPrevNext && /* @__PURE__ */ (0,
|
|
4559
|
+
showPrevNext && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4475
4560
|
Button_default,
|
|
4476
4561
|
{
|
|
4477
4562
|
variant: getButtonVariant(false),
|
|
4478
4563
|
size,
|
|
4479
|
-
iconRight:
|
|
4564
|
+
iconRight: import_lucide_react12.ChevronRight,
|
|
4480
4565
|
onClick: () => onChange(Math.min(totalPages, page + 1)),
|
|
4481
4566
|
disabled: disabled || page === totalPages,
|
|
4482
4567
|
title: labels?.nextPage || t("nextPage"),
|
|
4483
4568
|
"aria-label": labels?.nextPage || t("nextPage"),
|
|
4484
4569
|
"aria-disabled": disabled || page === totalPages,
|
|
4485
|
-
children: /* @__PURE__ */ (0,
|
|
4570
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "hidden sm:inline", children: labels?.next || t("next") })
|
|
4486
4571
|
}
|
|
4487
4572
|
),
|
|
4488
|
-
showFirstLast && /* @__PURE__ */ (0,
|
|
4573
|
+
showFirstLast && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4489
4574
|
Button_default,
|
|
4490
4575
|
{
|
|
4491
4576
|
variant: getButtonVariant(false),
|
|
4492
4577
|
size,
|
|
4493
|
-
icon:
|
|
4578
|
+
icon: import_lucide_react12.ChevronsRight,
|
|
4494
4579
|
onClick: () => onChange(totalPages),
|
|
4495
4580
|
disabled: disabled || page === totalPages,
|
|
4496
4581
|
className: "hidden sm:flex",
|
|
@@ -4500,12 +4585,12 @@ var Pagination = ({
|
|
|
4500
4585
|
}
|
|
4501
4586
|
)
|
|
4502
4587
|
] }),
|
|
4503
|
-
pageSizeOptions && onPageSizeChange && /* @__PURE__ */ (0,
|
|
4504
|
-
/* @__PURE__ */ (0,
|
|
4588
|
+
pageSizeOptions && onPageSizeChange && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: cn("flex items-center gap-2 text-sm"), children: [
|
|
4589
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
4505
4590
|
labels?.itemsPerPage || t("itemsPerPage"),
|
|
4506
4591
|
":"
|
|
4507
4592
|
] }),
|
|
4508
|
-
/* @__PURE__ */ (0,
|
|
4593
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "w-20", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4509
4594
|
Combobox,
|
|
4510
4595
|
{
|
|
4511
4596
|
options: pageSizeOptionsStrings,
|
|
@@ -4534,8 +4619,8 @@ var SimplePagination = ({
|
|
|
4534
4619
|
pageSize = 10
|
|
4535
4620
|
}) => {
|
|
4536
4621
|
if (totalPages <= 1) return null;
|
|
4537
|
-
return /* @__PURE__ */ (0,
|
|
4538
|
-
showInfo && totalItems && /* @__PURE__ */ (0,
|
|
4622
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
4623
|
+
showInfo && totalItems && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "text-sm text-muted-foreground text-center", children: [
|
|
4539
4624
|
"Page ",
|
|
4540
4625
|
page,
|
|
4541
4626
|
" of ",
|
|
@@ -4544,20 +4629,20 @@ var SimplePagination = ({
|
|
|
4544
4629
|
totalItems,
|
|
4545
4630
|
" total items)"
|
|
4546
4631
|
] }),
|
|
4547
|
-
/* @__PURE__ */ (0,
|
|
4548
|
-
/* @__PURE__ */ (0,
|
|
4549
|
-
/* @__PURE__ */ (0,
|
|
4550
|
-
/* @__PURE__ */ (0,
|
|
4551
|
-
/* @__PURE__ */ (0,
|
|
4552
|
-
/* @__PURE__ */ (0,
|
|
4553
|
-
/* @__PURE__ */ (0,
|
|
4632
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
4633
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Button_default, { variant, size, icon: import_lucide_react12.ChevronLeft, onClick: () => onChange(Math.max(1, page - 1)), disabled: disabled || page === 1, children: "Previous" }),
|
|
4634
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
4635
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: "Page" }),
|
|
4636
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "font-medium text-foreground", children: page }),
|
|
4637
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: "of" }),
|
|
4638
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "font-medium text-foreground", children: totalPages })
|
|
4554
4639
|
] }),
|
|
4555
|
-
/* @__PURE__ */ (0,
|
|
4640
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4556
4641
|
Button_default,
|
|
4557
4642
|
{
|
|
4558
4643
|
variant,
|
|
4559
4644
|
size,
|
|
4560
|
-
iconRight:
|
|
4645
|
+
iconRight: import_lucide_react12.ChevronRight,
|
|
4561
4646
|
onClick: () => onChange(Math.min(totalPages, page + 1)),
|
|
4562
4647
|
disabled: disabled || page === totalPages,
|
|
4563
4648
|
children: "Next"
|
|
@@ -4575,52 +4660,52 @@ var CompactPagination = ({
|
|
|
4575
4660
|
disabled = false
|
|
4576
4661
|
}) => {
|
|
4577
4662
|
if (totalPages <= 1) return null;
|
|
4578
|
-
return /* @__PURE__ */ (0,
|
|
4579
|
-
/* @__PURE__ */ (0,
|
|
4663
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("nav", { className: cn("flex items-center gap-1", className), "aria-label": "Compact Pagination", children: [
|
|
4664
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4580
4665
|
Button_default,
|
|
4581
4666
|
{
|
|
4582
4667
|
variant,
|
|
4583
4668
|
size: "icon",
|
|
4584
|
-
icon:
|
|
4669
|
+
icon: import_lucide_react12.ChevronsLeft,
|
|
4585
4670
|
onClick: () => onChange(1),
|
|
4586
4671
|
disabled: disabled || page === 1,
|
|
4587
4672
|
title: "First page",
|
|
4588
4673
|
"aria-label": "First page"
|
|
4589
4674
|
}
|
|
4590
4675
|
),
|
|
4591
|
-
/* @__PURE__ */ (0,
|
|
4676
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4592
4677
|
Button_default,
|
|
4593
4678
|
{
|
|
4594
4679
|
variant,
|
|
4595
4680
|
size: "icon",
|
|
4596
|
-
icon:
|
|
4681
|
+
icon: import_lucide_react12.ChevronLeft,
|
|
4597
4682
|
onClick: () => onChange(Math.max(1, page - 1)),
|
|
4598
4683
|
disabled: disabled || page === 1,
|
|
4599
4684
|
title: "Previous page"
|
|
4600
4685
|
}
|
|
4601
4686
|
),
|
|
4602
|
-
/* @__PURE__ */ (0,
|
|
4687
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "px-2 py-1 text-sm text-muted-foreground min-w-[4rem] text-center", children: [
|
|
4603
4688
|
page,
|
|
4604
4689
|
" / ",
|
|
4605
4690
|
totalPages
|
|
4606
4691
|
] }),
|
|
4607
|
-
/* @__PURE__ */ (0,
|
|
4692
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4608
4693
|
Button_default,
|
|
4609
4694
|
{
|
|
4610
4695
|
variant,
|
|
4611
4696
|
size: "icon",
|
|
4612
|
-
icon:
|
|
4697
|
+
icon: import_lucide_react12.ChevronRight,
|
|
4613
4698
|
onClick: () => onChange(Math.min(totalPages, page + 1)),
|
|
4614
4699
|
disabled: disabled || page === totalPages,
|
|
4615
4700
|
title: "Next page"
|
|
4616
4701
|
}
|
|
4617
4702
|
),
|
|
4618
|
-
/* @__PURE__ */ (0,
|
|
4703
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
4619
4704
|
Button_default,
|
|
4620
4705
|
{
|
|
4621
4706
|
variant,
|
|
4622
4707
|
size: "icon",
|
|
4623
|
-
icon:
|
|
4708
|
+
icon: import_lucide_react12.ChevronsRight,
|
|
4624
4709
|
onClick: () => onChange(totalPages),
|
|
4625
4710
|
disabled: disabled || page === totalPages,
|
|
4626
4711
|
title: "Last page"
|
|
@@ -4631,7 +4716,7 @@ var CompactPagination = ({
|
|
|
4631
4716
|
|
|
4632
4717
|
// ../../components/ui/Section.tsx
|
|
4633
4718
|
var import_react12 = __toESM(require("react"), 1);
|
|
4634
|
-
var
|
|
4719
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
4635
4720
|
var Section = import_react12.default.forwardRef(
|
|
4636
4721
|
({
|
|
4637
4722
|
children,
|
|
@@ -4654,7 +4739,7 @@ var Section = import_react12.default.forwardRef(
|
|
|
4654
4739
|
lg: "py-12",
|
|
4655
4740
|
xl: "py-16"
|
|
4656
4741
|
};
|
|
4657
|
-
return /* @__PURE__ */ (0,
|
|
4742
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
4658
4743
|
"section",
|
|
4659
4744
|
{
|
|
4660
4745
|
ref,
|
|
@@ -4676,9 +4761,9 @@ var Section_default = Section;
|
|
|
4676
4761
|
|
|
4677
4762
|
// ../../components/ui/ScrollArea.tsx
|
|
4678
4763
|
var import_react13 = require("react");
|
|
4679
|
-
var
|
|
4764
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
4680
4765
|
var ScrollArea = (0, import_react13.forwardRef)(({ className, children, ...props }, ref) => {
|
|
4681
|
-
return /* @__PURE__ */ (0,
|
|
4766
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { ref, className: cn("relative overflow-hidden bg-background", className), ...props, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: cn("h-full w-full overflow-y-auto scroll-area-viewport"), children }) });
|
|
4682
4767
|
});
|
|
4683
4768
|
ScrollArea.displayName = "ScrollArea";
|
|
4684
4769
|
|
|
@@ -4686,7 +4771,7 @@ ScrollArea.displayName = "ScrollArea";
|
|
|
4686
4771
|
var React21 = __toESM(require("react"), 1);
|
|
4687
4772
|
var import_react14 = require("react");
|
|
4688
4773
|
var import_react_dom7 = require("react-dom");
|
|
4689
|
-
var
|
|
4774
|
+
var import_lucide_react13 = require("lucide-react");
|
|
4690
4775
|
var import_next_intl5 = require("next-intl");
|
|
4691
4776
|
|
|
4692
4777
|
// ../../lib/utils/date.ts
|
|
@@ -4869,7 +4954,7 @@ function formatDateWithDay(date) {
|
|
|
4869
4954
|
}
|
|
4870
4955
|
|
|
4871
4956
|
// ../../components/ui/DatePicker.tsx
|
|
4872
|
-
var
|
|
4957
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
4873
4958
|
var DatePicker = ({
|
|
4874
4959
|
id,
|
|
4875
4960
|
value,
|
|
@@ -4980,7 +5065,7 @@ var DatePicker = ({
|
|
|
4980
5065
|
const firstDayOfMonth = getFirstDayOfMonth(viewDate);
|
|
4981
5066
|
const days = [];
|
|
4982
5067
|
for (let i = 0; i < firstDayOfMonth; i++) {
|
|
4983
|
-
days.push(/* @__PURE__ */ (0,
|
|
5068
|
+
days.push(/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "w-8 h-8" }, `empty-${i}`));
|
|
4984
5069
|
}
|
|
4985
5070
|
for (let day = 1; day <= daysInMonth; day++) {
|
|
4986
5071
|
const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), day);
|
|
@@ -4989,7 +5074,7 @@ var DatePicker = ({
|
|
|
4989
5074
|
const totalDaysFromStart = firstDayOfMonth + day - 1;
|
|
4990
5075
|
const rowIndex = Math.floor(totalDaysFromStart / 7);
|
|
4991
5076
|
days.push(
|
|
4992
|
-
/* @__PURE__ */ (0,
|
|
5077
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
4993
5078
|
"button",
|
|
4994
5079
|
{
|
|
4995
5080
|
onClick: () => handleDateSelect(date),
|
|
@@ -5011,7 +5096,7 @@ var DatePicker = ({
|
|
|
5011
5096
|
}
|
|
5012
5097
|
return days;
|
|
5013
5098
|
};
|
|
5014
|
-
const datePickerContent = isOpen && dropdownPosition ? /* @__PURE__ */ (0,
|
|
5099
|
+
const datePickerContent = isOpen && dropdownPosition ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
5015
5100
|
"div",
|
|
5016
5101
|
{
|
|
5017
5102
|
"data-datepicker": true,
|
|
@@ -5029,7 +5114,7 @@ var DatePicker = ({
|
|
|
5029
5114
|
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
5030
5115
|
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"
|
|
5031
5116
|
),
|
|
5032
|
-
children: /* @__PURE__ */ (0,
|
|
5117
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
5033
5118
|
"div",
|
|
5034
5119
|
{
|
|
5035
5120
|
ref: dropdownRef,
|
|
@@ -5040,14 +5125,14 @@ var DatePicker = ({
|
|
|
5040
5125
|
),
|
|
5041
5126
|
style: { pointerEvents: "auto" },
|
|
5042
5127
|
children: [
|
|
5043
|
-
/* @__PURE__ */ (0,
|
|
5044
|
-
/* @__PURE__ */ (0,
|
|
5045
|
-
/* @__PURE__ */ (0,
|
|
5046
|
-
/* @__PURE__ */ (0,
|
|
5128
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
|
|
5129
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Button_default, { variant: "ghost", size: "sm", onClick: () => navigateMonth("prev"), className: "p-1 h-auto", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react13.ChevronLeft, { className: "h-4 w-4" }) }),
|
|
5130
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "text-sm font-semibold", children: viewDate.toLocaleDateString("en-US", { month: "long", year: "numeric" }) }),
|
|
5131
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Button_default, { variant: "ghost", size: "sm", onClick: () => navigateMonth("next"), className: "p-1 h-auto", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react13.ChevronRight, { className: "h-4 w-4" }) })
|
|
5047
5132
|
] }),
|
|
5048
|
-
/* @__PURE__ */ (0,
|
|
5049
|
-
/* @__PURE__ */ (0,
|
|
5050
|
-
/* @__PURE__ */ (0,
|
|
5133
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: cn("grid grid-cols-7 gap-1", size === "sm" ? "mb-1" : "mb-2"), children: (weekdayLabels || ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]).map((day) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: cn("text-muted-foreground text-center font-medium", size === "sm" ? "text-[10px] py-0.5" : "text-xs py-1"), children: day }, day)) }),
|
|
5134
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "grid grid-cols-7 gap-1", children: renderCalendar() }),
|
|
5135
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "flex items-center justify-end mt-2", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
5051
5136
|
Button_default,
|
|
5052
5137
|
{
|
|
5053
5138
|
variant: "outline",
|
|
@@ -5071,8 +5156,8 @@ var DatePicker = ({
|
|
|
5071
5156
|
const labelSize = size === "sm" ? "text-xs" : "text-sm";
|
|
5072
5157
|
const radiusClass = size === "sm" ? "rounded-md" : "rounded-lg";
|
|
5073
5158
|
const verticalGap = size === "sm" ? "space-y-1.5" : "space-y-2";
|
|
5074
|
-
return /* @__PURE__ */ (0,
|
|
5075
|
-
label && /* @__PURE__ */ (0,
|
|
5159
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: cn("w-full group", verticalGap), children: [
|
|
5160
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
5076
5161
|
"label",
|
|
5077
5162
|
{
|
|
5078
5163
|
id: labelId,
|
|
@@ -5084,11 +5169,11 @@ var DatePicker = ({
|
|
|
5084
5169
|
),
|
|
5085
5170
|
children: [
|
|
5086
5171
|
label,
|
|
5087
|
-
required && /* @__PURE__ */ (0,
|
|
5172
|
+
required && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "text-destructive ml-1", children: "*" })
|
|
5088
5173
|
]
|
|
5089
5174
|
}
|
|
5090
5175
|
) }),
|
|
5091
|
-
/* @__PURE__ */ (0,
|
|
5176
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
5092
5177
|
"button",
|
|
5093
5178
|
{
|
|
5094
5179
|
ref: triggerRef,
|
|
@@ -5116,8 +5201,8 @@ var DatePicker = ({
|
|
|
5116
5201
|
className
|
|
5117
5202
|
),
|
|
5118
5203
|
children: [
|
|
5119
|
-
/* @__PURE__ */ (0,
|
|
5120
|
-
value && /* @__PURE__ */ (0,
|
|
5204
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: cn("truncate", !value && "text-muted-foreground"), children: value ? formatDateDisplay(value) : placeholder || t("placeholder") }),
|
|
5205
|
+
value && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
5121
5206
|
"span",
|
|
5122
5207
|
{
|
|
5123
5208
|
role: "button",
|
|
@@ -5139,10 +5224,10 @@ var DatePicker = ({
|
|
|
5139
5224
|
},
|
|
5140
5225
|
className: "absolute right-8 inline-flex items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors cursor-pointer",
|
|
5141
5226
|
style: { width: 20, height: 20 },
|
|
5142
|
-
children: /* @__PURE__ */ (0,
|
|
5227
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react13.X, { className: "h-3.5 w-3.5" })
|
|
5143
5228
|
}
|
|
5144
5229
|
),
|
|
5145
|
-
/* @__PURE__ */ (0,
|
|
5230
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react13.Calendar, { className: "h-4 w-4 text-muted-foreground ml-2" })
|
|
5146
5231
|
]
|
|
5147
5232
|
}
|
|
5148
5233
|
),
|
|
@@ -5227,7 +5312,7 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
|
|
|
5227
5312
|
const nodes = [];
|
|
5228
5313
|
const daysInMonth = getDaysInMonth(viewDate);
|
|
5229
5314
|
const firstDay = getFirstDayOfMonth(viewDate);
|
|
5230
|
-
for (let i = 0; i < firstDay; i++) nodes.push(/* @__PURE__ */ (0,
|
|
5315
|
+
for (let i = 0; i < firstDay; i++) nodes.push(/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "w-8 h-8" }, `e-${i}`));
|
|
5231
5316
|
for (let d = 1; d <= daysInMonth; d++) {
|
|
5232
5317
|
const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), d);
|
|
5233
5318
|
const isSelectedStart = isSameDay2(date, tempStart);
|
|
@@ -5252,7 +5337,7 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
|
|
|
5252
5337
|
}
|
|
5253
5338
|
}
|
|
5254
5339
|
nodes.push(
|
|
5255
|
-
/* @__PURE__ */ (0,
|
|
5340
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
5256
5341
|
"button",
|
|
5257
5342
|
{
|
|
5258
5343
|
onClick: () => handleSelect(date),
|
|
@@ -5282,7 +5367,7 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
|
|
|
5282
5367
|
}
|
|
5283
5368
|
return nodes;
|
|
5284
5369
|
};
|
|
5285
|
-
const panel = isOpen && dropdownPosition ? /* @__PURE__ */ (0,
|
|
5370
|
+
const panel = isOpen && dropdownPosition ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
5286
5371
|
"div",
|
|
5287
5372
|
{
|
|
5288
5373
|
style: { position: "absolute", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width || 256, zIndex: 9999 },
|
|
@@ -5292,37 +5377,37 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
|
|
|
5292
5377
|
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
5293
5378
|
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"
|
|
5294
5379
|
),
|
|
5295
|
-
children: /* @__PURE__ */ (0,
|
|
5380
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
5296
5381
|
"div",
|
|
5297
5382
|
{
|
|
5298
5383
|
ref: panelRef,
|
|
5299
5384
|
className: cn("rounded-md border bg-popover text-popover-foreground shadow-md", "backdrop-blur-sm bg-popover/95 border-border/60 p-4 w-64"),
|
|
5300
5385
|
children: [
|
|
5301
|
-
/* @__PURE__ */ (0,
|
|
5302
|
-
/* @__PURE__ */ (0,
|
|
5386
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [
|
|
5387
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
5303
5388
|
Button_default,
|
|
5304
5389
|
{
|
|
5305
5390
|
variant: "ghost",
|
|
5306
5391
|
size: "sm",
|
|
5307
5392
|
onClick: () => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() - 1, 1)),
|
|
5308
5393
|
className: "p-1 h-auto",
|
|
5309
|
-
children: /* @__PURE__ */ (0,
|
|
5394
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react13.ChevronLeft, { className: "h-4 w-4" })
|
|
5310
5395
|
}
|
|
5311
5396
|
),
|
|
5312
|
-
/* @__PURE__ */ (0,
|
|
5313
|
-
/* @__PURE__ */ (0,
|
|
5397
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "text-sm font-semibold", children: viewDate.toLocaleDateString("en-US", { month: "long", year: "numeric" }) }),
|
|
5398
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
5314
5399
|
Button_default,
|
|
5315
5400
|
{
|
|
5316
5401
|
variant: "ghost",
|
|
5317
5402
|
size: "sm",
|
|
5318
5403
|
onClick: () => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 1)),
|
|
5319
5404
|
className: "p-1 h-auto",
|
|
5320
|
-
children: /* @__PURE__ */ (0,
|
|
5405
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react13.ChevronRight, { className: "h-4 w-4" })
|
|
5321
5406
|
}
|
|
5322
5407
|
)
|
|
5323
5408
|
] }),
|
|
5324
|
-
/* @__PURE__ */ (0,
|
|
5325
|
-
/* @__PURE__ */ (0,
|
|
5409
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "grid grid-cols-7 gap-1 mb-2", children: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map((d) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "text-xs text-muted-foreground text-center py-1 font-medium", children: d }, d)) }),
|
|
5410
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "grid grid-cols-7", children: renderGrid() })
|
|
5326
5411
|
]
|
|
5327
5412
|
}
|
|
5328
5413
|
)
|
|
@@ -5330,8 +5415,8 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
|
|
|
5330
5415
|
) : null;
|
|
5331
5416
|
const displayFormat = (date) => formatDateShort(date);
|
|
5332
5417
|
const label = tempStart && tempEnd ? `${displayFormat(tempStart)} - ${displayFormat(tempEnd)}` : tempStart ? `${displayFormat(tempStart)} - ...` : placeholder;
|
|
5333
|
-
return /* @__PURE__ */ (0,
|
|
5334
|
-
/* @__PURE__ */ (0,
|
|
5418
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
5419
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
5335
5420
|
"button",
|
|
5336
5421
|
{
|
|
5337
5422
|
ref: triggerRef,
|
|
@@ -5350,8 +5435,8 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
|
|
|
5350
5435
|
className
|
|
5351
5436
|
),
|
|
5352
5437
|
children: [
|
|
5353
|
-
/* @__PURE__ */ (0,
|
|
5354
|
-
/* @__PURE__ */ (0,
|
|
5438
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: cn("truncate", !tempStart && !tempEnd && "text-muted-foreground"), children: label }),
|
|
5439
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react13.Calendar, { className: "h-4 w-4 text-muted-foreground ml-2" })
|
|
5355
5440
|
]
|
|
5356
5441
|
}
|
|
5357
5442
|
),
|
|
@@ -5361,8 +5446,8 @@ var DateRangePicker = ({ startDate, endDate, onChange, placeholder = "Select dat
|
|
|
5361
5446
|
|
|
5362
5447
|
// ../../components/ui/TimePicker.tsx
|
|
5363
5448
|
var React22 = __toESM(require("react"), 1);
|
|
5364
|
-
var
|
|
5365
|
-
var
|
|
5449
|
+
var import_lucide_react14 = require("lucide-react");
|
|
5450
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
5366
5451
|
var pad = (n) => n.toString().padStart(2, "0");
|
|
5367
5452
|
function parseTime(input, fmt = "24", includeSeconds) {
|
|
5368
5453
|
if (!input) return null;
|
|
@@ -5605,7 +5690,7 @@ function TimePicker({
|
|
|
5605
5690
|
const sz = sizeClasses2[size];
|
|
5606
5691
|
const radiusClass = size === "sm" ? "rounded-md" : "rounded-lg";
|
|
5607
5692
|
const display = formatTime2(parts, format, includeSeconds);
|
|
5608
|
-
const trigger = variant === "inline" ? null : /* @__PURE__ */ (0,
|
|
5693
|
+
const trigger = variant === "inline" ? null : /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
5609
5694
|
"button",
|
|
5610
5695
|
{
|
|
5611
5696
|
type: "button",
|
|
@@ -5629,17 +5714,17 @@ function TimePicker({
|
|
|
5629
5714
|
className
|
|
5630
5715
|
),
|
|
5631
5716
|
children: [
|
|
5632
|
-
/* @__PURE__ */ (0,
|
|
5633
|
-
/* @__PURE__ */ (0,
|
|
5634
|
-
/* @__PURE__ */ (0,
|
|
5717
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
5718
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.Clock, { className: cn(sz.icon, error ? "text-destructive" : success ? "text-green-500" : "text-muted-foreground") }),
|
|
5719
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: cn("truncate", !value && !defaultValue && "text-muted-foreground"), children: value || defaultValue ? display : placeholder })
|
|
5635
5720
|
] }),
|
|
5636
|
-
/* @__PURE__ */ (0,
|
|
5721
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: cn("ml-2 transition-transform duration-200", open && "rotate-180"), children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("svg", { className: sz.icon, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) }) })
|
|
5637
5722
|
]
|
|
5638
5723
|
}
|
|
5639
5724
|
);
|
|
5640
5725
|
const contentWidth = variant === "compact" ? 240 : variant === "inline" ? 320 : includeSeconds ? 340 : 300;
|
|
5641
|
-
const timePickerContent = /* @__PURE__ */ (0,
|
|
5642
|
-
allowManualInput && /* @__PURE__ */ (0,
|
|
5726
|
+
const timePickerContent = /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "space-y-3", children: [
|
|
5727
|
+
allowManualInput && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5643
5728
|
Input_default,
|
|
5644
5729
|
{
|
|
5645
5730
|
placeholder: format === "12" ? "02:30 PM" : "14:30",
|
|
@@ -5649,7 +5734,7 @@ function TimePicker({
|
|
|
5649
5734
|
variant: "outlined"
|
|
5650
5735
|
}
|
|
5651
5736
|
) }),
|
|
5652
|
-
showPresets && /* @__PURE__ */ (0,
|
|
5737
|
+
showPresets && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "grid grid-cols-2 gap-2", children: Object.keys(PRESETS).map((preset) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5653
5738
|
"button",
|
|
5654
5739
|
{
|
|
5655
5740
|
type: "button",
|
|
@@ -5663,7 +5748,7 @@ function TimePicker({
|
|
|
5663
5748
|
},
|
|
5664
5749
|
preset
|
|
5665
5750
|
)) }),
|
|
5666
|
-
customPresets && customPresets.length > 0 && /* @__PURE__ */ (0,
|
|
5751
|
+
customPresets && customPresets.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "grid grid-cols-2 gap-2", children: customPresets.map((preset, idx) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5667
5752
|
"button",
|
|
5668
5753
|
{
|
|
5669
5754
|
type: "button",
|
|
@@ -5677,10 +5762,10 @@ function TimePicker({
|
|
|
5677
5762
|
},
|
|
5678
5763
|
idx
|
|
5679
5764
|
)) }),
|
|
5680
|
-
/* @__PURE__ */ (0,
|
|
5681
|
-
/* @__PURE__ */ (0,
|
|
5682
|
-
/* @__PURE__ */ (0,
|
|
5683
|
-
/* @__PURE__ */ (0,
|
|
5765
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex gap-3", children: [
|
|
5766
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex-1 min-w-[70px]", children: [
|
|
5767
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-xs font-semibold text-muted-foreground mb-2 text-center", children: "Hour" }),
|
|
5768
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5684
5769
|
"div",
|
|
5685
5770
|
{
|
|
5686
5771
|
ref: hourScrollRef,
|
|
@@ -5692,7 +5777,7 @@ function TimePicker({
|
|
|
5692
5777
|
onFocus: () => setFocusedColumn("hour"),
|
|
5693
5778
|
children: hours.map((h) => {
|
|
5694
5779
|
const isSelected = format === "24" && parts.h === h || format === "12" && (parts.h % 12 || 12) === (h % 12 || 12);
|
|
5695
|
-
return /* @__PURE__ */ (0,
|
|
5780
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5696
5781
|
"button",
|
|
5697
5782
|
{
|
|
5698
5783
|
type: "button",
|
|
@@ -5719,10 +5804,10 @@ function TimePicker({
|
|
|
5719
5804
|
}
|
|
5720
5805
|
)
|
|
5721
5806
|
] }),
|
|
5722
|
-
/* @__PURE__ */ (0,
|
|
5723
|
-
/* @__PURE__ */ (0,
|
|
5724
|
-
/* @__PURE__ */ (0,
|
|
5725
|
-
/* @__PURE__ */ (0,
|
|
5807
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "w-px bg-border/50 self-stretch my-8" }),
|
|
5808
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex-1 min-w-[70px]", children: [
|
|
5809
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-xs font-semibold text-muted-foreground mb-2 text-center", children: "Min" }),
|
|
5810
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5726
5811
|
"div",
|
|
5727
5812
|
{
|
|
5728
5813
|
ref: minuteScrollRef,
|
|
@@ -5734,7 +5819,7 @@ function TimePicker({
|
|
|
5734
5819
|
onFocus: () => setFocusedColumn("minute"),
|
|
5735
5820
|
children: minutes.map((m) => {
|
|
5736
5821
|
const isSelected = parts.m === m;
|
|
5737
|
-
return /* @__PURE__ */ (0,
|
|
5822
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5738
5823
|
"button",
|
|
5739
5824
|
{
|
|
5740
5825
|
type: "button",
|
|
@@ -5760,11 +5845,11 @@ function TimePicker({
|
|
|
5760
5845
|
}
|
|
5761
5846
|
)
|
|
5762
5847
|
] }),
|
|
5763
|
-
/* @__PURE__ */ (0,
|
|
5764
|
-
includeSeconds && /* @__PURE__ */ (0,
|
|
5765
|
-
/* @__PURE__ */ (0,
|
|
5766
|
-
/* @__PURE__ */ (0,
|
|
5767
|
-
/* @__PURE__ */ (0,
|
|
5848
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "w-px bg-border/50 self-stretch my-8" }),
|
|
5849
|
+
includeSeconds && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
|
|
5850
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex-1 min-w-[70px]", children: [
|
|
5851
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-xs font-semibold text-muted-foreground mb-2 text-center", children: "Sec" }),
|
|
5852
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5768
5853
|
"div",
|
|
5769
5854
|
{
|
|
5770
5855
|
ref: secondScrollRef,
|
|
@@ -5776,7 +5861,7 @@ function TimePicker({
|
|
|
5776
5861
|
onFocus: () => setFocusedColumn("second"),
|
|
5777
5862
|
children: seconds.map((s) => {
|
|
5778
5863
|
const isSelected = parts.s === s;
|
|
5779
|
-
return /* @__PURE__ */ (0,
|
|
5864
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5780
5865
|
"button",
|
|
5781
5866
|
{
|
|
5782
5867
|
type: "button",
|
|
@@ -5802,11 +5887,11 @@ function TimePicker({
|
|
|
5802
5887
|
}
|
|
5803
5888
|
)
|
|
5804
5889
|
] }),
|
|
5805
|
-
/* @__PURE__ */ (0,
|
|
5890
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "w-px bg-border/50 self-stretch my-8" })
|
|
5806
5891
|
] }),
|
|
5807
|
-
format === "12" && /* @__PURE__ */ (0,
|
|
5808
|
-
/* @__PURE__ */ (0,
|
|
5809
|
-
/* @__PURE__ */ (0,
|
|
5892
|
+
format === "12" && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "w-20", children: [
|
|
5893
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-xs font-semibold text-muted-foreground mb-2 text-center", children: "Period" }),
|
|
5894
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5810
5895
|
"div",
|
|
5811
5896
|
{
|
|
5812
5897
|
className: "flex flex-col gap-2",
|
|
@@ -5817,7 +5902,7 @@ function TimePicker({
|
|
|
5817
5902
|
onFocus: () => setFocusedColumn("period"),
|
|
5818
5903
|
children: ["AM", "PM"].map((p) => {
|
|
5819
5904
|
const isSelected = parts.p === p;
|
|
5820
|
-
return /* @__PURE__ */ (0,
|
|
5905
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5821
5906
|
"button",
|
|
5822
5907
|
{
|
|
5823
5908
|
type: "button",
|
|
@@ -5848,8 +5933,8 @@ function TimePicker({
|
|
|
5848
5933
|
)
|
|
5849
5934
|
] })
|
|
5850
5935
|
] }),
|
|
5851
|
-
(showNow || clearable) && /* @__PURE__ */ (0,
|
|
5852
|
-
showNow && /* @__PURE__ */ (0,
|
|
5936
|
+
(showNow || clearable) && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center justify-between gap-2 pt-3 border-t border-border", children: [
|
|
5937
|
+
showNow && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
5853
5938
|
"button",
|
|
5854
5939
|
{
|
|
5855
5940
|
type: "button",
|
|
@@ -5863,13 +5948,13 @@ function TimePicker({
|
|
|
5863
5948
|
},
|
|
5864
5949
|
"aria-label": "Set current time",
|
|
5865
5950
|
children: [
|
|
5866
|
-
/* @__PURE__ */ (0,
|
|
5951
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.Clock, { className: "w-3.5 h-3.5" }),
|
|
5867
5952
|
"Now"
|
|
5868
5953
|
]
|
|
5869
5954
|
}
|
|
5870
5955
|
),
|
|
5871
|
-
/* @__PURE__ */ (0,
|
|
5872
|
-
clearable && /* @__PURE__ */ (0,
|
|
5956
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex-1" }),
|
|
5957
|
+
clearable && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
5873
5958
|
"button",
|
|
5874
5959
|
{
|
|
5875
5960
|
type: "button",
|
|
@@ -5884,7 +5969,7 @@ function TimePicker({
|
|
|
5884
5969
|
},
|
|
5885
5970
|
"aria-label": "Clear selected time",
|
|
5886
5971
|
children: [
|
|
5887
|
-
/* @__PURE__ */ (0,
|
|
5972
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.X, { className: "w-3.5 h-3.5" }),
|
|
5888
5973
|
"Clear"
|
|
5889
5974
|
]
|
|
5890
5975
|
}
|
|
@@ -5892,27 +5977,27 @@ function TimePicker({
|
|
|
5892
5977
|
] })
|
|
5893
5978
|
] });
|
|
5894
5979
|
if (variant === "inline") {
|
|
5895
|
-
return /* @__PURE__ */ (0,
|
|
5896
|
-
label && /* @__PURE__ */ (0,
|
|
5980
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "w-full", ...rest, children: [
|
|
5981
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("label", { className: cn(sz.label, "font-medium", disabled ? "text-muted-foreground" : "text-foreground"), children: [
|
|
5897
5982
|
label,
|
|
5898
|
-
required && /* @__PURE__ */ (0,
|
|
5983
|
+
required && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-destructive ml-1", children: "*" })
|
|
5899
5984
|
] }) }),
|
|
5900
|
-
/* @__PURE__ */ (0,
|
|
5985
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: cn("p-3 rounded-lg border border-border bg-card shadow-sm", className), children: timePickerContent })
|
|
5901
5986
|
] });
|
|
5902
5987
|
}
|
|
5903
|
-
return /* @__PURE__ */ (0,
|
|
5904
|
-
label && /* @__PURE__ */ (0,
|
|
5988
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "w-full", ...rest, children: [
|
|
5989
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex items-center justify-between mb-1.5", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
5905
5990
|
"label",
|
|
5906
5991
|
{
|
|
5907
5992
|
className: cn(sz.label, "font-medium", disabled ? "text-muted-foreground" : "text-foreground", "cursor-pointer"),
|
|
5908
5993
|
onClick: () => !disabled && handleOpenChange(true),
|
|
5909
5994
|
children: [
|
|
5910
5995
|
label,
|
|
5911
|
-
required && /* @__PURE__ */ (0,
|
|
5996
|
+
required && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-destructive ml-1", children: "*" })
|
|
5912
5997
|
]
|
|
5913
5998
|
}
|
|
5914
5999
|
) }),
|
|
5915
|
-
/* @__PURE__ */ (0,
|
|
6000
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
5916
6001
|
Popover,
|
|
5917
6002
|
{
|
|
5918
6003
|
trigger,
|
|
@@ -5931,24 +6016,24 @@ function TimePicker({
|
|
|
5931
6016
|
children: timePickerContent
|
|
5932
6017
|
}
|
|
5933
6018
|
),
|
|
5934
|
-
(error || success || helperText) && /* @__PURE__ */ (0,
|
|
5935
|
-
error && /* @__PURE__ */ (0,
|
|
5936
|
-
/* @__PURE__ */ (0,
|
|
5937
|
-
/* @__PURE__ */ (0,
|
|
6019
|
+
(error || success || helperText) && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: cn("mt-1.5 flex items-start gap-1.5", sz.label), children: [
|
|
6020
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-1.5 text-destructive", children: [
|
|
6021
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.X, { className: "w-3.5 h-3.5 flex-shrink-0" }),
|
|
6022
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { children: error })
|
|
5938
6023
|
] }),
|
|
5939
|
-
success && !error && /* @__PURE__ */ (0,
|
|
5940
|
-
/* @__PURE__ */ (0,
|
|
5941
|
-
/* @__PURE__ */ (0,
|
|
6024
|
+
success && !error && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex items-center gap-1.5 text-green-600", children: [
|
|
6025
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react14.Check, { className: "w-3.5 h-3.5 flex-shrink-0" }),
|
|
6026
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { children: "Valid time selected" })
|
|
5942
6027
|
] }),
|
|
5943
|
-
helperText && !error && !success && /* @__PURE__ */ (0,
|
|
6028
|
+
helperText && !error && !success && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "text-muted-foreground", children: helperText })
|
|
5944
6029
|
] })
|
|
5945
6030
|
] });
|
|
5946
6031
|
}
|
|
5947
6032
|
|
|
5948
6033
|
// ../../components/ui/Calendar.tsx
|
|
5949
6034
|
var React23 = __toESM(require("react"), 1);
|
|
5950
|
-
var
|
|
5951
|
-
var
|
|
6035
|
+
var import_lucide_react15 = require("lucide-react");
|
|
6036
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
5952
6037
|
function startOfMonth(d) {
|
|
5953
6038
|
return new Date(d.getFullYear(), d.getMonth(), 1);
|
|
5954
6039
|
}
|
|
@@ -6129,17 +6214,17 @@ function Calendar2({
|
|
|
6129
6214
|
const renderMonth = (monthDate) => {
|
|
6130
6215
|
const monthDays = getMonthGrid(monthDate, weekStartsOn);
|
|
6131
6216
|
const monthLabel = labels?.month ? labels.month(monthDate) : monthDate.toLocaleDateString("en-US", { month: "long", year: "numeric" });
|
|
6132
|
-
return /* @__PURE__ */ (0,
|
|
6133
|
-
months > 1 && /* @__PURE__ */ (0,
|
|
6134
|
-
showWeekdays && /* @__PURE__ */ (0,
|
|
6135
|
-
/* @__PURE__ */ (0,
|
|
6217
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
6218
|
+
months > 1 && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "flex items-center justify-center mb-2 text-sm font-semibold", children: monthLabel }),
|
|
6219
|
+
showWeekdays && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn("grid grid-cols-7", sz.grid, "mb-1 text-center text-muted-foreground font-medium"), children: weekdays.map((w) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn(sz.head), children: w }, `${monthLabel}-${w}`)) }),
|
|
6220
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn("grid grid-cols-7", sz.grid), children: monthDays.map((d, idx) => {
|
|
6136
6221
|
const inMonth = d.getMonth() === monthDate.getMonth();
|
|
6137
6222
|
const isToday2 = isSameDay(d, today);
|
|
6138
6223
|
const selectedDay = isSelected(d);
|
|
6139
6224
|
const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
|
|
6140
6225
|
const dayEvents = byDay.get(k) || [];
|
|
6141
6226
|
const disabled = isDateDisabled(d);
|
|
6142
|
-
return /* @__PURE__ */ (0,
|
|
6227
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
6143
6228
|
"button",
|
|
6144
6229
|
{
|
|
6145
6230
|
onClick: () => handleClickDay(d),
|
|
@@ -6156,7 +6241,7 @@ function Calendar2({
|
|
|
6156
6241
|
title: d.toDateString(),
|
|
6157
6242
|
children: [
|
|
6158
6243
|
d.getDate(),
|
|
6159
|
-
dayEvents.length > 0 && /* @__PURE__ */ (0,
|
|
6244
|
+
dayEvents.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "absolute -bottom-1 inline-flex gap-0.5", children: dayEvents.slice(0, 3).map((e, i) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "h-1.5 w-1.5 rounded-full", style: { backgroundColor: e.color || "hsl(var(--primary))" } }, i)) })
|
|
6160
6245
|
]
|
|
6161
6246
|
},
|
|
6162
6247
|
`${monthLabel}-${idx}`
|
|
@@ -6186,22 +6271,22 @@ function Calendar2({
|
|
|
6186
6271
|
const nextStart = startOfMonth(addMonths(view, 1));
|
|
6187
6272
|
return nextStart > maxBound;
|
|
6188
6273
|
}, [display, view, weekStartsOn, maxBound]);
|
|
6189
|
-
return /* @__PURE__ */ (0,
|
|
6190
|
-
showHeader && /* @__PURE__ */ (0,
|
|
6191
|
-
/* @__PURE__ */ (0,
|
|
6192
|
-
/* @__PURE__ */ (0,
|
|
6193
|
-
/* @__PURE__ */ (0,
|
|
6274
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: cn("w-full", className), ...rest, children: [
|
|
6275
|
+
showHeader && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
|
|
6276
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("button", { onClick: () => goByView(-1), disabled: prevDisabled, className: cn("p-1 rounded-md hover:bg-accent", prevDisabled && "opacity-40 cursor-not-allowed hover:bg-transparent"), "aria-label": labels?.prev || (display === "week" ? "Previous week" : "Previous month"), children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react15.ChevronLeft, { className: "h-4 w-4" }) }),
|
|
6277
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "text-sm font-semibold", children: display === "week" ? `${labels?.month ? labels.month(weekDays[0]) : weekDays[0].toLocaleDateString("en-US", { month: "short" })} ${weekDays[0].getDate()} \u2013 ${labels?.month ? labels.month(weekDays[6]) : weekDays[6].toLocaleDateString("en-US", { month: "short" })} ${weekDays[6].getDate()}` : labels?.month ? labels.month(view) : view.toLocaleDateString("en-US", { month: "long", year: "numeric" }) }),
|
|
6278
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("button", { onClick: () => goByView(1), disabled: nextDisabled, className: cn("p-1 rounded-md hover:bg-accent", nextDisabled && "opacity-40 cursor-not-allowed hover:bg-transparent"), "aria-label": labels?.next || (display === "week" ? "Next week" : "Next month"), children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react15.ChevronRight, { className: "h-4 w-4" }) })
|
|
6194
6279
|
] }),
|
|
6195
|
-
display === "week" ? /* @__PURE__ */ (0,
|
|
6196
|
-
showWeekdays && /* @__PURE__ */ (0,
|
|
6197
|
-
/* @__PURE__ */ (0,
|
|
6280
|
+
display === "week" ? /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
|
|
6281
|
+
showWeekdays && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn("grid grid-cols-7", sz.grid, "mb-1 text-center text-muted-foreground font-medium"), children: weekdays.map((w) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn(sz.head), children: w }, `w-${w}`)) }),
|
|
6282
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn("grid grid-cols-7", sz.grid), children: weekDays.map((d, idx) => {
|
|
6198
6283
|
const inMonth = true;
|
|
6199
6284
|
const isToday2 = isSameDay(d, today);
|
|
6200
6285
|
const selectedDay = isSelected(d);
|
|
6201
6286
|
const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
|
|
6202
6287
|
const dayEvents = byDay.get(k) || [];
|
|
6203
6288
|
const disabled = isDateDisabled(d);
|
|
6204
|
-
return /* @__PURE__ */ (0,
|
|
6289
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
6205
6290
|
"button",
|
|
6206
6291
|
{
|
|
6207
6292
|
onClick: () => handleClickDay(d),
|
|
@@ -6217,13 +6302,13 @@ function Calendar2({
|
|
|
6217
6302
|
title: d.toDateString(),
|
|
6218
6303
|
children: [
|
|
6219
6304
|
d.getDate(),
|
|
6220
|
-
dayEvents.length > 0 && /* @__PURE__ */ (0,
|
|
6305
|
+
dayEvents.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "absolute -bottom-1 inline-flex gap-0.5", children: dayEvents.slice(0, 3).map((e, i) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "h-1.5 w-1.5 rounded-full", style: { backgroundColor: e.color || "hsl(var(--primary))" } }, i)) })
|
|
6221
6306
|
]
|
|
6222
6307
|
},
|
|
6223
6308
|
`wd-${idx}`
|
|
6224
6309
|
);
|
|
6225
6310
|
}) })
|
|
6226
|
-
] }) : /* @__PURE__ */ (0,
|
|
6311
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: cn(months > 1 ? "grid md:grid-cols-2 lg:grid-cols-3 gap-4" : ""), children: Array.from({ length: Math.max(1, months) }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(React23.Fragment, { children: renderMonth(addMonths(view, i)) }, `cal-month-${view.getFullYear()}-${view.getMonth()}-${i}`)) })
|
|
6227
6312
|
] });
|
|
6228
6313
|
}
|
|
6229
6314
|
|
|
@@ -6231,8 +6316,8 @@ function Calendar2({
|
|
|
6231
6316
|
var React24 = __toESM(require("react"), 1);
|
|
6232
6317
|
var import_react15 = require("react");
|
|
6233
6318
|
var import_react_dom8 = require("react-dom");
|
|
6234
|
-
var
|
|
6235
|
-
var
|
|
6319
|
+
var import_lucide_react16 = require("lucide-react");
|
|
6320
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
6236
6321
|
var MultiCombobox = ({
|
|
6237
6322
|
id,
|
|
6238
6323
|
options,
|
|
@@ -6377,8 +6462,8 @@ var MultiCombobox = ({
|
|
|
6377
6462
|
const resolvedId = id ? String(id) : `multicombobox-${autoId}`;
|
|
6378
6463
|
const labelId = label ? `${resolvedId}-label` : void 0;
|
|
6379
6464
|
const labelSize = size === "sm" ? "text-xs" : size === "lg" ? "text-base" : "text-sm";
|
|
6380
|
-
return /* @__PURE__ */ (0,
|
|
6381
|
-
title && /* @__PURE__ */ (0,
|
|
6465
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: cn("w-full space-y-2 group", className), children: [
|
|
6466
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
6382
6467
|
"label",
|
|
6383
6468
|
{
|
|
6384
6469
|
className: cn(
|
|
@@ -6388,11 +6473,11 @@ var MultiCombobox = ({
|
|
|
6388
6473
|
),
|
|
6389
6474
|
children: [
|
|
6390
6475
|
title,
|
|
6391
|
-
required && /* @__PURE__ */ (0,
|
|
6476
|
+
required && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "text-destructive ml-1", children: "*" })
|
|
6392
6477
|
]
|
|
6393
6478
|
}
|
|
6394
6479
|
) }),
|
|
6395
|
-
label && /* @__PURE__ */ (0,
|
|
6480
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
6396
6481
|
"label",
|
|
6397
6482
|
{
|
|
6398
6483
|
id: labelId,
|
|
@@ -6404,12 +6489,12 @@ var MultiCombobox = ({
|
|
|
6404
6489
|
),
|
|
6405
6490
|
children: [
|
|
6406
6491
|
label,
|
|
6407
|
-
required && /* @__PURE__ */ (0,
|
|
6492
|
+
required && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "text-destructive ml-1", children: "*" })
|
|
6408
6493
|
]
|
|
6409
6494
|
}
|
|
6410
6495
|
),
|
|
6411
|
-
/* @__PURE__ */ (0,
|
|
6412
|
-
/* @__PURE__ */ (0,
|
|
6496
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "relative w-full" }),
|
|
6497
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
6413
6498
|
"button",
|
|
6414
6499
|
{
|
|
6415
6500
|
ref: triggerRef,
|
|
@@ -6432,11 +6517,11 @@ var MultiCombobox = ({
|
|
|
6432
6517
|
"disabled:cursor-not-allowed disabled:opacity-50"
|
|
6433
6518
|
),
|
|
6434
6519
|
children: [
|
|
6435
|
-
/* @__PURE__ */ (0,
|
|
6520
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex items-center gap-1 flex-wrap min-h-[1.5rem] flex-1", children: value.length > 0 ? showTags ? value.map((itemValue) => {
|
|
6436
6521
|
const option = normalizedOptions.find((o) => o.value === itemValue);
|
|
6437
|
-
return /* @__PURE__ */ (0,
|
|
6438
|
-
/* @__PURE__ */ (0,
|
|
6439
|
-
/* @__PURE__ */ (0,
|
|
6522
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "inline-flex items-center gap-1 bg-accent text-accent-foreground rounded px-2 py-1 text-xs", children: [
|
|
6523
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "truncate max-w-[120px]", children: option ? displayFormat(option) : itemValue }),
|
|
6524
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
6440
6525
|
"span",
|
|
6441
6526
|
{
|
|
6442
6527
|
role: "button",
|
|
@@ -6459,12 +6544,12 @@ var MultiCombobox = ({
|
|
|
6459
6544
|
}
|
|
6460
6545
|
)
|
|
6461
6546
|
] }, itemValue);
|
|
6462
|
-
}) : /* @__PURE__ */ (0,
|
|
6547
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "truncate text-sm", children: [
|
|
6463
6548
|
value.length,
|
|
6464
6549
|
" selected"
|
|
6465
|
-
] }) : /* @__PURE__ */ (0,
|
|
6466
|
-
/* @__PURE__ */ (0,
|
|
6467
|
-
|
|
6550
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "text-muted-foreground", children: placeholder || "Select..." }) }),
|
|
6551
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
6552
|
+
import_lucide_react16.ChevronDown,
|
|
6468
6553
|
{
|
|
6469
6554
|
className: cn("opacity-50 transition-all duration-200", sizeStyles8[size].icon, open && "rotate-180 scale-110 text-primary opacity-100")
|
|
6470
6555
|
}
|
|
@@ -6473,30 +6558,27 @@ var MultiCombobox = ({
|
|
|
6473
6558
|
}
|
|
6474
6559
|
),
|
|
6475
6560
|
open && dropdownPosition && typeof window !== "undefined" ? (0, import_react_dom8.createPortal)(
|
|
6476
|
-
/* @__PURE__ */ (0,
|
|
6561
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
6477
6562
|
"div",
|
|
6478
6563
|
{
|
|
6479
6564
|
ref: dropdownRef,
|
|
6480
|
-
"data-dropdown":
|
|
6565
|
+
"data-combobox-dropdown": true,
|
|
6481
6566
|
style: {
|
|
6482
6567
|
position: "absolute",
|
|
6483
6568
|
top: dropdownPosition?.top || 0,
|
|
6484
6569
|
left: dropdownPosition?.left || 0,
|
|
6485
6570
|
width: dropdownPosition?.width || 200,
|
|
6486
|
-
zIndex: 9999
|
|
6571
|
+
zIndex: 9999,
|
|
6572
|
+
transformOrigin: "top center"
|
|
6487
6573
|
},
|
|
6488
6574
|
"data-state": open ? "open" : "closed",
|
|
6489
|
-
className:
|
|
6490
|
-
|
|
6491
|
-
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
6492
|
-
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"
|
|
6493
|
-
),
|
|
6494
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
|
|
6575
|
+
className: "z-9999",
|
|
6576
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
6495
6577
|
"div",
|
|
6496
6578
|
{
|
|
6497
6579
|
className: cn("rounded-md border bg-popover text-popover-foreground shadow-md", "backdrop-blur-sm bg-popover/95 border-border/60"),
|
|
6498
6580
|
children: [
|
|
6499
|
-
showClear && value.length > 0 && /* @__PURE__ */ (0,
|
|
6581
|
+
showClear && value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "px-3 py-2 border-b border-border/60 flex justify-end", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
6500
6582
|
"button",
|
|
6501
6583
|
{
|
|
6502
6584
|
type: "button",
|
|
@@ -6509,9 +6591,9 @@ var MultiCombobox = ({
|
|
|
6509
6591
|
children: "Clear all"
|
|
6510
6592
|
}
|
|
6511
6593
|
) }),
|
|
6512
|
-
enableSearch && /* @__PURE__ */ (0,
|
|
6513
|
-
/* @__PURE__ */ (0,
|
|
6514
|
-
/* @__PURE__ */ (0,
|
|
6594
|
+
enableSearch && /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "relative border-b border-border/60", children: [
|
|
6595
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react16.Search, { className: cn("absolute left-2 top-2.5 text-muted-foreground", sizeStyles8[size].icon) }),
|
|
6596
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
6515
6597
|
"input",
|
|
6516
6598
|
{
|
|
6517
6599
|
ref: inputRef,
|
|
@@ -6526,13 +6608,13 @@ var MultiCombobox = ({
|
|
|
6526
6608
|
}
|
|
6527
6609
|
)
|
|
6528
6610
|
] }),
|
|
6529
|
-
/* @__PURE__ */ (0,
|
|
6530
|
-
/* @__PURE__ */ (0,
|
|
6531
|
-
/* @__PURE__ */ (0,
|
|
6611
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("ul", { className: cn("max-h-60 overflow-y-auto p-1", size === "lg" ? "text-base" : size === "sm" ? "text-xs" : "text-sm"), children: loading2 ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("li", { className: "px-3 py-8 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
6612
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react16.Loader2, { className: "h-6 w-6 animate-spin text-primary" }),
|
|
6613
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "text-muted-foreground", children: loadingText })
|
|
6532
6614
|
] }) }) : filtered.length ? filtered.map((item, index) => {
|
|
6533
6615
|
const isSelected = value.includes(item.value);
|
|
6534
6616
|
const isDisabled = disabledOptions.includes(item.value);
|
|
6535
|
-
return /* @__PURE__ */ (0,
|
|
6617
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
6536
6618
|
"li",
|
|
6537
6619
|
{
|
|
6538
6620
|
ref: (node) => {
|
|
@@ -6545,7 +6627,7 @@ var MultiCombobox = ({
|
|
|
6545
6627
|
inputRef.current?.focus();
|
|
6546
6628
|
},
|
|
6547
6629
|
style: {
|
|
6548
|
-
animationDelay: open ? `${index *
|
|
6630
|
+
animationDelay: open ? `${Math.min(index * 20, 200)}ms` : "0ms"
|
|
6549
6631
|
},
|
|
6550
6632
|
className: cn(
|
|
6551
6633
|
"dropdown-item flex cursor-pointer items-center justify-between rounded-sm transition-colors",
|
|
@@ -6556,22 +6638,22 @@ var MultiCombobox = ({
|
|
|
6556
6638
|
),
|
|
6557
6639
|
children: [
|
|
6558
6640
|
item.label,
|
|
6559
|
-
isSelected && /* @__PURE__ */ (0,
|
|
6641
|
+
isSelected && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react16.Check, { className: sizeStyles8[size].icon })
|
|
6560
6642
|
]
|
|
6561
6643
|
},
|
|
6562
6644
|
item.value
|
|
6563
6645
|
);
|
|
6564
|
-
}) : /* @__PURE__ */ (0,
|
|
6646
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
6565
6647
|
"li",
|
|
6566
6648
|
{
|
|
6567
6649
|
className: cn(
|
|
6568
6650
|
"px-3 py-8 text-center text-muted-foreground",
|
|
6569
6651
|
size === "lg" ? "text-base" : size === "sm" ? "text-xs" : "text-sm"
|
|
6570
6652
|
),
|
|
6571
|
-
children: /* @__PURE__ */ (0,
|
|
6572
|
-
/* @__PURE__ */ (0,
|
|
6573
|
-
/* @__PURE__ */ (0,
|
|
6574
|
-
query && /* @__PURE__ */ (0,
|
|
6653
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300", children: [
|
|
6654
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react16.SearchX, { className: "h-8 w-8 opacity-40 text-muted-foreground" }),
|
|
6655
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: emptyText }),
|
|
6656
|
+
query && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("button", { type: "button", onClick: () => setQuery(""), className: "text-xs text-primary hover:underline", children: "Clear search" })
|
|
6575
6657
|
] })
|
|
6576
6658
|
}
|
|
6577
6659
|
) })
|
|
@@ -6587,7 +6669,7 @@ var MultiCombobox = ({
|
|
|
6587
6669
|
|
|
6588
6670
|
// ../../components/ui/RadioGroup.tsx
|
|
6589
6671
|
var React25 = __toESM(require("react"), 1);
|
|
6590
|
-
var
|
|
6672
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
6591
6673
|
var RadioGroupContext = React25.createContext(void 0);
|
|
6592
6674
|
var useRadioGroup = () => {
|
|
6593
6675
|
const context = React25.useContext(RadioGroupContext);
|
|
@@ -6625,7 +6707,7 @@ var RadioGroup = React25.forwardRef(
|
|
|
6625
6707
|
};
|
|
6626
6708
|
const uniqueId = React25.useId();
|
|
6627
6709
|
const radioName = name || `radio-group-${uniqueId}`;
|
|
6628
|
-
return /* @__PURE__ */ (0,
|
|
6710
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6629
6711
|
RadioGroupContext.Provider,
|
|
6630
6712
|
{
|
|
6631
6713
|
value: {
|
|
@@ -6636,8 +6718,8 @@ var RadioGroup = React25.forwardRef(
|
|
|
6636
6718
|
size,
|
|
6637
6719
|
variant
|
|
6638
6720
|
},
|
|
6639
|
-
children: /* @__PURE__ */ (0,
|
|
6640
|
-
/* @__PURE__ */ (0,
|
|
6721
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "space-y-2", children: [
|
|
6722
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6641
6723
|
"div",
|
|
6642
6724
|
{
|
|
6643
6725
|
ref,
|
|
@@ -6654,7 +6736,7 @@ var RadioGroup = React25.forwardRef(
|
|
|
6654
6736
|
children
|
|
6655
6737
|
}
|
|
6656
6738
|
),
|
|
6657
|
-
error && errorMessage && /* @__PURE__ */ (0,
|
|
6739
|
+
error && errorMessage && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-sm text-destructive mt-1", children: errorMessage })
|
|
6658
6740
|
] })
|
|
6659
6741
|
}
|
|
6660
6742
|
);
|
|
@@ -6696,7 +6778,7 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6696
6778
|
const Icon = icon;
|
|
6697
6779
|
const radioId = id || `radio-${value}`;
|
|
6698
6780
|
if (variant === "card") {
|
|
6699
|
-
return /* @__PURE__ */ (0,
|
|
6781
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
|
|
6700
6782
|
"div",
|
|
6701
6783
|
{
|
|
6702
6784
|
className: cn(
|
|
@@ -6708,8 +6790,8 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6708
6790
|
className
|
|
6709
6791
|
),
|
|
6710
6792
|
children: [
|
|
6711
|
-
/* @__PURE__ */ (0,
|
|
6712
|
-
/* @__PURE__ */ (0,
|
|
6793
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-start gap-3", children: [
|
|
6794
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6713
6795
|
"button",
|
|
6714
6796
|
{
|
|
6715
6797
|
ref,
|
|
@@ -6728,22 +6810,22 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6728
6810
|
sizeStyles7[size].radio
|
|
6729
6811
|
),
|
|
6730
6812
|
onClick: () => onValueChange?.(value),
|
|
6731
|
-
children: /* @__PURE__ */ (0,
|
|
6813
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6732
6814
|
"span",
|
|
6733
6815
|
{
|
|
6734
6816
|
className: cn(
|
|
6735
6817
|
"flex items-center justify-center w-full h-full rounded-full transition-all duration-200",
|
|
6736
6818
|
isSelected && "bg-primary"
|
|
6737
6819
|
),
|
|
6738
|
-
children: isSelected && /* @__PURE__ */ (0,
|
|
6820
|
+
children: isSelected && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: cn("bg-primary-foreground rounded-full", sizeStyles7[size].dot) })
|
|
6739
6821
|
}
|
|
6740
6822
|
)
|
|
6741
6823
|
}
|
|
6742
6824
|
),
|
|
6743
|
-
/* @__PURE__ */ (0,
|
|
6744
|
-
/* @__PURE__ */ (0,
|
|
6745
|
-
Icon && /* @__PURE__ */ (0,
|
|
6746
|
-
/* @__PURE__ */ (0,
|
|
6825
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
6826
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
6827
|
+
Icon && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Icon, { className: "h-4 w-4 text-foreground" }),
|
|
6828
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6747
6829
|
"label",
|
|
6748
6830
|
{
|
|
6749
6831
|
htmlFor: radioId,
|
|
@@ -6755,10 +6837,10 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6755
6837
|
}
|
|
6756
6838
|
)
|
|
6757
6839
|
] }),
|
|
6758
|
-
description && /* @__PURE__ */ (0,
|
|
6840
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-muted-foreground mt-1 text-xs", children: description })
|
|
6759
6841
|
] })
|
|
6760
6842
|
] }),
|
|
6761
|
-
/* @__PURE__ */ (0,
|
|
6843
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6762
6844
|
"input",
|
|
6763
6845
|
{
|
|
6764
6846
|
type: "radio",
|
|
@@ -6776,7 +6858,7 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6776
6858
|
);
|
|
6777
6859
|
}
|
|
6778
6860
|
if (variant === "button") {
|
|
6779
|
-
return /* @__PURE__ */ (0,
|
|
6861
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
|
|
6780
6862
|
"button",
|
|
6781
6863
|
{
|
|
6782
6864
|
ref,
|
|
@@ -6798,9 +6880,9 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6798
6880
|
),
|
|
6799
6881
|
onClick: () => onValueChange?.(value),
|
|
6800
6882
|
children: [
|
|
6801
|
-
Icon && /* @__PURE__ */ (0,
|
|
6883
|
+
Icon && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Icon, { className: "h-4 w-4" }),
|
|
6802
6884
|
label || children,
|
|
6803
|
-
/* @__PURE__ */ (0,
|
|
6885
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6804
6886
|
"input",
|
|
6805
6887
|
{
|
|
6806
6888
|
type: "radio",
|
|
@@ -6817,8 +6899,8 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6817
6899
|
}
|
|
6818
6900
|
);
|
|
6819
6901
|
}
|
|
6820
|
-
return /* @__PURE__ */ (0,
|
|
6821
|
-
/* @__PURE__ */ (0,
|
|
6902
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: cn("flex items-center gap-2", className), children: [
|
|
6903
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6822
6904
|
"button",
|
|
6823
6905
|
{
|
|
6824
6906
|
ref,
|
|
@@ -6837,19 +6919,19 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6837
6919
|
sizeStyles7[size].radio
|
|
6838
6920
|
),
|
|
6839
6921
|
onClick: () => onValueChange?.(value),
|
|
6840
|
-
children: /* @__PURE__ */ (0,
|
|
6922
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6841
6923
|
"span",
|
|
6842
6924
|
{
|
|
6843
6925
|
className: cn(
|
|
6844
6926
|
"flex items-center justify-center w-full h-full rounded-full transition-all duration-200",
|
|
6845
6927
|
isSelected && "bg-primary"
|
|
6846
6928
|
),
|
|
6847
|
-
children: isSelected && /* @__PURE__ */ (0,
|
|
6929
|
+
children: isSelected && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: cn("bg-primary-foreground rounded-full", sizeStyles7[size].dot) })
|
|
6848
6930
|
}
|
|
6849
6931
|
)
|
|
6850
6932
|
}
|
|
6851
6933
|
),
|
|
6852
|
-
(label || children) && /* @__PURE__ */ (0,
|
|
6934
|
+
(label || children) && /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
|
|
6853
6935
|
"label",
|
|
6854
6936
|
{
|
|
6855
6937
|
htmlFor: radioId,
|
|
@@ -6860,15 +6942,15 @@ var RadioGroupItem = React25.forwardRef(
|
|
|
6860
6942
|
isDisabled && "cursor-not-allowed opacity-50"
|
|
6861
6943
|
),
|
|
6862
6944
|
children: [
|
|
6863
|
-
/* @__PURE__ */ (0,
|
|
6864
|
-
Icon && /* @__PURE__ */ (0,
|
|
6865
|
-
/* @__PURE__ */ (0,
|
|
6945
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
6946
|
+
Icon && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Icon, { className: "h-4 w-4" }),
|
|
6947
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: label || children })
|
|
6866
6948
|
] }),
|
|
6867
|
-
description && /* @__PURE__ */ (0,
|
|
6949
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-muted-foreground mt-0.5 text-xs", children: description })
|
|
6868
6950
|
]
|
|
6869
6951
|
}
|
|
6870
6952
|
),
|
|
6871
|
-
/* @__PURE__ */ (0,
|
|
6953
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
6872
6954
|
"input",
|
|
6873
6955
|
{
|
|
6874
6956
|
type: "radio",
|
|
@@ -6888,7 +6970,7 @@ RadioGroupItem.displayName = "RadioGroupItem";
|
|
|
6888
6970
|
|
|
6889
6971
|
// ../../components/ui/Slider.tsx
|
|
6890
6972
|
var React26 = __toESM(require("react"), 1);
|
|
6891
|
-
var
|
|
6973
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
6892
6974
|
var SIZE_STYLES = {
|
|
6893
6975
|
sm: {
|
|
6894
6976
|
track: "h-1",
|
|
@@ -6948,20 +7030,20 @@ var Slider = React26.forwardRef(
|
|
|
6948
7030
|
const displayValue = formatValue ? formatValue(currentValue) : currentValue.toString();
|
|
6949
7031
|
if (orientation === "vertical") {
|
|
6950
7032
|
}
|
|
6951
|
-
return /* @__PURE__ */ (0,
|
|
6952
|
-
(label || showValue) && /* @__PURE__ */ (0,
|
|
6953
|
-
label && /* @__PURE__ */ (0,
|
|
6954
|
-
showValue && /* @__PURE__ */ (0,
|
|
7033
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: cn("w-full space-y-2", containerClassName), children: [
|
|
7034
|
+
(label || showValue) && /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
7035
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("label", { className: cn("text-sm font-medium text-foreground", labelClassName), children: label }),
|
|
7036
|
+
showValue && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: cn("text-xs font-mono text-muted-foreground min-w-[2rem] text-right", valueClassName), children: displayValue })
|
|
6955
7037
|
] }),
|
|
6956
|
-
/* @__PURE__ */ (0,
|
|
6957
|
-
/* @__PURE__ */ (0,
|
|
7038
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: cn("relative flex items-center", sizeStyles8.container), children: [
|
|
7039
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: cn("w-full rounded-full bg-secondary relative overflow-hidden", sizeStyles8.track, trackClassName), children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
|
|
6958
7040
|
"div",
|
|
6959
7041
|
{
|
|
6960
7042
|
className: "absolute left-0 top-0 h-full bg-primary rounded-full transition-all duration-150 ease-out",
|
|
6961
7043
|
style: { width: `${percentage}%` }
|
|
6962
7044
|
}
|
|
6963
7045
|
) }),
|
|
6964
|
-
/* @__PURE__ */ (0,
|
|
7046
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
|
|
6965
7047
|
"input",
|
|
6966
7048
|
{
|
|
6967
7049
|
ref,
|
|
@@ -7025,9 +7107,9 @@ var Slider = React26.forwardRef(
|
|
|
7025
7107
|
Slider.displayName = "Slider";
|
|
7026
7108
|
|
|
7027
7109
|
// ../../components/ui/OverlayControls.tsx
|
|
7028
|
-
var
|
|
7110
|
+
var import_lucide_react17 = require("lucide-react");
|
|
7029
7111
|
var import_react16 = __toESM(require("react"), 1);
|
|
7030
|
-
var
|
|
7112
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
7031
7113
|
function OverlayControls({
|
|
7032
7114
|
mode,
|
|
7033
7115
|
value,
|
|
@@ -7250,41 +7332,41 @@ function OverlayControls({
|
|
|
7250
7332
|
const handleSliderMouseLeave = () => {
|
|
7251
7333
|
setPreviewData(null);
|
|
7252
7334
|
};
|
|
7253
|
-
return /* @__PURE__ */ (0,
|
|
7254
|
-
keyboardFeedback && /* @__PURE__ */ (0,
|
|
7335
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
|
|
7336
|
+
keyboardFeedback && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7255
7337
|
"div",
|
|
7256
7338
|
{
|
|
7257
7339
|
className: cn(
|
|
7258
7340
|
"absolute inset-0 flex items-center pointer-events-none z-50",
|
|
7259
7341
|
keyboardFeedback.type === "seek" && (keyboardFeedback.value ?? 0) > 0 ? "justify-end pr-32" : keyboardFeedback.type === "seek" && (keyboardFeedback.value ?? 0) < 0 ? "justify-start pl-32" : "justify-center"
|
|
7260
7342
|
),
|
|
7261
|
-
children: /* @__PURE__ */ (0,
|
|
7262
|
-
keyboardFeedback.type === "play" && /* @__PURE__ */ (0,
|
|
7263
|
-
keyboardFeedback.type === "pause" && /* @__PURE__ */ (0,
|
|
7264
|
-
keyboardFeedback.type === "seek" && /* @__PURE__ */ (0,
|
|
7265
|
-
(keyboardFeedback.value ?? 0) > 0 ? /* @__PURE__ */ (0,
|
|
7266
|
-
/* @__PURE__ */ (0,
|
|
7343
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "bg-black/50 backdrop-blur-sm rounded-xl px-6 py-4 shadow-xl border border-white/10 animate-in fade-in zoom-in duration-200", children: [
|
|
7344
|
+
keyboardFeedback.type === "play" && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Play, { className: "w-16 h-16 text-white", fill: "white" }),
|
|
7345
|
+
keyboardFeedback.type === "pause" && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Pause, { className: "w-16 h-16 text-white", fill: "white" }),
|
|
7346
|
+
keyboardFeedback.type === "seek" && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7347
|
+
(keyboardFeedback.value ?? 0) > 0 ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.RotateCw, { className: "w-12 h-12 text-white" }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.RotateCcw, { className: "w-12 h-12 text-white" }),
|
|
7348
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { className: "text-3xl font-bold text-white", children: [
|
|
7267
7349
|
keyboardFeedback.value && keyboardFeedback.value > 0 ? "+" : "",
|
|
7268
7350
|
keyboardFeedback.value,
|
|
7269
7351
|
"s"
|
|
7270
7352
|
] })
|
|
7271
7353
|
] }),
|
|
7272
|
-
keyboardFeedback.type === "volume" && /* @__PURE__ */ (0,
|
|
7273
|
-
/* @__PURE__ */ (0,
|
|
7274
|
-
/* @__PURE__ */ (0,
|
|
7275
|
-
/* @__PURE__ */ (0,
|
|
7354
|
+
keyboardFeedback.type === "volume" && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7355
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Volume2, { className: "w-12 h-12 text-white" }),
|
|
7356
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-col gap-1.5", children: [
|
|
7357
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { className: "text-2xl font-bold text-white", children: [
|
|
7276
7358
|
keyboardFeedback.value,
|
|
7277
7359
|
"%"
|
|
7278
7360
|
] }),
|
|
7279
|
-
/* @__PURE__ */ (0,
|
|
7361
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-32 h-1.5 bg-white/30 rounded-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "h-full bg-white rounded-full transition-all", style: { width: `${keyboardFeedback.value}%` } }) })
|
|
7280
7362
|
] })
|
|
7281
7363
|
] }),
|
|
7282
|
-
keyboardFeedback.type === "mute" && /* @__PURE__ */ (0,
|
|
7283
|
-
keyboardFeedback.type === "unmute" && /* @__PURE__ */ (0,
|
|
7364
|
+
keyboardFeedback.type === "mute" && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.VolumeX, { className: "w-16 h-16 text-white" }),
|
|
7365
|
+
keyboardFeedback.type === "unmute" && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Volume2, { className: "w-16 h-16 text-white" })
|
|
7284
7366
|
] })
|
|
7285
7367
|
}
|
|
7286
7368
|
),
|
|
7287
|
-
/* @__PURE__ */ (0,
|
|
7369
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7288
7370
|
"div",
|
|
7289
7371
|
{
|
|
7290
7372
|
className: cn(
|
|
@@ -7293,9 +7375,9 @@ function OverlayControls({
|
|
|
7293
7375
|
autoHide && !controlsVisible && "opacity-0 pointer-events-none",
|
|
7294
7376
|
className
|
|
7295
7377
|
),
|
|
7296
|
-
children: /* @__PURE__ */ (0,
|
|
7297
|
-
/* @__PURE__ */ (0,
|
|
7298
|
-
/* @__PURE__ */ (0,
|
|
7378
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "px-4", children: [
|
|
7379
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { ref: sliderRef, onMouseMove: handleSliderMouseMove, onMouseLeave: handleSliderMouseLeave, className: "relative", children: [
|
|
7380
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7299
7381
|
Slider,
|
|
7300
7382
|
{
|
|
7301
7383
|
min: 0,
|
|
@@ -7320,14 +7402,14 @@ function OverlayControls({
|
|
|
7320
7402
|
noFocus: true
|
|
7321
7403
|
}
|
|
7322
7404
|
),
|
|
7323
|
-
previewData && /* @__PURE__ */ (0,
|
|
7324
|
-
/* @__PURE__ */ (0,
|
|
7325
|
-
/* @__PURE__ */ (0,
|
|
7326
|
-
] }) : /* @__PURE__ */ (0,
|
|
7405
|
+
previewData && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute bottom-full mb-2 transform -translate-x-1/2 pointer-events-none z-30", style: { left: `${previewData.x}px` }, children: previewData.url ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "bg-background/95 backdrop-blur rounded-md border border-border shadow-lg overflow-hidden", children: [
|
|
7406
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { src: previewData.url, alt: "Preview", className: "w-40 h-24 object-cover" }),
|
|
7407
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "px-2 py-1 text-xs font-mono text-center bg-background/80", children: formatTime3(previewData.time) })
|
|
7408
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "px-3 py-1.5 rounded-md bg-background/90 backdrop-blur border border-border shadow-lg", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "text-xs font-mono text-center", children: formatTime3(previewData.time) }) }) })
|
|
7327
7409
|
] }),
|
|
7328
|
-
showControlsBar && /* @__PURE__ */ (0,
|
|
7329
|
-
/* @__PURE__ */ (0,
|
|
7330
|
-
/* @__PURE__ */ (0,
|
|
7410
|
+
showControlsBar && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "mt-2 flex items-center justify-between gap-2", children: [
|
|
7411
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7412
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7331
7413
|
Button_default,
|
|
7332
7414
|
{
|
|
7333
7415
|
variant: "ghost",
|
|
@@ -7335,10 +7417,10 @@ function OverlayControls({
|
|
|
7335
7417
|
onClick: onTogglePlay,
|
|
7336
7418
|
title: playing ? "T\u1EA1m d\u1EEBng" : "Ph\xE1t",
|
|
7337
7419
|
className: "bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0",
|
|
7338
|
-
children: playing ? /* @__PURE__ */ (0,
|
|
7420
|
+
children: playing ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Pause, { className: "w-4 h-4" }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Play, { className: "w-4 h-4" })
|
|
7339
7421
|
}
|
|
7340
7422
|
),
|
|
7341
|
-
onSkip && /* @__PURE__ */ (0,
|
|
7423
|
+
onSkip && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7342
7424
|
Button_default,
|
|
7343
7425
|
{
|
|
7344
7426
|
variant: "ghost",
|
|
@@ -7346,10 +7428,10 @@ function OverlayControls({
|
|
|
7346
7428
|
onClick: () => onSkip(-skipSeconds),
|
|
7347
7429
|
title: `L\xF9i ${skipSeconds}s`,
|
|
7348
7430
|
className: "bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0",
|
|
7349
|
-
children: /* @__PURE__ */ (0,
|
|
7431
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.RotateCcw, { className: "w-4 h-4" })
|
|
7350
7432
|
}
|
|
7351
7433
|
),
|
|
7352
|
-
onSkip && /* @__PURE__ */ (0,
|
|
7434
|
+
onSkip && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7353
7435
|
Button_default,
|
|
7354
7436
|
{
|
|
7355
7437
|
variant: "ghost",
|
|
@@ -7357,16 +7439,16 @@ function OverlayControls({
|
|
|
7357
7439
|
onClick: () => onSkip(skipSeconds),
|
|
7358
7440
|
title: `Tua ${skipSeconds}s`,
|
|
7359
7441
|
className: "bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0",
|
|
7360
|
-
children: /* @__PURE__ */ (0,
|
|
7442
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.RotateCw, { className: "w-4 h-4" })
|
|
7361
7443
|
}
|
|
7362
7444
|
),
|
|
7363
|
-
(showTime ?? true) && /* @__PURE__ */ (0,
|
|
7445
|
+
(showTime ?? true) && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { className: "px-3 py-1 rounded-full text-xs font-mono bg-background/60 text-foreground shadow-sm border border-border whitespace-nowrap", children: [
|
|
7364
7446
|
formatTime3(dragValue),
|
|
7365
7447
|
" / ",
|
|
7366
7448
|
formatTime3(max)
|
|
7367
7449
|
] }),
|
|
7368
|
-
/* @__PURE__ */ (0,
|
|
7369
|
-
/* @__PURE__ */ (0,
|
|
7450
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7451
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7370
7452
|
Button_default,
|
|
7371
7453
|
{
|
|
7372
7454
|
variant: "ghost",
|
|
@@ -7374,10 +7456,10 @@ function OverlayControls({
|
|
|
7374
7456
|
onClick: onToggleMute,
|
|
7375
7457
|
title: muted ? "B\u1EADt ti\u1EBFng" : "T\u1EAFt ti\u1EBFng",
|
|
7376
7458
|
className: "bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0",
|
|
7377
|
-
children: muted || (volume ?? 1) === 0 ? /* @__PURE__ */ (0,
|
|
7459
|
+
children: muted || (volume ?? 1) === 0 ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.VolumeX, { className: "w-4 h-4" }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Volume2, { className: "w-4 h-4" })
|
|
7378
7460
|
}
|
|
7379
7461
|
),
|
|
7380
|
-
/* @__PURE__ */ (0,
|
|
7462
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "w-24", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7381
7463
|
Slider,
|
|
7382
7464
|
{
|
|
7383
7465
|
min: 0,
|
|
@@ -7392,8 +7474,8 @@ function OverlayControls({
|
|
|
7392
7474
|
) })
|
|
7393
7475
|
] })
|
|
7394
7476
|
] }),
|
|
7395
|
-
/* @__PURE__ */ (0,
|
|
7396
|
-
onGoLive && /* @__PURE__ */ (0,
|
|
7477
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-2 relative", children: [
|
|
7478
|
+
onGoLive && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
7397
7479
|
Button_default,
|
|
7398
7480
|
{
|
|
7399
7481
|
variant: "ghost",
|
|
@@ -7402,13 +7484,13 @@ function OverlayControls({
|
|
|
7402
7484
|
title: "Tr\u1EF1c ti\u1EBFp (v\u1EC1 Live)",
|
|
7403
7485
|
className: "bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0",
|
|
7404
7486
|
children: [
|
|
7405
|
-
/* @__PURE__ */ (0,
|
|
7487
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Dot, { className: "w-10 h-10 text-destructive" }),
|
|
7406
7488
|
"Tr\u1EF1c ti\u1EBFp"
|
|
7407
7489
|
]
|
|
7408
7490
|
}
|
|
7409
7491
|
),
|
|
7410
|
-
onChangeRate && /* @__PURE__ */ (0,
|
|
7411
|
-
/* @__PURE__ */ (0,
|
|
7492
|
+
onChangeRate && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "relative", ref: rateWrapRef, children: [
|
|
7493
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
7412
7494
|
Button_default,
|
|
7413
7495
|
{
|
|
7414
7496
|
variant: "ghost",
|
|
@@ -7422,7 +7504,7 @@ function OverlayControls({
|
|
|
7422
7504
|
]
|
|
7423
7505
|
}
|
|
7424
7506
|
),
|
|
7425
|
-
rateOpen && /* @__PURE__ */ (0,
|
|
7507
|
+
rateOpen && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute bottom-9 right-0 bg-background/90 backdrop-blur rounded-md border border-border shadow-lg p-1 z-30", children: [0.5, 0.75, 1, 1.25, 1.5].map((r) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
7426
7508
|
"button",
|
|
7427
7509
|
{
|
|
7428
7510
|
onClick: () => {
|
|
@@ -7438,7 +7520,7 @@ function OverlayControls({
|
|
|
7438
7520
|
r
|
|
7439
7521
|
)) })
|
|
7440
7522
|
] }),
|
|
7441
|
-
onToggleFullscreen && /* @__PURE__ */ (0,
|
|
7523
|
+
onToggleFullscreen && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
7442
7524
|
Button_default,
|
|
7443
7525
|
{
|
|
7444
7526
|
variant: "ghost",
|
|
@@ -7446,7 +7528,7 @@ function OverlayControls({
|
|
|
7446
7528
|
onClick: onToggleFullscreen,
|
|
7447
7529
|
title: "To\xE0n m\xE0n h\xECnh",
|
|
7448
7530
|
className: "px-3 bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0",
|
|
7449
|
-
children: /* @__PURE__ */ (0,
|
|
7531
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react17.Maximize2, { className: "w-4 h-4" })
|
|
7450
7532
|
}
|
|
7451
7533
|
)
|
|
7452
7534
|
] })
|
|
@@ -7459,8 +7541,8 @@ function OverlayControls({
|
|
|
7459
7541
|
|
|
7460
7542
|
// ../../components/ui/CategoryTreeSelect.tsx
|
|
7461
7543
|
var import_react17 = require("react");
|
|
7462
|
-
var
|
|
7463
|
-
var
|
|
7544
|
+
var import_lucide_react18 = require("lucide-react");
|
|
7545
|
+
var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
7464
7546
|
function CategoryTreeSelect({ categories, value, onChange, placeholder = "Ch\u1ECDn danh m\u1EE5c", disabled }) {
|
|
7465
7547
|
const [isOpen, setIsOpen] = (0, import_react17.useState)(false);
|
|
7466
7548
|
const [expandedNodes, setExpandedNodes] = (0, import_react17.useState)(/* @__PURE__ */ new Set());
|
|
@@ -7502,8 +7584,8 @@ function CategoryTreeSelect({ categories, value, onChange, placeholder = "Ch\u1E
|
|
|
7502
7584
|
const hasChildren = children.length > 0;
|
|
7503
7585
|
const isExpanded = expandedNodes.has(category.id);
|
|
7504
7586
|
const isSelected = value.includes(category.id);
|
|
7505
|
-
return /* @__PURE__ */ (0,
|
|
7506
|
-
/* @__PURE__ */ (0,
|
|
7587
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { children: [
|
|
7588
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
|
|
7507
7589
|
"div",
|
|
7508
7590
|
{
|
|
7509
7591
|
className: cn(
|
|
@@ -7514,14 +7596,14 @@ function CategoryTreeSelect({ categories, value, onChange, placeholder = "Ch\u1E
|
|
|
7514
7596
|
),
|
|
7515
7597
|
style: { paddingLeft: `${level * 1.5 + 0.75}rem` },
|
|
7516
7598
|
children: [
|
|
7517
|
-
isSelected && /* @__PURE__ */ (0,
|
|
7599
|
+
isSelected && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
7518
7600
|
"span",
|
|
7519
7601
|
{
|
|
7520
7602
|
"aria-hidden": true,
|
|
7521
7603
|
className: "absolute left-0 top-0 bottom-0 w-1 bg-primary"
|
|
7522
7604
|
}
|
|
7523
7605
|
),
|
|
7524
|
-
hasChildren ? /* @__PURE__ */ (0,
|
|
7606
|
+
hasChildren ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
7525
7607
|
"button",
|
|
7526
7608
|
{
|
|
7527
7609
|
type: "button",
|
|
@@ -7530,39 +7612,39 @@ function CategoryTreeSelect({ categories, value, onChange, placeholder = "Ch\u1E
|
|
|
7530
7612
|
toggleExpand(category.id);
|
|
7531
7613
|
},
|
|
7532
7614
|
className: "p-0.5 hover:bg-accent rounded",
|
|
7533
|
-
children: isExpanded ? /* @__PURE__ */ (0,
|
|
7615
|
+
children: isExpanded ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react18.ChevronDown, { className: "w-4 h-4" }) : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react18.ChevronRight, { className: "w-4 h-4" })
|
|
7534
7616
|
}
|
|
7535
|
-
) : /* @__PURE__ */ (0,
|
|
7536
|
-
/* @__PURE__ */ (0,
|
|
7617
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "w-5" }),
|
|
7618
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
|
|
7537
7619
|
"div",
|
|
7538
7620
|
{
|
|
7539
7621
|
onClick: () => handleSelect(category.id, category),
|
|
7540
7622
|
className: "flex items-center gap-2 flex-1",
|
|
7541
7623
|
children: [
|
|
7542
|
-
/* @__PURE__ */ (0,
|
|
7624
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
7543
7625
|
"div",
|
|
7544
7626
|
{
|
|
7545
7627
|
className: cn(
|
|
7546
7628
|
"w-4 h-4 border-2 rounded flex items-center justify-center transition-colors",
|
|
7547
7629
|
isSelected ? "bg-primary border-primary" : "border-muted-foreground/30"
|
|
7548
7630
|
),
|
|
7549
|
-
children: isSelected && /* @__PURE__ */ (0,
|
|
7631
|
+
children: isSelected && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react18.Check, { className: "w-3 h-3 text-primary-foreground" })
|
|
7550
7632
|
}
|
|
7551
7633
|
),
|
|
7552
|
-
/* @__PURE__ */ (0,
|
|
7634
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: cn("text-sm", isSelected && "font-medium text-primary"), children: category.name })
|
|
7553
7635
|
]
|
|
7554
7636
|
}
|
|
7555
7637
|
)
|
|
7556
7638
|
]
|
|
7557
7639
|
}
|
|
7558
7640
|
),
|
|
7559
|
-
hasChildren && isExpanded && /* @__PURE__ */ (0,
|
|
7641
|
+
hasChildren && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { children: children.map((child) => renderCategory(child, level + 1)) })
|
|
7560
7642
|
] }, category.id);
|
|
7561
7643
|
};
|
|
7562
7644
|
const selectedCount = value.length;
|
|
7563
7645
|
const displayText = selectedCount > 0 ? `\u0110\xE3 ch\u1ECDn ${selectedCount} danh m\u1EE5c` : placeholder;
|
|
7564
|
-
return /* @__PURE__ */ (0,
|
|
7565
|
-
/* @__PURE__ */ (0,
|
|
7646
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: "relative", children: [
|
|
7647
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
|
|
7566
7648
|
"button",
|
|
7567
7649
|
{
|
|
7568
7650
|
type: "button",
|
|
@@ -7578,14 +7660,14 @@ function CategoryTreeSelect({ categories, value, onChange, placeholder = "Ch\u1E
|
|
|
7578
7660
|
isOpen && "border-primary"
|
|
7579
7661
|
),
|
|
7580
7662
|
children: [
|
|
7581
|
-
/* @__PURE__ */ (0,
|
|
7582
|
-
/* @__PURE__ */ (0,
|
|
7663
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: cn("text-sm", selectedCount === 0 && "text-muted-foreground"), children: displayText }),
|
|
7664
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react18.ChevronDown, { className: cn("w-4 h-4 transition-transform", isOpen && "transform rotate-180") })
|
|
7583
7665
|
]
|
|
7584
7666
|
}
|
|
7585
7667
|
),
|
|
7586
|
-
isOpen && !disabled && /* @__PURE__ */ (0,
|
|
7587
|
-
/* @__PURE__ */ (0,
|
|
7588
|
-
/* @__PURE__ */ (0,
|
|
7668
|
+
isOpen && !disabled && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
|
|
7669
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "fixed inset-0 z-10", onClick: () => setIsOpen(false) }),
|
|
7670
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
7589
7671
|
"div",
|
|
7590
7672
|
{
|
|
7591
7673
|
className: cn(
|
|
@@ -7593,7 +7675,7 @@ function CategoryTreeSelect({ categories, value, onChange, placeholder = "Ch\u1E
|
|
|
7593
7675
|
"rounded-md border bg-popover text-popover-foreground shadow-md",
|
|
7594
7676
|
"backdrop-blur-sm bg-popover/95 border-border/60"
|
|
7595
7677
|
),
|
|
7596
|
-
children: /* @__PURE__ */ (0,
|
|
7678
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "p-1", children: parentCategories.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "px-3 py-2 text-sm text-muted-foreground", children: "Kh\xF4ng c\xF3 danh m\u1EE5c n\xE0o" }) : parentCategories.map((cat) => renderCategory(cat)) })
|
|
7597
7679
|
}
|
|
7598
7680
|
)
|
|
7599
7681
|
] })
|
|
@@ -7602,9 +7684,9 @@ function CategoryTreeSelect({ categories, value, onChange, placeholder = "Ch\u1E
|
|
|
7602
7684
|
|
|
7603
7685
|
// ../../components/ui/ImageUpload.tsx
|
|
7604
7686
|
var import_react18 = require("react");
|
|
7605
|
-
var
|
|
7687
|
+
var import_lucide_react19 = require("lucide-react");
|
|
7606
7688
|
var import_next_intl6 = require("next-intl");
|
|
7607
|
-
var
|
|
7689
|
+
var import_jsx_runtime35 = require("react/jsx-runtime");
|
|
7608
7690
|
function ImageUpload({
|
|
7609
7691
|
onUpload,
|
|
7610
7692
|
onRemove,
|
|
@@ -7631,94 +7713,106 @@ function ImageUpload({
|
|
|
7631
7713
|
md: "w-24 h-24",
|
|
7632
7714
|
lg: "w-32 h-32"
|
|
7633
7715
|
};
|
|
7634
|
-
const handleDragOver = (0, import_react18.useCallback)(
|
|
7635
|
-
e
|
|
7636
|
-
|
|
7637
|
-
|
|
7638
|
-
|
|
7639
|
-
|
|
7716
|
+
const handleDragOver = (0, import_react18.useCallback)(
|
|
7717
|
+
(e) => {
|
|
7718
|
+
e.preventDefault();
|
|
7719
|
+
if (!disabled) {
|
|
7720
|
+
setIsDragging(true);
|
|
7721
|
+
}
|
|
7722
|
+
},
|
|
7723
|
+
[disabled]
|
|
7724
|
+
);
|
|
7640
7725
|
const handleDragLeave = (0, import_react18.useCallback)((e) => {
|
|
7641
7726
|
e.preventDefault();
|
|
7642
7727
|
setIsDragging(false);
|
|
7643
7728
|
}, []);
|
|
7644
|
-
const handleFiles = (0, import_react18.useCallback)(
|
|
7645
|
-
|
|
7646
|
-
|
|
7647
|
-
|
|
7648
|
-
|
|
7649
|
-
|
|
7650
|
-
|
|
7651
|
-
|
|
7652
|
-
|
|
7653
|
-
|
|
7654
|
-
|
|
7729
|
+
const handleFiles = (0, import_react18.useCallback)(
|
|
7730
|
+
async (files) => {
|
|
7731
|
+
if (files.length === 0) return;
|
|
7732
|
+
const validFiles = files.filter((file) => {
|
|
7733
|
+
if (file.size > maxSize * 1024 * 1024) {
|
|
7734
|
+
addToast({
|
|
7735
|
+
type: "error",
|
|
7736
|
+
message: `File "${file.name}" is too large. Max size: ${maxSize}MB`
|
|
7737
|
+
});
|
|
7738
|
+
return false;
|
|
7739
|
+
}
|
|
7740
|
+
if (!file.type.startsWith("image/")) {
|
|
7741
|
+
addToast({
|
|
7742
|
+
type: "error",
|
|
7743
|
+
message: `File "${file.name}" is not a valid image`
|
|
7744
|
+
});
|
|
7745
|
+
return false;
|
|
7746
|
+
}
|
|
7747
|
+
return true;
|
|
7748
|
+
});
|
|
7749
|
+
if (validFiles.length === 0) return;
|
|
7750
|
+
setUploading(true);
|
|
7751
|
+
try {
|
|
7752
|
+
for (const file of validFiles) {
|
|
7753
|
+
const formData = new FormData();
|
|
7754
|
+
formData.append("file", file);
|
|
7755
|
+
const response = {
|
|
7756
|
+
id: Date.now(),
|
|
7757
|
+
path: "",
|
|
7758
|
+
url: URL.createObjectURL(file),
|
|
7759
|
+
originalName: file.name,
|
|
7760
|
+
size: file.size,
|
|
7761
|
+
mimeType: file.type,
|
|
7762
|
+
width: 0,
|
|
7763
|
+
height: 0,
|
|
7764
|
+
formattedSize: `${(file.size / 1024).toFixed(1)} KB`
|
|
7765
|
+
};
|
|
7766
|
+
const newImage = {
|
|
7767
|
+
id: response.id,
|
|
7768
|
+
path: response.path,
|
|
7769
|
+
url: response.url,
|
|
7770
|
+
originalName: response.originalName,
|
|
7771
|
+
size: response.size,
|
|
7772
|
+
mimeType: response.mimeType,
|
|
7773
|
+
width: response.width,
|
|
7774
|
+
height: response.height,
|
|
7775
|
+
formattedSize: response.formattedSize
|
|
7776
|
+
};
|
|
7777
|
+
setUploadedImages((prev) => [...prev, newImage]);
|
|
7778
|
+
onUpload?.(newImage);
|
|
7779
|
+
addToast({
|
|
7780
|
+
type: "success",
|
|
7781
|
+
message: `"${file.name}" uploaded successfully`
|
|
7782
|
+
});
|
|
7783
|
+
}
|
|
7784
|
+
} catch (error) {
|
|
7785
|
+
console.error("Upload error:", error);
|
|
7655
7786
|
addToast({
|
|
7656
7787
|
type: "error",
|
|
7657
|
-
message:
|
|
7788
|
+
message: error.message || "Upload failed"
|
|
7658
7789
|
});
|
|
7659
|
-
|
|
7790
|
+
} finally {
|
|
7791
|
+
setUploading(false);
|
|
7660
7792
|
}
|
|
7661
|
-
|
|
7662
|
-
|
|
7663
|
-
|
|
7664
|
-
|
|
7665
|
-
|
|
7666
|
-
|
|
7667
|
-
|
|
7668
|
-
|
|
7669
|
-
|
|
7670
|
-
|
|
7671
|
-
|
|
7672
|
-
|
|
7673
|
-
|
|
7674
|
-
|
|
7675
|
-
|
|
7676
|
-
|
|
7677
|
-
|
|
7678
|
-
|
|
7679
|
-
|
|
7680
|
-
const newImage = {
|
|
7681
|
-
id: response.id,
|
|
7682
|
-
path: response.path,
|
|
7683
|
-
url: response.url,
|
|
7684
|
-
originalName: response.originalName,
|
|
7685
|
-
size: response.size,
|
|
7686
|
-
mimeType: response.mimeType,
|
|
7687
|
-
width: response.width,
|
|
7688
|
-
height: response.height,
|
|
7689
|
-
formattedSize: response.formattedSize
|
|
7690
|
-
};
|
|
7691
|
-
setUploadedImages((prev) => [...prev, newImage]);
|
|
7692
|
-
onUpload?.(newImage);
|
|
7693
|
-
addToast({
|
|
7694
|
-
type: "success",
|
|
7695
|
-
message: `"${file.name}" uploaded successfully`
|
|
7696
|
-
});
|
|
7793
|
+
},
|
|
7794
|
+
[maxSize, addToast, onUpload]
|
|
7795
|
+
);
|
|
7796
|
+
const handleDrop = (0, import_react18.useCallback)(
|
|
7797
|
+
(e) => {
|
|
7798
|
+
e.preventDefault();
|
|
7799
|
+
setIsDragging(false);
|
|
7800
|
+
if (disabled) return;
|
|
7801
|
+
const files = Array.from(e.dataTransfer.files);
|
|
7802
|
+
handleFiles(files);
|
|
7803
|
+
},
|
|
7804
|
+
[disabled, handleFiles]
|
|
7805
|
+
);
|
|
7806
|
+
const handleFileSelect = (0, import_react18.useCallback)(
|
|
7807
|
+
(e) => {
|
|
7808
|
+
const files = Array.from(e.target.files || []);
|
|
7809
|
+
handleFiles(files);
|
|
7810
|
+
if (fileInputRef.current) {
|
|
7811
|
+
fileInputRef.current.value = "";
|
|
7697
7812
|
}
|
|
7698
|
-
}
|
|
7699
|
-
|
|
7700
|
-
|
|
7701
|
-
type: "error",
|
|
7702
|
-
message: error.message || "Upload failed"
|
|
7703
|
-
});
|
|
7704
|
-
} finally {
|
|
7705
|
-
setUploading(false);
|
|
7706
|
-
}
|
|
7707
|
-
}, [maxSize, addToast, onUpload]);
|
|
7708
|
-
const handleDrop = (0, import_react18.useCallback)((e) => {
|
|
7709
|
-
e.preventDefault();
|
|
7710
|
-
setIsDragging(false);
|
|
7711
|
-
if (disabled) return;
|
|
7712
|
-
const files = Array.from(e.dataTransfer.files);
|
|
7713
|
-
handleFiles(files);
|
|
7714
|
-
}, [disabled, handleFiles]);
|
|
7715
|
-
const handleFileSelect = (0, import_react18.useCallback)((e) => {
|
|
7716
|
-
const files = Array.from(e.target.files || []);
|
|
7717
|
-
handleFiles(files);
|
|
7718
|
-
if (fileInputRef.current) {
|
|
7719
|
-
fileInputRef.current.value = "";
|
|
7720
|
-
}
|
|
7721
|
-
}, [handleFiles]);
|
|
7813
|
+
},
|
|
7814
|
+
[handleFiles]
|
|
7815
|
+
);
|
|
7722
7816
|
const handleRemoveImage = (imageId) => {
|
|
7723
7817
|
setUploadedImages((prev) => prev.filter((img) => img.id !== Number(imageId)));
|
|
7724
7818
|
onRemove?.(String(imageId));
|
|
@@ -7726,8 +7820,8 @@ function ImageUpload({
|
|
|
7726
7820
|
const handleBrowseClick = () => {
|
|
7727
7821
|
fileInputRef.current?.click();
|
|
7728
7822
|
};
|
|
7729
|
-
return /* @__PURE__ */ (0,
|
|
7730
|
-
/* @__PURE__ */ (0,
|
|
7823
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: cn("space-y-4", className), children: [
|
|
7824
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
|
|
7731
7825
|
"div",
|
|
7732
7826
|
{
|
|
7733
7827
|
className: cn(
|
|
@@ -7740,29 +7834,19 @@ function ImageUpload({
|
|
|
7740
7834
|
onDragLeave: handleDragLeave,
|
|
7741
7835
|
onDrop: handleDrop,
|
|
7742
7836
|
children: [
|
|
7743
|
-
uploading && /* @__PURE__ */ (0,
|
|
7744
|
-
/* @__PURE__ */ (0,
|
|
7745
|
-
/* @__PURE__ */ (0,
|
|
7837
|
+
uploading && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "absolute inset-0 bg-background/80 flex items-center justify-center rounded-lg", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7838
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react19.Loader2, { className: "w-6 h-6 animate-spin text-primary" }),
|
|
7839
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "text-sm font-medium", children: "Uploading..." })
|
|
7746
7840
|
] }) }),
|
|
7747
|
-
/* @__PURE__ */ (0,
|
|
7748
|
-
/* @__PURE__ */ (0,
|
|
7749
|
-
/* @__PURE__ */ (0,
|
|
7750
|
-
/* @__PURE__ */ (0,
|
|
7751
|
-
/* @__PURE__ */ (0,
|
|
7752
|
-
Button_default,
|
|
7753
|
-
{
|
|
7754
|
-
type: "button",
|
|
7755
|
-
variant: "outline",
|
|
7756
|
-
size: "sm",
|
|
7757
|
-
onClick: handleBrowseClick,
|
|
7758
|
-
disabled: disabled || uploading,
|
|
7759
|
-
children: browseText || t("browseFiles")
|
|
7760
|
-
}
|
|
7761
|
-
)
|
|
7841
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "space-y-4", children: [
|
|
7842
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react19.Upload, { className: "w-6 h-6 text-primary" }) }),
|
|
7843
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "space-y-2", children: [
|
|
7844
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "text-muted-foreground", children: dragDropText || t("dragDropText") }),
|
|
7845
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Button_default, { type: "button", variant: "outline", size: "sm", onClick: handleBrowseClick, disabled: disabled || uploading, children: browseText || t("browseFiles") })
|
|
7762
7846
|
] }),
|
|
7763
|
-
/* @__PURE__ */ (0,
|
|
7847
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "text-xs text-muted-foreground", children: supportedFormatsText || t("supportedFormats") })
|
|
7764
7848
|
] }),
|
|
7765
|
-
/* @__PURE__ */ (0,
|
|
7849
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
7766
7850
|
"input",
|
|
7767
7851
|
{
|
|
7768
7852
|
ref: fileInputRef,
|
|
@@ -7777,61 +7861,54 @@ function ImageUpload({
|
|
|
7777
7861
|
]
|
|
7778
7862
|
}
|
|
7779
7863
|
),
|
|
7780
|
-
showPreview && uploadedImages.length > 0 && /* @__PURE__ */ (0,
|
|
7781
|
-
/* @__PURE__ */ (0,
|
|
7782
|
-
/* @__PURE__ */ (0,
|
|
7783
|
-
|
|
7784
|
-
|
|
7785
|
-
|
|
7786
|
-
|
|
7787
|
-
|
|
7788
|
-
|
|
7789
|
-
|
|
7790
|
-
|
|
7791
|
-
|
|
7792
|
-
|
|
7793
|
-
|
|
7794
|
-
|
|
7864
|
+
showPreview && uploadedImages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "space-y-3", children: [
|
|
7865
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h4", { className: "text-sm font-medium", children: "Uploaded Images" }),
|
|
7866
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-4", children: uploadedImages.map((image) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "relative group bg-card border border-border rounded-lg p-3", children: [
|
|
7867
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
7868
|
+
Button_default,
|
|
7869
|
+
{
|
|
7870
|
+
variant: "danger",
|
|
7871
|
+
size: "icon",
|
|
7872
|
+
className: "absolute -top-2 -right-2 w-6 h-6 opacity-0 group-hover:opacity-100 transition-opacity z-10",
|
|
7873
|
+
onClick: () => handleRemoveImage(image.id),
|
|
7874
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react19.X, { className: "w-3 h-3" })
|
|
7875
|
+
}
|
|
7876
|
+
),
|
|
7877
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: cn("mx-auto mb-2 overflow-hidden rounded-md", previewSizes[previewSize]), children: [
|
|
7878
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
7879
|
+
"img",
|
|
7880
|
+
{
|
|
7881
|
+
src: image.url,
|
|
7882
|
+
alt: image.originalName,
|
|
7883
|
+
className: "w-full h-full object-cover",
|
|
7884
|
+
onError: (e) => {
|
|
7885
|
+
const target = e.target;
|
|
7886
|
+
target.style.display = "none";
|
|
7887
|
+
target.nextElementSibling?.classList.remove("hidden");
|
|
7795
7888
|
}
|
|
7796
|
-
|
|
7797
|
-
|
|
7798
|
-
|
|
7799
|
-
|
|
7800
|
-
|
|
7801
|
-
|
|
7802
|
-
|
|
7803
|
-
|
|
7804
|
-
|
|
7805
|
-
|
|
7806
|
-
|
|
7807
|
-
|
|
7808
|
-
|
|
7809
|
-
|
|
7810
|
-
|
|
7811
|
-
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "hidden w-full h-full bg-muted flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react20.Image, { className: "w-8 h-8 text-muted-foreground" }) })
|
|
7812
|
-
] }),
|
|
7813
|
-
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "space-y-1", children: [
|
|
7814
|
-
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "text-xs font-medium truncate", title: image.originalName, children: image.originalName }),
|
|
7815
|
-
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "text-xs text-muted-foreground", children: image.formattedSize }),
|
|
7816
|
-
image.width && image.height && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
7817
|
-
image.width,
|
|
7818
|
-
" \xD7 ",
|
|
7819
|
-
image.height
|
|
7820
|
-
] })
|
|
7821
|
-
] }),
|
|
7822
|
-
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "absolute top-1 left-1 w-5 h-5 bg-success rounded-full flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react20.Check, { className: "w-3 h-3 text-success-foreground" }) })
|
|
7823
|
-
]
|
|
7824
|
-
},
|
|
7825
|
-
image.id
|
|
7826
|
-
)) })
|
|
7889
|
+
}
|
|
7890
|
+
),
|
|
7891
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "hidden w-full h-full bg-muted flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react19.Image, { className: "w-8 h-8 text-muted-foreground" }) })
|
|
7892
|
+
] }),
|
|
7893
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "space-y-1", children: [
|
|
7894
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "text-xs font-medium truncate", title: image.originalName, children: image.originalName }),
|
|
7895
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "text-xs text-muted-foreground", children: image.formattedSize }),
|
|
7896
|
+
image.width && image.height && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
7897
|
+
image.width,
|
|
7898
|
+
" \xD7 ",
|
|
7899
|
+
image.height
|
|
7900
|
+
] })
|
|
7901
|
+
] }),
|
|
7902
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "absolute top-1 left-1 w-5 h-5 bg-success rounded-full flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react19.Check, { className: "w-3 h-3 text-success-foreground" }) })
|
|
7903
|
+
] }, image.id)) })
|
|
7827
7904
|
] })
|
|
7828
7905
|
] });
|
|
7829
7906
|
}
|
|
7830
7907
|
|
|
7831
7908
|
// ../../components/ui/Carousel.tsx
|
|
7832
7909
|
var React29 = __toESM(require("react"), 1);
|
|
7833
|
-
var
|
|
7834
|
-
var
|
|
7910
|
+
var import_lucide_react20 = require("lucide-react");
|
|
7911
|
+
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
7835
7912
|
function Carousel({
|
|
7836
7913
|
children,
|
|
7837
7914
|
autoScroll = true,
|
|
@@ -7989,7 +8066,7 @@ function Carousel({
|
|
|
7989
8066
|
};
|
|
7990
8067
|
};
|
|
7991
8068
|
const slideWidth = 100 / slidesToShow;
|
|
7992
|
-
return /* @__PURE__ */ (0,
|
|
8069
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
|
|
7993
8070
|
"div",
|
|
7994
8071
|
{
|
|
7995
8072
|
ref: carouselRef,
|
|
@@ -8001,8 +8078,8 @@ function Carousel({
|
|
|
8001
8078
|
"aria-roledescription": "carousel",
|
|
8002
8079
|
tabIndex: 0,
|
|
8003
8080
|
children: [
|
|
8004
|
-
showProgress && autoScroll && /* @__PURE__ */ (0,
|
|
8005
|
-
/* @__PURE__ */ (0,
|
|
8081
|
+
showProgress && autoScroll && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "absolute top-0 left-0 right-0 h-1 bg-muted z-20", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { ref: progressElRef, className: "h-full bg-primary", style: { width: "0%" } }) }),
|
|
8082
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8006
8083
|
"div",
|
|
8007
8084
|
{
|
|
8008
8085
|
className: cn("flex", isHorizontal ? "flex-row" : "flex-col", containerClassName),
|
|
@@ -8017,7 +8094,7 @@ function Carousel({
|
|
|
8017
8094
|
role: "group",
|
|
8018
8095
|
"aria-atomic": "false",
|
|
8019
8096
|
"aria-live": autoScroll ? "off" : "polite",
|
|
8020
|
-
children: React29.Children.map(children, (child, idx) => /* @__PURE__ */ (0,
|
|
8097
|
+
children: React29.Children.map(children, (child, idx) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8021
8098
|
"div",
|
|
8022
8099
|
{
|
|
8023
8100
|
className: cn(
|
|
@@ -8040,14 +8117,14 @@ function Carousel({
|
|
|
8040
8117
|
))
|
|
8041
8118
|
}
|
|
8042
8119
|
),
|
|
8043
|
-
showArrows && totalSlides > slidesToShow && /* @__PURE__ */ (0,
|
|
8044
|
-
/* @__PURE__ */ (0,
|
|
8120
|
+
showArrows && totalSlides > slidesToShow && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
|
|
8121
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8045
8122
|
Button_default,
|
|
8046
8123
|
{
|
|
8047
8124
|
onClick: scrollPrev,
|
|
8048
8125
|
variant: "ghost",
|
|
8049
8126
|
size: "icon",
|
|
8050
|
-
icon:
|
|
8127
|
+
icon: import_lucide_react20.ChevronLeft,
|
|
8051
8128
|
noHoverOverlay: true,
|
|
8052
8129
|
disabled: !loop && currentIndex === 0,
|
|
8053
8130
|
className: cn(
|
|
@@ -8057,13 +8134,13 @@ function Carousel({
|
|
|
8057
8134
|
"aria-label": "Previous slide"
|
|
8058
8135
|
}
|
|
8059
8136
|
),
|
|
8060
|
-
/* @__PURE__ */ (0,
|
|
8137
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8061
8138
|
Button_default,
|
|
8062
8139
|
{
|
|
8063
8140
|
onClick: scrollNext,
|
|
8064
8141
|
variant: "ghost",
|
|
8065
8142
|
size: "icon",
|
|
8066
|
-
icon:
|
|
8143
|
+
icon: import_lucide_react20.ChevronRight,
|
|
8067
8144
|
noHoverOverlay: true,
|
|
8068
8145
|
disabled: !loop && currentIndex >= maxIndex,
|
|
8069
8146
|
className: cn(
|
|
@@ -8074,7 +8151,7 @@ function Carousel({
|
|
|
8074
8151
|
}
|
|
8075
8152
|
)
|
|
8076
8153
|
] }),
|
|
8077
|
-
showDots && totalSlides > slidesToShow && /* @__PURE__ */ (0,
|
|
8154
|
+
showDots && totalSlides > slidesToShow && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8078
8155
|
"div",
|
|
8079
8156
|
{
|
|
8080
8157
|
className: cn(
|
|
@@ -8083,7 +8160,7 @@ function Carousel({
|
|
|
8083
8160
|
),
|
|
8084
8161
|
role: "tablist",
|
|
8085
8162
|
"aria-label": "Carousel pagination",
|
|
8086
|
-
children: Array.from({ length: maxIndex + 1 }, (_, idx) => /* @__PURE__ */ (0,
|
|
8163
|
+
children: Array.from({ length: maxIndex + 1 }, (_, idx) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8087
8164
|
"button",
|
|
8088
8165
|
{
|
|
8089
8166
|
onClick: () => scrollTo(idx),
|
|
@@ -8100,14 +8177,14 @@ function Carousel({
|
|
|
8100
8177
|
))
|
|
8101
8178
|
}
|
|
8102
8179
|
),
|
|
8103
|
-
showThumbnails && totalSlides > slidesToShow && /* @__PURE__ */ (0,
|
|
8180
|
+
showThumbnails && totalSlides > slidesToShow && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8104
8181
|
"div",
|
|
8105
8182
|
{
|
|
8106
8183
|
className: cn(
|
|
8107
8184
|
"absolute bottom-0 left-0 right-0 flex gap-2 p-4 bg-gradient-to-t from-black/50 to-transparent overflow-x-auto",
|
|
8108
8185
|
isHorizontal ? "flex-row" : "flex-col"
|
|
8109
8186
|
),
|
|
8110
|
-
children: React29.Children.map(children, (child, idx) => /* @__PURE__ */ (0,
|
|
8187
|
+
children: React29.Children.map(children, (child, idx) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
8111
8188
|
"button",
|
|
8112
8189
|
{
|
|
8113
8190
|
onClick: () => scrollTo(idx),
|
|
@@ -8129,7 +8206,7 @@ function Carousel({
|
|
|
8129
8206
|
|
|
8130
8207
|
// ../../components/ui/FallingIcons.tsx
|
|
8131
8208
|
var import_react19 = __toESM(require("react"), 1);
|
|
8132
|
-
var
|
|
8209
|
+
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
8133
8210
|
var DEFAULT_COUNT = 24;
|
|
8134
8211
|
var DEFAULT_SPEED_RANGE = [6, 14];
|
|
8135
8212
|
var DEFAULT_SIZE_RANGE = [14, 28];
|
|
@@ -8224,8 +8301,8 @@ function FallingIcons({
|
|
|
8224
8301
|
filter: `drop-shadow(0 0 ${4 * intensity}px ${glowColor}) drop-shadow(0 0 ${8 * intensity}px ${glowColor})`
|
|
8225
8302
|
};
|
|
8226
8303
|
}, [glow, glowColor, glowIntensity]);
|
|
8227
|
-
const FallbackIcon = import_react19.default.useMemo(() => (props) => /* @__PURE__ */ (0,
|
|
8228
|
-
const TheIcon = imageUrl ? ({ className: imgClassName }) => /* @__PURE__ */ (0,
|
|
8304
|
+
const FallbackIcon = import_react19.default.useMemo(() => (props) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("circle", { cx: "12", cy: "12", r: "10" }) }), []);
|
|
8305
|
+
const TheIcon = imageUrl ? ({ className: imgClassName }) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8229
8306
|
"img",
|
|
8230
8307
|
{
|
|
8231
8308
|
src: imageUrl,
|
|
@@ -8234,7 +8311,7 @@ function FallingIcons({
|
|
|
8234
8311
|
draggable: false
|
|
8235
8312
|
}
|
|
8236
8313
|
) : Icon || FallbackIcon;
|
|
8237
|
-
return /* @__PURE__ */ (0,
|
|
8314
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
|
|
8238
8315
|
"div",
|
|
8239
8316
|
{
|
|
8240
8317
|
ref: containerRef,
|
|
@@ -8244,7 +8321,7 @@ function FallingIcons({
|
|
|
8244
8321
|
),
|
|
8245
8322
|
style: { zIndex },
|
|
8246
8323
|
children: [
|
|
8247
|
-
/* @__PURE__ */ (0,
|
|
8324
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("style", { children: `
|
|
8248
8325
|
@keyframes ${FallName} {
|
|
8249
8326
|
0% { transform: translate3d(0, -10vh, 0); opacity: 0; }
|
|
8250
8327
|
10% { opacity: 1; }
|
|
@@ -8277,7 +8354,7 @@ function FallingIcons({
|
|
|
8277
8354
|
}
|
|
8278
8355
|
}
|
|
8279
8356
|
` }),
|
|
8280
|
-
/* @__PURE__ */ (0,
|
|
8357
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8281
8358
|
"div",
|
|
8282
8359
|
{
|
|
8283
8360
|
className: cn(
|
|
@@ -8298,12 +8375,12 @@ function FallingIcons({
|
|
|
8298
8375
|
});
|
|
8299
8376
|
};
|
|
8300
8377
|
const trailParticles = trail ? Array.from({ length: Math.min(5, Math.max(1, trailLength)) }) : [];
|
|
8301
|
-
return /* @__PURE__ */ (0,
|
|
8378
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_react19.default.Fragment, { children: [
|
|
8302
8379
|
trail && trailParticles.map((_, trailIndex) => {
|
|
8303
8380
|
const trailDelay = p.delay - (trailIndex + 1) * 0.15;
|
|
8304
8381
|
const trailOpacity = 1 - (trailIndex + 1) * (1 / (trailParticles.length + 1));
|
|
8305
8382
|
const trailScale = 1 - (trailIndex + 1) * 0.15;
|
|
8306
|
-
return /* @__PURE__ */ (0,
|
|
8383
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8307
8384
|
"span",
|
|
8308
8385
|
{
|
|
8309
8386
|
className: cn("absolute top-0 will-change-transform pointer-events-none uv-falling-particle", colorClassName),
|
|
@@ -8317,7 +8394,7 @@ function FallingIcons({
|
|
|
8317
8394
|
opacity: trailOpacity * 0.4,
|
|
8318
8395
|
["--fall"]: `${fallDist ?? (typeof window !== "undefined" ? window.innerHeight + 200 : 1200)}px`
|
|
8319
8396
|
},
|
|
8320
|
-
children: /* @__PURE__ */ (0,
|
|
8397
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8321
8398
|
"span",
|
|
8322
8399
|
{
|
|
8323
8400
|
className: "inline-block uv-sway",
|
|
@@ -8329,7 +8406,7 @@ function FallingIcons({
|
|
|
8329
8406
|
animationIterationCount: "infinite",
|
|
8330
8407
|
["--amp"]: `${Math.round(p.driftAmp)}px`
|
|
8331
8408
|
},
|
|
8332
|
-
children: /* @__PURE__ */ (0,
|
|
8409
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8333
8410
|
"span",
|
|
8334
8411
|
{
|
|
8335
8412
|
className: "block",
|
|
@@ -8338,7 +8415,7 @@ function FallingIcons({
|
|
|
8338
8415
|
height: p.size,
|
|
8339
8416
|
...glowStyles
|
|
8340
8417
|
},
|
|
8341
|
-
children: /* @__PURE__ */ (0,
|
|
8418
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TheIcon, { className: cn("w-full h-full text-primary/70", colorClassName) })
|
|
8342
8419
|
}
|
|
8343
8420
|
)
|
|
8344
8421
|
}
|
|
@@ -8347,7 +8424,7 @@ function FallingIcons({
|
|
|
8347
8424
|
`${p.key}-trail-${trailIndex}`
|
|
8348
8425
|
);
|
|
8349
8426
|
}),
|
|
8350
|
-
/* @__PURE__ */ (0,
|
|
8427
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8351
8428
|
"span",
|
|
8352
8429
|
{
|
|
8353
8430
|
className: cn("absolute top-0 will-change-transform pointer-events-auto uv-falling-particle", colorClassName),
|
|
@@ -8373,7 +8450,7 @@ function FallingIcons({
|
|
|
8373
8450
|
return next;
|
|
8374
8451
|
});
|
|
8375
8452
|
},
|
|
8376
|
-
children: /* @__PURE__ */ (0,
|
|
8453
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8377
8454
|
"span",
|
|
8378
8455
|
{
|
|
8379
8456
|
className: "inline-block uv-sway",
|
|
@@ -8385,7 +8462,7 @@ function FallingIcons({
|
|
|
8385
8462
|
animationIterationCount: "infinite",
|
|
8386
8463
|
["--amp"]: `${Math.round(p.driftAmp)}px`
|
|
8387
8464
|
},
|
|
8388
|
-
children: /* @__PURE__ */ (0,
|
|
8465
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
8389
8466
|
"span",
|
|
8390
8467
|
{
|
|
8391
8468
|
className: cn(
|
|
@@ -8401,7 +8478,7 @@ function FallingIcons({
|
|
|
8401
8478
|
["--popName"]: PopName,
|
|
8402
8479
|
...glowStyles
|
|
8403
8480
|
},
|
|
8404
|
-
children: /* @__PURE__ */ (0,
|
|
8481
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TheIcon, { className: cn("w-full h-full text-primary/70", colorClassName) })
|
|
8405
8482
|
}
|
|
8406
8483
|
)
|
|
8407
8484
|
}
|
|
@@ -8419,8 +8496,8 @@ function FallingIcons({
|
|
|
8419
8496
|
|
|
8420
8497
|
// ../../components/ui/List.tsx
|
|
8421
8498
|
var React31 = __toESM(require("react"), 1);
|
|
8422
|
-
var
|
|
8423
|
-
var
|
|
8499
|
+
var import_lucide_react21 = require("lucide-react");
|
|
8500
|
+
var import_jsx_runtime38 = require("react/jsx-runtime");
|
|
8424
8501
|
var SIZE_STYLES2 = {
|
|
8425
8502
|
xs: { itemPad: "px-2 py-1.5", densePad: "px-2 py-1", label: "text-xs", desc: "text-[11px]", icon: "h-3.5 w-3.5", avatar: "h-6 w-6" },
|
|
8426
8503
|
sm: { itemPad: "px-3 py-2", densePad: "px-3 py-1.5", label: "text-[13px]", desc: "text-[12px]", icon: "h-4 w-4", avatar: "h-8 w-8" },
|
|
@@ -8436,11 +8513,11 @@ var BADGE_VARIANTS = {
|
|
|
8436
8513
|
};
|
|
8437
8514
|
var ListItemSkeleton = ({ size }) => {
|
|
8438
8515
|
const sz = SIZE_STYLES2[size];
|
|
8439
|
-
return /* @__PURE__ */ (0,
|
|
8440
|
-
/* @__PURE__ */ (0,
|
|
8441
|
-
/* @__PURE__ */ (0,
|
|
8442
|
-
/* @__PURE__ */ (0,
|
|
8443
|
-
/* @__PURE__ */ (0,
|
|
8516
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: cn("flex items-center gap-3 animate-pulse", sz.itemPad), children: [
|
|
8517
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: cn("rounded-full bg-muted shrink-0", sz.avatar) }),
|
|
8518
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "flex-1 space-y-2", children: [
|
|
8519
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "h-4 bg-muted rounded w-3/4" }),
|
|
8520
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "h-3 bg-muted rounded w-1/2" })
|
|
8444
8521
|
] })
|
|
8445
8522
|
] });
|
|
8446
8523
|
};
|
|
@@ -8474,12 +8551,12 @@ var ListRoot = React31.forwardRef(
|
|
|
8474
8551
|
striped: "rounded-lg border border-border overflow-hidden"
|
|
8475
8552
|
};
|
|
8476
8553
|
if (loading2) {
|
|
8477
|
-
return /* @__PURE__ */ (0,
|
|
8554
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Comp, { ref, className: cn("group/list", variantClasses[variant], inset && "p-1.5 md:p-2", divided && "divide-y divide-border/60", className), ...rest, children: Array.from({ length: loadingCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ListItemSkeleton, { size }, i)) });
|
|
8478
8555
|
}
|
|
8479
8556
|
if (!hasChildren && emptyText) {
|
|
8480
|
-
return /* @__PURE__ */ (0,
|
|
8557
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Comp, { ref, className: cn("group/list", variantClasses[variant], inset && "p-1.5 md:p-2", className), ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "text-center py-8 text-muted-foreground text-sm", children: emptyText }) });
|
|
8481
8558
|
}
|
|
8482
|
-
return /* @__PURE__ */ (0,
|
|
8559
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
8483
8560
|
Comp,
|
|
8484
8561
|
{
|
|
8485
8562
|
ref,
|
|
@@ -8562,25 +8639,25 @@ var ListItem = React31.forwardRef(
|
|
|
8562
8639
|
}
|
|
8563
8640
|
}
|
|
8564
8641
|
} : {};
|
|
8565
|
-
const inner = /* @__PURE__ */ (0,
|
|
8566
|
-
/* @__PURE__ */ (0,
|
|
8642
|
+
const inner = /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
|
|
8643
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
|
|
8567
8644
|
"div",
|
|
8568
8645
|
{
|
|
8569
8646
|
className: cn("flex items-center gap-3", padding, "group/item relative"),
|
|
8570
8647
|
...headerProps,
|
|
8571
8648
|
children: [
|
|
8572
|
-
avatar && /* @__PURE__ */ (0,
|
|
8573
|
-
Left && !avatar && /* @__PURE__ */ (0,
|
|
8574
|
-
/* @__PURE__ */ (0,
|
|
8575
|
-
/* @__PURE__ */ (0,
|
|
8576
|
-
label && /* @__PURE__ */ (0,
|
|
8577
|
-
badge && /* @__PURE__ */ (0,
|
|
8649
|
+
avatar && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: cn("shrink-0", sz.avatar), children: typeof avatar === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("img", { src: avatar, alt: "", className: cn("rounded-full object-cover", sz.avatar) }) : avatar }),
|
|
8650
|
+
Left && !avatar && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: cn("text-muted-foreground shrink-0", sz.icon), children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Left, { className: cn(sz.icon) }) }),
|
|
8651
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "min-w-0 flex-1", children: [
|
|
8652
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8653
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: cn(sz.label, "text-foreground font-medium truncate"), children: label }),
|
|
8654
|
+
badge && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: cn("px-2 py-0.5 rounded-full text-[11px] font-medium shrink-0", BADGE_VARIANTS[badgeVariant]), children: badge })
|
|
8578
8655
|
] }),
|
|
8579
|
-
description && /* @__PURE__ */ (0,
|
|
8580
|
-
children && /* @__PURE__ */ (0,
|
|
8656
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: cn(sz.desc, "text-muted-foreground truncate mt-0.5"), children: description }),
|
|
8657
|
+
children && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "mt-1", children })
|
|
8581
8658
|
] }),
|
|
8582
|
-
action && /* @__PURE__ */ (0,
|
|
8583
|
-
collapsible ? /* @__PURE__ */ (0,
|
|
8659
|
+
action && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "opacity-0 group-hover/item:opacity-100 transition-opacity shrink-0", children: action }),
|
|
8660
|
+
collapsible ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
8584
8661
|
"span",
|
|
8585
8662
|
{
|
|
8586
8663
|
className: cn(
|
|
@@ -8588,13 +8665,13 @@ var ListItem = React31.forwardRef(
|
|
|
8588
8665
|
sz.icon,
|
|
8589
8666
|
isExpanded && "rotate-90"
|
|
8590
8667
|
),
|
|
8591
|
-
children: /* @__PURE__ */ (0,
|
|
8668
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_lucide_react21.ChevronRight, { className: cn(sz.icon) })
|
|
8592
8669
|
}
|
|
8593
|
-
) : Right && /* @__PURE__ */ (0,
|
|
8670
|
+
) : Right && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: cn("text-muted-foreground shrink-0", sz.icon), children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Right, { className: cn(sz.icon) }) })
|
|
8594
8671
|
]
|
|
8595
8672
|
}
|
|
8596
8673
|
),
|
|
8597
|
-
collapsible && isExpanded && expandContent && /* @__PURE__ */ (0,
|
|
8674
|
+
collapsible && isExpanded && expandContent && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: cn("border-t border-border/50 bg-muted/20", padding, "pt-3"), children: expandContent })
|
|
8598
8675
|
] });
|
|
8599
8676
|
const baseCls = cn(
|
|
8600
8677
|
"relative w-full",
|
|
@@ -8604,10 +8681,10 @@ var ListItem = React31.forwardRef(
|
|
|
8604
8681
|
);
|
|
8605
8682
|
if (href) {
|
|
8606
8683
|
const A = as === "a" ? "a" : "a";
|
|
8607
|
-
return /* @__PURE__ */ (0,
|
|
8684
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(A, { ref, href, className: cn(baseCls, "block"), ...rest, children: inner });
|
|
8608
8685
|
}
|
|
8609
8686
|
if (as === "button" && !collapsible) {
|
|
8610
|
-
return /* @__PURE__ */ (0,
|
|
8687
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
8611
8688
|
"button",
|
|
8612
8689
|
{
|
|
8613
8690
|
ref,
|
|
@@ -8619,7 +8696,7 @@ var ListItem = React31.forwardRef(
|
|
|
8619
8696
|
);
|
|
8620
8697
|
}
|
|
8621
8698
|
if (collapsible) {
|
|
8622
|
-
return /* @__PURE__ */ (0,
|
|
8699
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
8623
8700
|
"div",
|
|
8624
8701
|
{
|
|
8625
8702
|
ref,
|
|
@@ -8630,7 +8707,7 @@ var ListItem = React31.forwardRef(
|
|
|
8630
8707
|
);
|
|
8631
8708
|
}
|
|
8632
8709
|
const Comp = as;
|
|
8633
|
-
return /* @__PURE__ */ (0,
|
|
8710
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Comp, { ref, className: baseCls, ...rest, children: inner });
|
|
8634
8711
|
}
|
|
8635
8712
|
);
|
|
8636
8713
|
ListItem.displayName = "List.Item";
|
|
@@ -8640,7 +8717,7 @@ var List_default = List;
|
|
|
8640
8717
|
// ../../components/ui/Watermark.tsx
|
|
8641
8718
|
var React32 = __toESM(require("react"), 1);
|
|
8642
8719
|
var import_react_dom9 = require("react-dom");
|
|
8643
|
-
var
|
|
8720
|
+
var import_jsx_runtime39 = require("react/jsx-runtime");
|
|
8644
8721
|
var PRESETS2 = {
|
|
8645
8722
|
confidential: { text: "CONFIDENTIAL", color: "rgba(220, 38, 38, 0.15)", rotate: -22, fontSize: 16, fontWeight: "bold" },
|
|
8646
8723
|
draft: { text: "DRAFT", color: "rgba(59, 130, 246, 0.15)", rotate: -22, fontSize: 18, fontWeight: "bold" },
|
|
@@ -8895,7 +8972,7 @@ var Watermark = ({
|
|
|
8895
8972
|
if (dataURL) overlayStyle.backgroundImage = `url(${dataURL})`;
|
|
8896
8973
|
const animationClass = animate ? getAnimationClass(animationVariant, visible) : "";
|
|
8897
8974
|
const blurClass = blur ? `backdrop-blur-[${blurAmount}px]` : "";
|
|
8898
|
-
const overlay = /* @__PURE__ */ (0,
|
|
8975
|
+
const overlay = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
|
|
8899
8976
|
"div",
|
|
8900
8977
|
{
|
|
8901
8978
|
role: interactive ? "button" : void 0,
|
|
@@ -8919,12 +8996,12 @@ var Watermark = ({
|
|
|
8919
8996
|
}
|
|
8920
8997
|
);
|
|
8921
8998
|
if (fullPage) {
|
|
8922
|
-
return /* @__PURE__ */ (0,
|
|
8999
|
+
return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [
|
|
8923
9000
|
children,
|
|
8924
9001
|
typeof window !== "undefined" ? (0, import_react_dom9.createPortal)(overlay, document.body) : null
|
|
8925
9002
|
] });
|
|
8926
9003
|
}
|
|
8927
|
-
return /* @__PURE__ */ (0,
|
|
9004
|
+
return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: cn("relative", className), style, ...rest, children: [
|
|
8928
9005
|
children,
|
|
8929
9006
|
overlay
|
|
8930
9007
|
] });
|
|
@@ -8933,8 +9010,8 @@ var Watermark_default = Watermark;
|
|
|
8933
9010
|
|
|
8934
9011
|
// ../../components/ui/Timeline.tsx
|
|
8935
9012
|
var React33 = __toESM(require("react"), 1);
|
|
8936
|
-
var
|
|
8937
|
-
var
|
|
9013
|
+
var import_lucide_react22 = require("lucide-react");
|
|
9014
|
+
var import_jsx_runtime40 = require("react/jsx-runtime");
|
|
8938
9015
|
var SIZE_STYLE = {
|
|
8939
9016
|
sm: { dot: "h-2.5 w-2.5", iconDot: "h-6 w-6", padY: "py-3", densePadY: "py-2", title: "text-sm", desc: "text-xs", time: "text-[11px]", icon: "h-3.5 w-3.5" },
|
|
8940
9017
|
md: { dot: "h-3 w-3", iconDot: "h-8 w-8", padY: "py-4", densePadY: "py-2.5", title: "text-base", desc: "text-sm", time: "text-xs", icon: "h-4 w-4" },
|
|
@@ -8959,22 +9036,22 @@ var Marker = ({ index, last, size, color, status = "default", lineColor, lineSty
|
|
|
8959
9036
|
const sz = SIZE_STYLE[size];
|
|
8960
9037
|
const dotColor = color ? `background:${color}` : void 0;
|
|
8961
9038
|
const cls = color ? void 0 : STATUS_COLOR[status];
|
|
8962
|
-
return /* @__PURE__ */ (0,
|
|
8963
|
-
dot ? /* @__PURE__ */ (0,
|
|
9039
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: "flex flex-col items-center", children: [
|
|
9040
|
+
dot ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "flex items-center justify-center", children: dot }) : Icon ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
|
|
8964
9041
|
"div",
|
|
8965
9042
|
{
|
|
8966
9043
|
className: cn("rounded-full ring-2 ring-background flex items-center justify-center", sz.iconDot, cls, active && "ring-primary/40 ring-4"),
|
|
8967
9044
|
style: dotColor ? { background: color } : void 0,
|
|
8968
|
-
children: /* @__PURE__ */ (0,
|
|
9045
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon, { className: cn("text-white", sz.icon) })
|
|
8969
9046
|
}
|
|
8970
|
-
) : /* @__PURE__ */ (0,
|
|
9047
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
|
|
8971
9048
|
"div",
|
|
8972
9049
|
{
|
|
8973
9050
|
className: cn("rounded-full ring-2 ring-background", sz.dot, cls, active && "ring-primary/40 ring-4 scale-125"),
|
|
8974
9051
|
style: dotColor ? { background: color } : void 0
|
|
8975
9052
|
}
|
|
8976
9053
|
),
|
|
8977
|
-
!last && showLine && /* @__PURE__ */ (0,
|
|
9054
|
+
!last && showLine && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
|
|
8978
9055
|
"div",
|
|
8979
9056
|
{
|
|
8980
9057
|
className: cn("flex-1 border-l-2", LINE_STYLE_MAP[lineStyle]),
|
|
@@ -9000,8 +9077,8 @@ var TimelineRoot = React33.forwardRef(
|
|
|
9000
9077
|
children,
|
|
9001
9078
|
...rest
|
|
9002
9079
|
}, ref) => {
|
|
9003
|
-
const content = items ? items.map((it, i) => /* @__PURE__ */ (0,
|
|
9004
|
-
return /* @__PURE__ */ (0,
|
|
9080
|
+
const content = items ? items.map((it, i) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(TimelineItem, { ...it, className: cn(itemClassName, it.className), "data-index": i, "data-last": i === (items?.length ?? 0) - 1 }, i)) : children;
|
|
9081
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(TimelineContext.Provider, { value: { align, variant, size, mode, lineColor, lineStyle, itemClassName, animate, dense, showLine }, children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
|
|
9005
9082
|
"div",
|
|
9006
9083
|
{
|
|
9007
9084
|
ref,
|
|
@@ -9012,7 +9089,7 @@ var TimelineRoot = React33.forwardRef(
|
|
|
9012
9089
|
className
|
|
9013
9090
|
),
|
|
9014
9091
|
...rest,
|
|
9015
|
-
children: mode === "vertical" ? /* @__PURE__ */ (0,
|
|
9092
|
+
children: mode === "vertical" ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "space-y-0", children: content }) : content
|
|
9016
9093
|
}
|
|
9017
9094
|
) });
|
|
9018
9095
|
}
|
|
@@ -9060,39 +9137,39 @@ var TimelineItem = React33.forwardRef(
|
|
|
9060
9137
|
modern: "rounded-lg bg-gradient-to-r from-card to-muted/20 border border-border/50 px-5 py-4 backdrop-blur-sm",
|
|
9061
9138
|
gradient: "rounded-xl bg-gradient-to-br from-primary/10 via-card to-accent/10 border border-primary/20 px-5 py-4 shadow-lg"
|
|
9062
9139
|
};
|
|
9063
|
-
const contentBox = /* @__PURE__ */ (0,
|
|
9064
|
-
/* @__PURE__ */ (0,
|
|
9065
|
-
/* @__PURE__ */ (0,
|
|
9066
|
-
title && /* @__PURE__ */ (0,
|
|
9067
|
-
/* @__PURE__ */ (0,
|
|
9068
|
-
badge && /* @__PURE__ */ (0,
|
|
9140
|
+
const contentBox = /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: cn("min-w-0 flex-1", variantClasses[ctx.variant]), children: [
|
|
9141
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
9142
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
9143
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9144
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cn("font-semibold text-foreground", sz.title), children: title }),
|
|
9145
|
+
badge && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "px-2 py-0.5 rounded-full text-[10px] font-medium bg-primary/10 text-primary", children: badge })
|
|
9069
9146
|
] }),
|
|
9070
|
-
description && /* @__PURE__ */ (0,
|
|
9071
|
-
children && /* @__PURE__ */ (0,
|
|
9147
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cn("text-muted-foreground mt-1", sz.desc), children: description }),
|
|
9148
|
+
children && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "mt-2", children })
|
|
9072
9149
|
] }),
|
|
9073
|
-
collapsible && /* @__PURE__ */ (0,
|
|
9150
|
+
collapsible && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
|
|
9074
9151
|
"button",
|
|
9075
9152
|
{
|
|
9076
9153
|
type: "button",
|
|
9077
9154
|
onClick: toggleExpanded,
|
|
9078
9155
|
className: cn("text-muted-foreground hover:text-foreground transition-transform p-1", isExpanded && "rotate-180"),
|
|
9079
|
-
children: /* @__PURE__ */ (0,
|
|
9156
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_lucide_react22.ChevronDown, { className: "h-4 w-4" })
|
|
9080
9157
|
}
|
|
9081
9158
|
)
|
|
9082
9159
|
] }),
|
|
9083
|
-
time && /* @__PURE__ */ (0,
|
|
9084
|
-
collapsible && isExpanded && expandContent && /* @__PURE__ */ (0,
|
|
9160
|
+
time && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cn("mt-2 text-muted-foreground flex items-center gap-1", sz.time), children: time }),
|
|
9161
|
+
collapsible && isExpanded && expandContent && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "mt-3 pt-3 border-t border-border/50 text-sm", children: expandContent })
|
|
9085
9162
|
] });
|
|
9086
9163
|
const markerWidth = Icon || dot ? "w-auto" : "w-6";
|
|
9087
|
-
const leftSide = /* @__PURE__ */ (0,
|
|
9088
|
-
/* @__PURE__ */ (0,
|
|
9089
|
-
/* @__PURE__ */ (0,
|
|
9164
|
+
const leftSide = /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: cn("flex items-stretch gap-4", padding, ctx.animate && "animate-in slide-in-from-left duration-500"), style: { animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : void 0 }, children: [
|
|
9165
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cn("flex-shrink-0 flex items-stretch", markerWidth), children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Marker, { index: idx ?? 0, last: isLast, size: ctx.size, color, status, lineColor: ctx.lineColor, lineStyle: ctx.lineStyle, active, dot, icon: Icon, showLine: ctx.showLine }) }),
|
|
9166
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "flex-1", children: contentBox })
|
|
9090
9167
|
] });
|
|
9091
|
-
const rightSide = /* @__PURE__ */ (0,
|
|
9092
|
-
/* @__PURE__ */ (0,
|
|
9093
|
-
/* @__PURE__ */ (0,
|
|
9168
|
+
const rightSide = /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: cn("flex items-stretch gap-4", padding, ctx.animate && "animate-in slide-in-from-right duration-500"), style: { animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : void 0 }, children: [
|
|
9169
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "flex-1 flex justify-end", children: contentBox }),
|
|
9170
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cn("flex-shrink-0 flex items-stretch", markerWidth), children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Marker, { index: idx ?? 0, last: isLast, size: ctx.size, color, status, lineColor: ctx.lineColor, lineStyle: ctx.lineStyle, active, dot, icon: Icon, showLine: ctx.showLine }) })
|
|
9094
9171
|
] });
|
|
9095
|
-
const horizontalItem = /* @__PURE__ */ (0,
|
|
9172
|
+
const horizontalItem = /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
|
|
9096
9173
|
"div",
|
|
9097
9174
|
{
|
|
9098
9175
|
className: cn(
|
|
@@ -9101,19 +9178,19 @@ var TimelineItem = React33.forwardRef(
|
|
|
9101
9178
|
),
|
|
9102
9179
|
style: { animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : void 0 },
|
|
9103
9180
|
children: [
|
|
9104
|
-
/* @__PURE__ */ (0,
|
|
9105
|
-
!isLast && ctx.showLine && /* @__PURE__ */ (0,
|
|
9181
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Marker, { index: idx ?? 0, last: isLast, size: ctx.size, color, status, lineColor: ctx.lineColor, lineStyle: ctx.lineStyle, active, dot, icon: Icon, showLine: false }),
|
|
9182
|
+
!isLast && ctx.showLine && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cn("h-px w-full border-t-2", LINE_STYLE_MAP[ctx.lineStyle]), style: { borderColor: ctx.lineColor || "hsl(var(--border))" } }),
|
|
9106
9183
|
contentBox
|
|
9107
9184
|
]
|
|
9108
9185
|
}
|
|
9109
9186
|
);
|
|
9110
9187
|
if (ctx.mode === "horizontal") {
|
|
9111
|
-
return /* @__PURE__ */ (0,
|
|
9188
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { ref, className: cn("relative", className), ...rest, children: horizontalItem });
|
|
9112
9189
|
}
|
|
9113
9190
|
let row = leftSide;
|
|
9114
9191
|
if (ctx.align === "right") row = rightSide;
|
|
9115
9192
|
if (ctx.align === "alternate") row = (idx ?? 0) % 2 === 0 ? leftSide : rightSide;
|
|
9116
|
-
return /* @__PURE__ */ (0,
|
|
9193
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { ref, className: cn("relative", className), ...rest, children: row });
|
|
9117
9194
|
}
|
|
9118
9195
|
);
|
|
9119
9196
|
TimelineItem.displayName = "Timeline.Item";
|
|
@@ -9122,8 +9199,8 @@ var Timeline_default = Timeline;
|
|
|
9122
9199
|
|
|
9123
9200
|
// ../../components/ui/ColorPicker.tsx
|
|
9124
9201
|
var React34 = __toESM(require("react"), 1);
|
|
9125
|
-
var
|
|
9126
|
-
var
|
|
9202
|
+
var import_lucide_react23 = require("lucide-react");
|
|
9203
|
+
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
9127
9204
|
var clamp = (n, min, max) => Math.max(min, Math.min(max, n));
|
|
9128
9205
|
function hexToRgb(hex) {
|
|
9129
9206
|
const str = hex.replace(/^#/, "").trim();
|
|
@@ -9282,7 +9359,7 @@ var Swatch = ({
|
|
|
9282
9359
|
md: "h-6 w-6",
|
|
9283
9360
|
lg: "h-8 w-8"
|
|
9284
9361
|
};
|
|
9285
|
-
return /* @__PURE__ */ (0,
|
|
9362
|
+
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9286
9363
|
"button",
|
|
9287
9364
|
{
|
|
9288
9365
|
type: "button",
|
|
@@ -9406,7 +9483,7 @@ function ColorPicker({
|
|
|
9406
9483
|
lg: "h-12 text-base"
|
|
9407
9484
|
};
|
|
9408
9485
|
const swatchSize = size === "sm" ? "sm" : size === "lg" ? "lg" : "md";
|
|
9409
|
-
const trigger = /* @__PURE__ */ (0,
|
|
9486
|
+
const trigger = /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
|
|
9410
9487
|
"button",
|
|
9411
9488
|
{
|
|
9412
9489
|
type: "button",
|
|
@@ -9420,8 +9497,8 @@ function ColorPicker({
|
|
|
9420
9497
|
),
|
|
9421
9498
|
"aria-label": "Open color picker",
|
|
9422
9499
|
children: [
|
|
9423
|
-
/* @__PURE__ */ (0,
|
|
9424
|
-
/* @__PURE__ */ (0,
|
|
9500
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9501
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9425
9502
|
"span",
|
|
9426
9503
|
{
|
|
9427
9504
|
className: cn(
|
|
@@ -9431,9 +9508,9 @@ function ColorPicker({
|
|
|
9431
9508
|
style: { backgroundColor: withAlpha ? `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})` : hexForInput }
|
|
9432
9509
|
}
|
|
9433
9510
|
),
|
|
9434
|
-
/* @__PURE__ */ (0,
|
|
9511
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "font-mono text-muted-foreground", children: text })
|
|
9435
9512
|
] }),
|
|
9436
|
-
/* @__PURE__ */ (0,
|
|
9513
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.Pipette, { className: cn(size === "sm" ? "w-3.5 h-3.5" : size === "lg" ? "w-5 h-5" : "w-4 h-4", "text-muted-foreground") })
|
|
9437
9514
|
]
|
|
9438
9515
|
}
|
|
9439
9516
|
);
|
|
@@ -9443,7 +9520,7 @@ function ColorPicker({
|
|
|
9443
9520
|
default: 320,
|
|
9444
9521
|
full: 360
|
|
9445
9522
|
};
|
|
9446
|
-
return /* @__PURE__ */ (0,
|
|
9523
|
+
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: cn("inline-block w-full", className), ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9447
9524
|
Popover,
|
|
9448
9525
|
{
|
|
9449
9526
|
trigger,
|
|
@@ -9453,22 +9530,22 @@ function ColorPicker({
|
|
|
9453
9530
|
matchTriggerWidth: variant === "minimal",
|
|
9454
9531
|
contentWidth: contentWidthByVariant[variant],
|
|
9455
9532
|
contentClassName: cn("p-3 rounded-lg border border-border bg-card shadow-lg", contentClassName),
|
|
9456
|
-
children: /* @__PURE__ */ (0,
|
|
9457
|
-
variant !== "minimal" && /* @__PURE__ */ (0,
|
|
9458
|
-
/* @__PURE__ */ (0,
|
|
9459
|
-
/* @__PURE__ */ (0,
|
|
9533
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "space-y-3", children: [
|
|
9534
|
+
variant !== "minimal" && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9535
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("input", { type: "color", value: hexForInput, onChange: handleNativeChange, className: "h-9 w-9 rounded-md cursor-pointer border border-border" }),
|
|
9536
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
|
|
9460
9537
|
"button",
|
|
9461
9538
|
{
|
|
9462
9539
|
type: "button",
|
|
9463
9540
|
onClick: tryEyedropper,
|
|
9464
9541
|
className: cn("h-9 px-3 rounded-md border border-border text-xs hover:bg-accent/10 transition-colors flex items-center gap-1.5"),
|
|
9465
9542
|
children: [
|
|
9466
|
-
/* @__PURE__ */ (0,
|
|
9543
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.Pipette, { className: "w-3.5 h-3.5" }),
|
|
9467
9544
|
variant === "full" && "Pick"
|
|
9468
9545
|
]
|
|
9469
9546
|
}
|
|
9470
9547
|
),
|
|
9471
|
-
copyable && /* @__PURE__ */ (0,
|
|
9548
|
+
copyable && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
|
|
9472
9549
|
"button",
|
|
9473
9550
|
{
|
|
9474
9551
|
type: "button",
|
|
@@ -9478,26 +9555,26 @@ function ColorPicker({
|
|
|
9478
9555
|
copied && "bg-green-500/10 border-green-500/30"
|
|
9479
9556
|
),
|
|
9480
9557
|
children: [
|
|
9481
|
-
copied ? /* @__PURE__ */ (0,
|
|
9558
|
+
copied ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.Check, { className: "w-3.5 h-3.5 text-green-600" }) : /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.Copy, { className: "w-3.5 h-3.5" }),
|
|
9482
9559
|
variant === "full" && (copied ? "Copied!" : "Copy")
|
|
9483
9560
|
]
|
|
9484
9561
|
}
|
|
9485
9562
|
),
|
|
9486
|
-
clearable && /* @__PURE__ */ (0,
|
|
9563
|
+
clearable && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
|
|
9487
9564
|
"button",
|
|
9488
9565
|
{
|
|
9489
9566
|
type: "button",
|
|
9490
9567
|
onClick: clear,
|
|
9491
9568
|
className: "ml-auto h-9 px-2 rounded-md border border-border text-xs hover:bg-destructive/10 transition-colors flex items-center gap-1",
|
|
9492
9569
|
children: [
|
|
9493
|
-
/* @__PURE__ */ (0,
|
|
9570
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.X, { className: "w-3.5 h-3.5" }),
|
|
9494
9571
|
variant === "full" && "Clear"
|
|
9495
9572
|
]
|
|
9496
9573
|
}
|
|
9497
9574
|
)
|
|
9498
9575
|
] }),
|
|
9499
|
-
/* @__PURE__ */ (0,
|
|
9500
|
-
/* @__PURE__ */ (0,
|
|
9576
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9577
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9501
9578
|
Input_default,
|
|
9502
9579
|
{
|
|
9503
9580
|
value: text,
|
|
@@ -9508,7 +9585,7 @@ function ColorPicker({
|
|
|
9508
9585
|
className: "flex-1"
|
|
9509
9586
|
}
|
|
9510
9587
|
),
|
|
9511
|
-
variant === "minimal" && copyable && /* @__PURE__ */ (0,
|
|
9588
|
+
variant === "minimal" && copyable && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9512
9589
|
"button",
|
|
9513
9590
|
{
|
|
9514
9591
|
type: "button",
|
|
@@ -9517,17 +9594,17 @@ function ColorPicker({
|
|
|
9517
9594
|
"h-9 w-9 rounded-md border border-border hover:bg-accent/10 transition-colors flex items-center justify-center",
|
|
9518
9595
|
copied && "bg-green-500/10 border-green-500/30"
|
|
9519
9596
|
),
|
|
9520
|
-
children: copied ? /* @__PURE__ */ (0,
|
|
9597
|
+
children: copied ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.Check, { className: "w-3.5 h-3.5 text-green-600" }) : /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.Copy, { className: "w-3.5 h-3.5" })
|
|
9521
9598
|
}
|
|
9522
9599
|
)
|
|
9523
9600
|
] }),
|
|
9524
|
-
withAlpha && /* @__PURE__ */ (0,
|
|
9525
|
-
variant !== "minimal" && /* @__PURE__ */ (0,
|
|
9526
|
-
/* @__PURE__ */ (0,
|
|
9527
|
-
/* @__PURE__ */ (0,
|
|
9601
|
+
withAlpha && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "pt-1", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Slider, { min: 0, max: 100, step: 1, value: alphaPct, onChange: (v) => setAlpha(v), label: "Alpha", showValue: true, formatValue: (v) => `${v}%`, size: "sm" }) }),
|
|
9602
|
+
variant !== "minimal" && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { children: [
|
|
9603
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1.5", children: [
|
|
9604
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.Palette, { className: "w-3.5 h-3.5" }),
|
|
9528
9605
|
" Presets"
|
|
9529
9606
|
] }),
|
|
9530
|
-
/* @__PURE__ */ (0,
|
|
9607
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "grid grid-cols-8 gap-2", children: swatches.map((c) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9531
9608
|
Swatch,
|
|
9532
9609
|
{
|
|
9533
9610
|
color: c,
|
|
@@ -9543,12 +9620,12 @@ function ColorPicker({
|
|
|
9543
9620
|
c
|
|
9544
9621
|
)) })
|
|
9545
9622
|
] }),
|
|
9546
|
-
showRecent && recentColors.length > 0 && /* @__PURE__ */ (0,
|
|
9547
|
-
/* @__PURE__ */ (0,
|
|
9548
|
-
/* @__PURE__ */ (0,
|
|
9623
|
+
showRecent && recentColors.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { children: [
|
|
9624
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1.5", children: [
|
|
9625
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react23.History, { className: "w-3.5 h-3.5" }),
|
|
9549
9626
|
" Recent"
|
|
9550
9627
|
] }),
|
|
9551
|
-
/* @__PURE__ */ (0,
|
|
9628
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "flex gap-2 flex-wrap", children: recentColors.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9552
9629
|
Swatch,
|
|
9553
9630
|
{
|
|
9554
9631
|
color: c,
|
|
@@ -9564,12 +9641,12 @@ function ColorPicker({
|
|
|
9564
9641
|
`${c}-${i}`
|
|
9565
9642
|
)) })
|
|
9566
9643
|
] }),
|
|
9567
|
-
showHarmony && harmony && variant !== "minimal" && /* @__PURE__ */ (0,
|
|
9568
|
-
/* @__PURE__ */ (0,
|
|
9569
|
-
/* @__PURE__ */ (0,
|
|
9570
|
-
/* @__PURE__ */ (0,
|
|
9571
|
-
/* @__PURE__ */ (0,
|
|
9572
|
-
/* @__PURE__ */ (0,
|
|
9644
|
+
showHarmony && harmony && variant !== "minimal" && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { children: [
|
|
9645
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: "Harmony" }),
|
|
9646
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "space-y-2", children: [
|
|
9647
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9648
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "text-xs text-muted-foreground w-24", children: "Complementary" }),
|
|
9649
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9573
9650
|
Swatch,
|
|
9574
9651
|
{
|
|
9575
9652
|
color: harmony.complementary,
|
|
@@ -9583,11 +9660,11 @@ function ColorPicker({
|
|
|
9583
9660
|
}
|
|
9584
9661
|
}
|
|
9585
9662
|
),
|
|
9586
|
-
/* @__PURE__ */ (0,
|
|
9663
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "text-xs font-mono text-muted-foreground", children: harmony.complementary })
|
|
9587
9664
|
] }),
|
|
9588
|
-
/* @__PURE__ */ (0,
|
|
9589
|
-
/* @__PURE__ */ (0,
|
|
9590
|
-
/* @__PURE__ */ (0,
|
|
9665
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9666
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "text-xs text-muted-foreground w-24", children: "Triadic" }),
|
|
9667
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "flex gap-2", children: harmony.triadic.map((c) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9591
9668
|
Swatch,
|
|
9592
9669
|
{
|
|
9593
9670
|
color: c,
|
|
@@ -9603,9 +9680,9 @@ function ColorPicker({
|
|
|
9603
9680
|
c
|
|
9604
9681
|
)) })
|
|
9605
9682
|
] }),
|
|
9606
|
-
/* @__PURE__ */ (0,
|
|
9607
|
-
/* @__PURE__ */ (0,
|
|
9608
|
-
/* @__PURE__ */ (0,
|
|
9683
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9684
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "text-xs text-muted-foreground w-24", children: "Analogous" }),
|
|
9685
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "flex gap-2", children: harmony.analogous.map((c) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
9609
9686
|
Swatch,
|
|
9610
9687
|
{
|
|
9611
9688
|
color: c,
|
|
@@ -9630,7 +9707,7 @@ function ColorPicker({
|
|
|
9630
9707
|
|
|
9631
9708
|
// ../../components/ui/Grid.tsx
|
|
9632
9709
|
var import_react20 = __toESM(require("react"), 1);
|
|
9633
|
-
var
|
|
9710
|
+
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
9634
9711
|
var BP_MIN = {
|
|
9635
9712
|
sm: 640,
|
|
9636
9713
|
md: 768,
|
|
@@ -9737,7 +9814,7 @@ var GridRoot = import_react20.default.forwardRef(
|
|
|
9737
9814
|
css += `}}`;
|
|
9738
9815
|
});
|
|
9739
9816
|
}
|
|
9740
|
-
return /* @__PURE__ */ (0,
|
|
9817
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
9741
9818
|
"div",
|
|
9742
9819
|
{
|
|
9743
9820
|
ref,
|
|
@@ -9750,7 +9827,7 @@ var GridRoot = import_react20.default.forwardRef(
|
|
|
9750
9827
|
style,
|
|
9751
9828
|
...rest,
|
|
9752
9829
|
children: [
|
|
9753
|
-
/* @__PURE__ */ (0,
|
|
9830
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("style", { dangerouslySetInnerHTML: { __html: css } }),
|
|
9754
9831
|
children
|
|
9755
9832
|
]
|
|
9756
9833
|
}
|
|
@@ -9792,8 +9869,8 @@ var GridItem = import_react20.default.forwardRef(
|
|
|
9792
9869
|
st.opacity = 0;
|
|
9793
9870
|
st.animation = `uvGridItemFadeIn 0.5s ease-out forwards`;
|
|
9794
9871
|
}
|
|
9795
|
-
return /* @__PURE__ */ (0,
|
|
9796
|
-
animationDelay != null && /* @__PURE__ */ (0,
|
|
9872
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
9873
|
+
animationDelay != null && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
9797
9874
|
"style",
|
|
9798
9875
|
{
|
|
9799
9876
|
dangerouslySetInnerHTML: {
|
|
@@ -9801,7 +9878,7 @@ var GridItem = import_react20.default.forwardRef(
|
|
|
9801
9878
|
}
|
|
9802
9879
|
}
|
|
9803
9880
|
),
|
|
9804
|
-
/* @__PURE__ */ (0,
|
|
9881
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
9805
9882
|
"div",
|
|
9806
9883
|
{
|
|
9807
9884
|
ref,
|
|
@@ -9822,21 +9899,21 @@ var Grid_default = Grid;
|
|
|
9822
9899
|
|
|
9823
9900
|
// ../../components/ui/ClientOnly.tsx
|
|
9824
9901
|
var import_react21 = require("react");
|
|
9825
|
-
var
|
|
9902
|
+
var import_jsx_runtime43 = require("react/jsx-runtime");
|
|
9826
9903
|
function ClientOnly({ children, fallback = null }) {
|
|
9827
9904
|
const [hasMounted, setHasMounted] = (0, import_react21.useState)(false);
|
|
9828
9905
|
(0, import_react21.useEffect)(() => {
|
|
9829
9906
|
setHasMounted(true);
|
|
9830
9907
|
}, []);
|
|
9831
9908
|
if (!hasMounted) {
|
|
9832
|
-
return /* @__PURE__ */ (0,
|
|
9909
|
+
return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_jsx_runtime43.Fragment, { children: fallback });
|
|
9833
9910
|
}
|
|
9834
|
-
return /* @__PURE__ */ (0,
|
|
9911
|
+
return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_jsx_runtime43.Fragment, { children });
|
|
9835
9912
|
}
|
|
9836
9913
|
|
|
9837
9914
|
// ../../components/ui/Loading.tsx
|
|
9838
|
-
var
|
|
9839
|
-
var
|
|
9915
|
+
var import_lucide_react24 = require("lucide-react");
|
|
9916
|
+
var import_jsx_runtime44 = require("react/jsx-runtime");
|
|
9840
9917
|
var LoadingSpinner = ({
|
|
9841
9918
|
size = "md",
|
|
9842
9919
|
className,
|
|
@@ -9852,8 +9929,8 @@ var LoadingSpinner = ({
|
|
|
9852
9929
|
foreground: "text-foreground",
|
|
9853
9930
|
muted: "text-muted-foreground"
|
|
9854
9931
|
};
|
|
9855
|
-
return /* @__PURE__ */ (0,
|
|
9856
|
-
|
|
9932
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
9933
|
+
import_lucide_react24.Activity,
|
|
9857
9934
|
{
|
|
9858
9935
|
className: cn(
|
|
9859
9936
|
"animate-spin",
|
|
@@ -9873,7 +9950,7 @@ var LoadingDots = ({
|
|
|
9873
9950
|
foreground: "bg-foreground",
|
|
9874
9951
|
muted: "bg-muted-foreground"
|
|
9875
9952
|
};
|
|
9876
|
-
return /* @__PURE__ */ (0,
|
|
9953
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: cn("flex items-center space-x-1", className), children: [0, 1, 2].map((i) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
9877
9954
|
"div",
|
|
9878
9955
|
{
|
|
9879
9956
|
className: cn(
|
|
@@ -9895,7 +9972,7 @@ var LoadingBar = ({
|
|
|
9895
9972
|
label
|
|
9896
9973
|
}) => {
|
|
9897
9974
|
const pct = progress ? Math.min(Math.max(progress, 0), 100) : void 0;
|
|
9898
|
-
return /* @__PURE__ */ (0,
|
|
9975
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
9899
9976
|
"div",
|
|
9900
9977
|
{
|
|
9901
9978
|
className: cn("w-full bg-muted rounded-full h-2", className),
|
|
@@ -9904,7 +9981,7 @@ var LoadingBar = ({
|
|
|
9904
9981
|
"aria-valuemax": pct === void 0 ? void 0 : 100,
|
|
9905
9982
|
"aria-valuenow": pct === void 0 ? void 0 : Math.round(pct),
|
|
9906
9983
|
"aria-label": label || "Loading",
|
|
9907
|
-
children: /* @__PURE__ */ (0,
|
|
9984
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
9908
9985
|
"div",
|
|
9909
9986
|
{
|
|
9910
9987
|
className: cn(
|
|
@@ -9922,9 +9999,9 @@ var LoadingBar = ({
|
|
|
9922
9999
|
|
|
9923
10000
|
// ../../components/ui/Table.tsx
|
|
9924
10001
|
var import_react22 = __toESM(require("react"), 1);
|
|
9925
|
-
var
|
|
10002
|
+
var import_jsx_runtime45 = require("react/jsx-runtime");
|
|
9926
10003
|
var Table = import_react22.default.forwardRef(
|
|
9927
|
-
({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10004
|
+
({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
9928
10005
|
"div",
|
|
9929
10006
|
{
|
|
9930
10007
|
className: cn(
|
|
@@ -9934,7 +10011,7 @@ var Table = import_react22.default.forwardRef(
|
|
|
9934
10011
|
"backdrop-blur-sm transition-all duration-300",
|
|
9935
10012
|
containerClassName
|
|
9936
10013
|
),
|
|
9937
|
-
children: /* @__PURE__ */ (0,
|
|
10014
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
9938
10015
|
"table",
|
|
9939
10016
|
{
|
|
9940
10017
|
ref,
|
|
@@ -9947,7 +10024,7 @@ var Table = import_react22.default.forwardRef(
|
|
|
9947
10024
|
);
|
|
9948
10025
|
Table.displayName = "Table";
|
|
9949
10026
|
var TableHeader = import_react22.default.forwardRef(
|
|
9950
|
-
({ className, children, filterRow, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10027
|
+
({ className, children, filterRow, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
9951
10028
|
"thead",
|
|
9952
10029
|
{
|
|
9953
10030
|
ref,
|
|
@@ -9965,7 +10042,7 @@ var TableHeader = import_react22.default.forwardRef(
|
|
|
9965
10042
|
)
|
|
9966
10043
|
);
|
|
9967
10044
|
TableHeader.displayName = "TableHeader";
|
|
9968
|
-
var TableBody = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10045
|
+
var TableBody = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
9969
10046
|
"tbody",
|
|
9970
10047
|
{
|
|
9971
10048
|
ref,
|
|
@@ -9974,7 +10051,7 @@ var TableBody = import_react22.default.forwardRef(({ className, ...props }, ref)
|
|
|
9974
10051
|
}
|
|
9975
10052
|
));
|
|
9976
10053
|
TableBody.displayName = "TableBody";
|
|
9977
|
-
var TableFooter = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10054
|
+
var TableFooter = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
9978
10055
|
"tfoot",
|
|
9979
10056
|
{
|
|
9980
10057
|
ref,
|
|
@@ -9986,7 +10063,7 @@ var TableFooter = import_react22.default.forwardRef(({ className, ...props }, re
|
|
|
9986
10063
|
}
|
|
9987
10064
|
));
|
|
9988
10065
|
TableFooter.displayName = "TableFooter";
|
|
9989
|
-
var TableRow = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10066
|
+
var TableRow = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
9990
10067
|
"tr",
|
|
9991
10068
|
{
|
|
9992
10069
|
ref,
|
|
@@ -10000,7 +10077,7 @@ var TableRow = import_react22.default.forwardRef(({ className, ...props }, ref)
|
|
|
10000
10077
|
}
|
|
10001
10078
|
));
|
|
10002
10079
|
TableRow.displayName = "TableRow";
|
|
10003
|
-
var TableHead = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10080
|
+
var TableHead = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
10004
10081
|
"th",
|
|
10005
10082
|
{
|
|
10006
10083
|
ref,
|
|
@@ -10012,7 +10089,7 @@ var TableHead = import_react22.default.forwardRef(({ className, ...props }, ref)
|
|
|
10012
10089
|
}
|
|
10013
10090
|
));
|
|
10014
10091
|
TableHead.displayName = "TableHead";
|
|
10015
|
-
var TableCell = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10092
|
+
var TableCell = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
10016
10093
|
"td",
|
|
10017
10094
|
{
|
|
10018
10095
|
ref,
|
|
@@ -10021,7 +10098,7 @@ var TableCell = import_react22.default.forwardRef(({ className, ...props }, ref)
|
|
|
10021
10098
|
}
|
|
10022
10099
|
));
|
|
10023
10100
|
TableCell.displayName = "TableCell";
|
|
10024
|
-
var TableCaption = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
10101
|
+
var TableCaption = import_react22.default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
10025
10102
|
"caption",
|
|
10026
10103
|
{
|
|
10027
10104
|
ref,
|
|
@@ -10032,10 +10109,10 @@ var TableCaption = import_react22.default.forwardRef(({ className, ...props }, r
|
|
|
10032
10109
|
TableCaption.displayName = "TableCaption";
|
|
10033
10110
|
|
|
10034
10111
|
// ../../components/ui/DataTable.tsx
|
|
10035
|
-
var
|
|
10112
|
+
var import_lucide_react25 = require("lucide-react");
|
|
10036
10113
|
var import_react23 = __toESM(require("react"), 1);
|
|
10037
10114
|
var import_next_intl7 = require("next-intl");
|
|
10038
|
-
var
|
|
10115
|
+
var import_jsx_runtime46 = require("react/jsx-runtime");
|
|
10039
10116
|
function useDebounced(value, delay = 300) {
|
|
10040
10117
|
const [debounced, setDebounced] = import_react23.default.useState(value);
|
|
10041
10118
|
import_react23.default.useEffect(() => {
|
|
@@ -10099,7 +10176,7 @@ function DataTable({
|
|
|
10099
10176
|
className: "h-8 w-full text-sm"
|
|
10100
10177
|
};
|
|
10101
10178
|
if (col.filter.type === "text") {
|
|
10102
|
-
return /* @__PURE__ */ (0,
|
|
10179
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10103
10180
|
Input_default,
|
|
10104
10181
|
{
|
|
10105
10182
|
...commonProps,
|
|
@@ -10114,7 +10191,7 @@ function DataTable({
|
|
|
10114
10191
|
}
|
|
10115
10192
|
if (col.filter.type === "select") {
|
|
10116
10193
|
const options = col.filter.options || [];
|
|
10117
|
-
return /* @__PURE__ */ (0,
|
|
10194
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10118
10195
|
Combobox,
|
|
10119
10196
|
{
|
|
10120
10197
|
options: ["", ...options],
|
|
@@ -10130,7 +10207,7 @@ function DataTable({
|
|
|
10130
10207
|
);
|
|
10131
10208
|
}
|
|
10132
10209
|
if (col.filter.type === "date") {
|
|
10133
|
-
return /* @__PURE__ */ (0,
|
|
10210
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10134
10211
|
DatePicker,
|
|
10135
10212
|
{
|
|
10136
10213
|
placeholder: col.filter.placeholder || `Select ${String(col.title)}`,
|
|
@@ -10144,7 +10221,7 @@ function DataTable({
|
|
|
10144
10221
|
}
|
|
10145
10222
|
return null;
|
|
10146
10223
|
};
|
|
10147
|
-
const renderHeader = /* @__PURE__ */ (0,
|
|
10224
|
+
const renderHeader = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableRow, { children: visibleColumns.map((col, colIdx) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10148
10225
|
TableHead,
|
|
10149
10226
|
{
|
|
10150
10227
|
style: { width: col.width },
|
|
@@ -10157,9 +10234,9 @@ function DataTable({
|
|
|
10157
10234
|
children: (() => {
|
|
10158
10235
|
const isRightAlign = col.align === "right" || !col.align && headerAlign === "right";
|
|
10159
10236
|
const isCenterAlign = col.align === "center" || !col.align && headerAlign === "center";
|
|
10160
|
-
const titleContent = /* @__PURE__ */ (0,
|
|
10161
|
-
/* @__PURE__ */ (0,
|
|
10162
|
-
col.sortable && /* @__PURE__ */ (0,
|
|
10237
|
+
const titleContent = /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center gap-1 min-w-0 flex-shrink", children: [
|
|
10238
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "truncate font-medium text-sm", children: col.title }),
|
|
10239
|
+
col.sortable && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10163
10240
|
"button",
|
|
10164
10241
|
{
|
|
10165
10242
|
className: cn(
|
|
@@ -10176,8 +10253,8 @@ function DataTable({
|
|
|
10176
10253
|
},
|
|
10177
10254
|
"aria-label": "Sort",
|
|
10178
10255
|
title: `Sort by ${String(col.title)}`,
|
|
10179
|
-
children: /* @__PURE__ */ (0,
|
|
10180
|
-
/* @__PURE__ */ (0,
|
|
10256
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", className: "inline-block", children: [
|
|
10257
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10181
10258
|
"path",
|
|
10182
10259
|
{
|
|
10183
10260
|
d: "M7 8l3-3 3 3",
|
|
@@ -10188,7 +10265,7 @@ function DataTable({
|
|
|
10188
10265
|
opacity: sort?.key === col.key && sort.order === "asc" ? 1 : 0.4
|
|
10189
10266
|
}
|
|
10190
10267
|
),
|
|
10191
|
-
/* @__PURE__ */ (0,
|
|
10268
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10192
10269
|
"path",
|
|
10193
10270
|
{
|
|
10194
10271
|
d: "M7 12l3 3 3-3",
|
|
@@ -10203,11 +10280,11 @@ function DataTable({
|
|
|
10203
10280
|
}
|
|
10204
10281
|
)
|
|
10205
10282
|
] });
|
|
10206
|
-
const filterContent = col.filter && /* @__PURE__ */ (0,
|
|
10283
|
+
const filterContent = col.filter && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10207
10284
|
Popover,
|
|
10208
10285
|
{
|
|
10209
10286
|
placement: isRightAlign ? "bottom-end" : "bottom-start",
|
|
10210
|
-
trigger: /* @__PURE__ */ (0,
|
|
10287
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10211
10288
|
"button",
|
|
10212
10289
|
{
|
|
10213
10290
|
className: cn(
|
|
@@ -10217,16 +10294,16 @@ function DataTable({
|
|
|
10217
10294
|
),
|
|
10218
10295
|
"aria-label": "Filter",
|
|
10219
10296
|
title: "Filter",
|
|
10220
|
-
children: /* @__PURE__ */ (0,
|
|
10297
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react25.Filter, { className: "h-4 w-4" })
|
|
10221
10298
|
}
|
|
10222
10299
|
),
|
|
10223
|
-
children: /* @__PURE__ */ (0,
|
|
10224
|
-
/* @__PURE__ */ (0,
|
|
10300
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "w-48 p-2 space-y-2", children: [
|
|
10301
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: [
|
|
10225
10302
|
"Filter ",
|
|
10226
10303
|
col.title
|
|
10227
10304
|
] }),
|
|
10228
10305
|
renderFilterControl(col),
|
|
10229
|
-
filters[col.key] && /* @__PURE__ */ (0,
|
|
10306
|
+
filters[col.key] && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10230
10307
|
"button",
|
|
10231
10308
|
{
|
|
10232
10309
|
onClick: () => {
|
|
@@ -10244,7 +10321,7 @@ function DataTable({
|
|
|
10244
10321
|
] })
|
|
10245
10322
|
}
|
|
10246
10323
|
);
|
|
10247
|
-
return /* @__PURE__ */ (0,
|
|
10324
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10248
10325
|
"div",
|
|
10249
10326
|
{
|
|
10250
10327
|
className: cn(
|
|
@@ -10253,10 +10330,10 @@ function DataTable({
|
|
|
10253
10330
|
isCenterAlign && "justify-center",
|
|
10254
10331
|
!isRightAlign && !isCenterAlign && "justify-between"
|
|
10255
10332
|
),
|
|
10256
|
-
children: isRightAlign ? /* @__PURE__ */ (0,
|
|
10333
|
+
children: isRightAlign ? /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_jsx_runtime46.Fragment, { children: [
|
|
10257
10334
|
filterContent,
|
|
10258
10335
|
titleContent
|
|
10259
|
-
] }) : /* @__PURE__ */ (0,
|
|
10336
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_jsx_runtime46.Fragment, { children: [
|
|
10260
10337
|
titleContent,
|
|
10261
10338
|
filterContent
|
|
10262
10339
|
] })
|
|
@@ -10305,15 +10382,15 @@ function DataTable({
|
|
|
10305
10382
|
}
|
|
10306
10383
|
return processedData.slice(start, start + curPageSize);
|
|
10307
10384
|
}, [processedData, curPage, curPageSize]);
|
|
10308
|
-
return /* @__PURE__ */ (0,
|
|
10309
|
-
/* @__PURE__ */ (0,
|
|
10310
|
-
/* @__PURE__ */ (0,
|
|
10311
|
-
/* @__PURE__ */ (0,
|
|
10312
|
-
enableDensityToggle && /* @__PURE__ */ (0,
|
|
10385
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: cn("space-y-2", className), children: [
|
|
10386
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center justify-between gap-4 mb-1", children: [
|
|
10387
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "text-sm text-muted-foreground", children: caption }),
|
|
10388
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
10389
|
+
enableDensityToggle && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10313
10390
|
DropdownMenu_default,
|
|
10314
10391
|
{
|
|
10315
|
-
trigger: /* @__PURE__ */ (0,
|
|
10316
|
-
/* @__PURE__ */ (0,
|
|
10392
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
|
|
10393
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 10h16M4 14h16M4 18h16" }) }),
|
|
10317
10394
|
labels?.density || t("density")
|
|
10318
10395
|
] }),
|
|
10319
10396
|
items: [
|
|
@@ -10323,11 +10400,11 @@ function DataTable({
|
|
|
10323
10400
|
]
|
|
10324
10401
|
}
|
|
10325
10402
|
),
|
|
10326
|
-
enableColumnVisibilityToggle && /* @__PURE__ */ (0,
|
|
10403
|
+
enableColumnVisibilityToggle && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10327
10404
|
DropdownMenu_default,
|
|
10328
10405
|
{
|
|
10329
|
-
trigger: /* @__PURE__ */ (0,
|
|
10330
|
-
/* @__PURE__ */ (0,
|
|
10406
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
|
|
10407
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10331
10408
|
"path",
|
|
10332
10409
|
{
|
|
10333
10410
|
strokeLinecap: "round",
|
|
@@ -10338,26 +10415,26 @@ function DataTable({
|
|
|
10338
10415
|
) }),
|
|
10339
10416
|
labels?.columns || t("columns")
|
|
10340
10417
|
] }),
|
|
10341
|
-
children: columns.map((c) => /* @__PURE__ */ (0,
|
|
10418
|
+
children: columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
10342
10419
|
DropdownMenuItem,
|
|
10343
10420
|
{
|
|
10344
10421
|
onClick: () => {
|
|
10345
10422
|
setVisibleCols((prev) => prev.includes(c.key) ? prev.filter((k) => k !== c.key) : [...prev, c.key]);
|
|
10346
10423
|
},
|
|
10347
10424
|
children: [
|
|
10348
|
-
/* @__PURE__ */ (0,
|
|
10349
|
-
/* @__PURE__ */ (0,
|
|
10425
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("input", { type: "checkbox", className: "mr-2 rounded border-border", readOnly: true, checked: visibleCols.includes(c.key) }),
|
|
10426
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "truncate", children: c.title })
|
|
10350
10427
|
]
|
|
10351
10428
|
},
|
|
10352
10429
|
c.key
|
|
10353
10430
|
))
|
|
10354
10431
|
}
|
|
10355
10432
|
),
|
|
10356
|
-
enableHeaderAlignToggle && /* @__PURE__ */ (0,
|
|
10433
|
+
enableHeaderAlignToggle && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10357
10434
|
DropdownMenu_default,
|
|
10358
10435
|
{
|
|
10359
|
-
trigger: /* @__PURE__ */ (0,
|
|
10360
|
-
/* @__PURE__ */ (0,
|
|
10436
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
|
|
10437
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 12h10M4 18h16" }) }),
|
|
10361
10438
|
labels?.headerAlign || t("headerAlign")
|
|
10362
10439
|
] }),
|
|
10363
10440
|
items: [
|
|
@@ -10370,17 +10447,17 @@ function DataTable({
|
|
|
10370
10447
|
toolbar
|
|
10371
10448
|
] })
|
|
10372
10449
|
] }),
|
|
10373
|
-
/* @__PURE__ */ (0,
|
|
10450
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: cn("relative rounded-md border border-border/50 overflow-hidden", loading2 && "opacity-60 pointer-events-none"), children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
10374
10451
|
Table,
|
|
10375
10452
|
{
|
|
10376
10453
|
containerClassName: "border-0 md:border-0 rounded-none md:rounded-none shadow-none bg-transparent",
|
|
10377
10454
|
className: "[&_thead]:sticky [&_thead]:top-0 [&_thead]:z-[5] [&_thead]:bg-background [&_thead]:backdrop-blur-sm",
|
|
10378
10455
|
children: [
|
|
10379
|
-
/* @__PURE__ */ (0,
|
|
10380
|
-
/* @__PURE__ */ (0,
|
|
10381
|
-
/* @__PURE__ */ (0,
|
|
10382
|
-
/* @__PURE__ */ (0,
|
|
10383
|
-
/* @__PURE__ */ (0,
|
|
10456
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableHeader, { children: renderHeader }),
|
|
10457
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableBody, { children: loading2 ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { colSpan: visibleColumns.length, className: "text-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center justify-center gap-2 text-muted-foreground", children: [
|
|
10458
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("svg", { className: "animate-spin h-4 w-4", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [
|
|
10459
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
10460
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10384
10461
|
"path",
|
|
10385
10462
|
{
|
|
10386
10463
|
className: "opacity-75",
|
|
@@ -10389,12 +10466,12 @@ function DataTable({
|
|
|
10389
10466
|
}
|
|
10390
10467
|
)
|
|
10391
10468
|
] }),
|
|
10392
|
-
/* @__PURE__ */ (0,
|
|
10393
|
-
] }) }) }) : !displayedData || displayedData.length === 0 ? /* @__PURE__ */ (0,
|
|
10469
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-sm", children: "Loading..." })
|
|
10470
|
+
] }) }) }) : !displayedData || displayedData.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { colSpan: visibleColumns.length, className: "text-center py-6 text-muted-foreground", children: "No data" }) }) : displayedData.map((row, idx) => {
|
|
10394
10471
|
const isLastRow = idx === displayedData.length - 1;
|
|
10395
|
-
return /* @__PURE__ */ (0,
|
|
10472
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableRow, { className: cn(densityRowClass, striped && idx % 2 === 0 && "bg-muted/30"), children: visibleColumns.map((col, colIdx) => {
|
|
10396
10473
|
const value = col.dataIndex ? row[col.dataIndex] : void 0;
|
|
10397
|
-
return /* @__PURE__ */ (0,
|
|
10474
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10398
10475
|
TableCell,
|
|
10399
10476
|
{
|
|
10400
10477
|
className: cn(
|
|
@@ -10414,7 +10491,7 @@ function DataTable({
|
|
|
10414
10491
|
]
|
|
10415
10492
|
}
|
|
10416
10493
|
) }),
|
|
10417
|
-
totalItems > 0 && /* @__PURE__ */ (0,
|
|
10494
|
+
totalItems > 0 && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "border-t bg-muted/30 p-4 rounded-b-md", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
10418
10495
|
Pagination,
|
|
10419
10496
|
{
|
|
10420
10497
|
page: curPage,
|
|
@@ -12204,7 +12281,7 @@ function useForm(props = {}) {
|
|
|
12204
12281
|
|
|
12205
12282
|
// ../../components/ui/Form.tsx
|
|
12206
12283
|
var import_next_intl8 = require("next-intl");
|
|
12207
|
-
var
|
|
12284
|
+
var import_jsx_runtime47 = require("react/jsx-runtime");
|
|
12208
12285
|
var FormConfigContext = React39.createContext({ size: "md" });
|
|
12209
12286
|
var FormWrapper = ({
|
|
12210
12287
|
children,
|
|
@@ -12224,14 +12301,14 @@ var FormWrapper = ({
|
|
|
12224
12301
|
}
|
|
12225
12302
|
}, [JSON.stringify(initialValues)]);
|
|
12226
12303
|
const { validationSchema: _, ...formProps } = props;
|
|
12227
|
-
return /* @__PURE__ */ (0,
|
|
12304
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormProvider, { ...methods, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormConfigContext.Provider, { value: { size }, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("form", { onSubmit: methods.handleSubmit(onSubmit), className, ...formProps, children }) }) });
|
|
12228
12305
|
};
|
|
12229
12306
|
var Form = FormWrapper;
|
|
12230
12307
|
var FormFieldContext = React39.createContext({});
|
|
12231
12308
|
var FormField = ({
|
|
12232
12309
|
...props
|
|
12233
12310
|
}) => {
|
|
12234
|
-
return /* @__PURE__ */ (0,
|
|
12311
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Controller, { ...props }) });
|
|
12235
12312
|
};
|
|
12236
12313
|
var useFormField = () => {
|
|
12237
12314
|
const fieldContext = React39.useContext(FormFieldContext);
|
|
@@ -12259,14 +12336,14 @@ var useFormField = () => {
|
|
|
12259
12336
|
var FormItemContext = React39.createContext({});
|
|
12260
12337
|
var FormItem = React39.forwardRef(({ className, ...props }, ref) => {
|
|
12261
12338
|
const id = React39.useId();
|
|
12262
|
-
return /* @__PURE__ */ (0,
|
|
12339
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { ref, className: cn("space-y-2", className), ...props }) });
|
|
12263
12340
|
});
|
|
12264
12341
|
FormItem.displayName = "FormItem";
|
|
12265
12342
|
var FormLabel = React39.forwardRef(({ className, children, required, ...props }, ref) => {
|
|
12266
12343
|
const { error, formItemId } = useFormField();
|
|
12267
12344
|
const config = React39.useContext(FormConfigContext);
|
|
12268
12345
|
const sizeClass = config.size === "sm" ? "text-xs" : config.size === "lg" ? "text-base" : "text-sm";
|
|
12269
|
-
return /* @__PURE__ */ (0,
|
|
12346
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(
|
|
12270
12347
|
Label,
|
|
12271
12348
|
{
|
|
12272
12349
|
ref,
|
|
@@ -12275,7 +12352,7 @@ var FormLabel = React39.forwardRef(({ className, children, required, ...props },
|
|
|
12275
12352
|
...props,
|
|
12276
12353
|
children: [
|
|
12277
12354
|
children,
|
|
12278
|
-
required && /* @__PURE__ */ (0,
|
|
12355
|
+
required && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "text-destructive ml-1", children: "*" })
|
|
12279
12356
|
]
|
|
12280
12357
|
}
|
|
12281
12358
|
);
|
|
@@ -12283,7 +12360,7 @@ var FormLabel = React39.forwardRef(({ className, children, required, ...props },
|
|
|
12283
12360
|
FormLabel.displayName = "FormLabel";
|
|
12284
12361
|
var FormControl = React39.forwardRef(({ ...props }, ref) => {
|
|
12285
12362
|
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
12286
|
-
return /* @__PURE__ */ (0,
|
|
12363
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
12287
12364
|
"div",
|
|
12288
12365
|
{
|
|
12289
12366
|
ref,
|
|
@@ -12297,7 +12374,7 @@ var FormControl = React39.forwardRef(({ ...props }, ref) => {
|
|
|
12297
12374
|
FormControl.displayName = "FormControl";
|
|
12298
12375
|
var FormDescription = React39.forwardRef(({ className, ...props }, ref) => {
|
|
12299
12376
|
const { formDescriptionId } = useFormField();
|
|
12300
|
-
return /* @__PURE__ */ (0,
|
|
12377
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", { ref, id: formDescriptionId, className: cn("text-sm text-muted-foreground", className), ...props });
|
|
12301
12378
|
});
|
|
12302
12379
|
FormDescription.displayName = "FormDescription";
|
|
12303
12380
|
var FormMessage = React39.forwardRef(({ className, children, ...props }, ref) => {
|
|
@@ -12306,26 +12383,26 @@ var FormMessage = React39.forwardRef(({ className, children, ...props }, ref) =>
|
|
|
12306
12383
|
if (!body) {
|
|
12307
12384
|
return null;
|
|
12308
12385
|
}
|
|
12309
|
-
return /* @__PURE__ */ (0,
|
|
12386
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", { ref, id: formMessageId, className: cn("text-sm font-medium text-destructive", className), ...props, children: body });
|
|
12310
12387
|
});
|
|
12311
12388
|
FormMessage.displayName = "FormMessage";
|
|
12312
|
-
var FormInput = React39.forwardRef(({ name, ...props }, ref) => /* @__PURE__ */ (0,
|
|
12389
|
+
var FormInput = React39.forwardRef(({ name, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormConfigContext.Consumer, { children: ({ size }) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
12313
12390
|
FormField,
|
|
12314
12391
|
{
|
|
12315
12392
|
name,
|
|
12316
|
-
render: ({ field }) => /* @__PURE__ */ (0,
|
|
12317
|
-
/* @__PURE__ */ (0,
|
|
12318
|
-
/* @__PURE__ */ (0,
|
|
12393
|
+
render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(FormItem, { children: [
|
|
12394
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Input_default, { size: props.size ?? size, ...field, ...props }) }),
|
|
12395
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormMessage, {})
|
|
12319
12396
|
] })
|
|
12320
12397
|
}
|
|
12321
12398
|
) }));
|
|
12322
12399
|
FormInput.displayName = "FormInput";
|
|
12323
|
-
var FormCheckbox = React39.forwardRef(({ name, ...props }, ref) => /* @__PURE__ */ (0,
|
|
12400
|
+
var FormCheckbox = React39.forwardRef(({ name, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormConfigContext.Consumer, { children: ({ size }) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
12324
12401
|
FormField,
|
|
12325
12402
|
{
|
|
12326
12403
|
name,
|
|
12327
|
-
render: ({ field }) => /* @__PURE__ */ (0,
|
|
12328
|
-
/* @__PURE__ */ (0,
|
|
12404
|
+
render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(FormItem, { children: [
|
|
12405
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
12329
12406
|
Checkbox,
|
|
12330
12407
|
{
|
|
12331
12408
|
ref,
|
|
@@ -12339,20 +12416,20 @@ var FormCheckbox = React39.forwardRef(({ name, ...props }, ref) => /* @__PURE__
|
|
|
12339
12416
|
...props
|
|
12340
12417
|
}
|
|
12341
12418
|
) }),
|
|
12342
|
-
/* @__PURE__ */ (0,
|
|
12419
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormMessage, {})
|
|
12343
12420
|
] })
|
|
12344
12421
|
}
|
|
12345
12422
|
) }));
|
|
12346
12423
|
FormCheckbox.displayName = "FormCheckbox";
|
|
12347
|
-
var FormActions = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
12424
|
+
var FormActions = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { ref, className: cn("flex gap-2 justify-end", className), ...props }));
|
|
12348
12425
|
FormActions.displayName = "FormActions";
|
|
12349
|
-
var FormSubmitButton = React39.forwardRef(({ children, loading: loading2, ...props }, ref) => /* @__PURE__ */ (0,
|
|
12426
|
+
var FormSubmitButton = React39.forwardRef(({ children, loading: loading2, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(FormConfigContext.Consumer, { children: ({ size }) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Button_default, { ref, type: "submit", size: props.size ?? size, disabled: loading2, ...props, children }) }));
|
|
12350
12427
|
FormSubmitButton.displayName = "FormSubmitButton";
|
|
12351
12428
|
|
|
12352
12429
|
// ../../components/ui/NotificationModal.tsx
|
|
12353
|
-
var
|
|
12430
|
+
var import_lucide_react26 = require("lucide-react");
|
|
12354
12431
|
var import_next_intl9 = require("next-intl");
|
|
12355
|
-
var
|
|
12432
|
+
var import_jsx_runtime48 = require("react/jsx-runtime");
|
|
12356
12433
|
function NotificationModal({ isOpen, onClose, notification, titleText, openLinkText, closeText }) {
|
|
12357
12434
|
const t = (0, import_next_intl9.useTranslations)("Common");
|
|
12358
12435
|
if (!notification) return null;
|
|
@@ -12373,26 +12450,26 @@ function NotificationModal({ isOpen, onClose, notification, titleText, openLinkT
|
|
|
12373
12450
|
onClose();
|
|
12374
12451
|
}
|
|
12375
12452
|
};
|
|
12376
|
-
return /* @__PURE__ */ (0,
|
|
12453
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
12377
12454
|
Modal_default,
|
|
12378
12455
|
{
|
|
12379
12456
|
isOpen,
|
|
12380
12457
|
onClose,
|
|
12381
12458
|
title: titleText || t("notifications"),
|
|
12382
12459
|
size: "md",
|
|
12383
|
-
children: /* @__PURE__ */ (0,
|
|
12384
|
-
/* @__PURE__ */ (0,
|
|
12385
|
-
/* @__PURE__ */ (0,
|
|
12460
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-4", children: [
|
|
12461
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-2 pb-2 border-b border-border", children: [
|
|
12462
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: cn(
|
|
12386
12463
|
"w-2 h-2 rounded-full",
|
|
12387
12464
|
!notification.is_read ? "bg-primary" : "bg-border"
|
|
12388
12465
|
) }),
|
|
12389
|
-
/* @__PURE__ */ (0,
|
|
12466
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "text-xs text-muted-foreground", children: !notification.is_read ? t("newNotification") : t("readStatus") })
|
|
12390
12467
|
] }),
|
|
12391
|
-
notification.title && /* @__PURE__ */ (0,
|
|
12392
|
-
notification.body && /* @__PURE__ */ (0,
|
|
12393
|
-
/* @__PURE__ */ (0,
|
|
12394
|
-
/* @__PURE__ */ (0,
|
|
12395
|
-
hasLink && /* @__PURE__ */ (0,
|
|
12468
|
+
notification.title && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("h3", { className: "text-lg font-semibold text-foreground", children: notification.title }),
|
|
12469
|
+
notification.body && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "text-sm text-muted-foreground whitespace-pre-wrap leading-relaxed", children: notification.body }),
|
|
12470
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "text-xs text-muted-foreground border-t border-border pt-2", children: formatTime3(notification.created_at) }),
|
|
12471
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex gap-2 justify-end pt-2", children: [
|
|
12472
|
+
hasLink && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
12396
12473
|
Button_default,
|
|
12397
12474
|
{
|
|
12398
12475
|
variant: "primary",
|
|
@@ -12400,12 +12477,12 @@ function NotificationModal({ isOpen, onClose, notification, titleText, openLinkT
|
|
|
12400
12477
|
onClick: handleLinkClick,
|
|
12401
12478
|
className: "gap-2",
|
|
12402
12479
|
children: [
|
|
12403
|
-
/* @__PURE__ */ (0,
|
|
12480
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react26.ExternalLink, { className: "w-4 h-4" }),
|
|
12404
12481
|
openLinkText || t("openLink")
|
|
12405
12482
|
]
|
|
12406
12483
|
}
|
|
12407
12484
|
),
|
|
12408
|
-
/* @__PURE__ */ (0,
|
|
12485
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
12409
12486
|
Button_default,
|
|
12410
12487
|
{
|
|
12411
12488
|
variant: "ghost",
|
|
@@ -12424,160 +12501,10 @@ var NotificationModal_default = NotificationModal;
|
|
|
12424
12501
|
// ../../components/ui/FloatingContacts.tsx
|
|
12425
12502
|
var import_link2 = __toESM(require("next/link"), 1);
|
|
12426
12503
|
var import_navigation = require("next/navigation");
|
|
12427
|
-
var
|
|
12428
|
-
|
|
12429
|
-
// ../../node_modules/react-icons/lib/iconBase.mjs
|
|
12430
|
-
var import_react26 = __toESM(require("react"), 1);
|
|
12431
|
-
|
|
12432
|
-
// ../../node_modules/react-icons/lib/iconContext.mjs
|
|
12433
|
-
var import_react25 = __toESM(require("react"), 1);
|
|
12434
|
-
var DefaultContext = {
|
|
12435
|
-
color: void 0,
|
|
12436
|
-
size: void 0,
|
|
12437
|
-
className: void 0,
|
|
12438
|
-
style: void 0,
|
|
12439
|
-
attr: void 0
|
|
12440
|
-
};
|
|
12441
|
-
var IconContext = import_react25.default.createContext && /* @__PURE__ */ import_react25.default.createContext(DefaultContext);
|
|
12442
|
-
|
|
12443
|
-
// ../../node_modules/react-icons/lib/iconBase.mjs
|
|
12444
|
-
var _excluded = ["attr", "size", "title"];
|
|
12445
|
-
function _objectWithoutProperties(source, excluded) {
|
|
12446
|
-
if (source == null) return {};
|
|
12447
|
-
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
12448
|
-
var key, i;
|
|
12449
|
-
if (Object.getOwnPropertySymbols) {
|
|
12450
|
-
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
12451
|
-
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
12452
|
-
key = sourceSymbolKeys[i];
|
|
12453
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
12454
|
-
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
12455
|
-
target[key] = source[key];
|
|
12456
|
-
}
|
|
12457
|
-
}
|
|
12458
|
-
return target;
|
|
12459
|
-
}
|
|
12460
|
-
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
12461
|
-
if (source == null) return {};
|
|
12462
|
-
var target = {};
|
|
12463
|
-
for (var key in source) {
|
|
12464
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
12465
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
12466
|
-
target[key] = source[key];
|
|
12467
|
-
}
|
|
12468
|
-
}
|
|
12469
|
-
return target;
|
|
12470
|
-
}
|
|
12471
|
-
function _extends() {
|
|
12472
|
-
_extends = Object.assign ? Object.assign.bind() : function(target) {
|
|
12473
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
12474
|
-
var source = arguments[i];
|
|
12475
|
-
for (var key in source) {
|
|
12476
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
12477
|
-
target[key] = source[key];
|
|
12478
|
-
}
|
|
12479
|
-
}
|
|
12480
|
-
}
|
|
12481
|
-
return target;
|
|
12482
|
-
};
|
|
12483
|
-
return _extends.apply(this, arguments);
|
|
12484
|
-
}
|
|
12485
|
-
function ownKeys(e, r) {
|
|
12486
|
-
var t = Object.keys(e);
|
|
12487
|
-
if (Object.getOwnPropertySymbols) {
|
|
12488
|
-
var o = Object.getOwnPropertySymbols(e);
|
|
12489
|
-
r && (o = o.filter(function(r2) {
|
|
12490
|
-
return Object.getOwnPropertyDescriptor(e, r2).enumerable;
|
|
12491
|
-
})), t.push.apply(t, o);
|
|
12492
|
-
}
|
|
12493
|
-
return t;
|
|
12494
|
-
}
|
|
12495
|
-
function _objectSpread(e) {
|
|
12496
|
-
for (var r = 1; r < arguments.length; r++) {
|
|
12497
|
-
var t = null != arguments[r] ? arguments[r] : {};
|
|
12498
|
-
r % 2 ? ownKeys(Object(t), true).forEach(function(r2) {
|
|
12499
|
-
_defineProperty(e, r2, t[r2]);
|
|
12500
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r2) {
|
|
12501
|
-
Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2));
|
|
12502
|
-
});
|
|
12503
|
-
}
|
|
12504
|
-
return e;
|
|
12505
|
-
}
|
|
12506
|
-
function _defineProperty(obj, key, value) {
|
|
12507
|
-
key = _toPropertyKey(key);
|
|
12508
|
-
if (key in obj) {
|
|
12509
|
-
Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
|
|
12510
|
-
} else {
|
|
12511
|
-
obj[key] = value;
|
|
12512
|
-
}
|
|
12513
|
-
return obj;
|
|
12514
|
-
}
|
|
12515
|
-
function _toPropertyKey(t) {
|
|
12516
|
-
var i = _toPrimitive(t, "string");
|
|
12517
|
-
return "symbol" == typeof i ? i : i + "";
|
|
12518
|
-
}
|
|
12519
|
-
function _toPrimitive(t, r) {
|
|
12520
|
-
if ("object" != typeof t || !t) return t;
|
|
12521
|
-
var e = t[Symbol.toPrimitive];
|
|
12522
|
-
if (void 0 !== e) {
|
|
12523
|
-
var i = e.call(t, r || "default");
|
|
12524
|
-
if ("object" != typeof i) return i;
|
|
12525
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
12526
|
-
}
|
|
12527
|
-
return ("string" === r ? String : Number)(t);
|
|
12528
|
-
}
|
|
12529
|
-
function Tree2Element(tree) {
|
|
12530
|
-
return tree && tree.map((node, i) => /* @__PURE__ */ import_react26.default.createElement(node.tag, _objectSpread({
|
|
12531
|
-
key: i
|
|
12532
|
-
}, node.attr), Tree2Element(node.child)));
|
|
12533
|
-
}
|
|
12534
|
-
function GenIcon(data) {
|
|
12535
|
-
return (props) => /* @__PURE__ */ import_react26.default.createElement(IconBase, _extends({
|
|
12536
|
-
attr: _objectSpread({}, data.attr)
|
|
12537
|
-
}, props), Tree2Element(data.child));
|
|
12538
|
-
}
|
|
12539
|
-
function IconBase(props) {
|
|
12540
|
-
var elem = (conf) => {
|
|
12541
|
-
var {
|
|
12542
|
-
attr,
|
|
12543
|
-
size,
|
|
12544
|
-
title
|
|
12545
|
-
} = props, svgProps = _objectWithoutProperties(props, _excluded);
|
|
12546
|
-
var computedSize = size || conf.size || "1em";
|
|
12547
|
-
var className;
|
|
12548
|
-
if (conf.className) className = conf.className;
|
|
12549
|
-
if (props.className) className = (className ? className + " " : "") + props.className;
|
|
12550
|
-
return /* @__PURE__ */ import_react26.default.createElement("svg", _extends({
|
|
12551
|
-
stroke: "currentColor",
|
|
12552
|
-
fill: "currentColor",
|
|
12553
|
-
strokeWidth: "0"
|
|
12554
|
-
}, conf.attr, attr, svgProps, {
|
|
12555
|
-
className,
|
|
12556
|
-
style: _objectSpread(_objectSpread({
|
|
12557
|
-
color: props.color || conf.color
|
|
12558
|
-
}, conf.style), props.style),
|
|
12559
|
-
height: computedSize,
|
|
12560
|
-
width: computedSize,
|
|
12561
|
-
xmlns: "http://www.w3.org/2000/svg"
|
|
12562
|
-
}), title && /* @__PURE__ */ import_react26.default.createElement("title", null, title), props.children);
|
|
12563
|
-
};
|
|
12564
|
-
return IconContext !== void 0 ? /* @__PURE__ */ import_react26.default.createElement(IconContext.Consumer, null, (conf) => elem(conf)) : elem(DefaultContext);
|
|
12565
|
-
}
|
|
12566
|
-
|
|
12567
|
-
// ../../node_modules/react-icons/fa/index.mjs
|
|
12568
|
-
function FaInstagram(props) {
|
|
12569
|
-
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 448 512" }, "child": [{ "tag": "path", "attr": { "d": "M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z" }, "child": [] }] })(props);
|
|
12570
|
-
}
|
|
12571
|
-
|
|
12572
|
-
// ../../node_modules/react-icons/si/index.mjs
|
|
12573
|
-
function SiZalo(props) {
|
|
12574
|
-
return GenIcon({ "tag": "svg", "attr": { "role": "img", "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "d": "M12.49 10.2722v-.4496h1.3467v6.3218h-.7704a.576.576 0 01-.5763-.5729l-.0006.0005a3.273 3.273 0 01-1.9372.6321c-1.8138 0-3.2844-1.4697-3.2844-3.2823 0-1.8125 1.4706-3.2822 3.2844-3.2822a3.273 3.273 0 011.9372.6321l.0006.0005zM6.9188 7.7896v.205c0 .3823-.051.6944-.2995 1.0605l-.03.0343c-.0542.0615-.1815.206-.2421.2843L2.024 14.8h4.8948v.7682a.5764.5764 0 01-.5767.5761H0v-.3622c0-.4436.1102-.6414.2495-.8476L4.8582 9.23H.1922V7.7896h6.7266zm8.5513 8.3548a.4805.4805 0 01-.4803-.4798v-7.875h1.4416v8.3548H15.47zM20.6934 9.6C22.52 9.6 24 11.0807 24 12.9044c0 1.8252-1.4801 3.306-3.3066 3.306-1.8264 0-3.3066-1.4808-3.3066-3.306 0-1.8237 1.4802-3.3044 3.3066-3.3044zm-10.1412 5.253c1.0675 0 1.9324-.8645 1.9324-1.9312 0-1.065-.865-1.9295-1.9324-1.9295s-1.9324.8644-1.9324 1.9295c0 1.0667.865 1.9312 1.9324 1.9312zm10.1412-.0033c1.0737 0 1.945-.8707 1.945-1.9453 0-1.073-.8713-1.9436-1.945-1.9436-1.0753 0-1.945.8706-1.945 1.9436 0 1.0746.8697 1.9453 1.945 1.9453z" }, "child": [] }] })(props);
|
|
12575
|
-
}
|
|
12576
|
-
|
|
12577
|
-
// ../../components/ui/FloatingContacts.tsx
|
|
12578
|
-
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
12504
|
+
var import_lucide_react27 = require("lucide-react");
|
|
12505
|
+
var import_jsx_runtime49 = require("react/jsx-runtime");
|
|
12579
12506
|
function MessengerIcon(props) {
|
|
12580
|
-
return /* @__PURE__ */ (0,
|
|
12507
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("svg", { viewBox: "0 0 24 24", width: 24, height: 24, "aria-hidden": "true", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
12581
12508
|
"path",
|
|
12582
12509
|
{
|
|
12583
12510
|
d: "M12 2C6.477 2 2 6.145 2 11.235c0 2.93 1.35 5.542 3.464 7.25v3.515l3.344-1.836c.894.247 1.843.375 2.192.375 5.523 0 10-4.145 10-9.235S17.523 2 12 2zm.994 12.444l-2.563-2.73-5.004 2.73 5.507-5.84 2.626 2.729 4.942-2.729-5.508 5.84z",
|
|
@@ -12586,10 +12513,16 @@ function MessengerIcon(props) {
|
|
|
12586
12513
|
) });
|
|
12587
12514
|
}
|
|
12588
12515
|
function ZaloIcon(props) {
|
|
12589
|
-
return /* @__PURE__ */ (0,
|
|
12516
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("svg", { viewBox: "0 0 48 48", width: 20, height: 20, "aria-hidden": "true", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
12517
|
+
"path",
|
|
12518
|
+
{
|
|
12519
|
+
fill: "white",
|
|
12520
|
+
d: "M24 4C12.954 4 4 12.954 4 24s8.954 20 20 20 20-8.954 20-20S35.046 4 24 4zm6.164 27.602h-4.239c-.405 0-.732-.328-.732-.732v-7.596l-2.646 7.933c-.096.288-.366.482-.67.482h-1.773c-.304 0-.574-.194-.67-.482l-2.647-7.933v7.596c0 .405-.327.732-.732.732h-2.873c-.405 0-.732-.328-.732-.732V17.134c0-.405.327-.732.732-.732h3.91c.32 0 .602.208.698.514l2.68 8.042 2.68-8.042c.096-.306.378-.514.698-.514h3.91c.405 0 .732.327.732.732v14.466c0 .404-.327.732-.732.732z"
|
|
12521
|
+
}
|
|
12522
|
+
) });
|
|
12590
12523
|
}
|
|
12591
12524
|
function InstagramIcon(props) {
|
|
12592
|
-
return /* @__PURE__ */ (0,
|
|
12525
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("svg", { viewBox: "0 0 24 24", width: 20, height: 20, "aria-hidden": "true", fill: "white", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z" }) });
|
|
12593
12526
|
}
|
|
12594
12527
|
function FloatingContacts({ className }) {
|
|
12595
12528
|
const pathname = (0, import_navigation.usePathname)();
|
|
@@ -12624,8 +12557,8 @@ function FloatingContacts({ className }) {
|
|
|
12624
12557
|
external: true
|
|
12625
12558
|
}
|
|
12626
12559
|
];
|
|
12627
|
-
return /* @__PURE__ */ (0,
|
|
12628
|
-
/* @__PURE__ */ (0,
|
|
12560
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: cn("fixed bottom-6 right-4 z-[100000]", "flex flex-col items-end gap-3", className), "aria-label": "Quick contacts", children: [
|
|
12561
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
12629
12562
|
import_link2.default,
|
|
12630
12563
|
{
|
|
12631
12564
|
href: `tel:${hotline.replace(/\D/g, "")}`,
|
|
@@ -12636,10 +12569,10 @@ function FloatingContacts({ className }) {
|
|
|
12636
12569
|
"hover:scale-105 active:scale-95 transition-transform",
|
|
12637
12570
|
"bg-[#22c55e]"
|
|
12638
12571
|
),
|
|
12639
|
-
children: /* @__PURE__ */ (0,
|
|
12572
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react27.Phone, { className: "w-6 h-6" })
|
|
12640
12573
|
}
|
|
12641
12574
|
),
|
|
12642
|
-
moreItems.map(({ key, href, label, bg, Icon, external }) => /* @__PURE__ */ (0,
|
|
12575
|
+
moreItems.map(({ key, href, label, bg, Icon, external }) => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
12643
12576
|
import_link2.default,
|
|
12644
12577
|
{
|
|
12645
12578
|
href,
|
|
@@ -12651,7 +12584,7 @@ function FloatingContacts({ className }) {
|
|
|
12651
12584
|
"hover:scale-105 active:scale-95 transition-transform",
|
|
12652
12585
|
bg
|
|
12653
12586
|
),
|
|
12654
|
-
children: /* @__PURE__ */ (0,
|
|
12587
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Icon, { className: "w-6 h-6" })
|
|
12655
12588
|
},
|
|
12656
12589
|
key
|
|
12657
12590
|
))
|
|
@@ -12659,17 +12592,17 @@ function FloatingContacts({ className }) {
|
|
|
12659
12592
|
}
|
|
12660
12593
|
|
|
12661
12594
|
// ../../components/ui/AccessDenied.tsx
|
|
12662
|
-
var
|
|
12663
|
-
var
|
|
12595
|
+
var import_lucide_react28 = require("lucide-react");
|
|
12596
|
+
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
12664
12597
|
var VARIANT_STYLES = {
|
|
12665
12598
|
destructive: { bg: "bg-destructive/5", border: "border-destructive/20", text: "text-destructive" },
|
|
12666
12599
|
warning: { bg: "bg-warning/5", border: "border-warning/20", text: "text-warning" },
|
|
12667
12600
|
info: { bg: "bg-info/5", border: "border-info/20", text: "text-info" }
|
|
12668
12601
|
};
|
|
12669
12602
|
var DEFAULT_ICONS = {
|
|
12670
|
-
destructive:
|
|
12671
|
-
warning:
|
|
12672
|
-
info:
|
|
12603
|
+
destructive: import_lucide_react28.ShieldAlert,
|
|
12604
|
+
warning: import_lucide_react28.Ban,
|
|
12605
|
+
info: import_lucide_react28.Lock
|
|
12673
12606
|
};
|
|
12674
12607
|
function AccessDenied({
|
|
12675
12608
|
title = "Access Restricted",
|
|
@@ -12681,36 +12614,36 @@ function AccessDenied({
|
|
|
12681
12614
|
}) {
|
|
12682
12615
|
const styles = VARIANT_STYLES[variant];
|
|
12683
12616
|
const UsedIcon = Icon || DEFAULT_ICONS[variant];
|
|
12684
|
-
return /* @__PURE__ */ (0,
|
|
12685
|
-
/* @__PURE__ */ (0,
|
|
12686
|
-
/* @__PURE__ */ (0,
|
|
12687
|
-
/* @__PURE__ */ (0,
|
|
12688
|
-
/* @__PURE__ */ (0,
|
|
12617
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Card_default, { className: cn("p-8 text-center shadow-sm", styles.bg, styles.border, className), children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: "flex flex-col items-center gap-4", children: [
|
|
12618
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: cn("p-3 rounded-lg", styles.bg.replace("/5", "/10")), children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(UsedIcon, { className: cn("w-8 h-8", styles.text) }) }),
|
|
12619
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { children: [
|
|
12620
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("h3", { className: cn("font-semibold mb-2", styles.text), children: title }),
|
|
12621
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("p", { className: cn(styles.text.replace("text-", "text-") + "/80", "text-sm"), children: description })
|
|
12689
12622
|
] }),
|
|
12690
|
-
children && /* @__PURE__ */ (0,
|
|
12623
|
+
children && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "mt-2 flex flex-wrap gap-2 justify-center", children })
|
|
12691
12624
|
] }) });
|
|
12692
12625
|
}
|
|
12693
12626
|
|
|
12694
12627
|
// ../../components/ui/ThemeToggleHeadless.tsx
|
|
12695
|
-
var
|
|
12696
|
-
var
|
|
12628
|
+
var import_lucide_react29 = require("lucide-react");
|
|
12629
|
+
var import_react25 = require("react");
|
|
12697
12630
|
var import_react_dom10 = require("react-dom");
|
|
12698
|
-
var
|
|
12631
|
+
var import_jsx_runtime51 = require("react/jsx-runtime");
|
|
12699
12632
|
function ThemeToggleHeadless({
|
|
12700
12633
|
theme,
|
|
12701
12634
|
onChange,
|
|
12702
12635
|
labels,
|
|
12703
12636
|
className
|
|
12704
12637
|
}) {
|
|
12705
|
-
const [isOpen, setIsOpen] = (0,
|
|
12706
|
-
const [mounted, setMounted] = (0,
|
|
12707
|
-
const triggerRef = (0,
|
|
12708
|
-
const [dropdownPosition, setDropdownPosition] = (0,
|
|
12709
|
-
(0,
|
|
12638
|
+
const [isOpen, setIsOpen] = (0, import_react25.useState)(false);
|
|
12639
|
+
const [mounted, setMounted] = (0, import_react25.useState)(false);
|
|
12640
|
+
const triggerRef = (0, import_react25.useRef)(null);
|
|
12641
|
+
const [dropdownPosition, setDropdownPosition] = (0, import_react25.useState)(null);
|
|
12642
|
+
(0, import_react25.useEffect)(() => setMounted(true), []);
|
|
12710
12643
|
const themes = [
|
|
12711
|
-
{ value: "light", label: labels?.light ?? "Light", icon:
|
|
12712
|
-
{ value: "dark", label: labels?.dark ?? "Dark", icon:
|
|
12713
|
-
{ value: "system", label: labels?.system ?? "System", icon:
|
|
12644
|
+
{ value: "light", label: labels?.light ?? "Light", icon: import_lucide_react29.Sun },
|
|
12645
|
+
{ value: "dark", label: labels?.dark ?? "Dark", icon: import_lucide_react29.Moon },
|
|
12646
|
+
{ value: "system", label: labels?.system ?? "System", icon: import_lucide_react29.Monitor }
|
|
12714
12647
|
];
|
|
12715
12648
|
const current = mounted ? themes.find((t) => t.value === theme) || themes[2] : themes[2];
|
|
12716
12649
|
const CurrentIcon = current.icon;
|
|
@@ -12724,8 +12657,8 @@ function ThemeToggleHeadless({
|
|
|
12724
12657
|
const top = rect.bottom + scrollTop + 8;
|
|
12725
12658
|
return { top, left, width };
|
|
12726
12659
|
};
|
|
12727
|
-
return /* @__PURE__ */ (0,
|
|
12728
|
-
/* @__PURE__ */ (0,
|
|
12660
|
+
return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: cn("relative", className), children: [
|
|
12661
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
12729
12662
|
Button_default,
|
|
12730
12663
|
{
|
|
12731
12664
|
variant: "ghost",
|
|
@@ -12743,25 +12676,25 @@ function ThemeToggleHeadless({
|
|
|
12743
12676
|
"aria-haspopup": "menu",
|
|
12744
12677
|
"aria-expanded": isOpen,
|
|
12745
12678
|
"aria-label": labels?.heading ?? "Theme",
|
|
12746
|
-
children: /* @__PURE__ */ (0,
|
|
12679
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(CurrentIcon, { className: "h-5 w-5" })
|
|
12747
12680
|
}
|
|
12748
12681
|
),
|
|
12749
|
-
isOpen && /* @__PURE__ */ (0,
|
|
12750
|
-
typeof window !== "undefined" && (0, import_react_dom10.createPortal)(/* @__PURE__ */ (0,
|
|
12682
|
+
isOpen && /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_jsx_runtime51.Fragment, { children: [
|
|
12683
|
+
typeof window !== "undefined" && (0, import_react_dom10.createPortal)(/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "fixed inset-0 z-[9998]", onClick: () => setIsOpen(false) }), document.body),
|
|
12751
12684
|
typeof window !== "undefined" && dropdownPosition && (0, import_react_dom10.createPortal)(
|
|
12752
|
-
/* @__PURE__ */ (0,
|
|
12685
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
12753
12686
|
"div",
|
|
12754
12687
|
{
|
|
12755
12688
|
className: "z-[9999] bg-card border border-border rounded-lg shadow-lg overflow-hidden",
|
|
12756
12689
|
style: { position: "absolute", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width },
|
|
12757
12690
|
onMouseDown: (e) => e.stopPropagation(),
|
|
12758
12691
|
role: "menu",
|
|
12759
|
-
children: /* @__PURE__ */ (0,
|
|
12760
|
-
/* @__PURE__ */ (0,
|
|
12692
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "p-2", children: [
|
|
12693
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "px-3 py-2 text-sm font-medium text-muted-foreground border-b border-border mb-2", children: labels?.heading ?? "Theme" }),
|
|
12761
12694
|
themes.map((opt) => {
|
|
12762
12695
|
const Icon = opt.icon;
|
|
12763
12696
|
const active = theme === opt.value;
|
|
12764
|
-
return /* @__PURE__ */ (0,
|
|
12697
|
+
return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
|
|
12765
12698
|
Button_default,
|
|
12766
12699
|
{
|
|
12767
12700
|
variant: "ghost",
|
|
@@ -12777,9 +12710,9 @@ function ThemeToggleHeadless({
|
|
|
12777
12710
|
role: "menuitemradio",
|
|
12778
12711
|
"aria-checked": active,
|
|
12779
12712
|
children: [
|
|
12780
|
-
/* @__PURE__ */ (0,
|
|
12781
|
-
/* @__PURE__ */ (0,
|
|
12782
|
-
active && /* @__PURE__ */ (0,
|
|
12713
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Icon, { className: "h-4 w-4" }),
|
|
12714
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "flex-1 text-left", children: opt.label }),
|
|
12715
|
+
active && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "w-2 h-2 rounded-full bg-primary" })
|
|
12783
12716
|
]
|
|
12784
12717
|
},
|
|
12785
12718
|
opt.value
|
|
@@ -12795,10 +12728,10 @@ function ThemeToggleHeadless({
|
|
|
12795
12728
|
}
|
|
12796
12729
|
|
|
12797
12730
|
// ../../components/ui/LanguageSwitcherHeadless.tsx
|
|
12798
|
-
var
|
|
12731
|
+
var import_react26 = require("react");
|
|
12799
12732
|
var import_react_dom11 = require("react-dom");
|
|
12800
|
-
var
|
|
12801
|
-
var
|
|
12733
|
+
var import_lucide_react30 = require("lucide-react");
|
|
12734
|
+
var import_jsx_runtime52 = require("react/jsx-runtime");
|
|
12802
12735
|
function LanguageSwitcherHeadless({
|
|
12803
12736
|
locales,
|
|
12804
12737
|
currentLocale,
|
|
@@ -12806,9 +12739,9 @@ function LanguageSwitcherHeadless({
|
|
|
12806
12739
|
labels,
|
|
12807
12740
|
className
|
|
12808
12741
|
}) {
|
|
12809
|
-
const [isOpen, setIsOpen] = (0,
|
|
12810
|
-
const [dropdownPosition, setDropdownPosition] = (0,
|
|
12811
|
-
const triggerButtonRef = (0,
|
|
12742
|
+
const [isOpen, setIsOpen] = (0, import_react26.useState)(false);
|
|
12743
|
+
const [dropdownPosition, setDropdownPosition] = (0, import_react26.useState)(null);
|
|
12744
|
+
const triggerButtonRef = (0, import_react26.useRef)(null);
|
|
12812
12745
|
const currentLanguage = locales.find((l) => l.code === currentLocale) || locales[0];
|
|
12813
12746
|
const calculatePosition = () => {
|
|
12814
12747
|
const rect = triggerButtonRef.current?.getBoundingClientRect();
|
|
@@ -12820,8 +12753,8 @@ function LanguageSwitcherHeadless({
|
|
|
12820
12753
|
const top = rect.bottom + scrollTop + 8;
|
|
12821
12754
|
return { top, left, width };
|
|
12822
12755
|
};
|
|
12823
|
-
return /* @__PURE__ */ (0,
|
|
12824
|
-
/* @__PURE__ */ (0,
|
|
12756
|
+
return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: cn("relative", className), children: [
|
|
12757
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
12825
12758
|
Button_default,
|
|
12826
12759
|
{
|
|
12827
12760
|
variant: "ghost",
|
|
@@ -12840,22 +12773,22 @@ function LanguageSwitcherHeadless({
|
|
|
12840
12773
|
"aria-expanded": isOpen,
|
|
12841
12774
|
"aria-label": labels?.heading ?? "Language",
|
|
12842
12775
|
title: labels?.heading ?? "Language",
|
|
12843
|
-
children: /* @__PURE__ */ (0,
|
|
12776
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_lucide_react30.Globe, { className: "h-5 w-5" })
|
|
12844
12777
|
}
|
|
12845
12778
|
),
|
|
12846
|
-
isOpen && /* @__PURE__ */ (0,
|
|
12847
|
-
typeof window !== "undefined" && (0, import_react_dom11.createPortal)(/* @__PURE__ */ (0,
|
|
12779
|
+
isOpen && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_jsx_runtime52.Fragment, { children: [
|
|
12780
|
+
typeof window !== "undefined" && (0, import_react_dom11.createPortal)(/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "fixed inset-0 z-[9998]", onClick: () => setIsOpen(false) }), document.body),
|
|
12848
12781
|
typeof window !== "undefined" && dropdownPosition && (0, import_react_dom11.createPortal)(
|
|
12849
|
-
/* @__PURE__ */ (0,
|
|
12782
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
12850
12783
|
"div",
|
|
12851
12784
|
{
|
|
12852
12785
|
className: "z-[9999] bg-card border border-border rounded-lg shadow-lg overflow-hidden",
|
|
12853
12786
|
style: { position: "absolute", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width },
|
|
12854
12787
|
onMouseDown: (e) => e.stopPropagation(),
|
|
12855
12788
|
role: "menu",
|
|
12856
|
-
children: /* @__PURE__ */ (0,
|
|
12857
|
-
/* @__PURE__ */ (0,
|
|
12858
|
-
locales.map((language) => /* @__PURE__ */ (0,
|
|
12789
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "p-2", children: [
|
|
12790
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "px-3 py-2 text-sm font-medium text-muted-foreground border-b border-border mb-2", children: labels?.heading ?? "Language" }),
|
|
12791
|
+
locales.map((language) => /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
|
|
12859
12792
|
Button_default,
|
|
12860
12793
|
{
|
|
12861
12794
|
variant: "ghost",
|
|
@@ -12868,9 +12801,9 @@ function LanguageSwitcherHeadless({
|
|
|
12868
12801
|
role: "menuitemradio",
|
|
12869
12802
|
"aria-checked": currentLocale === language.code,
|
|
12870
12803
|
children: [
|
|
12871
|
-
language.flag && /* @__PURE__ */ (0,
|
|
12872
|
-
/* @__PURE__ */ (0,
|
|
12873
|
-
currentLocale === language.code && /* @__PURE__ */ (0,
|
|
12804
|
+
language.flag && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "text-lg", children: language.flag }),
|
|
12805
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "flex-1 text-left", children: language.name }),
|
|
12806
|
+
currentLocale === language.code && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "w-2 h-2 rounded-full bg-primary" })
|
|
12874
12807
|
]
|
|
12875
12808
|
},
|
|
12876
12809
|
language.code
|