@dilipod/ui 0.3.4 → 0.4.1
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/components/file-preview.d.ts +25 -0
- package/dist/components/file-preview.d.ts.map +1 -0
- package/dist/components/scenarios-manager.d.ts +23 -0
- package/dist/components/scenarios-manager.d.ts.map +1 -0
- package/dist/components/select.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +607 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +608 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/dialog.tsx +1 -1
- package/src/components/file-preview.tsx +359 -0
- package/src/components/scenarios-manager.tsx +403 -0
- package/src/components/select.tsx +25 -18
- package/src/index.ts +8 -0
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import * as React28 from 'react';
|
|
3
|
+
import { useState, useRef } from 'react';
|
|
3
4
|
import { Slot, createSlot } from '@radix-ui/react-slot';
|
|
4
5
|
import { cva } from 'class-variance-authority';
|
|
5
6
|
import { clsx } from 'clsx';
|
|
@@ -7,7 +8,7 @@ import { twMerge } from 'tailwind-merge';
|
|
|
7
8
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
8
9
|
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
9
10
|
import * as react_star from '@phosphor-icons/react';
|
|
10
|
-
import { X, Circle, CaretLeft, DotsThree, CaretRight, Check, House, Info, WarningCircle } from '@phosphor-icons/react';
|
|
11
|
+
import { X, CaretDown, Circle, CaretLeft, DotsThree, CaretRight, Check, House, Info, WarningCircle, Play, Download, Folder, ArrowSquareOut, CircleNotch, File, FileVideo, Lightning, Plus, FileImage, FilePdf, FileDoc, Question, CheckCircle, Warning, PencilSimple, Trash } from '@phosphor-icons/react';
|
|
11
12
|
import 'react-dom';
|
|
12
13
|
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
13
14
|
import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
|
|
@@ -104,6 +105,7 @@ __export(index_exports, {
|
|
|
104
105
|
DropdownMenuTrigger: () => DropdownMenuTrigger,
|
|
105
106
|
EmptyState: () => EmptyState,
|
|
106
107
|
ErrorState: () => ErrorState,
|
|
108
|
+
FilePreview: () => FilePreview,
|
|
107
109
|
FormField: () => FormField,
|
|
108
110
|
IconBox: () => IconBox,
|
|
109
111
|
Input: () => Input,
|
|
@@ -135,6 +137,7 @@ __export(index_exports, {
|
|
|
135
137
|
RadioGroupCard: () => RadioGroupCard,
|
|
136
138
|
RadioGroupItem: () => RadioGroupItem,
|
|
137
139
|
RadioGroupOption: () => RadioGroupOption,
|
|
140
|
+
ScenariosManager: () => ScenariosManager,
|
|
138
141
|
Select: () => Select,
|
|
139
142
|
Separator: () => Separator2,
|
|
140
143
|
SettingsNav: () => SettingsNav,
|
|
@@ -1279,24 +1282,33 @@ var Textarea = React28.forwardRef(
|
|
|
1279
1282
|
Textarea.displayName = "Textarea";
|
|
1280
1283
|
var Select = React28.forwardRef(
|
|
1281
1284
|
({ className, error, children, ...props }, ref) => {
|
|
1282
|
-
return /* @__PURE__ */
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1285
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
1286
|
+
/* @__PURE__ */ jsx(
|
|
1287
|
+
"select",
|
|
1288
|
+
{
|
|
1289
|
+
ref,
|
|
1290
|
+
className: cn(
|
|
1291
|
+
"h-10 w-full rounded-sm border bg-white px-3 py-2 text-base text-[var(--black)] ring-offset-background",
|
|
1292
|
+
"placeholder:text-gray-500",
|
|
1293
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
1294
|
+
"disabled:cursor-not-allowed disabled:opacity-50 md:text-sm transition-colors",
|
|
1295
|
+
"appearance-none pr-10",
|
|
1296
|
+
error ? "border-red-500 focus-visible:ring-red-500" : "border-gray-300 focus-visible:ring-[var(--cyan)]",
|
|
1297
|
+
className
|
|
1298
|
+
),
|
|
1299
|
+
"aria-invalid": error ? "true" : void 0,
|
|
1300
|
+
...props,
|
|
1301
|
+
children
|
|
1302
|
+
}
|
|
1303
|
+
),
|
|
1304
|
+
/* @__PURE__ */ jsx(
|
|
1305
|
+
CaretDown,
|
|
1306
|
+
{
|
|
1307
|
+
size: 16,
|
|
1308
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 pointer-events-none"
|
|
1309
|
+
}
|
|
1310
|
+
)
|
|
1311
|
+
] });
|
|
1300
1312
|
}
|
|
1301
1313
|
);
|
|
1302
1314
|
Select.displayName = "Select";
|
|
@@ -2336,7 +2348,7 @@ var DialogContent = React28.forwardRef(({ className, children, ...props }, ref)
|
|
|
2336
2348
|
{
|
|
2337
2349
|
ref,
|
|
2338
2350
|
className: cn(
|
|
2339
|
-
"fixed left-
|
|
2351
|
+
"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg gap-4 border border-border bg-white p-6 shadow-lg rounded-sm",
|
|
2340
2352
|
className
|
|
2341
2353
|
),
|
|
2342
2354
|
...props,
|
|
@@ -3454,6 +3466,293 @@ function getDateRangeFromPreset(preset) {
|
|
|
3454
3466
|
}
|
|
3455
3467
|
return { start, end };
|
|
3456
3468
|
}
|
|
3469
|
+
function getFileIcon(type) {
|
|
3470
|
+
if (type.startsWith("video/") || type === "screen_recording") return FileVideo;
|
|
3471
|
+
if (type.startsWith("image/") || type === "image") return FileImage;
|
|
3472
|
+
if (type === "application/pdf" || type === "pdf") return FilePdf;
|
|
3473
|
+
if (type.includes("document") || type === "document") return FileDoc;
|
|
3474
|
+
return File;
|
|
3475
|
+
}
|
|
3476
|
+
function getTypeLabel(type) {
|
|
3477
|
+
if (type.startsWith("video/") || type === "screen_recording") return "Video";
|
|
3478
|
+
if (type.startsWith("audio/")) return "Audio";
|
|
3479
|
+
if (type.startsWith("image/") || type === "image") return "Image";
|
|
3480
|
+
if (type === "application/pdf" || type === "pdf") return "PDF";
|
|
3481
|
+
if (type.includes("document") || type === "document") return "Document";
|
|
3482
|
+
return "File";
|
|
3483
|
+
}
|
|
3484
|
+
function formatSize(size) {
|
|
3485
|
+
if (size < 1024) return `${size} B`;
|
|
3486
|
+
if (size < 1024 * 1024) return `${Math.round(size / 1024)} KB`;
|
|
3487
|
+
return `${(size / (1024 * 1024)).toFixed(1)} MB`;
|
|
3488
|
+
}
|
|
3489
|
+
function canPreview(file) {
|
|
3490
|
+
const ext = file.filename.toLowerCase().split(".").pop() || "";
|
|
3491
|
+
if (["jpg", "jpeg", "png", "gif", "webp", "svg"].includes(ext)) return true;
|
|
3492
|
+
if (["mp4", "webm", "mov", "avi", "mkv"].includes(ext)) return true;
|
|
3493
|
+
if (ext === "pdf") return true;
|
|
3494
|
+
if (file.type.startsWith("image/") || file.type === "image") return true;
|
|
3495
|
+
if (file.type.startsWith("video/") || file.type === "screen_recording") return true;
|
|
3496
|
+
if (file.type === "application/pdf" || file.type === "pdf") return true;
|
|
3497
|
+
return false;
|
|
3498
|
+
}
|
|
3499
|
+
function getPreviewType(file) {
|
|
3500
|
+
const ext = file.filename.toLowerCase().split(".").pop() || "";
|
|
3501
|
+
if (["jpg", "jpeg", "png", "gif", "webp", "svg"].includes(ext) || file.type.startsWith("image/") || file.type === "image") return "image";
|
|
3502
|
+
if (["mp4", "webm", "mov", "avi", "mkv"].includes(ext) || file.type.startsWith("video/") || file.type === "screen_recording") return "video";
|
|
3503
|
+
if (ext === "pdf" || file.type === "application/pdf" || file.type === "pdf") return "pdf";
|
|
3504
|
+
return "none";
|
|
3505
|
+
}
|
|
3506
|
+
function FilePreview({
|
|
3507
|
+
files,
|
|
3508
|
+
title = "Uploaded Files",
|
|
3509
|
+
getSignedUrl,
|
|
3510
|
+
showCard = true,
|
|
3511
|
+
emptyMessage = "No files uploaded"
|
|
3512
|
+
}) {
|
|
3513
|
+
const [previewFile, setPreviewFile] = useState(null);
|
|
3514
|
+
const [videoError, setVideoError] = useState(false);
|
|
3515
|
+
const [signedUrl, setSignedUrl] = useState(null);
|
|
3516
|
+
const [loadingUrl, setLoadingUrl] = useState(false);
|
|
3517
|
+
const [urlError, setUrlError] = useState(null);
|
|
3518
|
+
const videoRef = useRef(null);
|
|
3519
|
+
const handleOpenPreview = async (file) => {
|
|
3520
|
+
setVideoError(false);
|
|
3521
|
+
setPreviewFile(file);
|
|
3522
|
+
setUrlError(null);
|
|
3523
|
+
if (file.url) {
|
|
3524
|
+
setSignedUrl(file.url);
|
|
3525
|
+
} else if (getSignedUrl) {
|
|
3526
|
+
setLoadingUrl(true);
|
|
3527
|
+
try {
|
|
3528
|
+
const url = await getSignedUrl(file.path);
|
|
3529
|
+
if (url) {
|
|
3530
|
+
setSignedUrl(url);
|
|
3531
|
+
} else {
|
|
3532
|
+
setUrlError("Failed to load file URL");
|
|
3533
|
+
}
|
|
3534
|
+
} catch (error) {
|
|
3535
|
+
setUrlError(error instanceof Error ? error.message : "Failed to load file");
|
|
3536
|
+
} finally {
|
|
3537
|
+
setLoadingUrl(false);
|
|
3538
|
+
}
|
|
3539
|
+
} else {
|
|
3540
|
+
setUrlError("No URL available for this file");
|
|
3541
|
+
}
|
|
3542
|
+
};
|
|
3543
|
+
const handleClosePreview = () => {
|
|
3544
|
+
setPreviewFile(null);
|
|
3545
|
+
setSignedUrl(null);
|
|
3546
|
+
setUrlError(null);
|
|
3547
|
+
setLoadingUrl(false);
|
|
3548
|
+
setVideoError(false);
|
|
3549
|
+
};
|
|
3550
|
+
const handleDownload = async (e, file) => {
|
|
3551
|
+
e.stopPropagation();
|
|
3552
|
+
let url = file.url;
|
|
3553
|
+
if (!url && getSignedUrl) {
|
|
3554
|
+
url = await getSignedUrl(file.path) || void 0;
|
|
3555
|
+
}
|
|
3556
|
+
if (url) {
|
|
3557
|
+
window.open(url, "_blank");
|
|
3558
|
+
}
|
|
3559
|
+
};
|
|
3560
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
3561
|
+
files.length > 0 ? /* @__PURE__ */ jsx("div", { className: "space-y-2", children: files.map((file, i) => {
|
|
3562
|
+
const FileIcon = getFileIcon(file.type);
|
|
3563
|
+
const typeLabel = getTypeLabel(file.type);
|
|
3564
|
+
const sizeLabel = formatSize(file.size);
|
|
3565
|
+
const isPreviewable = canPreview(file);
|
|
3566
|
+
const previewType = getPreviewType(file);
|
|
3567
|
+
return /* @__PURE__ */ jsxs(
|
|
3568
|
+
"div",
|
|
3569
|
+
{
|
|
3570
|
+
className: `flex items-center justify-between p-3 rounded-md bg-gray-50 transition-colors ${isPreviewable ? "hover:bg-gray-100 cursor-pointer" : ""}`,
|
|
3571
|
+
onClick: () => isPreviewable && handleOpenPreview(file),
|
|
3572
|
+
children: [
|
|
3573
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [
|
|
3574
|
+
/* @__PURE__ */ jsxs("div", { className: "relative shrink-0", children: [
|
|
3575
|
+
/* @__PURE__ */ jsx("div", { className: "w-10 h-10 rounded-sm bg-white border border-gray-200 flex items-center justify-center", children: /* @__PURE__ */ jsx(FileIcon, { className: "w-5 h-5 text-[var(--cyan)]", weight: "fill" }) }),
|
|
3576
|
+
previewType === "video" && /* @__PURE__ */ jsx(Play, { className: "absolute -bottom-0.5 -right-0.5 w-3.5 h-3.5 text-[var(--cyan)] bg-white rounded-full", weight: "fill" })
|
|
3577
|
+
] }),
|
|
3578
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
3579
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-[var(--black)] truncate", children: file.filename }),
|
|
3580
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
3581
|
+
typeLabel,
|
|
3582
|
+
" \xB7 ",
|
|
3583
|
+
sizeLabel,
|
|
3584
|
+
isPreviewable && /* @__PURE__ */ jsx("span", { className: "text-[var(--cyan)] ml-1", children: "\xB7 Click to preview" })
|
|
3585
|
+
] })
|
|
3586
|
+
] })
|
|
3587
|
+
] }),
|
|
3588
|
+
/* @__PURE__ */ jsx(
|
|
3589
|
+
"button",
|
|
3590
|
+
{
|
|
3591
|
+
onClick: (e) => handleDownload(e, file),
|
|
3592
|
+
className: "p-2 rounded-sm hover:bg-gray-200 transition-colors shrink-0",
|
|
3593
|
+
title: "Download",
|
|
3594
|
+
children: /* @__PURE__ */ jsx(Download, { className: "w-4 h-4 text-muted-foreground" })
|
|
3595
|
+
}
|
|
3596
|
+
)
|
|
3597
|
+
]
|
|
3598
|
+
},
|
|
3599
|
+
i
|
|
3600
|
+
);
|
|
3601
|
+
}) }) : /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-32 border border-dashed border-gray-200 rounded-md", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
3602
|
+
/* @__PURE__ */ jsx(Folder, { size: 24, className: "text-gray-300 mx-auto mb-2" }),
|
|
3603
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage })
|
|
3604
|
+
] }) }),
|
|
3605
|
+
previewFile && /* @__PURE__ */ jsx(
|
|
3606
|
+
"div",
|
|
3607
|
+
{
|
|
3608
|
+
className: "fixed inset-0 z-50 bg-black/80 flex items-center justify-center p-4",
|
|
3609
|
+
onClick: handleClosePreview,
|
|
3610
|
+
children: /* @__PURE__ */ jsxs(
|
|
3611
|
+
"div",
|
|
3612
|
+
{
|
|
3613
|
+
className: "bg-white rounded-lg max-w-5xl w-full max-h-[90vh] flex flex-col overflow-hidden shadow-2xl",
|
|
3614
|
+
onClick: (e) => e.stopPropagation(),
|
|
3615
|
+
children: [
|
|
3616
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-4 border-b border-gray-200", children: [
|
|
3617
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [
|
|
3618
|
+
(() => {
|
|
3619
|
+
const FileIcon = getFileIcon(previewFile.type);
|
|
3620
|
+
return /* @__PURE__ */ jsx(FileIcon, { className: "w-5 h-5 text-[var(--cyan)] flex-shrink-0", weight: "fill" });
|
|
3621
|
+
})(),
|
|
3622
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
3623
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium text-[var(--black)] truncate", children: previewFile.filename }),
|
|
3624
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
3625
|
+
getTypeLabel(previewFile.type),
|
|
3626
|
+
" \xB7 ",
|
|
3627
|
+
formatSize(previewFile.size)
|
|
3628
|
+
] })
|
|
3629
|
+
] })
|
|
3630
|
+
] }),
|
|
3631
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
3632
|
+
signedUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
3633
|
+
/* @__PURE__ */ jsx(
|
|
3634
|
+
"a",
|
|
3635
|
+
{
|
|
3636
|
+
href: signedUrl,
|
|
3637
|
+
target: "_blank",
|
|
3638
|
+
rel: "noopener noreferrer",
|
|
3639
|
+
className: "p-2 rounded-md hover:bg-gray-100 transition-colors",
|
|
3640
|
+
title: "Open in new tab",
|
|
3641
|
+
children: /* @__PURE__ */ jsx(ArrowSquareOut, { className: "w-5 h-5 text-muted-foreground" })
|
|
3642
|
+
}
|
|
3643
|
+
),
|
|
3644
|
+
/* @__PURE__ */ jsx(
|
|
3645
|
+
"a",
|
|
3646
|
+
{
|
|
3647
|
+
href: signedUrl,
|
|
3648
|
+
download: previewFile.filename,
|
|
3649
|
+
className: "p-2 rounded-md hover:bg-gray-100 transition-colors",
|
|
3650
|
+
title: "Download",
|
|
3651
|
+
children: /* @__PURE__ */ jsx(Download, { className: "w-5 h-5 text-muted-foreground" })
|
|
3652
|
+
}
|
|
3653
|
+
)
|
|
3654
|
+
] }),
|
|
3655
|
+
/* @__PURE__ */ jsx(
|
|
3656
|
+
"button",
|
|
3657
|
+
{
|
|
3658
|
+
onClick: handleClosePreview,
|
|
3659
|
+
className: "p-2 rounded-md hover:bg-gray-100 transition-colors ml-2",
|
|
3660
|
+
children: /* @__PURE__ */ jsx(X, { className: "w-5 h-5" })
|
|
3661
|
+
}
|
|
3662
|
+
)
|
|
3663
|
+
] })
|
|
3664
|
+
] }),
|
|
3665
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-auto p-4 bg-gray-900 flex items-center justify-center min-h-[400px]", children: [
|
|
3666
|
+
loadingUrl && /* @__PURE__ */ jsxs("div", { className: "text-center text-white", children: [
|
|
3667
|
+
/* @__PURE__ */ jsx(CircleNotch, { className: "w-8 h-8 mx-auto mb-2 animate-spin text-[var(--cyan)]" }),
|
|
3668
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-400", children: "Loading file..." })
|
|
3669
|
+
] }),
|
|
3670
|
+
urlError && /* @__PURE__ */ jsxs("div", { className: "text-center text-white max-w-md", children: [
|
|
3671
|
+
/* @__PURE__ */ jsx(File, { className: "w-16 h-16 mx-auto mb-4 text-gray-500" }),
|
|
3672
|
+
/* @__PURE__ */ jsx("p", { className: "text-lg font-medium mb-2", children: "Failed to Load File" }),
|
|
3673
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-400", children: urlError })
|
|
3674
|
+
] }),
|
|
3675
|
+
signedUrl && !loadingUrl && !urlError && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
3676
|
+
getPreviewType(previewFile) === "image" && /* @__PURE__ */ jsx(
|
|
3677
|
+
"img",
|
|
3678
|
+
{
|
|
3679
|
+
src: signedUrl,
|
|
3680
|
+
alt: previewFile.filename,
|
|
3681
|
+
className: "max-w-full max-h-[70vh] object-contain rounded-md"
|
|
3682
|
+
}
|
|
3683
|
+
),
|
|
3684
|
+
getPreviewType(previewFile) === "video" && !videoError && /* @__PURE__ */ jsx(
|
|
3685
|
+
"video",
|
|
3686
|
+
{
|
|
3687
|
+
ref: videoRef,
|
|
3688
|
+
src: signedUrl,
|
|
3689
|
+
controls: true,
|
|
3690
|
+
autoPlay: true,
|
|
3691
|
+
className: "w-full max-h-[70vh] rounded-md bg-black",
|
|
3692
|
+
onError: () => setVideoError(true),
|
|
3693
|
+
children: "Your browser does not support the video tag."
|
|
3694
|
+
}
|
|
3695
|
+
),
|
|
3696
|
+
getPreviewType(previewFile) === "video" && videoError && /* @__PURE__ */ jsxs("div", { className: "text-center text-white max-w-md", children: [
|
|
3697
|
+
/* @__PURE__ */ jsx(FileVideo, { className: "w-16 h-16 mx-auto mb-4 text-gray-500" }),
|
|
3698
|
+
/* @__PURE__ */ jsx("p", { className: "text-lg font-medium mb-2", children: "Video Preview Not Available" }),
|
|
3699
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm text-gray-400 mb-6", children: [
|
|
3700
|
+
"This video format (.",
|
|
3701
|
+
previewFile.filename.split(".").pop(),
|
|
3702
|
+
") cannot be played directly in the browser."
|
|
3703
|
+
] }),
|
|
3704
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3 justify-center", children: [
|
|
3705
|
+
/* @__PURE__ */ jsxs(
|
|
3706
|
+
"a",
|
|
3707
|
+
{
|
|
3708
|
+
href: signedUrl,
|
|
3709
|
+
target: "_blank",
|
|
3710
|
+
rel: "noopener noreferrer",
|
|
3711
|
+
className: "inline-flex items-center gap-2 px-4 py-2 bg-white text-gray-900 rounded-full text-sm font-medium hover:bg-gray-100 transition-colors",
|
|
3712
|
+
children: [
|
|
3713
|
+
/* @__PURE__ */ jsx(ArrowSquareOut, { className: "w-4 h-4" }),
|
|
3714
|
+
"Open in New Tab"
|
|
3715
|
+
]
|
|
3716
|
+
}
|
|
3717
|
+
),
|
|
3718
|
+
/* @__PURE__ */ jsxs(
|
|
3719
|
+
"a",
|
|
3720
|
+
{
|
|
3721
|
+
href: signedUrl,
|
|
3722
|
+
download: previewFile.filename,
|
|
3723
|
+
className: "inline-flex items-center gap-2 px-4 py-2 bg-[var(--cyan)] text-gray-900 rounded-full text-sm font-medium hover:bg-[var(--cyan)]/90 transition-colors",
|
|
3724
|
+
children: [
|
|
3725
|
+
/* @__PURE__ */ jsx(Download, { className: "w-4 h-4" }),
|
|
3726
|
+
"Download"
|
|
3727
|
+
]
|
|
3728
|
+
}
|
|
3729
|
+
)
|
|
3730
|
+
] })
|
|
3731
|
+
] }),
|
|
3732
|
+
getPreviewType(previewFile) === "pdf" && /* @__PURE__ */ jsx(
|
|
3733
|
+
"iframe",
|
|
3734
|
+
{
|
|
3735
|
+
src: signedUrl,
|
|
3736
|
+
className: "w-full h-[70vh] rounded-md border-0 bg-white",
|
|
3737
|
+
title: previewFile.filename
|
|
3738
|
+
}
|
|
3739
|
+
)
|
|
3740
|
+
] })
|
|
3741
|
+
] })
|
|
3742
|
+
]
|
|
3743
|
+
}
|
|
3744
|
+
)
|
|
3745
|
+
}
|
|
3746
|
+
)
|
|
3747
|
+
] });
|
|
3748
|
+
if (!showCard) {
|
|
3749
|
+
return content;
|
|
3750
|
+
}
|
|
3751
|
+
return /* @__PURE__ */ jsxs(Card, { children: [
|
|
3752
|
+
/* @__PURE__ */ jsx(CardHeader, { className: "pb-3", children: /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: title }) }),
|
|
3753
|
+
/* @__PURE__ */ jsx(CardContent, { children: content })
|
|
3754
|
+
] });
|
|
3755
|
+
}
|
|
3457
3756
|
var SettingsNav = React28.forwardRef(
|
|
3458
3757
|
({ groups, LinkComponent, className, ...props }, ref) => {
|
|
3459
3758
|
const Link2 = LinkComponent || "a";
|
|
@@ -3512,10 +3811,298 @@ var SettingsNavLink = React28.forwardRef(
|
|
|
3512
3811
|
}
|
|
3513
3812
|
);
|
|
3514
3813
|
SettingsNavLink.displayName = "SettingsNavLink";
|
|
3814
|
+
var typeConfig = {
|
|
3815
|
+
escalation: {
|
|
3816
|
+
label: "Ask me first",
|
|
3817
|
+
icon: Warning,
|
|
3818
|
+
color: "text-amber-600",
|
|
3819
|
+
bgColor: "bg-amber-50",
|
|
3820
|
+
description: "Stop and check with me before proceeding"
|
|
3821
|
+
},
|
|
3822
|
+
default_behavior: {
|
|
3823
|
+
label: "Handle it",
|
|
3824
|
+
icon: CheckCircle,
|
|
3825
|
+
color: "text-blue-600",
|
|
3826
|
+
bgColor: "bg-blue-50",
|
|
3827
|
+
description: "Proceed automatically using this rule"
|
|
3828
|
+
},
|
|
3829
|
+
quality_check: {
|
|
3830
|
+
label: "Must be correct",
|
|
3831
|
+
icon: CheckCircle,
|
|
3832
|
+
color: "text-emerald-600",
|
|
3833
|
+
bgColor: "bg-emerald-50",
|
|
3834
|
+
description: 'This is what "done right" looks like'
|
|
3835
|
+
},
|
|
3836
|
+
edge_case: {
|
|
3837
|
+
label: "Watch out",
|
|
3838
|
+
icon: Question,
|
|
3839
|
+
color: "text-purple-600",
|
|
3840
|
+
bgColor: "bg-purple-50",
|
|
3841
|
+
description: "Common mistakes or tricky situations"
|
|
3842
|
+
}
|
|
3843
|
+
};
|
|
3844
|
+
function ScenarioCard({
|
|
3845
|
+
scenario,
|
|
3846
|
+
onEdit,
|
|
3847
|
+
onDelete
|
|
3848
|
+
}) {
|
|
3849
|
+
const config = typeConfig[scenario.type];
|
|
3850
|
+
const Icon = config.icon;
|
|
3851
|
+
return /* @__PURE__ */ jsx("div", { className: "group relative border border-gray-200 rounded-sm p-4 hover:border-gray-300 transition-colors", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
3852
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 flex-1 min-w-0", children: [
|
|
3853
|
+
/* @__PURE__ */ jsx("div", { className: cn("w-8 h-8 rounded-sm flex items-center justify-center shrink-0", config.bgColor), children: /* @__PURE__ */ jsx(Icon, { size: 16, weight: "fill", className: config.color }) }),
|
|
3854
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
3855
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 mb-1", children: /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", children: config.label }) }),
|
|
3856
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm text-[var(--black)] font-medium", children: [
|
|
3857
|
+
"When: ",
|
|
3858
|
+
/* @__PURE__ */ jsx("span", { className: "font-normal", children: scenario.situation })
|
|
3859
|
+
] }),
|
|
3860
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground mt-1", children: [
|
|
3861
|
+
"Action: ",
|
|
3862
|
+
/* @__PURE__ */ jsx("span", { className: "text-[var(--black)]", children: scenario.action })
|
|
3863
|
+
] })
|
|
3864
|
+
] })
|
|
3865
|
+
] }),
|
|
3866
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity", children: [
|
|
3867
|
+
/* @__PURE__ */ jsx(
|
|
3868
|
+
Button,
|
|
3869
|
+
{
|
|
3870
|
+
variant: "ghost",
|
|
3871
|
+
size: "icon",
|
|
3872
|
+
className: "h-8 w-8",
|
|
3873
|
+
onClick: onEdit,
|
|
3874
|
+
children: /* @__PURE__ */ jsx(PencilSimple, { size: 16 })
|
|
3875
|
+
}
|
|
3876
|
+
),
|
|
3877
|
+
/* @__PURE__ */ jsx(
|
|
3878
|
+
Button,
|
|
3879
|
+
{
|
|
3880
|
+
variant: "ghost",
|
|
3881
|
+
size: "icon",
|
|
3882
|
+
className: "h-8 w-8 text-red-600 hover:text-red-700 hover:bg-red-50",
|
|
3883
|
+
onClick: onDelete,
|
|
3884
|
+
children: /* @__PURE__ */ jsx(Trash, { size: 16 })
|
|
3885
|
+
}
|
|
3886
|
+
)
|
|
3887
|
+
] })
|
|
3888
|
+
] }) });
|
|
3889
|
+
}
|
|
3890
|
+
function SuggestionChip({
|
|
3891
|
+
suggestion,
|
|
3892
|
+
onAdd,
|
|
3893
|
+
disabled
|
|
3894
|
+
}) {
|
|
3895
|
+
const config = typeConfig[suggestion.type];
|
|
3896
|
+
config.icon;
|
|
3897
|
+
return /* @__PURE__ */ jsxs(
|
|
3898
|
+
"button",
|
|
3899
|
+
{
|
|
3900
|
+
type: "button",
|
|
3901
|
+
onClick: onAdd,
|
|
3902
|
+
disabled,
|
|
3903
|
+
className: cn(
|
|
3904
|
+
"inline-flex items-center gap-2 px-3 py-2 rounded-sm border border-dashed border-gray-300",
|
|
3905
|
+
"text-sm text-muted-foreground hover:border-[var(--cyan)] hover:text-[var(--cyan)] hover:bg-[var(--cyan)]/5",
|
|
3906
|
+
"transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
3907
|
+
),
|
|
3908
|
+
children: [
|
|
3909
|
+
/* @__PURE__ */ jsx(Plus, { size: 14 }),
|
|
3910
|
+
suggestion.situation
|
|
3911
|
+
]
|
|
3912
|
+
}
|
|
3913
|
+
);
|
|
3914
|
+
}
|
|
3915
|
+
function ScenarioDialog({
|
|
3916
|
+
open,
|
|
3917
|
+
onOpenChange,
|
|
3918
|
+
scenario,
|
|
3919
|
+
onSave,
|
|
3920
|
+
isLoading
|
|
3921
|
+
}) {
|
|
3922
|
+
const [type, setType] = React28.useState(scenario?.type || "escalation");
|
|
3923
|
+
const [situation, setSituation] = React28.useState(scenario?.situation || "");
|
|
3924
|
+
const [action, setAction] = React28.useState(scenario?.action || "");
|
|
3925
|
+
const [isSaving, setIsSaving] = React28.useState(false);
|
|
3926
|
+
React28.useEffect(() => {
|
|
3927
|
+
if (open) {
|
|
3928
|
+
setType(scenario?.type || "escalation");
|
|
3929
|
+
setSituation(scenario?.situation || "");
|
|
3930
|
+
setAction(scenario?.action || "");
|
|
3931
|
+
}
|
|
3932
|
+
}, [open, scenario]);
|
|
3933
|
+
const handleSave = async () => {
|
|
3934
|
+
if (!situation.trim() || !action.trim()) return;
|
|
3935
|
+
setIsSaving(true);
|
|
3936
|
+
try {
|
|
3937
|
+
await onSave({ type, situation: situation.trim(), action: action.trim() });
|
|
3938
|
+
onOpenChange(false);
|
|
3939
|
+
} finally {
|
|
3940
|
+
setIsSaving(false);
|
|
3941
|
+
}
|
|
3942
|
+
};
|
|
3943
|
+
const isValid = situation.trim() && action.trim();
|
|
3944
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-md", children: [
|
|
3945
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
3946
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: scenario ? "Edit scenario" : "Add scenario" }),
|
|
3947
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: "Define when something happens and what action to take." })
|
|
3948
|
+
] }),
|
|
3949
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 py-4", children: [
|
|
3950
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
3951
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium text-[var(--black)]", children: "Type" }),
|
|
3952
|
+
/* @__PURE__ */ jsx(
|
|
3953
|
+
Select,
|
|
3954
|
+
{
|
|
3955
|
+
value: type,
|
|
3956
|
+
onChange: (e) => setType(e.target.value),
|
|
3957
|
+
children: Object.entries(typeConfig).map(([key, config]) => /* @__PURE__ */ jsxs("option", { value: key, children: [
|
|
3958
|
+
config.label,
|
|
3959
|
+
" \u2014 ",
|
|
3960
|
+
config.description
|
|
3961
|
+
] }, key))
|
|
3962
|
+
}
|
|
3963
|
+
)
|
|
3964
|
+
] }),
|
|
3965
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
3966
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium text-[var(--black)]", children: "When..." }),
|
|
3967
|
+
/* @__PURE__ */ jsx(
|
|
3968
|
+
Input,
|
|
3969
|
+
{
|
|
3970
|
+
placeholder: "e.g., Invoice amount doesn't match PO",
|
|
3971
|
+
value: situation,
|
|
3972
|
+
onChange: (e) => setSituation(e.target.value)
|
|
3973
|
+
}
|
|
3974
|
+
),
|
|
3975
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Describe the situation or trigger" })
|
|
3976
|
+
] }),
|
|
3977
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
3978
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium text-[var(--black)]", children: "Then..." }),
|
|
3979
|
+
/* @__PURE__ */ jsx(
|
|
3980
|
+
Input,
|
|
3981
|
+
{
|
|
3982
|
+
placeholder: "e.g., Flag for review, don't process",
|
|
3983
|
+
value: action,
|
|
3984
|
+
onChange: (e) => setAction(e.target.value)
|
|
3985
|
+
}
|
|
3986
|
+
),
|
|
3987
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "What should happen in this situation" })
|
|
3988
|
+
] })
|
|
3989
|
+
] }),
|
|
3990
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
3991
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Cancel" }),
|
|
3992
|
+
/* @__PURE__ */ jsx(
|
|
3993
|
+
Button,
|
|
3994
|
+
{
|
|
3995
|
+
onClick: handleSave,
|
|
3996
|
+
disabled: !isValid || isSaving,
|
|
3997
|
+
loading: isSaving,
|
|
3998
|
+
children: scenario ? "Save changes" : "Add scenario"
|
|
3999
|
+
}
|
|
4000
|
+
)
|
|
4001
|
+
] })
|
|
4002
|
+
] }) });
|
|
4003
|
+
}
|
|
4004
|
+
function ScenariosManager({
|
|
4005
|
+
scenarios,
|
|
4006
|
+
onAdd,
|
|
4007
|
+
onUpdate,
|
|
4008
|
+
onDelete,
|
|
4009
|
+
suggestions = [],
|
|
4010
|
+
isLoading,
|
|
4011
|
+
className
|
|
4012
|
+
}) {
|
|
4013
|
+
const [dialogOpen, setDialogOpen] = React28.useState(false);
|
|
4014
|
+
const [editingScenario, setEditingScenario] = React28.useState(null);
|
|
4015
|
+
const [deletingId, setDeletingId] = React28.useState(null);
|
|
4016
|
+
const handleAddClick = () => {
|
|
4017
|
+
setEditingScenario(null);
|
|
4018
|
+
setDialogOpen(true);
|
|
4019
|
+
};
|
|
4020
|
+
const handleEditClick = (scenario) => {
|
|
4021
|
+
setEditingScenario(scenario);
|
|
4022
|
+
setDialogOpen(true);
|
|
4023
|
+
};
|
|
4024
|
+
const handleSave = async (data) => {
|
|
4025
|
+
if (editingScenario) {
|
|
4026
|
+
await onUpdate(editingScenario.id, data);
|
|
4027
|
+
} else {
|
|
4028
|
+
await onAdd(data);
|
|
4029
|
+
}
|
|
4030
|
+
};
|
|
4031
|
+
const handleDelete = async (id) => {
|
|
4032
|
+
setDeletingId(id);
|
|
4033
|
+
try {
|
|
4034
|
+
await onDelete(id);
|
|
4035
|
+
} finally {
|
|
4036
|
+
setDeletingId(null);
|
|
4037
|
+
}
|
|
4038
|
+
};
|
|
4039
|
+
const handleSuggestionAdd = async (suggestion) => {
|
|
4040
|
+
await onAdd(suggestion);
|
|
4041
|
+
};
|
|
4042
|
+
const filteredSuggestions = suggestions.filter(
|
|
4043
|
+
(s) => !scenarios.some(
|
|
4044
|
+
(existing) => existing.situation.toLowerCase() === s.situation.toLowerCase()
|
|
4045
|
+
)
|
|
4046
|
+
);
|
|
4047
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4", className), children: [
|
|
4048
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
4049
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
4050
|
+
/* @__PURE__ */ jsx("div", { className: "w-10 h-10 rounded-sm bg-[var(--cyan)]/10 flex items-center justify-center", children: /* @__PURE__ */ jsx(Lightning, { size: 20, weight: "fill", className: "text-[var(--cyan)]" }) }),
|
|
4051
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4052
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-[var(--black)]", children: "Scenarios" }),
|
|
4053
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: scenarios.length === 0 ? "Define rules for edge cases and escalations" : `${scenarios.length} scenario${scenarios.length === 1 ? "" : "s"} defined` })
|
|
4054
|
+
] })
|
|
4055
|
+
] }),
|
|
4056
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handleAddClick, children: [
|
|
4057
|
+
/* @__PURE__ */ jsx(Plus, { size: 16, className: "mr-1" }),
|
|
4058
|
+
"Add scenario"
|
|
4059
|
+
] })
|
|
4060
|
+
] }),
|
|
4061
|
+
scenarios.length > 0 && /* @__PURE__ */ jsx("div", { className: "grid gap-3", children: scenarios.map((scenario) => /* @__PURE__ */ jsx(
|
|
4062
|
+
ScenarioCard,
|
|
4063
|
+
{
|
|
4064
|
+
scenario,
|
|
4065
|
+
onEdit: () => handleEditClick(scenario),
|
|
4066
|
+
onDelete: () => handleDelete(scenario.id)
|
|
4067
|
+
},
|
|
4068
|
+
scenario.id
|
|
4069
|
+
)) }),
|
|
4070
|
+
scenarios.length === 0 && /* @__PURE__ */ jsxs("div", { className: "border border-dashed border-gray-300 rounded-sm p-8 text-center", children: [
|
|
4071
|
+
/* @__PURE__ */ jsx(Lightning, { size: 32, className: "text-gray-300 mx-auto mb-3" }),
|
|
4072
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-4", children: "No scenarios yet. Add rules for how the worker should handle edge cases." }),
|
|
4073
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handleAddClick, children: [
|
|
4074
|
+
/* @__PURE__ */ jsx(Plus, { size: 16, className: "mr-1" }),
|
|
4075
|
+
"Add your first scenario"
|
|
4076
|
+
] })
|
|
4077
|
+
] }),
|
|
4078
|
+
filteredSuggestions.length > 0 && /* @__PURE__ */ jsxs("div", { className: "pt-2", children: [
|
|
4079
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mb-2", children: "Suggested scenarios:" }),
|
|
4080
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: filteredSuggestions.map((suggestion, index) => /* @__PURE__ */ jsx(
|
|
4081
|
+
SuggestionChip,
|
|
4082
|
+
{
|
|
4083
|
+
suggestion,
|
|
4084
|
+
onAdd: () => handleSuggestionAdd(suggestion),
|
|
4085
|
+
disabled: isLoading
|
|
4086
|
+
},
|
|
4087
|
+
index
|
|
4088
|
+
)) })
|
|
4089
|
+
] }),
|
|
4090
|
+
/* @__PURE__ */ jsx(
|
|
4091
|
+
ScenarioDialog,
|
|
4092
|
+
{
|
|
4093
|
+
open: dialogOpen,
|
|
4094
|
+
onOpenChange: setDialogOpen,
|
|
4095
|
+
scenario: editingScenario,
|
|
4096
|
+
onSave: handleSave,
|
|
4097
|
+
isLoading
|
|
4098
|
+
}
|
|
4099
|
+
)
|
|
4100
|
+
] });
|
|
4101
|
+
}
|
|
3515
4102
|
|
|
3516
4103
|
// src/index.ts
|
|
3517
4104
|
__reExport(index_exports, icons_exports);
|
|
3518
4105
|
|
|
3519
|
-
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge, BreadcrumbLink, Breadcrumbs, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, CodeBlock, ConfirmDialog, DateRangePicker, DateRangeSelect, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Divider, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, ErrorState, FormField, IconBox, Input, Label2 as Label, LabeledSwitch, Logo, Metric, MetricCard, MetricLabel, MetricSubtext, MetricValue, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, Popover, PopoverAnchor, PopoverArrow, PopoverClose, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupCard, RadioGroupItem, RadioGroupOption, Select, Separator2 as Separator, SettingsNav, SettingsNavLink, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SimplePagination, SimpleTooltip, Skeleton, SkeletonCard, SkeletonText, Stat, StepDots, StepProgress, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsListUnderline, TabsTrigger, TabsTriggerUnderline, Tag, Textarea, Toast, ToastAction, ToastClose, ToastDescription, ToastIcon, ToastProvider, ToastTitle, ToastViewport, Toaster, Tooltip, TooltipArrow, TooltipContent, TooltipProvider, TooltipTrigger, UsageBar, UsageChart, alertVariants, badgeVariants, buttonVariants, cn, getDateRangeFromPreset, iconBoxVariants, metricCardVariants, navigationMenuTriggerStyle, progressVariants, statVariants, tagVariants, toast, usageBarVariants, useToast, valueVariants };
|
|
4106
|
+
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge, BreadcrumbLink, Breadcrumbs, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, CodeBlock, ConfirmDialog, DateRangePicker, DateRangeSelect, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Divider, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, ErrorState, FilePreview, FormField, IconBox, Input, Label2 as Label, LabeledSwitch, Logo, Metric, MetricCard, MetricLabel, MetricSubtext, MetricValue, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, Popover, PopoverAnchor, PopoverArrow, PopoverClose, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupCard, RadioGroupItem, RadioGroupOption, ScenariosManager, Select, Separator2 as Separator, SettingsNav, SettingsNavLink, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SimplePagination, SimpleTooltip, Skeleton, SkeletonCard, SkeletonText, Stat, StepDots, StepProgress, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsListUnderline, TabsTrigger, TabsTriggerUnderline, Tag, Textarea, Toast, ToastAction, ToastClose, ToastDescription, ToastIcon, ToastProvider, ToastTitle, ToastViewport, Toaster, Tooltip, TooltipArrow, TooltipContent, TooltipProvider, TooltipTrigger, UsageBar, UsageChart, alertVariants, badgeVariants, buttonVariants, cn, getDateRangeFromPreset, iconBoxVariants, metricCardVariants, navigationMenuTriggerStyle, progressVariants, statVariants, tagVariants, toast, usageBarVariants, useToast, valueVariants };
|
|
3520
4107
|
//# sourceMappingURL=index.mjs.map
|
|
3521
4108
|
//# sourceMappingURL=index.mjs.map
|