@retinalabsllc/zairusjs 1.0.9 → 1.1.0
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.d.mts +11 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +129 -148
- package/dist/index.mjs +177 -189
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -885,13 +885,24 @@ interface UniversalDriveViewProps {
|
|
|
885
885
|
items: DriveItem[];
|
|
886
886
|
uploadQueue: UploadQueueJob[];
|
|
887
887
|
isLoading: boolean;
|
|
888
|
+
isTrashView: boolean;
|
|
888
889
|
searchQuery: string;
|
|
890
|
+
currentPage: number;
|
|
891
|
+
totalPages: number;
|
|
889
892
|
onSearchChange: (val: string) => void;
|
|
890
893
|
onNavigateFolder: (folderId: string | null) => void;
|
|
891
894
|
onCreateFolder: (name: string) => Promise<void>;
|
|
892
895
|
onUploadFiles: (files: FileList) => Promise<void>;
|
|
893
896
|
onMoveToTrash: (ids: string[]) => Promise<void>;
|
|
897
|
+
onRestoreItems: (ids: string[]) => Promise<void>;
|
|
898
|
+
onEmptyTrash: () => Promise<void>;
|
|
894
899
|
onClearUploadQueue?: () => void;
|
|
900
|
+
onPageChange: (page: number) => void;
|
|
901
|
+
onToggleTrashView: () => void;
|
|
902
|
+
onCopyItems: (ids: string[]) => void;
|
|
903
|
+
onCutItems: (ids: string[]) => void;
|
|
904
|
+
onPasteItems: () => Promise<void>;
|
|
905
|
+
clipboardCount: number;
|
|
895
906
|
}
|
|
896
907
|
declare const UniversalDriveView: React.FC<UniversalDriveViewProps>;
|
|
897
908
|
|
package/dist/index.d.ts
CHANGED
|
@@ -885,13 +885,24 @@ interface UniversalDriveViewProps {
|
|
|
885
885
|
items: DriveItem[];
|
|
886
886
|
uploadQueue: UploadQueueJob[];
|
|
887
887
|
isLoading: boolean;
|
|
888
|
+
isTrashView: boolean;
|
|
888
889
|
searchQuery: string;
|
|
890
|
+
currentPage: number;
|
|
891
|
+
totalPages: number;
|
|
889
892
|
onSearchChange: (val: string) => void;
|
|
890
893
|
onNavigateFolder: (folderId: string | null) => void;
|
|
891
894
|
onCreateFolder: (name: string) => Promise<void>;
|
|
892
895
|
onUploadFiles: (files: FileList) => Promise<void>;
|
|
893
896
|
onMoveToTrash: (ids: string[]) => Promise<void>;
|
|
897
|
+
onRestoreItems: (ids: string[]) => Promise<void>;
|
|
898
|
+
onEmptyTrash: () => Promise<void>;
|
|
894
899
|
onClearUploadQueue?: () => void;
|
|
900
|
+
onPageChange: (page: number) => void;
|
|
901
|
+
onToggleTrashView: () => void;
|
|
902
|
+
onCopyItems: (ids: string[]) => void;
|
|
903
|
+
onCutItems: (ids: string[]) => void;
|
|
904
|
+
onPasteItems: () => Promise<void>;
|
|
905
|
+
clipboardCount: number;
|
|
895
906
|
}
|
|
896
907
|
declare const UniversalDriveView: React.FC<UniversalDriveViewProps>;
|
|
897
908
|
|
package/dist/index.js
CHANGED
|
@@ -3114,12 +3114,12 @@ var UniversalOverviewPage = ({
|
|
|
3114
3114
|
},
|
|
3115
3115
|
primaryAction.label,
|
|
3116
3116
|
primaryAction.icon
|
|
3117
|
-
))), /* @__PURE__ */ import_react56.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-8" }, details.map((detail, idx) => /* @__PURE__ */ import_react56.default.createElement("div", { key: idx, className: "min-w-0" }, /* @__PURE__ */ import_react56.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-400 mb-1.5 uppercase" }, detail.label), /* @__PURE__ */ import_react56.default.createElement("p", { className: "text-[13px] text-black truncate" }, detail.value)))), alerts.map((
|
|
3118
|
-
const bgClass =
|
|
3119
|
-
const textClass =
|
|
3120
|
-
const valClass =
|
|
3121
|
-
const lblClass =
|
|
3122
|
-
return /* @__PURE__ */ import_react56.default.createElement("div", { key: idx, className: `mt-4 p-5 rounded-xl flex flex-col gap-4 ${bgClass}` }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react56.default.createElement("span", { className: `text-[11px] tracking-widest uppercase ${textClass}` },
|
|
3117
|
+
))), /* @__PURE__ */ import_react56.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-8" }, details.map((detail, idx) => /* @__PURE__ */ import_react56.default.createElement("div", { key: idx, className: "min-w-0" }, /* @__PURE__ */ import_react56.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-400 mb-1.5 uppercase" }, detail.label), /* @__PURE__ */ import_react56.default.createElement("p", { className: "text-[13px] text-black truncate" }, detail.value)))), alerts.map((alert2, idx) => {
|
|
3118
|
+
const bgClass = alert2.type === "warning" ? "bg-amber-50/50" : alert2.type === "info" ? "bg-blue-50/50" : "bg-red-50/50";
|
|
3119
|
+
const textClass = alert2.type === "warning" ? "text-amber-600" : alert2.type === "info" ? "text-blue-600" : "text-red-600";
|
|
3120
|
+
const valClass = alert2.type === "warning" ? "text-amber-700" : alert2.type === "info" ? "text-blue-700" : "text-red-700";
|
|
3121
|
+
const lblClass = alert2.type === "warning" ? "text-amber-400" : alert2.type === "info" ? "text-blue-400" : "text-red-400";
|
|
3122
|
+
return /* @__PURE__ */ import_react56.default.createElement("div", { key: idx, className: `mt-4 p-5 rounded-xl flex flex-col gap-4 ${bgClass}` }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react56.default.createElement("span", { className: `text-[11px] tracking-widest uppercase ${textClass}` }, alert2.title)), alert2.items.map((item, itemIdx) => /* @__PURE__ */ import_react56.default.createElement("div", { key: itemIdx }, /* @__PURE__ */ import_react56.default.createElement("span", { className: `text-[11px] tracking-[0.2em] block mb-1 uppercase ${lblClass}` }, item.label), /* @__PURE__ */ import_react56.default.createElement("p", { className: `text-[13px] leading-relaxed ${valClass}` }, item.text))));
|
|
3123
3123
|
}))));
|
|
3124
3124
|
};
|
|
3125
3125
|
|
|
@@ -3328,21 +3328,27 @@ var FileIconMapper = ({ type, mimeType }) => {
|
|
|
3328
3328
|
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.ImageIcon, size: 18, className: "text-black" });
|
|
3329
3329
|
}
|
|
3330
3330
|
if (type === "VIDEO" || mime.startsWith("video/")) {
|
|
3331
|
-
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.
|
|
3331
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.FileVideoIcon, size: 18, className: "text-black" });
|
|
3332
3332
|
}
|
|
3333
3333
|
if (type === "AUDIO" || mime.startsWith("audio/")) {
|
|
3334
|
-
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.
|
|
3334
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.FileAudioIcon, size: 18, className: "text-black" });
|
|
3335
3335
|
}
|
|
3336
3336
|
if (type === "CODE" || mime.includes("json") || mime.includes("javascript") || mime.includes("html")) {
|
|
3337
|
-
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.
|
|
3337
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.DocumentCodeIcon, size: 18, className: "text-black" });
|
|
3338
3338
|
}
|
|
3339
3339
|
if (type === "ARCHIVE" || mime.includes("zip") || mime.includes("tar") || mime.includes("rar")) {
|
|
3340
|
-
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.
|
|
3340
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.FileZipIcon, size: 18, className: "text-black" });
|
|
3341
3341
|
}
|
|
3342
|
-
if (type === "DOC" ||
|
|
3343
|
-
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.
|
|
3342
|
+
if (type === "DOC" || mime.includes("word")) {
|
|
3343
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.Doc01Icon, size: 18, className: "text-black" });
|
|
3344
3344
|
}
|
|
3345
|
-
|
|
3345
|
+
if (type === "PDF" || mime.includes("pdf")) {
|
|
3346
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.Pdf01Icon, size: 18, className: "text-black" });
|
|
3347
|
+
}
|
|
3348
|
+
if (type === "TXT" || mime.includes("text/plain")) {
|
|
3349
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.Txt01Icon, size: 18, className: "text-black" });
|
|
3350
|
+
}
|
|
3351
|
+
return /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons21.FileEmpty02Icon, size: 18, className: "text-black" });
|
|
3346
3352
|
};
|
|
3347
3353
|
|
|
3348
3354
|
// src/components/UniversalDriveView.tsx
|
|
@@ -3352,18 +3358,50 @@ var UniversalDriveView = ({
|
|
|
3352
3358
|
items,
|
|
3353
3359
|
uploadQueue,
|
|
3354
3360
|
isLoading,
|
|
3361
|
+
isTrashView,
|
|
3355
3362
|
searchQuery,
|
|
3363
|
+
currentPage,
|
|
3364
|
+
totalPages,
|
|
3356
3365
|
onSearchChange,
|
|
3357
3366
|
onNavigateFolder,
|
|
3358
3367
|
onCreateFolder,
|
|
3359
3368
|
onUploadFiles,
|
|
3360
3369
|
onMoveToTrash,
|
|
3361
|
-
|
|
3370
|
+
onRestoreItems,
|
|
3371
|
+
onEmptyTrash,
|
|
3372
|
+
onClearUploadQueue,
|
|
3373
|
+
onPageChange,
|
|
3374
|
+
onToggleTrashView,
|
|
3375
|
+
onCopyItems,
|
|
3376
|
+
onCutItems,
|
|
3377
|
+
onPasteItems,
|
|
3378
|
+
clipboardCount
|
|
3362
3379
|
}) => {
|
|
3363
|
-
const [viewLayout, setViewLayout] = (0, import_react65.useState)("list");
|
|
3364
3380
|
const [selectedIds, setSelectedIds] = (0, import_react65.useState)([]);
|
|
3365
3381
|
const [isNewFolderModalOpen, setIsNewFolderModalOpen] = (0, import_react65.useState)(false);
|
|
3366
3382
|
const [newFolderName, setNewFolderName] = (0, import_react65.useState)("");
|
|
3383
|
+
const [isCreatingFolder, setIsCreatingFolder] = (0, import_react65.useState)(false);
|
|
3384
|
+
const [localSearch, setLocalSearch] = (0, import_react65.useState)(searchQuery);
|
|
3385
|
+
const [isSearching, setIsSearching] = (0, import_react65.useState)(false);
|
|
3386
|
+
const [loadingFolderId, setLoadingFolderId] = (0, import_react65.useState)(null);
|
|
3387
|
+
const [contextMenu, setContextMenu] = (0, import_react65.useState)(null);
|
|
3388
|
+
const tableRef = (0, import_react65.useRef)(null);
|
|
3389
|
+
(0, import_react65.useEffect)(() => {
|
|
3390
|
+
if (localSearch !== searchQuery) setIsSearching(true);
|
|
3391
|
+
const delay = setTimeout(() => {
|
|
3392
|
+
onSearchChange(localSearch);
|
|
3393
|
+
setIsSearching(false);
|
|
3394
|
+
}, 3e3);
|
|
3395
|
+
return () => clearTimeout(delay);
|
|
3396
|
+
}, [localSearch, onSearchChange, searchQuery]);
|
|
3397
|
+
(0, import_react65.useEffect)(() => {
|
|
3398
|
+
if (!isLoading) setLoadingFolderId(null);
|
|
3399
|
+
}, [isLoading]);
|
|
3400
|
+
(0, import_react65.useEffect)(() => {
|
|
3401
|
+
const handleClickOutside = () => setContextMenu(null);
|
|
3402
|
+
document.addEventListener("click", handleClickOutside);
|
|
3403
|
+
return () => document.removeEventListener("click", handleClickOutside);
|
|
3404
|
+
}, []);
|
|
3367
3405
|
const formatBytes = (bytes) => {
|
|
3368
3406
|
const num = Number(bytes);
|
|
3369
3407
|
if (num === 0) return "0 Bytes";
|
|
@@ -3379,87 +3417,70 @@ var UniversalDriveView = ({
|
|
|
3379
3417
|
year: "numeric"
|
|
3380
3418
|
});
|
|
3381
3419
|
};
|
|
3382
|
-
const
|
|
3383
|
-
e.
|
|
3384
|
-
|
|
3385
|
-
(prev) => prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id]
|
|
3386
|
-
);
|
|
3387
|
-
};
|
|
3388
|
-
const handleSelectAll = () => {
|
|
3389
|
-
if (selectedIds.length === items.length) {
|
|
3390
|
-
setSelectedIds([]);
|
|
3420
|
+
const handleRowClick = (id, e) => {
|
|
3421
|
+
if (e.ctrlKey || e.metaKey) {
|
|
3422
|
+
setSelectedIds((prev) => prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id]);
|
|
3391
3423
|
} else {
|
|
3392
|
-
setSelectedIds(
|
|
3424
|
+
setSelectedIds([id]);
|
|
3393
3425
|
}
|
|
3394
3426
|
};
|
|
3427
|
+
const handleSelectAll = () => {
|
|
3428
|
+
if (selectedIds.length === items.length && items.length > 0) setSelectedIds([]);
|
|
3429
|
+
else setSelectedIds(items.map((i) => i.id));
|
|
3430
|
+
};
|
|
3395
3431
|
const handleItemDoubleClick = (item) => {
|
|
3396
3432
|
if (item.type === "FOLDER") {
|
|
3433
|
+
setLoadingFolderId(item.id);
|
|
3397
3434
|
setSelectedIds([]);
|
|
3398
3435
|
onNavigateFolder(item.id);
|
|
3399
3436
|
}
|
|
3400
3437
|
};
|
|
3438
|
+
const handleContextMenu = (e, itemId) => {
|
|
3439
|
+
e.preventDefault();
|
|
3440
|
+
if (!selectedIds.includes(itemId)) setSelectedIds([itemId]);
|
|
3441
|
+
setContextMenu({ x: e.clientX, y: e.clientY, itemId });
|
|
3442
|
+
};
|
|
3401
3443
|
const handleCreateFolderSubmit = async (e) => {
|
|
3402
3444
|
e.preventDefault();
|
|
3403
|
-
if (!newFolderName.trim()) return;
|
|
3445
|
+
if (!newFolderName.trim() || isCreatingFolder) return;
|
|
3446
|
+
setIsCreatingFolder(true);
|
|
3404
3447
|
await onCreateFolder(newFolderName.trim());
|
|
3405
3448
|
setNewFolderName("");
|
|
3449
|
+
setIsCreatingFolder(false);
|
|
3406
3450
|
setIsNewFolderModalOpen(false);
|
|
3407
3451
|
};
|
|
3408
|
-
const handleBulkDelete = async () => {
|
|
3409
|
-
if (selectedIds.length === 0) return;
|
|
3410
|
-
await onMoveToTrash(selectedIds);
|
|
3411
|
-
setSelectedIds([]);
|
|
3412
|
-
};
|
|
3413
3452
|
const activeJobs = uploadQueue.filter((j) => j.status === "UPLOADING" || j.status === "PENDING");
|
|
3414
|
-
const
|
|
3415
|
-
|
|
3416
|
-
const globalProgress = totalJobs > 0 ? Math.round(uploadQueue.reduce((acc, job) => acc + job.progress, 0) / (totalJobs * 100) * 100) : 0;
|
|
3417
|
-
return /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-6 max-w-4xl w-full mx-auto p-6 bg-white rounded-2xl animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react65.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4 pb-4 border-b border-neutral-100" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("h1", { className: "text-xl text-black tracking-tight mb-1" }, "Files & Workspace Storage"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500" }, "Secure sandboxed storage framework optimized for workspace data.")), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(
|
|
3453
|
+
const globalProgress = uploadQueue.length > 0 ? Math.round(uploadQueue.reduce((acc, job) => acc + job.progress, 0) / (uploadQueue.length * 100) * 100) : 0;
|
|
3454
|
+
return /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-6 max-w-5xl w-full mx-auto p-6 bg-white rounded-2xl animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react65.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4 pb-4 border-b border-neutral-100" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("h1", { className: "text-xl text-black tracking-tight mb-1" }, " My Drive"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500" }, "Secure cloud storage optimized for your workspace.")), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(
|
|
3418
3455
|
"button",
|
|
3419
3456
|
{
|
|
3420
|
-
onClick:
|
|
3421
|
-
|
|
3457
|
+
onClick: onToggleTrashView,
|
|
3458
|
+
title: "Trash",
|
|
3459
|
+
className: `p-2.5 rounded-full transition-all outline-none flex items-center justify-center ${isTrashView ? "bg-red-50 text-red-600" : "bg-neutral-50 text-neutral-500 hover:text-black hover:bg-neutral-100"}`
|
|
3422
3460
|
},
|
|
3423
|
-
/* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.
|
|
3424
|
-
), /* @__PURE__ */ import_react65.default.createElement(
|
|
3425
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
), /* @__PURE__ */ import_react65.default.createElement(
|
|
3432
|
-
"button",
|
|
3433
|
-
{
|
|
3434
|
-
onClick: () => setIsNewFolderModalOpen(true),
|
|
3435
|
-
className: "flex items-center gap-2 px-4 py-2 border border-neutral-100 rounded-full text-xs text-black hover:bg-neutral-50 transition-colors outline-none"
|
|
3436
|
-
},
|
|
3437
|
-
/* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.FolderAddIcon, size: 14 }),
|
|
3438
|
-
" New Folder"
|
|
3439
|
-
), /* @__PURE__ */ import_react65.default.createElement("label", { className: "flex items-center gap-2 px-4 py-2 bg-black text-white rounded-full text-xs cursor-pointer hover:bg-neutral-900 transition-colors select-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Upload02Icon, size: 14, className: "text-white" }), " Upload Files", /* @__PURE__ */ import_react65.default.createElement(
|
|
3461
|
+
/* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Delete02Icon, size: 18 })
|
|
3462
|
+
), !isTrashView && /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, selectedIds.length > 0 && /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3463
|
+
onCopyItems(selectedIds);
|
|
3464
|
+
setSelectedIds([]);
|
|
3465
|
+
}, title: "Copy", className: "p-2.5 bg-neutral-50 text-neutral-500 hover:text-black hover:bg-neutral-100 rounded-full transition-all outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Copy01Icon, size: 18 })), /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3466
|
+
onCutItems(selectedIds);
|
|
3467
|
+
setSelectedIds([]);
|
|
3468
|
+
}, title: "Cut", className: "p-2.5 bg-neutral-50 text-neutral-500 hover:text-black hover:bg-neutral-100 rounded-full transition-all outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Scissor01Icon, size: 18 }))), clipboardCount > 0 && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: onPasteItems, title: `Paste ${clipboardCount} items`, className: "p-2.5 bg-black text-white hover:bg-neutral-800 rounded-full transition-all outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.FilePasteIcon, size: 18 })), /* @__PURE__ */ import_react65.default.createElement("div", { className: "w-px h-6 bg-neutral-200 mx-1" }), /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => setIsNewFolderModalOpen(true), title: "New Folder", className: "p-2.5 bg-neutral-50 text-neutral-500 hover:text-black hover:bg-neutral-100 rounded-full transition-all outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.FolderAddIcon, size: 18 })), /* @__PURE__ */ import_react65.default.createElement("label", { title: "Upload Files", className: "p-2.5 bg-neutral-50 text-neutral-500 hover:text-black hover:bg-neutral-100 rounded-full cursor-pointer transition-all" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.CloudUploadIcon, size: 18 }), /* @__PURE__ */ import_react65.default.createElement("input", { type: "file", multiple: true, className: "hidden", onChange: (e) => e.target.files && onUploadFiles(e.target.files) }))))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "w-full sm:max-w-xs relative" }, /* @__PURE__ */ import_react65.default.createElement(
|
|
3440
3469
|
"input",
|
|
3441
3470
|
{
|
|
3442
|
-
type: "
|
|
3443
|
-
|
|
3444
|
-
className: "
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
)))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "w-full sm:max-w-xs" }, /* @__PURE__ */ import_react65.default.createElement(
|
|
3448
|
-
TextInput,
|
|
3449
|
-
{
|
|
3450
|
-
placeholder: "Search workspace files...",
|
|
3451
|
-
value: searchQuery,
|
|
3452
|
-
onChange: onSearchChange
|
|
3471
|
+
type: "text",
|
|
3472
|
+
placeholder: "Search Drive...",
|
|
3473
|
+
className: "w-full pl-4 pr-10 py-2.5 text-xs bg-neutral-50 border border-neutral-100 rounded-full outline-none focus:border-black transition-colors",
|
|
3474
|
+
value: localSearch,
|
|
3475
|
+
onChange: (e) => setLocalSearch(e.target.value)
|
|
3453
3476
|
}
|
|
3454
|
-
)), selectedIds.length > 0 && /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 bg-neutral-50 border border-neutral-100 px-4 py-2 rounded-full animate-in fade-in
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
" Move to Trash"
|
|
3462
|
-
))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-1.5 overflow-x-auto text-xs py-1 border-b border-neutral-50 text-neutral-400 whitespace-nowrap tracking-wide" }, folderBreadcrumbs.map((crumb, idx) => /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, { key: idx }, idx > 0 && /* @__PURE__ */ import_react65.default.createElement("span", null, "/"), /* @__PURE__ */ import_react65.default.createElement(
|
|
3477
|
+
), isSearching && /* @__PURE__ */ import_react65.default.createElement("div", { className: "absolute right-3 top-1/2 -translate-y-1/2" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Loading03Icon, size: 14, className: "animate-spin text-neutral-400" }))), selectedIds.length > 0 && /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 bg-neutral-50 border border-neutral-100 px-4 py-2 rounded-full animate-in fade-in duration-200" }, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[11px] tracking-widest text-neutral-500 uppercase" }, selectedIds.length, " Selected"), isTrashView ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3478
|
+
onRestoreItems(selectedIds);
|
|
3479
|
+
setSelectedIds([]);
|
|
3480
|
+
}, className: "text-emerald-600 hover:text-emerald-700 p-1 flex items-center gap-1.5 text-xs outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.RestoreBinIcon, size: 14 }), " Restore") : /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3481
|
+
onMoveToTrash(selectedIds);
|
|
3482
|
+
setSelectedIds([]);
|
|
3483
|
+
}, className: "text-neutral-500 hover:text-red-600 p-1 flex items-center gap-1.5 text-xs outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Delete02Icon, size: 14 }), " Move to Trash")), isTrashView && selectedIds.length === 0 && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: onEmptyTrash, className: "text-red-600 hover:text-red-700 p-2 text-xs flex items-center gap-2 outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Delete02Icon, size: 14 }), " Empty Trash")), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-1.5 overflow-x-auto text-xs py-1 border-b border-neutral-50 text-neutral-400 whitespace-nowrap" }, folderBreadcrumbs.map((crumb, idx) => /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, { key: idx }, idx > 0 && /* @__PURE__ */ import_react65.default.createElement("span", null, "/"), /* @__PURE__ */ import_react65.default.createElement(
|
|
3463
3484
|
"button",
|
|
3464
3485
|
{
|
|
3465
3486
|
onClick: () => {
|
|
@@ -3469,91 +3490,51 @@ var UniversalDriveView = ({
|
|
|
3469
3490
|
className: `hover:text-black transition-colors outline-none ${idx === folderBreadcrumbs.length - 1 ? "text-black" : ""}`
|
|
3470
3491
|
},
|
|
3471
3492
|
crumb.name
|
|
3472
|
-
)))), !isLoading && items.length === 0 && /* @__PURE__ */ import_react65.default.createElement("div", { className: "py-
|
|
3473
|
-
"input",
|
|
3474
|
-
{
|
|
3475
|
-
type: "checkbox",
|
|
3476
|
-
checked: selectedIds.length === items.length,
|
|
3477
|
-
onChange: handleSelectAll,
|
|
3478
|
-
className: "rounded border-neutral-200 focus:ring-0 outline-none cursor-pointer"
|
|
3479
|
-
}
|
|
3480
|
-
)), /* @__PURE__ */ import_react65.default.createElement("th", { className: "text-[11px] uppercase tracking-[0.2em] text-neutral-400 p-3" }, "Name"), /* @__PURE__ */ import_react65.default.createElement("th", { className: "text-[11px] uppercase tracking-[0.2em] text-neutral-400 p-3" }, "Modified"), /* @__PURE__ */ import_react65.default.createElement("th", { className: "text-[11px] uppercase tracking-[0.2em] text-neutral-400 p-3 text-right" }, "Size"))), /* @__PURE__ */ import_react65.default.createElement("tbody", { className: "divide-y divide-neutral-50" }, items.map((item) => {
|
|
3493
|
+
)))), !isLoading && items.length === 0 && /* @__PURE__ */ import_react65.default.createElement("div", { className: "py-24 text-center flex flex-col items-center justify-center border border-dashed border-neutral-100 rounded-xl bg-neutral-50/50" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: isTrashView ? import_core_free_icons22.Delete02Icon : import_core_free_icons22.FolderIcon, size: 40, className: "text-neutral-300 mb-3" }), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500" }, isTrashView ? "Trash is empty." : "This directory is empty.")), /* @__PURE__ */ import_react65.default.createElement("div", { className: "w-full overflow-x-auto select-none flex-1", ref: tableRef }, /* @__PURE__ */ import_react65.default.createElement("table", { className: "w-full text-left border-collapse min-w-full" }, /* @__PURE__ */ import_react65.default.createElement("thead", null, /* @__PURE__ */ import_react65.default.createElement("tr", { className: "border-b border-neutral-100" }, /* @__PURE__ */ import_react65.default.createElement("th", { className: "w-10 p-3" }, /* @__PURE__ */ import_react65.default.createElement("input", { type: "checkbox", checked: selectedIds.length === items.length && items.length > 0, onChange: handleSelectAll, className: "rounded border-neutral-200 focus:ring-0 cursor-pointer" })), /* @__PURE__ */ import_react65.default.createElement("th", { className: "text-[11px] uppercase tracking-[0.2em] text-neutral-400 p-3" }, "Name"), /* @__PURE__ */ import_react65.default.createElement("th", { className: "text-[11px] uppercase tracking-[0.2em] text-neutral-400 p-3" }, "Modified"), /* @__PURE__ */ import_react65.default.createElement("th", { className: "text-[11px] uppercase tracking-[0.2em] text-neutral-400 p-3 text-right" }, "Size"))), /* @__PURE__ */ import_react65.default.createElement("tbody", { className: "divide-y divide-neutral-50 relative" }, isLoading && items.length === 0 && /* @__PURE__ */ import_react65.default.createElement("tr", null, /* @__PURE__ */ import_react65.default.createElement("td", { colSpan: 4, className: "py-12 text-center" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Loading03Icon, className: "animate-spin mx-auto text-neutral-400", size: 24 }))), items.map((item) => {
|
|
3481
3494
|
const isChecked = selectedIds.includes(item.id);
|
|
3482
3495
|
return /* @__PURE__ */ import_react65.default.createElement(
|
|
3483
3496
|
"tr",
|
|
3484
3497
|
{
|
|
3485
3498
|
key: item.id,
|
|
3499
|
+
onClick: (e) => handleRowClick(item.id, e),
|
|
3486
3500
|
onDoubleClick: () => handleItemDoubleClick(item),
|
|
3487
|
-
|
|
3501
|
+
onContextMenu: (e) => handleContextMenu(e, item.id),
|
|
3502
|
+
className: `hover:bg-neutral-50/70 transition-colors cursor-pointer group ${isChecked ? "bg-neutral-50" : ""}`
|
|
3488
3503
|
},
|
|
3489
|
-
/* @__PURE__ */ import_react65.default.createElement("td", { className: "p-3", onClick: (e) =>
|
|
3490
|
-
|
|
3491
|
-
{
|
|
3492
|
-
type: "checkbox",
|
|
3493
|
-
checked: isChecked,
|
|
3494
|
-
onChange: (e) => handleItemSelection(item.id, e),
|
|
3495
|
-
className: "rounded border-neutral-200 focus:ring-0 outline-none cursor-pointer"
|
|
3496
|
-
}
|
|
3497
|
-
)),
|
|
3498
|
-
/* @__PURE__ */ import_react65.default.createElement("td", { className: "p-3 flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "w-8 h-8 shrink-0 bg-neutral-100 rounded-lg flex items-center justify-center" }, /* @__PURE__ */ import_react65.default.createElement(FileIconMapper, { type: item.type, mimeType: item.mimeType })), /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-xs text-black truncate pr-4" }, item.name)),
|
|
3504
|
+
/* @__PURE__ */ import_react65.default.createElement("td", { className: "p-3", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react65.default.createElement("input", { type: "checkbox", checked: isChecked, onChange: () => handleRowClick(item.id, { ctrlKey: true }), className: "rounded border-neutral-200 cursor-pointer" })),
|
|
3505
|
+
/* @__PURE__ */ import_react65.default.createElement("td", { className: "p-3 flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "w-8 h-8 shrink-0 bg-neutral-100 rounded-lg flex items-center justify-center relative" }, loadingFolderId === item.id ? /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Loading03Icon, size: 14, className: "animate-spin text-black" }) : /* @__PURE__ */ import_react65.default.createElement(FileIconMapper, { type: item.type, mimeType: item.mimeType })), /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-xs text-black truncate pr-4" }, item.name)),
|
|
3499
3506
|
/* @__PURE__ */ import_react65.default.createElement("td", { className: "p-3 text-xs text-neutral-500 whitespace-nowrap" }, formatDate3(item.updatedAt)),
|
|
3500
|
-
/* @__PURE__ */ import_react65.default.createElement("td", { className: "p-3 text-xs text-neutral-500 text-right whitespace-nowrap" },
|
|
3501
|
-
);
|
|
3502
|
-
})))), !isLoading && items.length > 0 && viewLayout === "grid" && /* @__PURE__ */ import_react65.default.createElement("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4 select-none" }, items.map((item) => {
|
|
3503
|
-
const isChecked = selectedIds.includes(item.id);
|
|
3504
|
-
return /* @__PURE__ */ import_react65.default.createElement(
|
|
3505
|
-
"div",
|
|
3506
|
-
{
|
|
3507
|
-
key: item.id,
|
|
3508
|
-
onDoubleClick: () => handleItemDoubleClick(item),
|
|
3509
|
-
onClick: (e) => handleItemSelection(item.id, e),
|
|
3510
|
-
className: `p-4 border rounded-xl flex flex-col gap-3 relative hover:border-black/30 cursor-pointer group transition-all ${isChecked ? "bg-neutral-50 border-black/30" : "bg-white border-neutral-100"}`
|
|
3511
|
-
},
|
|
3512
|
-
/* @__PURE__ */ import_react65.default.createElement("div", { className: "absolute top-3 left-3 opacity-0 group-hover:opacity-100 checked:opacity-100 transition-opacity", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react65.default.createElement(
|
|
3513
|
-
"input",
|
|
3514
|
-
{
|
|
3515
|
-
type: "checkbox",
|
|
3516
|
-
checked: isChecked,
|
|
3517
|
-
onChange: (e) => handleItemSelection(item.id, e),
|
|
3518
|
-
className: "rounded border-neutral-200 focus:ring-0 outline-none cursor-pointer"
|
|
3519
|
-
}
|
|
3520
|
-
)),
|
|
3521
|
-
/* @__PURE__ */ import_react65.default.createElement("div", { className: "w-10 h-10 bg-neutral-100 rounded-xl flex items-center justify-center mx-auto mt-2 shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(FileIconMapper, { type: item.type, mimeType: item.mimeType })),
|
|
3522
|
-
/* @__PURE__ */ import_react65.default.createElement("div", { className: "text-center min-w-0 px-1" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "text-xs text-black truncate w-full block" }, item.name), /* @__PURE__ */ import_react65.default.createElement("div", { className: "text-[10px] text-neutral-400 tracking-wide mt-0.5 whitespace-nowrap" }, item.type === "FOLDER" ? "Folder" : formatBytes(item.size)))
|
|
3507
|
+
/* @__PURE__ */ import_react65.default.createElement("td", { className: "p-3 text-xs text-neutral-500 text-right whitespace-nowrap" }, formatBytes(item.size))
|
|
3523
3508
|
);
|
|
3524
|
-
})),
|
|
3525
|
-
"
|
|
3509
|
+
})))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between pt-4 border-t border-neutral-100" }, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[11px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", Math.max(1, totalPages)), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage <= 1 || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black disabled:opacity-30 transition-all outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black disabled:opacity-30 transition-all outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.ArrowRight01Icon, size: 14 })))), contextMenu && /* @__PURE__ */ import_react65.default.createElement(
|
|
3510
|
+
"div",
|
|
3526
3511
|
{
|
|
3527
|
-
|
|
3528
|
-
|
|
3512
|
+
className: "fixed bg-white border border-neutral-100 shadow-xl rounded-xl w-40 py-2 z-50 flex flex-col text-xs text-black animate-in fade-in zoom-in-95 duration-100",
|
|
3513
|
+
style: { top: contextMenu.y, left: contextMenu.x }
|
|
3529
3514
|
},
|
|
3530
|
-
/* @__PURE__ */ import_react65.default.createElement("
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
)
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
), /* @__PURE__ */ import_react65.default.createElement(
|
|
3548
|
-
|
|
3549
|
-
|
|
3550
|
-
|
|
3551
|
-
|
|
3552
|
-
|
|
3553
|
-
},
|
|
3554
|
-
"Create Folder"
|
|
3555
|
-
))
|
|
3556
|
-
)));
|
|
3515
|
+
/* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3516
|
+
onCopyItems(selectedIds);
|
|
3517
|
+
setContextMenu(null);
|
|
3518
|
+
}, className: "px-4 py-2 hover:bg-neutral-50 flex items-center gap-3 text-left" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Copy01Icon, size: 14 }), " Copy"),
|
|
3519
|
+
/* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3520
|
+
onCutItems(selectedIds);
|
|
3521
|
+
setContextMenu(null);
|
|
3522
|
+
}, className: "px-4 py-2 hover:bg-neutral-50 flex items-center gap-3 text-left" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Scissor01Icon, size: 14 }), " Cut"),
|
|
3523
|
+
/* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3524
|
+
alert("Share functionality coming soon.");
|
|
3525
|
+
setContextMenu(null);
|
|
3526
|
+
}, className: "px-4 py-2 hover:bg-neutral-50 flex items-center gap-3 text-left" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Share01Icon, size: 14 }), " Share"),
|
|
3527
|
+
/* @__PURE__ */ import_react65.default.createElement("div", { className: "w-full h-px bg-neutral-100 my-1" }),
|
|
3528
|
+
isTrashView ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3529
|
+
onRestoreItems(selectedIds);
|
|
3530
|
+
setSelectedIds([]);
|
|
3531
|
+
setContextMenu(null);
|
|
3532
|
+
}, className: "px-4 py-2 hover:bg-emerald-50 text-emerald-600 flex items-center gap-3 text-left" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.RestoreBinIcon, size: 14 }), " Restore") : /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => {
|
|
3533
|
+
onMoveToTrash(selectedIds);
|
|
3534
|
+
setSelectedIds([]);
|
|
3535
|
+
setContextMenu(null);
|
|
3536
|
+
}, className: "px-4 py-2 hover:bg-red-50 text-red-600 flex items-center gap-3 text-left" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Delete02Icon, size: 14 }), " Delete")
|
|
3537
|
+
), activeJobs.length > 0 && /* @__PURE__ */ import_react65.default.createElement("div", { className: "fixed bottom-6 right-6 w-80 bg-white border border-neutral-200 shadow-2xl rounded-xl z-100 overflow-hidden flex flex-col animate-in slide-in-from-bottom-4 duration-300" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "p-4 border-b border-neutral-100 bg-neutral-50 flex items-center justify-between" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("h4", { className: "text-xs text-black font-medium" }, "Processing Elements"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-[10px] text-neutral-500 mt-0.5" }, "Processing ", activeJobs.length, " active streams")), onClearUploadQueue && activeJobs.length === 0 && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: onClearUploadQueue, className: "text-neutral-400 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Cancel01Icon, size: 14 }))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "w-full h-1 bg-neutral-100 relative" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "h-full transition-all duration-500 ease-out", style: { width: `${globalProgress}%`, background: "linear-gradient(to right, #f64b4d, #ffa360)" } }))), isNewFolderModalOpen && /* @__PURE__ */ import_react65.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "absolute inset-0 bg-black/20", onClick: () => !isCreatingFolder && setIsNewFolderModalOpen(false) }), /* @__PURE__ */ import_react65.default.createElement("form", { onSubmit: handleCreateFolderSubmit, className: "relative w-80 bg-white shadow-2xl rounded-2xl p-6 flex flex-col gap-4 animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm text-black tracking-tight mb-1" }, "Create Folder"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-[11px] text-neutral-400" }, "Name your new directory structure.")), /* @__PURE__ */ import_react65.default.createElement("input", { type: "text", placeholder: "Folder name", value: newFolderName, onChange: (e) => setNewFolderName(e.target.value), disabled: isCreatingFolder, className: "w-full px-4 py-2 border border-neutral-200 rounded-lg text-sm outline-none focus:border-black disabled:opacity-50", autoFocus: true }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-end gap-2 mt-2" }, /* @__PURE__ */ import_react65.default.createElement("button", { type: "button", onClick: () => setIsNewFolderModalOpen(false), disabled: isCreatingFolder, className: "px-4 py-2 text-xs text-neutral-500 hover:bg-neutral-50 rounded-full outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ import_react65.default.createElement("button", { type: "submit", disabled: !newFolderName.trim() || isCreatingFolder, className: "px-4 py-2 text-xs bg-black text-white rounded-full flex items-center gap-2 hover:bg-neutral-900 disabled:opacity-50 outline-none" }, isCreatingFolder ? /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons22.Loading03Icon, size: 14, className: "animate-spin" }) : "Create")))));
|
|
3557
3538
|
};
|
|
3558
3539
|
|
|
3559
3540
|
// src/components/AiApproveDecline.tsx
|