@vryzel/file-next-ui 0.4.1 → 0.4.2
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 +23 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +23 -21
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cn.ts","../src/breadcrumbs.tsx","../src/file-icon.tsx","../src/labels.ts","../src/use-explorer-item-pointer.ts","../src/explorer-list-view.tsx","../src/explorer-grid-view.tsx","../src/explorer-toolbar.tsx","../src/swallow-click-through.ts","../src/explorer-context-menu.tsx","../src/overlay.tsx","../src/create-folder-dialog.tsx","../src/confirm-delete-dialog.tsx","../src/explorer-selection-toast.tsx","../src/explorer-upload-status.tsx","../src/use-upload-queue.ts","../src/upload-queue.tsx","../src/file-explorer.tsx","../src/empty-state.tsx","../src/error-state.tsx","../src/file-preview.tsx"],"names":["jsx","jsxs","MoreHorizontal","Link2","ListIcon","useRef","useEffect","Fragment","FolderPlus","Upload","useState","btn","X","RotateCcw","Download","Copy","useCallback","createContext","useContext","useMemo","trimmed","result"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"./cn\";\n\nexport interface BreadcrumbsProps {\n readonly segments: ReadonlyArray<{ id: string; name: string }>;\n readonly onNavigate?: (segment: { id: string; name: string }) => void;\n readonly className?: string;\n}\n\nexport function Breadcrumbs(props: BreadcrumbsProps): React.ReactElement {\n const { segments, onNavigate, className } = props;\n return (\n <nav aria-label=\"Breadcrumb\" className={cn(\"flex items-center gap-1 text-sm\", className)}>\n <ol className=\"flex flex-wrap items-center gap-1\">\n {segments.map((segment, index) => {\n const isLast = index === segments.length - 1;\n return (\n <li key={segment.id} className=\"flex items-center gap-1\">\n {isLast ? (\n <span aria-current=\"page\" className=\"font-medium text-foreground\">\n {segment.name}\n </span>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => onNavigate?.(segment)}\n className=\"rounded-sm text-muted-foreground hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {segment.name}\n </button>\n <ChevronRight aria-hidden=\"true\" className=\"size-3.5 text-muted-foreground\" />\n </>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","\"use client\";\n\nimport {\n Archive,\n File,\n FileAudio,\n FileCode,\n FileImage,\n FileText,\n FileVideo,\n Folder,\n Music,\n type LucideIcon,\n} from \"lucide-react\";\nimport { cn } from \"./cn\";\n\nexport interface FileIconProps {\n readonly kind: \"file\" | \"folder\";\n readonly mimeType?: string;\n readonly className?: string;\n}\n\nexport const FILE_ICON_MAP: Record<string, LucideIcon> = {\n \"text/plain\": FileText,\n \"text/csv\": FileText,\n \"text/html\": FileCode,\n \"application/pdf\": FileText,\n \"application/json\": FileCode,\n \"application/xml\": FileCode,\n \"application/zip\": Archive,\n \"application/gzip\": Archive,\n \"application/x-tar\": Archive,\n \"application/x-7z-compressed\": Archive,\n \"image/png\": FileImage,\n \"image/jpeg\": FileImage,\n \"image/gif\": FileImage,\n \"image/webp\": FileImage,\n \"image/svg+xml\": FileImage,\n \"audio/mpeg\": FileAudio,\n \"audio/wav\": FileAudio,\n \"video/mp4\": FileVideo,\n \"video/webm\": FileVideo,\n \"text/javascript\": FileCode,\n \"audio/mp4\": Music,\n};\n\nexport function resolveFileIcon(mimeType: string | undefined): LucideIcon {\n if (!mimeType) return File;\n if (FILE_ICON_MAP[mimeType]) return FILE_ICON_MAP[mimeType]!;\n const prefix = mimeType.split(\"/\")[0];\n if (prefix === \"image\") return FileImage;\n if (prefix === \"audio\") return FileAudio;\n if (prefix === \"video\") return FileVideo;\n if (prefix === \"text\") return FileText;\n return File;\n}\n\nexport function FileIcon(props: FileIconProps): React.ReactElement {\n const { kind, mimeType, className } = props;\n const Icon = kind === \"folder\" ? Folder : resolveFileIcon(mimeType);\n return (\n <Icon\n aria-hidden=\"true\"\n className={cn(\n kind === \"folder\" ? \"text-primary\" : \"text-muted-foreground\",\n \"size-5 shrink-0\",\n className,\n )}\n />\n );\n}\n","import { createContext, createElement, useContext, type ReactNode } from \"react\";\n\nexport type ExplorerLabels = {\n loading: string;\n emptyFolder: string;\n emptyTrash: string;\n noMatches: string;\n dropHint: string;\n trashRetention: string;\n items: string;\n inTrash: string;\n loadMore: string;\n search: string;\n upload: string;\n newFolder: string;\n folderName: string;\n folderNameHint: string;\n folderExists: string;\n folderCreateFailed: string;\n createFolder: string;\n cancel: string;\n rename: string;\n renameHint: string;\n viewOptions: string;\n listView: string;\n gridView: string;\n sortName: string;\n sortSize: string;\n sortModified: string;\n sortKind: string;\n trash: string;\n folder: string;\n inUse: string;\n itemActions: string;\n preview: string;\n download: string;\n copy: string;\n paste: string;\n copied: string;\n copyShare: string;\n share: string;\n restore: string;\n moveToTrash: string;\n deleteForever: string;\n confirmDelete: string;\n confirmDeleteMany: string;\n confirmPurge: string;\n confirmPurgeMany: string;\n deleting: string;\n selectedCount: string;\n clearSelection: string;\n clearClipboard: string;\n uploadStatus: string;\n dismissUploads: string;\n uploadQueued: string;\n uploadDone: string;\n uploadFailed: string;\n unknownType: string;\n previewUnavailable: string;\n};\n\nexport const defaultLabels: ExplorerLabels = {\n loading: \"Loading…\",\n emptyFolder: \"This folder is empty\",\n emptyTrash: \"Trash is empty\",\n noMatches: \"No matches\",\n dropHint: \"Drop files here or use Upload.\",\n trashRetention: \"Deleted files stay here until you purge them.\",\n items: \"items\",\n inTrash: \"in trash\",\n loadMore: \"Load more\",\n search: \"Search files\",\n upload: \"Upload\",\n newFolder: \"New folder\",\n folderName: \"Folder name\",\n folderNameHint: \"Name the folder.\",\n folderExists: \"A folder with that name already exists.\",\n folderCreateFailed: \"Could not create the folder.\",\n createFolder: \"Create\",\n cancel: \"Cancel\",\n rename: \"Rename\",\n renameHint: \"Enter a new name.\",\n viewOptions: \"View options\",\n listView: \"List view\",\n gridView: \"Grid view\",\n sortName: \"Name\",\n sortSize: \"Size\",\n sortModified: \"Modified\",\n sortKind: \"Kind\",\n trash: \"Trash\",\n folder: \"Folder\",\n inUse: \"In use\",\n itemActions: \"Item actions\",\n preview: \"Preview\",\n download: \"Download\",\n copy: \"Copy\",\n paste: \"Paste\",\n copied: \"copied\",\n copyShare: \"Copy share link\",\n share: \"Share\",\n restore: \"Restore\",\n moveToTrash: \"Move to trash\",\n deleteForever: \"Delete forever\",\n confirmDelete: \"Move “{name}” to trash?\",\n confirmDeleteMany: \"Move {count} items to trash?\",\n confirmPurge: \"Delete “{name}” forever? This cannot be undone.\",\n confirmPurgeMany: \"Delete {count} items forever? This cannot be undone.\",\n deleting: \"Deleting…\",\n selectedCount: \"selected\",\n clearSelection: \"Clear selection\",\n clearClipboard: \"Clear clipboard\",\n uploadStatus: \"uploading\",\n dismissUploads: \"Dismiss uploads\",\n uploadQueued: \"Queued\",\n uploadDone: \"Done\",\n uploadFailed: \"Failed\",\n unknownType: \"Unknown type\",\n previewUnavailable: \"Preview is not available for this file.\",\n};\n\nconst LabelsContext = createContext<ExplorerLabels>(defaultLabels);\n\nexport function ExplorerLabelsProvider({\n labels,\n children,\n}: {\n labels?: Partial<ExplorerLabels>;\n children: ReactNode;\n}): React.ReactElement {\n const value = { ...defaultLabels, ...labels };\n return createElement(LabelsContext.Provider, { value }, children);\n}\n\nexport function useExplorerLabels(): ExplorerLabels {\n return useContext(LabelsContext);\n}\n\nexport function formatLabel(\n template: string,\n vars: Record<string, string | number>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => String(vars[key] ?? \"\"));\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { FileNode } from \"./types\";\n\nconst LONG_PRESS_MS = 450;\nconst MOVE_CANCEL_PX = 10;\n\nexport function useCoarsePointer(): boolean {\n const [coarse, setCoarse] = useState(false);\n\n useEffect(() => {\n if (typeof window.matchMedia !== \"function\") return;\n const mql = window.matchMedia(\"(pointer: coarse)\");\n const sync = () => setCoarse(mql.matches);\n sync();\n mql.addEventListener(\"change\", sync);\n return () => mql.removeEventListener(\"change\", sync);\n }, []);\n\n return coarse;\n}\n\nexport function useExplorerItemPointer(opts: {\n file: FileNode;\n coarse: boolean;\n onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n onActivate: (file: FileNode) => void;\n}): {\n onPointerDown: (event: React.PointerEvent) => void;\n onClick: (event: React.MouseEvent) => void;\n onDoubleClick: () => void;\n} {\n const timer = useRef(0);\n const start = useRef({ x: 0, y: 0 });\n const didLongPress = useRef(false);\n const detach = useRef<(() => void) | null>(null);\n const { file, coarse, onSelect, onActivate } = opts;\n\n const clear = useCallback(() => {\n if (timer.current) {\n window.clearTimeout(timer.current);\n timer.current = 0;\n }\n detach.current?.();\n detach.current = null;\n }, []);\n\n useEffect(() => () => clear(), [clear]);\n\n const onPointerDown = useCallback(\n (event: React.PointerEvent) => {\n if (!coarse || event.pointerType !== \"touch\") return;\n didLongPress.current = false;\n start.current = { x: event.clientX, y: event.clientY };\n clear();\n timer.current = window.setTimeout(() => {\n didLongPress.current = true;\n onSelect(file, { shiftKey: false });\n }, LONG_PRESS_MS);\n\n const onMove = (move: PointerEvent) => {\n const dx = move.clientX - start.current.x;\n const dy = move.clientY - start.current.y;\n if (dx * dx + dy * dy > MOVE_CANCEL_PX * MOVE_CANCEL_PX) clear();\n };\n const onEnd = () => clear();\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n detach.current = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n };\n },\n [clear, coarse, file, onSelect],\n );\n\n const onClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.detail > 1) return;\n event.stopPropagation();\n if (didLongPress.current) {\n didLongPress.current = false;\n return;\n }\n if (coarse) {\n onActivate(file);\n return;\n }\n onSelect(file, event);\n },\n [coarse, file, onActivate, onSelect],\n );\n\n const onDoubleClick = useCallback(() => {\n if (!coarse) onActivate(file);\n }, [coarse, file, onActivate]);\n\n return { onPointerDown, onClick, onDoubleClick };\n}\n","\"use client\";\n\nimport type { DragEvent, KeyboardEvent } from \"react\";\nimport { ChevronDown, ChevronUp, Link2, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { FileIcon } from \"./file-icon\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\nimport { useCoarsePointer, useExplorerItemPointer } from \"./use-explorer-item-pointer\";\n\nexport type ExplorerColumn = \"name\" | \"size\" | \"modified\" | \"kind\";\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface ExplorerListViewProps {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds?: ReadonlySet<string>;\n readonly selectedIds: ReadonlySet<string>;\n readonly onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n readonly onActivate: (file: FileNode) => void;\n readonly onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n readonly onDragStart: (id: string) => void;\n readonly onDragEnd: () => void;\n readonly onDrop: (destinationFolderId: string) => void;\n readonly draggingId: string | null;\n readonly draggingIds?: ReadonlySet<string>;\n readonly dropTargetId: string | null;\n readonly onDragOverRow: (id: string | null) => void;\n readonly sortKey?: ExplorerColumn;\n readonly sortDirection?: SortDirection;\n readonly onSortChange?: (key: ExplorerColumn) => void;\n readonly className?: string;\n}\n\nconst ROW_GRID =\n \"grid-cols-[2.25rem_1.5rem_minmax(12rem,1fr)_5rem_2.75rem] sm:grid-cols-[2.25rem_1.25rem_minmax(0,1fr)_5rem_7.5rem]\";\nconst DRAG_MIME = \"application/x-file-next-id\";\n\nexport function ExplorerListView(props: ExplorerListViewProps): React.ReactElement {\n const {\n files,\n protectedIds,\n selectedIds,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n draggingId,\n draggingIds,\n dropTargetId,\n onDragOverRow,\n sortKey,\n sortDirection,\n onSortChange,\n className,\n } = props;\n const labels = useExplorerLabels();\n const coarse = useCoarsePointer();\n\n return (\n <div className={cn(\"overflow-x-auto overscroll-x-contain\", className)}>\n <div className=\"min-w-[32rem] sm:min-w-0\">\n <div\n role=\"row\"\n className={cn(\n \"grid items-center gap-3 border-b border-border px-3 py-2 font-mono text-[10px] font-medium uppercase tracking-[0.12em] text-muted-foreground\",\n ROW_GRID,\n )}\n >\n <span aria-hidden=\"true\" />\n <span aria-hidden=\"true\" />\n <SortHeader col=\"name\" label={labels.sortName} sortKey={sortKey} sortDirection={sortDirection} onSort={onSortChange} />\n <SortHeader col=\"size\" label={labels.sortSize} sortKey={sortKey} sortDirection={sortDirection} onSort={onSortChange} className=\"justify-end text-right\" />\n {coarse ? (\n <span aria-hidden=\"true\" />\n ) : (\n <SortHeader col=\"modified\" label={labels.sortModified} sortKey={sortKey} sortDirection={sortDirection} onSort={onSortChange} className=\"hidden sm:flex\" />\n )}\n </div>\n <ul role=\"list\">\n {files.map((file, idx) => (\n <ExplorerListRow\n key={file.id}\n file={file}\n idx={idx}\n selected={selectedIds.has(file.id)}\n dragging={draggingIds?.has(file.id) ?? file.id === draggingId}\n dropTarget={file.id === dropTargetId && file.kind === \"folder\"}\n isProtected={protectedIds?.has(file.id) ?? false}\n draggingId={draggingId}\n dropTargetId={dropTargetId}\n coarse={coarse}\n onSelect={onSelect}\n onActivate={onActivate}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n onDragOverRow={onDragOverRow}\n />\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nfunction ExplorerListRow({\n file,\n idx,\n selected,\n dragging,\n dropTarget,\n isProtected,\n draggingId,\n dropTargetId,\n coarse,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n onDragOverRow,\n}: {\n file: FileNode;\n idx: number;\n selected: boolean;\n dragging: boolean;\n dropTarget: boolean;\n isProtected: boolean;\n draggingId: string | null;\n dropTargetId: string | null;\n coarse: boolean;\n onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n onActivate: (file: FileNode) => void;\n onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n onDragStart: (id: string) => void;\n onDragEnd: () => void;\n onDrop: (destinationFolderId: string) => void;\n onDragOverRow: (id: string | null) => void;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const isFolder = file.kind === \"folder\";\n const pointer = useExplorerItemPointer({ file, coarse, onSelect, onActivate });\n\n return (\n <li\n role=\"row\"\n data-file-id={file.id}\n aria-selected={selected}\n draggable={!coarse}\n onDragStart={(e: DragEvent<HTMLLIElement>) => {\n e.dataTransfer.setData(DRAG_MIME, file.id);\n e.dataTransfer.effectAllowed = \"move\";\n onDragStart(file.id);\n }}\n onDragEnd={onDragEnd}\n onPointerDown={pointer.onPointerDown}\n onClick={pointer.onClick}\n onDoubleClick={pointer.onDoubleClick}\n onKeyDown={(e: KeyboardEvent<HTMLLIElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onActivate(file);\n }\n }}\n onContextMenu={\n onContextMenu\n ? (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (coarse) return;\n onContextMenu(file, e);\n }\n : undefined\n }\n onDragOver={(e) => {\n if (!isFolder || !draggingId) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (dropTargetId !== file.id) onDragOverRow(file.id);\n }}\n onDragLeave={() => {\n if (dropTargetId === file.id) onDragOverRow(null);\n }}\n onDrop={(e) => {\n if (!isFolder) return;\n e.preventDefault();\n const draggedId = e.dataTransfer.getData(DRAG_MIME);\n if (draggedId && draggedId !== file.id) onDrop(file.id);\n else onDragEnd();\n }}\n tabIndex={0}\n className={cn(\n \"group grid items-center gap-3 border-b border-border/60 px-3 py-3.5 text-sm outline-none last:border-b-0 sm:py-2\",\n \"touch-manipulation select-none [-webkit-touch-callout:none]\",\n ROW_GRID,\n \"hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n selected && \"bg-muted\",\n dragging && \"opacity-50\",\n dropTarget && \"ring-2 ring-primary ring-inset\",\n )}\n >\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums\">\n {String(idx + 1).padStart(2, \"0\")}\n </span>\n <span className={isFolder ? \"text-primary\" : \"text-muted-foreground\"}>\n <FileIcon kind={file.kind} mimeType={file.mimeType} className=\"size-5 text-current sm:size-4\" />\n </span>\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className={cn(\"truncate\", isFolder && \"text-primary\")}>{file.name}</span>\n {isProtected ? (\n <span className=\"flex shrink-0 items-center gap-0.5 rounded-[10px] bg-primary/10 px-1.5 text-[10px] text-primary\">\n <Link2 aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.inUse}\n </span>\n ) : null}\n </span>\n <span className=\"truncate text-right font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums\">\n {formatSize(file.size)}\n </span>\n {coarse ? (\n <button\n type=\"button\"\n aria-label={labels.itemActions}\n className=\"inline-flex size-11 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n onContextMenu?.(file, event);\n }}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"size-5\" />\n </button>\n ) : (\n <span className=\"hidden truncate font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums sm:block\">\n {formatDate(file.updatedAt)}\n </span>\n )}\n </li>\n );\n}\n\nfunction SortHeader({\n col,\n label,\n sortKey,\n sortDirection,\n onSort,\n className,\n}: {\n col: ExplorerColumn;\n label: string;\n sortKey?: ExplorerColumn;\n sortDirection?: SortDirection;\n onSort?: (k: ExplorerColumn) => void;\n className?: string;\n}): React.ReactElement {\n const active = sortKey === col;\n return (\n <button\n type=\"button\"\n role=\"columnheader\"\n aria-sort={active ? (sortDirection === \"asc\" ? \"ascending\" : \"descending\") : \"none\"}\n onClick={onSort ? () => onSort(col) : undefined}\n className={cn(\n \"flex items-center gap-1 text-left outline-none\",\n onSort ? \"cursor-pointer hover:text-foreground\" : \"cursor-default\",\n className,\n )}\n >\n <span>{label}</span>\n {active ? (\n sortDirection === \"asc\" ? (\n <ChevronUp aria-hidden=\"true\" className=\"size-3\" />\n ) : (\n <ChevronDown aria-hidden=\"true\" className=\"size-3\" />\n )\n ) : null}\n </button>\n );\n}\n\nconst formatSize = (bytes: number): string => {\n if (bytes === 0) return \"—\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const exp = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n const value = bytes / Math.pow(1024, exp);\n return `${value.toFixed(value >= 100 || exp === 0 ? 0 : 1)} ${units[exp]}`;\n};\n\nconst formatDate = (d: Date): string =>\n d.toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n\nexport const EXPLORER_DRAG_MIME = DRAG_MIME;\n","\"use client\";\n\nimport type { DragEvent, KeyboardEvent } from \"react\";\nimport { Link2, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { FileIcon } from \"./file-icon\";\nimport { EXPLORER_DRAG_MIME } from \"./explorer-list-view\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\nimport { useCoarsePointer, useExplorerItemPointer } from \"./use-explorer-item-pointer\";\n\nexport interface ExplorerGridViewProps {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds?: ReadonlySet<string>;\n readonly selectedIds: ReadonlySet<string>;\n readonly onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n readonly onActivate: (file: FileNode) => void;\n readonly onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n readonly onDragStart: (id: string) => void;\n readonly onDragEnd: () => void;\n readonly onDrop: (destinationFolderId: string) => void;\n readonly draggingId: string | null;\n readonly draggingIds?: ReadonlySet<string>;\n readonly dropTargetId: string | null;\n readonly onDragOverRow: (id: string | null) => void;\n readonly className?: string;\n}\n\nexport function ExplorerGridView(props: ExplorerGridViewProps): React.ReactElement {\n const {\n files,\n protectedIds,\n selectedIds,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n draggingId,\n draggingIds,\n dropTargetId,\n onDragOverRow,\n className,\n } = props;\n const labels = useExplorerLabels();\n const coarse = useCoarsePointer();\n\n return (\n <ul role=\"list\" className={cn(\"grid grid-cols-3 gap-1.5 p-3 sm:grid-cols-5 md:grid-cols-6 lg:grid-cols-8\", className)}>\n {files.map((file, idx) => (\n <ExplorerGridItem\n key={file.id}\n file={file}\n idx={idx}\n selected={selectedIds.has(file.id)}\n dragging={draggingIds?.has(file.id) ?? file.id === draggingId}\n dropTarget={file.id === dropTargetId && file.kind === \"folder\"}\n isProtected={protectedIds?.has(file.id) ?? false}\n draggingId={draggingId}\n dropTargetId={dropTargetId}\n coarse={coarse}\n folderLabel={labels.folder}\n inUseLabel={labels.inUse}\n actionsLabel={labels.itemActions}\n onSelect={onSelect}\n onActivate={onActivate}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n onDragOverRow={onDragOverRow}\n />\n ))}\n </ul>\n );\n}\n\nfunction ExplorerGridItem({\n file,\n idx,\n selected,\n dragging,\n dropTarget,\n isProtected,\n draggingId,\n dropTargetId,\n coarse,\n folderLabel,\n inUseLabel,\n actionsLabel,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n onDragOverRow,\n}: {\n file: FileNode;\n idx: number;\n selected: boolean;\n dragging: boolean;\n dropTarget: boolean;\n isProtected: boolean;\n draggingId: string | null;\n dropTargetId: string | null;\n coarse: boolean;\n folderLabel: string;\n inUseLabel: string;\n actionsLabel: string;\n onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n onActivate: (file: FileNode) => void;\n onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n onDragStart: (id: string) => void;\n onDragEnd: () => void;\n onDrop: (destinationFolderId: string) => void;\n onDragOverRow: (id: string | null) => void;\n}): React.ReactElement {\n const pointer = useExplorerItemPointer({ file, coarse, onSelect, onActivate });\n return (\n <li className=\"relative\">\n {coarse && onContextMenu ? (\n <button\n type=\"button\"\n aria-label={actionsLabel}\n className=\"absolute right-0.5 top-0.5 z-10 inline-flex size-10 items-center justify-center rounded-[10px] text-muted-foreground\"\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n onContextMenu(file, event);\n }}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"size-5\" />\n </button>\n ) : null}\n <button\n type=\"button\"\n data-file-id={file.id}\n draggable={!coarse}\n aria-selected={selected}\n onDragStart={(e: DragEvent<HTMLButtonElement>) => {\n e.dataTransfer.setData(EXPLORER_DRAG_MIME, file.id);\n e.dataTransfer.effectAllowed = \"move\";\n onDragStart(file.id);\n }}\n onDragEnd={onDragEnd}\n onPointerDown={pointer.onPointerDown}\n onClick={pointer.onClick}\n onDoubleClick={pointer.onDoubleClick}\n onKeyDown={(e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onActivate(file);\n }\n }}\n onContextMenu={\n onContextMenu\n ? (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (coarse) return;\n onContextMenu(file, e);\n }\n : undefined\n }\n onDragOver={(e) => {\n if (file.kind !== \"folder\" || !draggingId) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (dropTargetId !== file.id) onDragOverRow(file.id);\n }}\n onDragLeave={() => {\n if (dropTargetId === file.id) onDragOverRow(null);\n }}\n onDrop={(e) => {\n if (file.kind !== \"folder\") return;\n e.preventDefault();\n onDrop(file.id);\n }}\n className={cn(\n \"group relative flex w-full flex-col items-stretch gap-1 overflow-hidden rounded-[10px] border border-border bg-background p-2 text-left outline-none\",\n \"touch-manipulation select-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\",\n selected && \"border-primary bg-muted\",\n dragging && \"opacity-50\",\n dropTarget && \"ring-2 ring-primary ring-inset\",\n )}\n >\n <span className=\"flex items-center gap-1 pr-8\">\n <span className=\"font-mono text-[9px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums\">\n {String(idx + 1).padStart(2, \"0\")}\n </span>\n {isProtected ? (\n <span className=\"flex items-center gap-0.5 rounded-[10px] bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary\">\n <Link2 aria-hidden=\"true\" className=\"size-2.5\" />\n <span className=\"sr-only\">{inUseLabel}</span>\n </span>\n ) : null}\n </span>\n <span className={cn(\"flex items-center justify-center py-1\", file.kind === \"folder\" ? \"text-primary\" : \"text-muted-foreground\")}>\n <FileIcon kind={file.kind} mimeType={file.mimeType} className=\"size-12 text-current\" />\n </span>\n <span className={cn(\"truncate text-[11px]\", file.kind === \"folder\" && \"text-primary\")}>{file.name}</span>\n <span className=\"font-mono text-[9px] uppercase tracking-[0.12em] text-muted-foreground\">\n {file.kind === \"folder\" ? folderLabel : formatSizeShort(file.size)}\n </span>\n </button>\n </li>\n );\n}\n\nconst formatSizeShort = (bytes: number): string => {\n if (bytes === 0) return \"0 B\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const exp = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n const value = bytes / Math.pow(1024, exp);\n return `${value.toFixed(value >= 10 || exp === 0 ? 0 : 1)} ${units[exp]}`;\n};\n","\"use client\";\n\nimport { FolderPlus, LayoutGrid, List as ListIcon, Search, Trash, Upload } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { useExplorerLabels } from \"./labels\";\nimport type { ViewMode } from \"@vryzel/file-next-headless\";\nimport type { ExplorerColumn, SortDirection } from \"./explorer-list-view\";\n\nexport interface ExplorerToolbarProps {\n readonly view: ViewMode;\n readonly onViewChange: (v: ViewMode) => void;\n readonly query?: string;\n readonly onQueryChange?: (query: string) => void;\n readonly trashOpen?: boolean;\n readonly onTrashToggle?: () => void;\n readonly trashHasItems?: boolean;\n readonly onNewFolder?: () => void;\n readonly onUpload?: () => void;\n readonly uploading?: boolean;\n readonly uploadLabel?: string;\n readonly sortKey: ExplorerColumn;\n readonly sortDirection: SortDirection;\n readonly onSortChange: (key: ExplorerColumn) => void;\n readonly className?: string;\n}\n\nconst SORT_KEYS: ReadonlyArray<ExplorerColumn> = [\"name\", \"size\", \"modified\", \"kind\"];\n\nconst btn =\n \"inline-flex h-10 shrink-0 items-center justify-center gap-1.5 rounded-[10px] border border-border bg-background px-2.5 text-xs font-medium text-foreground outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 sm:h-8 sm:px-3\";\n\nexport function ExplorerToolbar(props: ExplorerToolbarProps): React.ReactElement {\n const {\n view,\n onViewChange,\n query,\n onQueryChange,\n trashOpen,\n onTrashToggle,\n trashHasItems = false,\n onNewFolder,\n onUpload,\n uploading = false,\n uploadLabel,\n sortKey,\n sortDirection,\n onSortChange,\n className,\n } = props;\n const labels = useExplorerLabels();\n const sortLabel: Record<ExplorerColumn, string> = {\n name: labels.sortName,\n size: labels.sortSize,\n modified: labels.sortModified,\n kind: labels.sortKind,\n };\n\n const viewToggle = (\n <div\n role=\"toolbar\"\n aria-label={labels.viewOptions}\n className=\"inline-flex shrink-0 items-center gap-0.5 rounded-[10px] border border-border bg-background p-0.5\"\n >\n <button\n type=\"button\"\n aria-label={labels.listView}\n aria-pressed={view === \"list\"}\n onClick={() => onViewChange(\"list\")}\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-[8px] outline-none focus-visible:ring-2 focus-visible:ring-ring sm:size-7\",\n view === \"list\"\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n <ListIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n aria-label={labels.gridView}\n aria-pressed={view === \"grid\"}\n onClick={() => onViewChange(\"grid\")}\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-[8px] outline-none focus-visible:ring-2 focus-visible:ring-ring sm:size-7\",\n view === \"grid\"\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n <LayoutGrid aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n );\n\n return (\n <div className={cn(\"flex min-w-0 flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\", className)}>\n <div className=\"flex min-w-0 items-center gap-2 sm:max-w-xs sm:flex-1\">\n {onQueryChange ? (\n <label className=\"relative min-w-0 flex-1 sm:min-w-40\">\n <Search\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\"\n />\n <input\n type=\"search\"\n value={query ?? \"\"}\n onChange={(event) => onQueryChange(event.target.value)}\n placeholder={labels.search}\n aria-label={labels.search}\n className=\"h-10 w-full rounded-[10px] border border-border bg-background pl-9 pr-2 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring sm:h-8\"\n />\n </label>\n ) : null}\n <div className=\"sm:hidden\">{viewToggle}</div>\n </div>\n <div className=\"flex min-w-0 items-center gap-2 sm:ml-auto\">\n {onUpload ? (\n <button type=\"button\" onClick={onUpload} disabled={uploading} aria-label={uploadLabel ?? labels.upload} className={btn}>\n <Upload aria-hidden=\"true\" className=\"size-4 sm:size-3.5\" />\n <span className=\"hidden sm:inline\">{uploadLabel ?? labels.upload}</span>\n </button>\n ) : null}\n {onNewFolder ? (\n <button type=\"button\" onClick={onNewFolder} aria-label={labels.newFolder} className={btn}>\n <FolderPlus aria-hidden=\"true\" className=\"size-4 sm:size-3.5\" />\n <span className=\"hidden sm:inline\">{labels.newFolder}</span>\n </button>\n ) : null}\n <div className=\"inline-flex h-10 min-w-0 flex-1 items-center rounded-[10px] border border-border sm:h-8 sm:max-w-48 sm:flex-none\">\n <select\n aria-label={sortLabel[sortKey]}\n value={sortKey}\n onChange={(event) => onSortChange(event.target.value as ExplorerColumn)}\n className=\"h-10 min-w-0 flex-1 appearance-none bg-transparent pl-2.5 pr-1 font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground outline-none sm:h-8\"\n >\n {SORT_KEYS.map((key) => (\n <option key={key} value={key}>\n {sortLabel[key]}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n aria-label={`${sortLabel[sortKey]} ${sortDirection}`}\n onClick={() => onSortChange(sortKey)}\n className=\"inline-flex size-10 shrink-0 items-center justify-center font-mono text-[10px] text-muted-foreground hover:bg-muted sm:size-8\"\n >\n {sortDirection === \"asc\" ? \"↑\" : \"↓\"}\n </button>\n </div>\n {onTrashToggle ? (\n <button\n type=\"button\"\n aria-label={labels.trash}\n aria-pressed={trashOpen === true}\n onClick={onTrashToggle}\n className={cn(\n \"relative inline-flex size-10 shrink-0 items-center justify-center rounded-[10px] border border-border outline-none focus-visible:ring-2 focus-visible:ring-ring sm:size-8\",\n trashOpen\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n <Trash aria-hidden=\"true\" className=\"size-4\" />\n {trashHasItems ? (\n <span aria-hidden=\"true\" className=\"absolute top-1 right-1 size-1.5 rounded-full bg-primary\" />\n ) : null}\n </button>\n ) : null}\n <div className=\"hidden sm:block\">{viewToggle}</div>\n </div>\n </div>\n );\n}\n","export function swallowClickThrough(): void {\n const swallow = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n window.removeEventListener(\"click\", swallow, true);\n window.removeEventListener(\"pointerup\", swallow, true);\n };\n window.addEventListener(\"click\", swallow, true);\n window.addEventListener(\"pointerup\", swallow, true);\n window.setTimeout(() => {\n window.removeEventListener(\"click\", swallow, true);\n window.removeEventListener(\"pointerup\", swallow, true);\n }, 400);\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect, useRef } from \"react\";\nimport {\n Copy,\n Download,\n Eye,\n FolderPlus,\n Link2,\n Pencil,\n RotateCcw,\n Upload,\n X,\n} from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { swallowClickThrough } from \"./swallow-click-through\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport interface ExplorerContextMenuActions {\n readonly deleteFile: (input: { id: string }) => Promise<unknown>;\n readonly renameFile: (id: string, newName: string) => Promise<void>;\n readonly restoreNode?: (input: { id: string }) => Promise<unknown>;\n readonly purgeNode?: (input: { id: string }) => Promise<unknown>;\n readonly createShare?: (input: { id: string }) => Promise<string>;\n}\n\nexport type ExplorerContextTarget =\n | { kind: \"item\"; file: FileNode; x: number; y: number }\n | { kind: \"blank\"; x: number; y: number };\n\nexport interface ExplorerContextMenuProps {\n readonly target: ExplorerContextTarget | null;\n readonly mode?: \"browse\" | \"trash\";\n readonly actions: ExplorerContextMenuActions;\n readonly protectedItem?: boolean;\n readonly onClose: () => void;\n readonly onPreview?: (file: FileNode) => void;\n readonly onDownload?: (file: FileNode) => void;\n readonly onRename?: (file: FileNode) => void;\n readonly onRequestDelete?: (file: FileNode) => void;\n readonly onRequestPurge?: (file: FileNode) => void;\n readonly onCopy?: (file: FileNode) => void;\n readonly onPaste?: (folder?: FileNode) => void;\n readonly onNewFolder?: () => void;\n readonly onUpload?: () => void;\n readonly extraFileAction?: {\n label: string;\n onSelect: (file: FileNode) => void;\n };\n}\n\nexport function ExplorerContextMenu(\n props: ExplorerContextMenuProps,\n): React.ReactElement | null {\n const {\n target,\n mode = \"browse\",\n actions,\n protectedItem = false,\n onClose,\n onPreview,\n onDownload,\n onRename,\n onRequestDelete,\n onRequestPurge,\n onCopy,\n onPaste,\n onNewFolder,\n onUpload,\n extraFileAction,\n } = props;\n const labels = useExplorerLabels();\n const menuRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const el = menuRef.current;\n if (!el || !target) return;\n const rect = el.getBoundingClientRect();\n const pad = 8;\n const left = Math.min(Math.max(pad, target.x), window.innerWidth - rect.width - pad);\n const top = Math.min(Math.max(pad, target.y), window.innerHeight - rect.height - pad);\n el.style.left = `${left}px`;\n el.style.top = `${top}px`;\n }, [target]);\n\n useEffect(() => {\n if (!target) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n const onPointer = (event: PointerEvent) => {\n if (menuRef.current?.contains(event.target as Node)) return;\n event.preventDefault();\n event.stopPropagation();\n swallowClickThrough();\n onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"pointerdown\", onPointer, true);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"pointerdown\", onPointer, true);\n };\n }, [onClose, target]);\n\n if (!target) return null;\n\n const close = () => {\n swallowClickThrough();\n onClose();\n };\n\n const itemClass =\n \"flex w-full min-h-11 cursor-pointer items-center gap-2 rounded-[10px] px-3 py-2.5 text-left text-sm outline-none hover:bg-accent disabled:opacity-40 sm:min-h-0 sm:px-2.5 sm:py-1.5\";\n\n return (\n <div\n ref={menuRef}\n role=\"menu\"\n className=\"fixed z-50 min-w-48 rounded-[10px] border border-border bg-card p-1 text-card-foreground shadow-xl\"\n style={{ left: target.x, top: target.y }}\n >\n {target.kind === \"blank\" ? (\n <>\n {onNewFolder ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onNewFolder(); }}>\n <FolderPlus aria-hidden=\"true\" className=\"size-4\" />\n {labels.newFolder}\n </button>\n ) : null}\n {onUpload ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onUpload(); }}>\n <Upload aria-hidden=\"true\" className=\"size-4\" />\n {labels.upload}\n </button>\n ) : null}\n {onPaste ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onPaste(); }}>\n <Copy aria-hidden=\"true\" className=\"size-4\" />\n {labels.paste}\n </button>\n ) : null}\n </>\n ) : mode === \"trash\" ? (\n <>\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); void actions.restoreNode?.({ id: target.file.id }); }}>\n <RotateCcw aria-hidden=\"true\" className=\"size-4\" />\n {labels.restore}\n </button>\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n role=\"menuitem\"\n className={cn(itemClass, \"text-destructive\")}\n onClick={() => {\n close();\n if (onRequestPurge) onRequestPurge(target.file);\n else void actions.purgeNode?.({ id: target.file.id });\n }}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n {labels.deleteForever}\n </button>\n </>\n ) : (\n <>\n {target.file.kind === \"file\" && onPreview ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onPreview(target.file); }}>\n <Eye aria-hidden=\"true\" className=\"size-4\" />\n {labels.preview}\n </button>\n ) : null}\n {target.file.kind === \"file\" && onDownload ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onDownload(target.file); }}>\n <Download aria-hidden=\"true\" className=\"size-4\" />\n {labels.download}\n </button>\n ) : null}\n {target.file.kind === \"file\" && extraFileAction ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); extraFileAction.onSelect(target.file); }}>\n {extraFileAction.label}\n </button>\n ) : null}\n {onRename ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onRename(target.file); }}>\n <Pencil aria-hidden=\"true\" className=\"size-4\" />\n {labels.rename}\n </button>\n ) : null}\n {onCopy ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onCopy(target.file); }}>\n <Copy aria-hidden=\"true\" className=\"size-4\" />\n {labels.copy}\n </button>\n ) : null}\n {onPaste && target.file.kind === \"folder\" ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onPaste(target.file); }}>\n <Copy aria-hidden=\"true\" className=\"size-4\" />\n {labels.paste}\n </button>\n ) : null}\n {actions.createShare ? (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={itemClass}\n onClick={() => {\n close();\n void actions.createShare!({ id: target.file.id }).then((token) =>\n navigator.clipboard.writeText(token),\n );\n }}\n >\n <Link2 aria-hidden=\"true\" className=\"size-4\" />\n {labels.copyShare}\n </button>\n ) : null}\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={protectedItem}\n className={cn(itemClass, \"text-destructive\")}\n onClick={() => {\n if (protectedItem) return;\n close();\n if (onRequestDelete) onRequestDelete(target.file);\n else void actions.deleteFile({ id: target.file.id });\n }}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n {labels.moveToTrash}\n </button>\n </>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"./cn\";\n\nexport function Overlay({\n open,\n onClose,\n className,\n children,\n}: {\n open: boolean;\n onClose: () => void;\n className?: string;\n children: ReactNode;\n}): React.ReactElement | null {\n if (!open) return null;\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4\"\n onClick={onClose}\n >\n <div\n role=\"dialog\"\n className={cn(\n \"w-full max-w-sm rounded-[10px] border border-border bg-card p-4 text-card-foreground shadow-xl\",\n className,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {children}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Overlay } from \"./overlay\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport function CreateFolderDialog({\n open,\n onOpenChange,\n onCreate,\n title,\n description,\n confirmLabel,\n initialName = \"\",\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onCreate: (name: string) => Promise<void> | void;\n title?: string;\n description?: string;\n confirmLabel?: string;\n initialName?: string;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const [name, setName] = useState(initialName);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!open) {\n setSaving(false);\n setError(null);\n return;\n }\n setName(initialName);\n const id = window.setTimeout(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, 0);\n return () => window.clearTimeout(id);\n }, [initialName, open]);\n\n async function submit() {\n const trimmed = name.trim();\n if (!trimmed || saving) return;\n setSaving(true);\n setError(null);\n try {\n await onCreate(trimmed);\n onOpenChange(false);\n } catch (cause) {\n const code =\n cause && typeof cause === \"object\" && \"code\" in cause\n ? String((cause as { code?: string }).code)\n : \"\";\n setError(code === \"Conflict\" ? labels.folderExists : labels.folderCreateFailed);\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Overlay open={open} onClose={() => onOpenChange(false)}>\n <h2 className=\"text-base font-semibold\">{title ?? labels.newFolder}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {description ?? labels.folderNameHint}\n </p>\n <input\n ref={inputRef}\n value={name}\n onChange={(event) => setName(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n void submit();\n }\n }}\n placeholder={labels.folderName}\n aria-invalid={Boolean(error)}\n className=\"mt-3 h-9 w-full rounded-[10px] border border-border bg-background px-3 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {error ? <p className=\"mt-2 text-sm text-destructive\">{error}</p> : null}\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n className=\"inline-flex h-8 items-center rounded-[10px] border border-border px-3 text-sm\"\n onClick={() => onOpenChange(false)}\n >\n {labels.cancel}\n </button>\n <button\n type=\"button\"\n disabled={!name.trim() || saving}\n className=\"inline-flex h-8 items-center rounded-[10px] bg-primary px-3 text-sm text-primary-foreground disabled:opacity-50\"\n onClick={() => void submit()}\n >\n {confirmLabel ?? labels.createFolder}\n </button>\n </div>\n </Overlay>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Overlay } from \"./overlay\";\nimport { formatLabel, useExplorerLabels } from \"./labels\";\n\nexport function ConfirmDeleteDialog({\n open,\n names,\n permanent = false,\n onOpenChange,\n onConfirm,\n}: {\n open: boolean;\n names: ReadonlyArray<string>;\n permanent?: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: () => Promise<void> | void;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const [saving, setSaving] = useState(false);\n const description =\n names.length === 1\n ? formatLabel(permanent ? labels.confirmPurge : labels.confirmDelete, {\n name: names[0] ?? \"\",\n })\n : formatLabel(permanent ? labels.confirmPurgeMany : labels.confirmDeleteMany, {\n count: names.length,\n });\n\n async function submit() {\n if (saving) return;\n setSaving(true);\n try {\n await onConfirm();\n onOpenChange(false);\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Overlay open={open} onClose={() => !saving && onOpenChange(false)}>\n <h2 className=\"text-base font-semibold\">\n {permanent ? labels.deleteForever : labels.moveToTrash}\n </h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n disabled={saving}\n className=\"inline-flex h-8 items-center rounded-[10px] border border-border px-3 text-sm\"\n onClick={() => onOpenChange(false)}\n >\n {labels.cancel}\n </button>\n <button\n type=\"button\"\n disabled={saving}\n className={\n permanent\n ? \"inline-flex h-8 items-center rounded-[10px] bg-destructive px-3 text-sm text-destructive-foreground\"\n : \"inline-flex h-8 items-center rounded-[10px] bg-primary px-3 text-sm text-primary-foreground\"\n }\n onClick={() => void submit()}\n >\n {saving\n ? labels.deleting\n : permanent\n ? labels.deleteForever\n : labels.moveToTrash}\n </button>\n </div>\n </Overlay>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Copy, Download, Link2, ListChecks, RotateCcw, X } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { swallowClickThrough } from \"./swallow-click-through\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport function ExplorerSelectionToast({\n files,\n protectedIds,\n trashOpen,\n onDownload,\n onCopy,\n onShare,\n onDelete,\n onRestore,\n onPurge,\n onClear,\n}: {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds: ReadonlySet<string>;\n readonly trashOpen: boolean;\n readonly onDownload?: (file: FileNode) => void;\n readonly onCopy?: () => void;\n readonly onShare?: () => void;\n readonly onDelete?: () => void;\n readonly onRestore?: () => void;\n readonly onPurge?: () => void;\n readonly onClear: () => void;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n const [open, setOpen] = useState(false);\n const [compact, setCompact] = useState(true);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (typeof window.matchMedia !== \"function\") return;\n const mq = window.matchMedia(\"(max-width: 767px), (pointer: coarse)\");\n const sync = () => setCompact(mq.matches);\n sync();\n mq.addEventListener(\"change\", sync);\n return () => mq.removeEventListener(\"change\", sync);\n }, []);\n\n useEffect(() => {\n if (files.length < 2) setOpen(false);\n }, [files.length]);\n\n useEffect(() => {\n if (!open) return;\n const onPointer = (event: PointerEvent) => {\n if (rootRef.current?.contains(event.target as Node)) return;\n event.preventDefault();\n event.stopPropagation();\n swallowClickThrough();\n setOpen(false);\n };\n const timer = window.setTimeout(() => {\n window.addEventListener(\"pointerdown\", onPointer, true);\n }, 0);\n return () => {\n window.clearTimeout(timer);\n window.removeEventListener(\"pointerdown\", onPointer, true);\n };\n }, [open]);\n\n if (files.length < 2) return null;\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"z-50 flex flex-col items-start gap-2\",\n compact ? \"fixed bottom-4 left-4\" : \"fixed right-4 bottom-4 w-[min(22rem,calc(100vw-2rem))]\",\n )}\n >\n {!compact || open ? (\n <div className=\"w-[min(18rem,calc(100vw-2rem))] md:w-full\">\n <SelectionActions\n files={files}\n protectedIds={protectedIds}\n trashOpen={trashOpen}\n onDownload={onDownload}\n onCopy={onCopy}\n onShare={onShare}\n onDelete={onDelete}\n onRestore={onRestore}\n onPurge={onPurge}\n onClear={onClear}\n />\n </div>\n ) : null}\n {compact ? (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${files.length} ${labels.selectedCount}`}\n className=\"relative inline-flex size-12 items-center justify-center rounded-[10px] border border-border bg-card shadow-xl\"\n onClick={(event) => {\n event.stopPropagation();\n setOpen((value) => !value);\n }}\n >\n <ListChecks aria-hidden=\"true\" className=\"size-5\" />\n <span className=\"absolute -right-1 -top-1 min-w-5 rounded-full bg-primary px-1 text-center font-mono text-[10px] leading-5 text-primary-foreground\">\n {files.length}\n </span>\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction SelectionActions({\n files,\n protectedIds,\n trashOpen,\n onDownload,\n onCopy,\n onShare,\n onDelete,\n onRestore,\n onPurge,\n onClear,\n}: {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds: ReadonlySet<string>;\n readonly trashOpen: boolean;\n readonly onDownload?: (file: FileNode) => void;\n readonly onCopy?: () => void;\n readonly onShare?: () => void;\n readonly onDelete?: () => void;\n readonly onRestore?: () => void;\n readonly onPurge?: () => void;\n readonly onClear: () => void;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const downloadable = files.filter((file) => file.kind === \"file\");\n const hasProtected = files.some((file) => protectedIds.has(file.id));\n const btn =\n \"inline-flex h-10 items-center gap-1.5 rounded-[10px] border border-border bg-background px-3 text-xs font-medium hover:bg-muted disabled:opacity-40 sm:h-8 sm:px-2.5\";\n\n return (\n <div role=\"status\" className=\"w-full rounded-[10px] border border-border bg-card p-3 shadow-xl\">\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary\">{String(files.length).padStart(2, \"0\")}</span>{\" \"}\n {labels.selectedCount}\n </span>\n <button\n type=\"button\"\n aria-label={labels.clearSelection}\n className=\"ml-auto inline-flex size-7 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onClick={(event) => {\n event.stopPropagation();\n swallowClickThrough();\n onClear();\n }}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {trashOpen ? (\n <>\n <button type=\"button\" className={btn} onClick={onRestore}>\n <RotateCcw aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.restore}\n </button>\n {onPurge ? (\n <button type=\"button\" className={cn(btn, \"text-destructive\")} onClick={onPurge}>\n <X aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.deleteForever}\n </button>\n ) : null}\n </>\n ) : (\n <>\n {onDownload && downloadable.length > 0 ? (\n <button type=\"button\" className={btn} onClick={() => downloadable.forEach(onDownload)}>\n <Download aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.download}\n </button>\n ) : null}\n {onCopy ? (\n <button type=\"button\" className={btn} onClick={onCopy}>\n <Copy aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.copy}\n </button>\n ) : null}\n {onShare && downloadable.length > 0 ? (\n <button type=\"button\" className={btn} onClick={onShare}>\n <Link2 aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.share}\n </button>\n ) : null}\n <button type=\"button\" disabled={hasProtected} className={cn(btn, \"text-destructive\")} onClick={onDelete}>\n <X aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.moveToTrash}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n\nexport function ExplorerClipboardToast({\n count,\n onPaste,\n onClear,\n}: {\n readonly count: number;\n readonly onPaste: () => void;\n readonly onClear: () => void;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n if (count < 1) return null;\n return (\n <div role=\"status\" className=\"pointer-events-auto w-full rounded-[10px] border border-border bg-card p-3 shadow-xl\">\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary\">{String(count).padStart(2, \"0\")}</span> {labels.copied}\n </span>\n <button\n type=\"button\"\n aria-label={labels.clearClipboard}\n className=\"ml-auto inline-flex size-7 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onClick={onClear}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"inline-flex h-8 items-center gap-1.5 rounded-[10px] border border-border px-2.5 text-xs font-medium hover:bg-muted\"\n onClick={onPaste}\n >\n <Copy aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.paste}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { X } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { useExplorerLabels } from \"./labels\";\nimport type { UploadQueueItem } from \"./use-upload-queue\";\n\nexport function ExplorerUploadStatus({\n items,\n onDismiss,\n className,\n}: {\n readonly items: ReadonlyArray<UploadQueueItem>;\n readonly onDismiss: () => void;\n readonly className?: string;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n if (items.length === 0) return null;\n\n const done = items.filter((item) => item.status === \"success\").length;\n const failed = items.filter((item) => item.status === \"error\").length;\n const active = items.some(\n (item) => item.status === \"queued\" || item.status === \"uploading\",\n );\n const visible = items.slice(-6);\n\n return (\n <div\n role=\"status\"\n className={cn(\n \"w-full rounded-[10px] border border-border bg-card p-3 shadow-xl\",\n className,\n )}\n >\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary\">\n {String(done).padStart(2, \"0\")}/{String(items.length).padStart(2, \"0\")}\n </span>{\" \"}\n {labels.uploadStatus}\n {failed > 0 ? (\n <span className=\"text-destructive\"> · {failed}</span>\n ) : null}\n </span>\n {!active ? (\n <button\n type=\"button\"\n aria-label={labels.dismissUploads}\n className=\"ml-auto inline-flex size-7 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onClick={onDismiss}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n ) : (\n <span className=\"ml-auto\" />\n )}\n </div>\n <ul className=\"flex max-h-48 flex-col gap-1.5 overflow-y-auto\">\n {visible.map((item) => (\n <li key={item.id} className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-xs\">{item.name}</span>\n <span\n className={cn(\n \"shrink-0 font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\",\n item.status === \"error\" && \"text-destructive\",\n item.status === \"success\" && \"text-primary\",\n )}\n >\n {item.status === \"uploading\"\n ? `${item.progress}%`\n : item.status === \"queued\"\n ? labels.uploadQueued\n : item.status === \"success\"\n ? labels.uploadDone\n : labels.uploadFailed}\n </span>\n </div>\n {item.status === \"uploading\" ? (\n <div className=\"mt-1 h-1 overflow-hidden rounded-[10px] bg-muted\">\n <div className=\"h-full bg-primary\" style={{ width: `${item.progress}%` }} />\n </div>\n ) : null}\n {item.error ? (\n <p className=\"mt-0.5 truncate text-[10px] text-destructive\">{item.error}</p>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { RequestUploadResult } from \"@vryzel/file-next-headless\";\n\nexport type UploadQueueStatus = \"queued\" | \"uploading\" | \"success\" | \"error\";\n\nexport type UploadQueueItem = {\n readonly id: string;\n readonly name: string;\n readonly size: number;\n readonly type: string;\n readonly parentId: string | null;\n readonly status: UploadQueueStatus;\n readonly progress: number;\n readonly error?: string;\n};\n\ntype InternalItem = {\n id: string;\n name: string;\n size: number;\n type: string;\n parentId: string | null;\n status: UploadQueueStatus;\n progress: number;\n error?: string;\n content: Blob;\n};\n\nexport function useUploadQueue(options: {\n readonly requestUpload: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n parentId: string | null;\n }) => Promise<RequestUploadResult>;\n readonly confirmUpload?: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n }) => Promise<void> | void;\n}): {\n readonly items: ReadonlyArray<UploadQueueItem>;\n readonly enqueue: (files: ReadonlyArray<File>, parentId: string | null) => void;\n readonly dismiss: () => void;\n readonly active: boolean;\n} {\n const requestUploadRef = useRef(options.requestUpload);\n requestUploadRef.current = options.requestUpload;\n const confirmUploadRef = useRef(options.confirmUpload);\n confirmUploadRef.current = options.confirmUpload;\n\n const queueRef = useRef<InternalItem[]>([]);\n const running = useRef(false);\n const [items, setItems] = useState<ReadonlyArray<UploadQueueItem>>([]);\n\n const publish = useCallback(() => {\n setItems(queueRef.current.map(({ content: _content, ...item }) => item));\n }, []);\n\n const pump = useCallback(async () => {\n if (running.current) return;\n const next = queueRef.current.find((item) => item.status === \"queued\");\n if (!next) return;\n running.current = true;\n next.status = \"uploading\";\n next.progress = 0;\n publish();\n try {\n const target = await requestUploadRef.current({\n name: next.name,\n size: next.size,\n type: next.type,\n content: next.content,\n parentId: next.parentId,\n });\n let lastPublish = 0;\n await putFile(target, next, (progress) => {\n next.progress = progress;\n const now = Date.now();\n if (progress === 100 || now - lastPublish > 200) {\n lastPublish = now;\n publish();\n }\n });\n await confirmUploadRef.current?.({\n name: next.name,\n size: next.size,\n type: next.type,\n content: next.content,\n });\n next.status = \"success\";\n next.progress = 100;\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new Event(\"file-next-uploaded\"));\n }\n } catch (error) {\n next.status = \"error\";\n next.error = error instanceof Error ? error.message : \"Upload failed\";\n } finally {\n publish();\n running.current = false;\n void pump();\n }\n }, [publish]);\n\n const enqueue = useCallback(\n (files: ReadonlyArray<File>, parentId: string | null) => {\n if (files.length === 0) return;\n const added: InternalItem[] = files.map((file) => ({\n id:\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `${file.name}-${file.size}-${Date.now()}-${Math.random()}`,\n name: file.name,\n size: file.size,\n type: file.type,\n content: file,\n parentId,\n status: \"queued\",\n progress: 0,\n }));\n queueRef.current = [...queueRef.current, ...added];\n publish();\n void pump();\n },\n [publish, pump],\n );\n\n const dismiss = useCallback(() => {\n queueRef.current = queueRef.current.filter(\n (item) => item.status === \"queued\" || item.status === \"uploading\",\n );\n publish();\n }, [publish]);\n\n const active = items.some(\n (item) => item.status === \"queued\" || item.status === \"uploading\",\n );\n const itemCount = items.length;\n\n useEffect(() => {\n if (active || itemCount === 0) return undefined;\n const timeout = window.setTimeout(() => {\n dismiss();\n }, 3000);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [active, dismiss, itemCount]);\n\n return { items, enqueue, dismiss, active };\n}\n\nfunction putFile(\n target: RequestUploadResult,\n file: InternalItem,\n onProgress: (progress: number) => void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", (event) => {\n if (event.lengthComputable) {\n onProgress(Math.min(100, Math.round((event.loaded / event.total) * 100)));\n }\n });\n xhr.addEventListener(\"load\", () => {\n if (xhr.status < 200 || xhr.status >= 300) {\n let message = `Upload failed (${xhr.status})`;\n try {\n const parsed = JSON.parse(xhr.responseText) as {\n error?: { message?: string };\n };\n if (parsed.error?.message) message = parsed.error.message;\n } catch {\n /* keep fallback */\n }\n reject(new Error(message));\n return;\n }\n resolve();\n });\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Upload failed\"));\n });\n xhr.open(target.method ?? \"PUT\", target.url);\n xhr.setRequestHeader(\"Content-Type\", file.type || \"application/octet-stream\");\n for (const [header, value] of Object.entries(target.headers ?? {})) {\n xhr.setRequestHeader(header, value);\n }\n xhr.send(file.content);\n });\n}\n","\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { RequestUploadResult } from \"@vryzel/file-next-headless\";\nimport { ExplorerUploadStatus } from \"./explorer-upload-status\";\nimport { useUploadQueue, type UploadQueueItem } from \"./use-upload-queue\";\n\ntype Enqueue = (files: ReadonlyArray<File>, parentId: string | null) => void;\n\nconst EnqueueContext = createContext<Enqueue | null>(null);\n\nexport function useUploadEnqueue(): Enqueue | null {\n return useContext(EnqueueContext);\n}\n\nexport function UploadQueueProvider({\n requestUpload,\n confirmUpload,\n children,\n}: {\n requestUpload: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n parentId: string | null;\n }) => Promise<RequestUploadResult>;\n confirmUpload?: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n }) => Promise<void> | void;\n children: ReactNode;\n}): React.ReactElement {\n const uploads = useUploadQueue({ requestUpload, confirmUpload });\n const panel = useMemo(\n () => (\n <div className=\"fixed right-4 bottom-4 z-50 flex w-[min(22rem,calc(100vw-2rem))] flex-col gap-2\">\n <ExplorerUploadStatus items={uploads.items} onDismiss={uploads.dismiss} />\n </div>\n ),\n [uploads.dismiss, uploads.items],\n );\n\n return (\n <EnqueueContext.Provider value={uploads.enqueue}>\n {children}\n {panel}\n </EnqueueContext.Provider>\n );\n}\n\nexport type { UploadQueueItem };\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { useFileExplorer } from \"@vryzel/file-next-headless\";\nimport type { RequestUploadResult } from \"@vryzel/file-next-headless\";\nimport type { TenantId as BrandedTenantId } from \"@vryzel/file-next\";\nimport type { FileNode, FileSystemError, Result } from \"./types\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\nimport { ExplorerListView, type ExplorerColumn, type SortDirection } from \"./explorer-list-view\";\nimport { ExplorerGridView } from \"./explorer-grid-view\";\nimport { ExplorerToolbar } from \"./explorer-toolbar\";\nimport { ExplorerContextMenu, type ExplorerContextTarget } from \"./explorer-context-menu\";\nimport { CreateFolderDialog } from \"./create-folder-dialog\";\nimport { ConfirmDeleteDialog } from \"./confirm-delete-dialog\";\nimport { ExplorerClipboardToast, ExplorerSelectionToast } from \"./explorer-selection-toast\";\nimport { UploadQueueProvider, useUploadEnqueue } from \"./upload-queue\";\nimport { ExplorerLabelsProvider, useExplorerLabels, type ExplorerLabels } from \"./labels\";\nimport { cn } from \"./cn\";\n\nexport type { ExplorerColumn, SortDirection };\n\nexport interface FileExplorerActions {\n readonly deleteFile: (input: { id: string }) => Promise<unknown>;\n readonly moveFile: (input: {\n id: string;\n newParentId: string | null;\n newName?: string;\n }) => Promise<unknown>;\n readonly copyFile: (input: {\n id: string;\n newParentId: string | null;\n newName?: string;\n }) => Promise<unknown>;\n readonly renameFile: (id: string, newName: string) => Promise<void>;\n readonly restoreNode?: (input: { id: string }) => Promise<unknown>;\n readonly purgeNode?: (input: { id: string }) => Promise<unknown>;\n readonly createShare?: (input: { id: string }) => Promise<string>;\n readonly createFolder?: (input: {\n name: string;\n parentId: string | null;\n }) => Promise<unknown>;\n}\n\nconst PAGE_SIZE = 50;\n\ntype ListPageResult = Result<\n { items: ReadonlyArray<FileNode>; nextCursor?: string },\n FileSystemError\n>;\n\ntype OverlayQuery = (input: {\n query?: string;\n cursor?: string;\n limit?: number;\n trash?: boolean;\n}) => Promise<ListPageResult>;\n\nexport interface FileExplorerProps {\n readonly tenantId: string;\n readonly parentId: string | null;\n readonly listFiles: (input: {\n parentId: string | null;\n cursor?: string;\n limit?: number;\n }) => Promise<ListPageResult>;\n readonly actions: FileExplorerActions;\n readonly breadcrumbs?: ReadonlyArray<{ id: string; name: string }>;\n readonly onBreadcrumbNavigate?: (seg: { id: string; name: string }) => void;\n readonly initialView?: \"list\" | \"grid\";\n readonly autoFetch?: boolean;\n readonly onActivate?: (file: FileNode) => void;\n readonly onOpenFolder?: (folder: FileNode) => void;\n readonly searchFiles?: OverlayQuery;\n readonly listTrash?: OverlayQuery;\n readonly requestUpload?: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n parentId: string | null;\n }) => Promise<RequestUploadResult>;\n readonly confirmUpload?: () => Promise<void> | void;\n readonly usedBytes?: number;\n readonly quotaBytes?: number;\n readonly onMove?: (input: {\n itemIds: ReadonlyArray<string>;\n destinationFolderId: string;\n }) => Promise<void> | void;\n readonly refreshKey?: number;\n readonly className?: string;\n readonly persistViewKey?: string;\n readonly onPreview?: (file: FileNode) => void;\n readonly onDownload?: (file: FileNode) => void;\n readonly extraFileAction?: { label: string; onSelect: (file: FileNode) => void };\n readonly protectedIds?: ReadonlyArray<string>;\n readonly labels?: Partial<ExplorerLabels>;\n}\n\ntype ExplorerPrefs = {\n view: \"list\" | \"grid\";\n sortKey: ExplorerColumn;\n sortDir: SortDirection;\n};\n\nconst DEFAULT_PREFS: ExplorerPrefs = { view: \"list\", sortKey: \"name\", sortDir: \"asc\" };\n\nfunction reviveFile(node: FileNode): FileNode {\n const asDate = (value: Date | string) => (value instanceof Date ? value : new Date(value));\n return {\n ...node,\n createdAt: asDate(node.createdAt),\n updatedAt: asDate(node.updatedAt),\n deletedAt: node.deletedAt ? asDate(node.deletedAt) : null,\n };\n}\n\nfunction readPrefs(key: string): ExplorerPrefs {\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return DEFAULT_PREFS;\n if (raw === \"list\" || raw === \"grid\") return { ...DEFAULT_PREFS, view: raw };\n const parsed = JSON.parse(raw) as Partial<ExplorerPrefs>;\n const view = parsed.view === \"grid\" ? \"grid\" : \"list\";\n const sortKey: ExplorerColumn =\n parsed.sortKey === \"size\" || parsed.sortKey === \"modified\" || parsed.sortKey === \"kind\"\n ? parsed.sortKey\n : \"name\";\n const sortDir: SortDirection = parsed.sortDir === \"desc\" ? \"desc\" : \"asc\";\n return { view, sortKey, sortDir };\n } catch {\n return DEFAULT_PREFS;\n }\n}\n\nconst compareFiles = (\n a: FileNode,\n b: FileNode,\n key: ExplorerColumn,\n dir: SortDirection,\n): number => {\n if (a.kind !== b.kind) return a.kind === \"folder\" ? -1 : 1;\n let cmp = 0;\n switch (key) {\n case \"name\":\n cmp = a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" });\n break;\n case \"size\":\n cmp = a.size - b.size;\n break;\n case \"modified\":\n cmp = a.updatedAt.getTime() - b.updatedAt.getTime();\n break;\n case \"kind\":\n cmp = a.kind.localeCompare(b.kind);\n break;\n }\n return dir === \"asc\" ? cmp : -cmp;\n};\n\nfunction formatExplorerBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function FileExplorer(props: FileExplorerProps): React.ReactElement {\n const outerEnqueue = useUploadEnqueue();\n const tree = (\n <ExplorerLabelsProvider labels={props.labels}>\n <FileExplorerInner {...props} />\n </ExplorerLabelsProvider>\n );\n if (props.requestUpload && !outerEnqueue) {\n return (\n <UploadQueueProvider\n requestUpload={props.requestUpload}\n confirmUpload={\n props.confirmUpload\n ? async () => {\n await props.confirmUpload?.();\n }\n : undefined\n }\n >\n {tree}\n </UploadQueueProvider>\n );\n }\n return tree;\n}\n\nfunction FileExplorerInner(props: FileExplorerProps): React.ReactElement {\n const {\n tenantId,\n parentId,\n listFiles,\n actions,\n breadcrumbs,\n onBreadcrumbNavigate,\n initialView = \"list\",\n onActivate,\n onOpenFolder,\n searchFiles,\n listTrash,\n requestUpload,\n confirmUpload,\n usedBytes,\n quotaBytes,\n onMove = () => undefined,\n refreshKey,\n className,\n persistViewKey,\n onPreview,\n onDownload,\n extraFileAction,\n protectedIds,\n } = props;\n const labels = useExplorerLabels();\n const protectedSet = useMemo(() => new Set(protectedIds ?? []), [protectedIds]);\n\n const explorer = useFileExplorer({\n listFiles: ((input: { parentId: string | null }) =>\n listFiles({ parentId: input.parentId, limit: PAGE_SIZE })) as never,\n tenantId: tenantId as BrandedTenantId,\n parentId,\n initialView,\n autoFetch: false,\n onMove,\n });\n\n const uploadInputRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const [trashOpen, setTrashOpen] = useState(false);\n const [pageItems, setPageItems] = useState<ReadonlyArray<FileNode>>([]);\n const [pageStatus, setPageStatus] = useState<\"idle\" | \"loading\" | \"success\" | \"error\">(\"idle\");\n const [pageError, setPageError] = useState<FileSystemError | null>(null);\n const [loadingMore, setLoadingMore] = useState(false);\n const [browseHasMore, setBrowseHasMore] = useState(false);\n const [overlayHasMore, setOverlayHasMore] = useState(false);\n const browseCursor = useRef<string | undefined>(undefined);\n const overlayCursor = useRef<string | undefined>(undefined);\n const loadingMoreRef = useRef(false);\n const overlayMoreRef = useRef(false);\n const browseGen = useRef(0);\n const [overlayFiles, setOverlayFiles] = useState<ReadonlyArray<FileNode> | null>(null);\n const [overlayError, setOverlayError] = useState<FileSystemError | null>(null);\n const [overlayLoading, setOverlayLoading] = useState(false);\n const [overlayMore, setOverlayMore] = useState(false);\n const [sortKey, setSortKey] = useState<ExplorerColumn>(\"name\");\n const [sortDir, setSortDir] = useState<SortDirection>(\"asc\");\n const [prefsReady, setPrefsReady] = useState(!persistViewKey);\n const skipPrefsWrite = useRef(!persistViewKey);\n const [menu, setMenu] = useState<ExplorerContextTarget | null>(null);\n const [folderOpen, setFolderOpen] = useState(false);\n const [renameTarget, setRenameTarget] = useState<FileNode | null>(null);\n const [deleteTargets, setDeleteTargets] = useState<ReadonlyArray<FileNode>>([]);\n const [purgeTargets, setPurgeTargets] = useState<ReadonlyArray<FileNode>>([]);\n const [trashHasItems, setTrashHasItems] = useState(false);\n const [clipboard, setClipboard] = useState<ReadonlyArray<FileNode>>([]);\n const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(() => new Set());\n const anchorId = useRef<string | null>(null);\n\n useEffect(() => {\n if (!persistViewKey) return;\n const prefs = readPrefs(persistViewKey);\n explorer.setView(prefs.view);\n setSortKey(prefs.sortKey);\n setSortDir(prefs.sortDir);\n skipPrefsWrite.current = true;\n setPrefsReady(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [persistViewKey]);\n\n useEffect(() => {\n if (!persistViewKey || !prefsReady) return;\n if (skipPrefsWrite.current) {\n skipPrefsWrite.current = false;\n return;\n }\n window.localStorage.setItem(\n persistViewKey,\n JSON.stringify({ view: explorer.view, sortKey, sortDir } satisfies ExplorerPrefs),\n );\n }, [explorer.view, persistViewKey, prefsReady, sortDir, sortKey]);\n\n const handleSortChange = useCallback(\n (key: ExplorerColumn) => {\n if (key === sortKey) {\n setSortDir((dir) => (dir === \"asc\" ? \"desc\" : \"asc\"));\n return;\n }\n setSortKey(key);\n setSortDir(key === \"modified\" ? \"desc\" : \"asc\");\n },\n [sortKey],\n );\n\n const loadBrowse = useCallback(\n async (mode: \"reset\" | \"more\") => {\n const gen = mode === \"reset\" ? ++browseGen.current : browseGen.current;\n if (mode === \"more\") {\n if (!browseCursor.current || loadingMoreRef.current) return;\n loadingMoreRef.current = true;\n setLoadingMore(true);\n } else {\n setPageStatus(\"loading\");\n browseCursor.current = undefined;\n setBrowseHasMore(false);\n }\n const result = await listFiles({\n parentId,\n limit: PAGE_SIZE,\n cursor: mode === \"more\" ? browseCursor.current : undefined,\n });\n if (gen !== browseGen.current) {\n loadingMoreRef.current = false;\n setLoadingMore(false);\n return;\n }\n if (result.ok) {\n browseCursor.current = result.value.nextCursor;\n setBrowseHasMore(Boolean(result.value.nextCursor));\n const items = result.value.items.map(reviveFile);\n setPageItems((current) => (mode === \"more\" ? [...current, ...items] : items));\n setPageError(null);\n setPageStatus(\"success\");\n } else if (mode === \"reset\") {\n setPageItems([]);\n setPageError(result.error);\n setPageStatus(\"error\");\n }\n loadingMoreRef.current = false;\n setLoadingMore(false);\n },\n [listFiles, parentId],\n );\n\n const loadOverlay = useCallback(\n async (mode: \"reset\" | \"more\" = \"reset\") => {\n if (trashOpen && listTrash) {\n const trimmed = query.trim();\n if (trimmed && searchFiles) {\n setOverlayLoading(true);\n const result = await searchFiles({ query: trimmed, limit: PAGE_SIZE, trash: true });\n setOverlayLoading(false);\n if (result.ok) {\n setOverlayFiles(result.value.items.map(reviveFile));\n setOverlayError(null);\n } else setOverlayError(result.error);\n return;\n }\n if (mode === \"more\") {\n if (!overlayCursor.current || overlayMoreRef.current) return;\n overlayMoreRef.current = true;\n setOverlayMore(true);\n } else {\n setOverlayLoading(true);\n overlayCursor.current = undefined;\n setOverlayHasMore(false);\n }\n const result = await listTrash({\n limit: PAGE_SIZE,\n cursor: mode === \"more\" ? overlayCursor.current : undefined,\n });\n if (result.ok) {\n overlayCursor.current = result.value.nextCursor;\n setOverlayHasMore(Boolean(result.value.nextCursor));\n const items = result.value.items.map(reviveFile);\n setOverlayFiles((current) => (mode === \"more\" && current ? [...current, ...items] : items));\n setOverlayError(null);\n } else if (mode === \"reset\") setOverlayError(result.error);\n overlayMoreRef.current = false;\n setOverlayLoading(false);\n setOverlayMore(false);\n return;\n }\n const trimmed = query.trim();\n if (trimmed && searchFiles) {\n setOverlayLoading(true);\n const result = await searchFiles({ query: trimmed, limit: PAGE_SIZE });\n setOverlayLoading(false);\n if (result.ok) {\n setOverlayFiles(result.value.items.map(reviveFile));\n setOverlayError(null);\n } else setOverlayError(result.error);\n return;\n }\n overlayCursor.current = undefined;\n setOverlayHasMore(false);\n setOverlayFiles(null);\n setOverlayError(null);\n setOverlayLoading(false);\n },\n [listTrash, query, searchFiles, trashOpen],\n );\n\n const refreshTrashFlag = useCallback(async () => {\n if (!listTrash) {\n setTrashHasItems(false);\n return;\n }\n const result = await listTrash({ limit: 1 });\n setTrashHasItems(result.ok && result.value.items.length > 0);\n }, [listTrash]);\n\n const reload = useCallback(async () => {\n await loadBrowse(\"reset\");\n await loadOverlay(\"reset\");\n await refreshTrashFlag();\n }, [loadBrowse, loadOverlay, refreshTrashFlag]);\n\n const enqueueUploads = useUploadEnqueue();\n\n useEffect(() => {\n const onUploaded = () => {\n void reload();\n void confirmUpload?.();\n };\n window.addEventListener(\"file-next-uploaded\", onUploaded);\n return () => window.removeEventListener(\"file-next-uploaded\", onUploaded);\n }, [confirmUpload, reload]);\n\n useEffect(() => {\n void loadBrowse(\"reset\");\n }, [loadBrowse]);\n\n useEffect(() => {\n void refreshTrashFlag();\n }, [refreshTrashFlag]);\n\n useEffect(() => {\n const handle = window.setTimeout(() => {\n void loadOverlay(\"reset\");\n }, trashOpen ? 0 : 250);\n return () => window.clearTimeout(handle);\n }, [loadOverlay, trashOpen]);\n\n const sourceFiles = overlayFiles ?? pageItems;\n const hasMore = overlayFiles ? overlayHasMore : browseHasMore;\n const sortedFiles = useMemo(\n () => [...sourceFiles].sort((a, b) => compareFiles(a, b, sortKey, sortDir)),\n [sourceFiles, sortKey, sortDir],\n );\n\n useEffect(() => {\n if (refreshKey === undefined) return;\n void reload();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refreshKey]);\n\n const handleActivate = useCallback(\n (file: FileNode) => {\n if (file.kind === \"folder\") {\n onOpenFolder?.(file);\n return;\n }\n if (onPreview) onPreview(file);\n else if (onDownload) onDownload(file);\n else onActivate?.(file);\n },\n [onActivate, onDownload, onOpenFolder, onPreview],\n );\n\n const handleContextMenu = useCallback((file: FileNode, event: React.MouseEvent) => {\n setMenu({ kind: \"item\", file, x: event.clientX, y: event.clientY });\n }, []);\n\n const clearSelection = useCallback(() => {\n setSelectedIds(new Set());\n anchorId.current = null;\n }, []);\n\n useEffect(() => {\n clearSelection();\n }, [clearSelection, parentId, trashOpen]);\n\n const handleSelect = useCallback(\n (file: FileNode, event: { shiftKey: boolean }) => {\n const id = file.id;\n if (event.shiftKey && anchorId.current) {\n const from = sortedFiles.findIndex((item) => item.id === anchorId.current);\n const to = sortedFiles.findIndex((item) => item.id === id);\n if (from >= 0 && to >= 0) {\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n setSelectedIds(new Set(sortedFiles.slice(start, end + 1).map((item) => item.id)));\n return;\n }\n }\n setSelectedIds((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n anchorId.current = id;\n },\n [sortedFiles],\n );\n\n const selectedFiles = useMemo(\n () => sortedFiles.filter((file) => selectedIds.has(file.id)),\n [selectedIds, sortedFiles],\n );\n const selected = selectedFiles.length === 1 ? selectedFiles[0] : undefined;\n const draggingIds = useMemo(() => {\n const id = explorer.draggingId;\n if (!id) return new Set<string>();\n if (selectedIds.has(id)) return selectedIds;\n return new Set([id]);\n }, [explorer.draggingId, selectedIds]);\n\n const handleDropOnFolder = useCallback(\n (destinationFolderId: string) => {\n const ids = [...draggingIds].filter((id) => id !== destinationFolderId);\n explorer.endDrag();\n if (ids.length === 0) return;\n void Promise.resolve(onMove({ itemIds: ids, destinationFolderId })).then(clearSelection);\n },\n [clearSelection, draggingIds, explorer, onMove],\n );\n\n const copyToClipboard = useCallback(\n (files: ReadonlyArray<FileNode>) => {\n if (files.length === 0) return;\n setClipboard(files);\n clearSelection();\n },\n [clearSelection],\n );\n\n const pasteClipboard = useCallback(\n async (destinationId: string | null = parentId) => {\n if (clipboard.length === 0 || trashOpen) return;\n for (const node of clipboard) {\n if (node.id === destinationId) continue;\n await actions.copyFile({ id: node.id, newParentId: destinationId, newName: node.name });\n }\n setClipboard([]);\n await reload();\n },\n [actions, clipboard, parentId, reload, trashOpen],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (target.closest(\"input, textarea, [contenteditable=true]\")) return;\n const index = sortedFiles.findIndex((file) => file.id === (anchorId.current ?? selected?.id));\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"a\") {\n event.preventDefault();\n setSelectedIds(new Set(sortedFiles.map((file) => file.id)));\n return;\n }\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"c\") {\n if (selectedFiles.length === 0 || trashOpen) return;\n event.preventDefault();\n copyToClipboard(selectedFiles);\n return;\n }\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"v\") {\n if (clipboard.length === 0 || trashOpen) return;\n event.preventDefault();\n void pasteClipboard();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const nextIndex = Math.min(sortedFiles.length - 1, Math.max(0, (index < 0 ? 0 : index) + delta));\n const next = sortedFiles[nextIndex];\n if (!next) return;\n if (event.shiftKey && anchorId.current) {\n const from = sortedFiles.findIndex((item) => item.id === anchorId.current);\n const start = Math.min(from, nextIndex);\n const end = Math.max(from, nextIndex);\n setSelectedIds(new Set(sortedFiles.slice(start, end + 1).map((item) => item.id)));\n } else {\n setSelectedIds(new Set([next.id]));\n anchorId.current = next.id;\n }\n return;\n }\n if (event.key === \"Enter\" && selected) {\n event.preventDefault();\n handleActivate(selected);\n return;\n }\n if (event.key === \"F2\" && selected && !trashOpen) {\n event.preventDefault();\n setRenameTarget(selected);\n return;\n }\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && selectedFiles.length > 0) {\n event.preventDefault();\n if (trashOpen) {\n setPurgeTargets(selectedFiles);\n return;\n }\n if (selectedFiles.some((file) => protectedSet.has(file.id))) return;\n setDeleteTargets(selectedFiles);\n return;\n }\n if (event.key === \"Escape\") {\n setMenu(null);\n clearSelection();\n }\n },\n [\n clipboard.length,\n clearSelection,\n copyToClipboard,\n handleActivate,\n pasteClipboard,\n protectedSet,\n selected,\n selectedFiles,\n sortedFiles,\n trashOpen,\n ],\n );\n\n const openUpload = () => uploadInputRef.current?.click();\n\n return (\n <div\n className={cn(\"flex min-h-0 flex-1 flex-col\", className)}\n onKeyDown={handleKeyDown}\n onDragOver={(event) => {\n if (!requestUpload || trashOpen) return;\n if (event.dataTransfer.types.includes(\"Files\")) event.preventDefault();\n }}\n onDrop={(event) => {\n if (!requestUpload || trashOpen) return;\n const files = event.dataTransfer.files;\n if (!files.length) return;\n event.preventDefault();\n enqueueUploads?.(Array.from(files), parentId);\n }}\n onContextMenu={(event) => {\n if (trashOpen) return;\n if ((event.target as HTMLElement).closest(\"[data-file-id]\")) return;\n event.preventDefault();\n setMenu({ kind: \"blank\", x: event.clientX, y: event.clientY });\n }}\n >\n {breadcrumbs && onBreadcrumbNavigate ? (\n <div className=\"border-b border-border px-4 py-3\">\n <Breadcrumbs segments={breadcrumbs} onNavigate={onBreadcrumbNavigate} />\n </div>\n ) : null}\n\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border px-4 py-3\">\n {requestUpload ? (\n <input\n ref={uploadInputRef}\n type=\"file\"\n multiple\n className=\"sr-only\"\n onChange={(event) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n enqueueUploads?.(Array.from(files), parentId);\n event.target.value = \"\";\n }}\n />\n ) : null}\n <ExplorerToolbar\n className=\"min-w-0 flex-1\"\n view={explorer.view}\n onViewChange={explorer.setView}\n onUpload={requestUpload && !trashOpen ? openUpload : undefined}\n onNewFolder={actions.createFolder && !trashOpen ? () => setFolderOpen(true) : undefined}\n query={query}\n onQueryChange={searchFiles ? setQuery : undefined}\n trashOpen={trashOpen}\n trashHasItems={trashHasItems}\n onTrashToggle={\n listTrash\n ? () => {\n setQuery(\"\");\n setTrashOpen((open) => !open);\n }\n : undefined\n }\n sortKey={sortKey}\n sortDirection={sortDir}\n onSortChange={handleSortChange}\n />\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {(overlayLoading || pageStatus === \"loading\") && sortedFiles.length === 0 ? (\n <p className=\"px-4 py-12 text-center font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n {labels.loading}\n </p>\n ) : overlayError || (pageStatus === \"error\" && pageError) ? (\n <div className=\"border-b border-destructive/30 bg-destructive/5 px-4 py-3 text-sm text-destructive\">\n {(overlayError ?? pageError)?.message ?? labels.folderCreateFailed}\n </div>\n ) : sortedFiles.length === 0 ? (\n <div className=\"flex min-h-full flex-col justify-center px-4 py-16 text-center\">\n <p className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n {trashOpen ? labels.emptyTrash : query.trim() ? labels.noMatches : labels.emptyFolder}\n </p>\n {trashOpen ? (\n <p className=\"mt-2 text-sm text-muted-foreground\">{labels.trashRetention}</p>\n ) : !query.trim() ? (\n <p className=\"mt-2 text-sm text-muted-foreground\">{labels.dropHint}</p>\n ) : null}\n </div>\n ) : explorer.view === \"list\" ? (\n <div\n onClick={(event) => {\n if ((event.target as HTMLElement).closest(\"[data-file-id]\")) return;\n clearSelection();\n }}\n >\n <ExplorerListView\n files={sortedFiles}\n protectedIds={protectedSet}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n onActivate={handleActivate}\n onContextMenu={handleContextMenu}\n onDragStart={explorer.beginDrag}\n onDragEnd={explorer.endDrag}\n onDrop={handleDropOnFolder}\n draggingId={explorer.draggingId}\n draggingIds={draggingIds}\n dropTargetId={explorer.dropTargetId}\n onDragOverRow={explorer.setDropTarget}\n sortKey={sortKey}\n sortDirection={sortDir}\n onSortChange={handleSortChange}\n />\n </div>\n ) : (\n <div\n onClick={(event) => {\n if ((event.target as HTMLElement).closest(\"[data-file-id]\")) return;\n clearSelection();\n }}\n >\n <ExplorerGridView\n files={sortedFiles}\n protectedIds={protectedSet}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n onActivate={handleActivate}\n onContextMenu={handleContextMenu}\n onDragStart={explorer.beginDrag}\n onDragEnd={explorer.endDrag}\n onDrop={handleDropOnFolder}\n draggingId={explorer.draggingId}\n draggingIds={draggingIds}\n dropTargetId={explorer.dropTargetId}\n onDragOverRow={explorer.setDropTarget}\n />\n </div>\n )}\n </div>\n\n {hasMore && sortedFiles.length > 0 ? (\n <div className=\"shrink-0 border-t border-border p-3\">\n <button\n type=\"button\"\n disabled={loadingMore || overlayMore}\n onClick={() => {\n if (overlayFiles) void loadOverlay(\"more\");\n else void loadBrowse(\"more\");\n }}\n className=\"inline-flex h-8 w-full items-center justify-center rounded-[10px] border border-border text-xs font-medium hover:bg-muted disabled:opacity-50\"\n >\n {loadingMore || overlayMore ? labels.loading : labels.loadMore}\n </button>\n </div>\n ) : null}\n\n <footer className=\"flex shrink-0 items-center justify-between gap-3 border-t border-border px-4 py-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary tabular-nums\">\n {sortedFiles.length}\n {hasMore ? \"+\" : \"\"}\n </span>\n {trashOpen ? ` ${labels.inTrash}` : ` ${labels.items}`}\n </span>\n {quotaBytes != null ? (\n <span className=\"hidden font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground sm:inline\">\n {formatExplorerBytes(usedBytes ?? 0)} / {formatExplorerBytes(quotaBytes)}\n </span>\n ) : null}\n </footer>\n\n <ExplorerContextMenu\n target={menu}\n mode={trashOpen ? \"trash\" : \"browse\"}\n protectedItem={menu?.kind === \"item\" ? protectedSet.has(menu.file.id) : false}\n extraFileAction={extraFileAction}\n actions={{\n deleteFile: async (input) => {\n await actions.deleteFile(input);\n clearSelection();\n await reload();\n },\n renameFile: actions.renameFile,\n restoreNode: actions.restoreNode\n ? async (input) => {\n await actions.restoreNode?.(input);\n await reload();\n }\n : undefined,\n purgeNode: actions.purgeNode\n ? async (input) => {\n await actions.purgeNode?.(input);\n await reload();\n }\n : undefined,\n createShare: actions.createShare,\n }}\n onClose={() => setMenu(null)}\n onPreview={onPreview}\n onDownload={onDownload}\n onRename={setRenameTarget}\n onRequestDelete={(file) => setDeleteTargets([file])}\n onRequestPurge={(file) => setPurgeTargets([file])}\n onCopy={(file) => copyToClipboard([file])}\n onPaste={\n clipboard.length > 0 && !trashOpen\n ? (folder) => void pasteClipboard(folder ? folder.id : parentId)\n : undefined\n }\n onNewFolder={actions.createFolder ? () => setFolderOpen(true) : undefined}\n onUpload={requestUpload ? openUpload : undefined}\n />\n\n <ExplorerSelectionToast\n files={selectedFiles}\n protectedIds={protectedSet}\n trashOpen={trashOpen}\n onDownload={onDownload}\n onCopy={trashOpen ? undefined : () => copyToClipboard(selectedFiles)}\n onShare={\n actions.createShare\n ? async () => {\n const tokens: string[] = [];\n for (const file of selectedFiles) {\n if (file.kind !== \"file\") continue;\n tokens.push(await actions.createShare!({ id: file.id }));\n }\n if (tokens.length > 0) await navigator.clipboard.writeText(tokens.join(\"\\n\"));\n }\n : undefined\n }\n onDelete={() => setDeleteTargets(selectedFiles)}\n onRestore={\n actions.restoreNode\n ? async () => {\n for (const file of selectedFiles) await actions.restoreNode?.({ id: file.id });\n clearSelection();\n await reload();\n }\n : undefined\n }\n onPurge={() => setPurgeTargets(selectedFiles)}\n onClear={clearSelection}\n />\n <div className=\"fixed right-4 bottom-4 z-50 w-[min(22rem,calc(100vw-2rem))]\">\n <ExplorerClipboardToast\n count={clipboard.length}\n onPaste={() => void pasteClipboard()}\n onClear={() => setClipboard([])}\n />\n </div>\n\n <CreateFolderDialog\n open={folderOpen}\n onOpenChange={setFolderOpen}\n onCreate={async (name) => {\n await actions.createFolder?.({ name, parentId });\n await reload();\n }}\n />\n <CreateFolderDialog\n open={Boolean(renameTarget)}\n onOpenChange={(open) => {\n if (!open) setRenameTarget(null);\n }}\n title={labels.rename}\n description={labels.renameHint}\n confirmLabel={labels.rename}\n initialName={renameTarget?.name ?? \"\"}\n onCreate={async (name) => {\n if (!renameTarget) return;\n await actions.renameFile(renameTarget.id, name);\n setRenameTarget(null);\n await reload();\n }}\n />\n <ConfirmDeleteDialog\n open={deleteTargets.length > 0}\n names={deleteTargets.map((file) => file.name)}\n onOpenChange={(open) => {\n if (!open) setDeleteTargets([]);\n }}\n onConfirm={async () => {\n for (const file of deleteTargets) await actions.deleteFile({ id: file.id });\n setDeleteTargets([]);\n clearSelection();\n await reload();\n }}\n />\n <ConfirmDeleteDialog\n open={purgeTargets.length > 0}\n names={purgeTargets.map((file) => file.name)}\n permanent\n onOpenChange={(open) => {\n if (!open) setPurgeTargets([]);\n }}\n onConfirm={async () => {\n for (const file of purgeTargets) await actions.purgeNode?.({ id: file.id });\n setPurgeTargets([]);\n clearSelection();\n await reload();\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Inbox } from \"lucide-react\";\nimport { cn } from \"./cn\";\n\nexport interface EmptyStateProps {\n readonly title: string;\n readonly description?: string;\n readonly icon?: ReactNode;\n readonly action?: ReactNode;\n readonly className?: string;\n}\n\nexport function EmptyState(props: EmptyStateProps): React.ReactElement {\n const { title, description, icon, action, className } = props;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border bg-muted/40 p-8 text-center\",\n className,\n )}\n >\n <div className=\"rounded-full bg-background p-3 text-muted-foreground shadow-sm\">\n {icon ?? <Inbox aria-hidden=\"true\" className=\"size-6\" />}\n </div>\n <h3 className=\"text-base font-semibold text-foreground\">{title}</h3>\n {description ? (\n <p className=\"max-w-sm text-sm text-muted-foreground\">{description}</p>\n ) : null}\n {action ? <div className=\"mt-2\">{action}</div> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { AlertCircleIcon } from \"lucide-react\";\nimport type { FileSystemError } from \"./types\";\nimport { cn } from \"./cn\";\n\nexport interface ErrorStateProps {\n readonly error: FileSystemError | { code: string; message: string };\n readonly onRetry?: () => void;\n readonly className?: string;\n}\n\nexport function ErrorState(props: ErrorStateProps): React.ReactElement {\n const { error, onRetry, className } = props;\n return (\n <div\n role=\"alert\"\n className={cn(\n \"flex items-start gap-3 rounded-lg border border-destructive/30 bg-destructive/5 p-4 text-sm\",\n className,\n )}\n >\n <AlertCircleIcon\n aria-hidden=\"true\"\n className=\"mt-0.5 size-5 shrink-0 text-destructive\"\n />\n <div className=\"flex-1\">\n <p className=\"font-medium text-destructive\">{error.code}</p>\n <p className=\"mt-1 text-muted-foreground\">{error.message}</p>\n </div>\n {onRetry ? (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex h-8 items-center justify-center rounded-[10px] border border-border bg-background px-3 text-sm font-medium hover:bg-accent\"\n >\n Retry\n </button>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport type { FileNode } from \"./types\";\nimport { Overlay } from \"./overlay\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport function canPreviewFile(file: Pick<FileNode, \"mimeType\" | \"name\">): boolean {\n return previewKind(file.mimeType, file.name) !== \"none\";\n}\n\nfunction previewKind(mimeType: string, name: string) {\n const mime = mimeType.toLowerCase();\n const ext = name.split(\".\").pop()?.toLowerCase() ?? \"\";\n if (mime.startsWith(\"image/\") || [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\"].includes(ext)) {\n return \"image\";\n }\n if (mime === \"application/pdf\" || ext === \"pdf\") return \"pdf\";\n if (mime.startsWith(\"video/\") || [\"mp4\", \"webm\", \"mov\"].includes(ext)) return \"video\";\n if (mime.startsWith(\"text/\") || [\"txt\", \"csv\"].includes(ext)) return \"text\";\n return \"none\";\n}\n\nexport function FilePreviewDialog({\n file,\n src,\n onClose,\n onDownload,\n}: {\n file: FileNode | null;\n src: string;\n onClose: () => void;\n onDownload: (file: FileNode) => void;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n if (!file) return null;\n const kind = previewKind(file.mimeType, file.name);\n\n return (\n <Overlay open onClose={onClose} className=\"max-w-4xl\">\n <h2 className=\"truncate pr-6 text-base font-semibold\">{file.name}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {file.mimeType || labels.unknownType}\n </p>\n <div className=\"mt-3\">\n {kind === \"image\" ? (\n <img\n src={src}\n alt={file.name}\n className=\"max-h-[70vh] w-full rounded-[10px] object-contain\"\n />\n ) : kind === \"pdf\" || kind === \"text\" ? (\n <iframe\n src={src}\n title={file.name}\n className=\"h-[70vh] w-full rounded-[10px] border border-border bg-background\"\n />\n ) : kind === \"video\" ? (\n <video\n controls\n playsInline\n preload=\"metadata\"\n src={src}\n className=\"max-h-[70vh] w-full rounded-[10px] bg-foreground\"\n >\n {labels.previewUnavailable}\n </video>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{labels.previewUnavailable}</p>\n )}\n </div>\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n className=\"inline-flex h-8 items-center rounded-[10px] border border-border px-3 text-sm\"\n onClick={() => onDownload(file)}\n >\n {labels.download}\n </button>\n </div>\n </Overlay>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cn.ts","../src/breadcrumbs.tsx","../src/file-icon.tsx","../src/labels.ts","../src/use-explorer-item-pointer.ts","../src/explorer-list-view.tsx","../src/explorer-grid-view.tsx","../src/explorer-toolbar.tsx","../src/swallow-click-through.ts","../src/explorer-context-menu.tsx","../src/overlay.tsx","../src/create-folder-dialog.tsx","../src/confirm-delete-dialog.tsx","../src/explorer-selection-toast.tsx","../src/explorer-upload-status.tsx","../src/use-upload-queue.ts","../src/upload-queue.tsx","../src/file-explorer.tsx","../src/empty-state.tsx","../src/error-state.tsx","../src/file-preview.tsx"],"names":["jsx","jsxs","MoreHorizontal","Link2","ListIcon","useRef","useEffect","Fragment","FolderPlus","Upload","useState","btn","X","RotateCcw","Download","Copy","useCallback","createContext","useContext","useMemo","trimmed","result"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"./cn\";\n\nexport interface BreadcrumbsProps {\n readonly segments: ReadonlyArray<{ id: string; name: string }>;\n readonly onNavigate?: (segment: { id: string; name: string }) => void;\n readonly className?: string;\n}\n\nexport function Breadcrumbs(props: BreadcrumbsProps): React.ReactElement {\n const { segments, onNavigate, className } = props;\n return (\n <nav aria-label=\"Breadcrumb\" className={cn(\"flex items-center gap-1 text-sm\", className)}>\n <ol className=\"flex flex-wrap items-center gap-1\">\n {segments.map((segment, index) => {\n const isLast = index === segments.length - 1;\n return (\n <li key={segment.id} className=\"flex items-center gap-1\">\n {isLast ? (\n <span aria-current=\"page\" className=\"font-medium text-foreground\">\n {segment.name}\n </span>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => onNavigate?.(segment)}\n className=\"rounded-sm text-muted-foreground hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {segment.name}\n </button>\n <ChevronRight aria-hidden=\"true\" className=\"size-3.5 text-muted-foreground\" />\n </>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","\"use client\";\n\nimport {\n Archive,\n File,\n FileAudio,\n FileCode,\n FileImage,\n FileText,\n FileVideo,\n Folder,\n Music,\n type LucideIcon,\n} from \"lucide-react\";\nimport { cn } from \"./cn\";\n\nexport interface FileIconProps {\n readonly kind: \"file\" | \"folder\";\n readonly mimeType?: string;\n readonly className?: string;\n}\n\nexport const FILE_ICON_MAP: Record<string, LucideIcon> = {\n \"text/plain\": FileText,\n \"text/csv\": FileText,\n \"text/html\": FileCode,\n \"application/pdf\": FileText,\n \"application/json\": FileCode,\n \"application/xml\": FileCode,\n \"application/zip\": Archive,\n \"application/gzip\": Archive,\n \"application/x-tar\": Archive,\n \"application/x-7z-compressed\": Archive,\n \"image/png\": FileImage,\n \"image/jpeg\": FileImage,\n \"image/gif\": FileImage,\n \"image/webp\": FileImage,\n \"image/svg+xml\": FileImage,\n \"audio/mpeg\": FileAudio,\n \"audio/wav\": FileAudio,\n \"video/mp4\": FileVideo,\n \"video/webm\": FileVideo,\n \"text/javascript\": FileCode,\n \"audio/mp4\": Music,\n};\n\nexport function resolveFileIcon(mimeType: string | undefined): LucideIcon {\n if (!mimeType) return File;\n if (FILE_ICON_MAP[mimeType]) return FILE_ICON_MAP[mimeType]!;\n const prefix = mimeType.split(\"/\")[0];\n if (prefix === \"image\") return FileImage;\n if (prefix === \"audio\") return FileAudio;\n if (prefix === \"video\") return FileVideo;\n if (prefix === \"text\") return FileText;\n return File;\n}\n\nexport function FileIcon(props: FileIconProps): React.ReactElement {\n const { kind, mimeType, className } = props;\n const Icon = kind === \"folder\" ? Folder : resolveFileIcon(mimeType);\n return (\n <Icon\n aria-hidden=\"true\"\n className={cn(\n kind === \"folder\" ? \"text-primary\" : \"text-muted-foreground\",\n \"size-5 shrink-0\",\n className,\n )}\n />\n );\n}\n","import { createContext, createElement, useContext, type ReactNode } from \"react\";\n\nexport type ExplorerLabels = {\n loading: string;\n emptyFolder: string;\n emptyTrash: string;\n noMatches: string;\n dropHint: string;\n trashRetention: string;\n items: string;\n inTrash: string;\n loadMore: string;\n search: string;\n upload: string;\n newFolder: string;\n folderName: string;\n folderNameHint: string;\n folderExists: string;\n folderCreateFailed: string;\n createFolder: string;\n cancel: string;\n rename: string;\n renameHint: string;\n viewOptions: string;\n listView: string;\n gridView: string;\n sortName: string;\n sortSize: string;\n sortModified: string;\n sortKind: string;\n trash: string;\n folder: string;\n inUse: string;\n itemActions: string;\n preview: string;\n download: string;\n copy: string;\n paste: string;\n copied: string;\n copyShare: string;\n share: string;\n restore: string;\n moveToTrash: string;\n deleteForever: string;\n confirmDelete: string;\n confirmDeleteMany: string;\n confirmPurge: string;\n confirmPurgeMany: string;\n deleting: string;\n selectedCount: string;\n clearSelection: string;\n clearClipboard: string;\n uploadStatus: string;\n dismissUploads: string;\n uploadQueued: string;\n uploadDone: string;\n uploadFailed: string;\n unknownType: string;\n previewUnavailable: string;\n};\n\nexport const defaultLabels: ExplorerLabels = {\n loading: \"Loading…\",\n emptyFolder: \"This folder is empty\",\n emptyTrash: \"Trash is empty\",\n noMatches: \"No matches\",\n dropHint: \"Drop files here or use Upload.\",\n trashRetention: \"Deleted files stay here until you purge them.\",\n items: \"items\",\n inTrash: \"in trash\",\n loadMore: \"Load more\",\n search: \"Search files\",\n upload: \"Upload\",\n newFolder: \"New folder\",\n folderName: \"Folder name\",\n folderNameHint: \"Name the folder.\",\n folderExists: \"A folder with that name already exists.\",\n folderCreateFailed: \"Could not create the folder.\",\n createFolder: \"Create\",\n cancel: \"Cancel\",\n rename: \"Rename\",\n renameHint: \"Enter a new name.\",\n viewOptions: \"View options\",\n listView: \"List view\",\n gridView: \"Grid view\",\n sortName: \"Name\",\n sortSize: \"Size\",\n sortModified: \"Modified\",\n sortKind: \"Kind\",\n trash: \"Trash\",\n folder: \"Folder\",\n inUse: \"In use\",\n itemActions: \"Item actions\",\n preview: \"Preview\",\n download: \"Download\",\n copy: \"Copy\",\n paste: \"Paste\",\n copied: \"copied\",\n copyShare: \"Copy share link\",\n share: \"Share\",\n restore: \"Restore\",\n moveToTrash: \"Move to trash\",\n deleteForever: \"Delete forever\",\n confirmDelete: \"Move “{name}” to trash?\",\n confirmDeleteMany: \"Move {count} items to trash?\",\n confirmPurge: \"Delete “{name}” forever? This cannot be undone.\",\n confirmPurgeMany: \"Delete {count} items forever? This cannot be undone.\",\n deleting: \"Deleting…\",\n selectedCount: \"selected\",\n clearSelection: \"Clear selection\",\n clearClipboard: \"Clear clipboard\",\n uploadStatus: \"uploading\",\n dismissUploads: \"Dismiss uploads\",\n uploadQueued: \"Queued\",\n uploadDone: \"Done\",\n uploadFailed: \"Failed\",\n unknownType: \"Unknown type\",\n previewUnavailable: \"Preview is not available for this file.\",\n};\n\nconst LabelsContext = createContext<ExplorerLabels>(defaultLabels);\n\nexport function ExplorerLabelsProvider({\n labels,\n children,\n}: {\n labels?: Partial<ExplorerLabels>;\n children: ReactNode;\n}): React.ReactElement {\n const value = { ...defaultLabels, ...labels };\n return createElement(LabelsContext.Provider, { value }, children);\n}\n\nexport function useExplorerLabels(): ExplorerLabels {\n return useContext(LabelsContext);\n}\n\nexport function formatLabel(\n template: string,\n vars: Record<string, string | number>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => String(vars[key] ?? \"\"));\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { FileNode } from \"./types\";\n\nconst LONG_PRESS_MS = 450;\nconst MOVE_CANCEL_PX = 10;\n\nexport function useCoarsePointer(): boolean {\n const [coarse, setCoarse] = useState(false);\n\n useEffect(() => {\n if (typeof window.matchMedia !== \"function\") return;\n const mql = window.matchMedia(\"(pointer: coarse)\");\n const sync = () => setCoarse(mql.matches);\n sync();\n mql.addEventListener(\"change\", sync);\n return () => mql.removeEventListener(\"change\", sync);\n }, []);\n\n return coarse;\n}\n\nexport function useExplorerItemPointer(opts: {\n file: FileNode;\n coarse: boolean;\n onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n onActivate: (file: FileNode) => void;\n}): {\n onPointerDown: (event: React.PointerEvent) => void;\n onClick: (event: React.MouseEvent) => void;\n onDoubleClick: () => void;\n} {\n const timer = useRef(0);\n const start = useRef({ x: 0, y: 0 });\n const didLongPress = useRef(false);\n const detach = useRef<(() => void) | null>(null);\n const { file, coarse, onSelect, onActivate } = opts;\n\n const clear = useCallback(() => {\n if (timer.current) {\n window.clearTimeout(timer.current);\n timer.current = 0;\n }\n detach.current?.();\n detach.current = null;\n }, []);\n\n useEffect(() => () => clear(), [clear]);\n\n const onPointerDown = useCallback(\n (event: React.PointerEvent) => {\n if (!coarse || event.pointerType !== \"touch\") return;\n didLongPress.current = false;\n start.current = { x: event.clientX, y: event.clientY };\n clear();\n timer.current = window.setTimeout(() => {\n didLongPress.current = true;\n onSelect(file, { shiftKey: false });\n }, LONG_PRESS_MS);\n\n const onMove = (move: PointerEvent) => {\n const dx = move.clientX - start.current.x;\n const dy = move.clientY - start.current.y;\n if (dx * dx + dy * dy > MOVE_CANCEL_PX * MOVE_CANCEL_PX) clear();\n };\n const onEnd = () => clear();\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n detach.current = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n };\n },\n [clear, coarse, file, onSelect],\n );\n\n const onClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.detail > 1) return;\n event.stopPropagation();\n if (didLongPress.current) {\n didLongPress.current = false;\n return;\n }\n if (coarse) {\n onActivate(file);\n return;\n }\n onSelect(file, event);\n },\n [coarse, file, onActivate, onSelect],\n );\n\n const onDoubleClick = useCallback(() => {\n if (!coarse) onActivate(file);\n }, [coarse, file, onActivate]);\n\n return { onPointerDown, onClick, onDoubleClick };\n}\n","\"use client\";\n\nimport type { DragEvent, KeyboardEvent } from \"react\";\nimport { ChevronDown, ChevronUp, Link2, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { FileIcon } from \"./file-icon\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\nimport { useCoarsePointer, useExplorerItemPointer } from \"./use-explorer-item-pointer\";\n\nexport type ExplorerColumn = \"name\" | \"size\" | \"modified\" | \"kind\";\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface ExplorerListViewProps {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds?: ReadonlySet<string>;\n readonly selectedIds: ReadonlySet<string>;\n readonly onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n readonly onActivate: (file: FileNode) => void;\n readonly onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n readonly onDragStart: (id: string) => void;\n readonly onDragEnd: () => void;\n readonly onDrop: (destinationFolderId: string) => void;\n readonly draggingId: string | null;\n readonly draggingIds?: ReadonlySet<string>;\n readonly dropTargetId: string | null;\n readonly onDragOverRow: (id: string | null) => void;\n readonly sortKey?: ExplorerColumn;\n readonly sortDirection?: SortDirection;\n readonly onSortChange?: (key: ExplorerColumn) => void;\n readonly className?: string;\n}\n\nconst ROW_GRID =\n \"grid-cols-[2.25rem_1.5rem_minmax(12rem,1fr)_5rem_2.75rem] sm:grid-cols-[2.25rem_1.25rem_minmax(0,1fr)_5rem_7.5rem]\";\nconst DRAG_MIME = \"application/x-file-next-id\";\n\nexport function ExplorerListView(props: ExplorerListViewProps): React.ReactElement {\n const {\n files,\n protectedIds,\n selectedIds,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n draggingId,\n draggingIds,\n dropTargetId,\n onDragOverRow,\n sortKey,\n sortDirection,\n onSortChange,\n className,\n } = props;\n const labels = useExplorerLabels();\n const coarse = useCoarsePointer();\n\n return (\n <div className={cn(\"overflow-x-auto overscroll-x-contain\", className)}>\n <div className=\"min-w-[32rem] sm:min-w-0\">\n <div\n role=\"row\"\n className={cn(\n \"grid items-center gap-3 border-b border-border px-3 py-2 font-mono text-[10px] font-medium uppercase tracking-[0.12em] text-muted-foreground\",\n ROW_GRID,\n )}\n >\n <span aria-hidden=\"true\" />\n <span aria-hidden=\"true\" />\n <SortHeader col=\"name\" label={labels.sortName} sortKey={sortKey} sortDirection={sortDirection} onSort={onSortChange} />\n <SortHeader col=\"size\" label={labels.sortSize} sortKey={sortKey} sortDirection={sortDirection} onSort={onSortChange} className=\"justify-end text-right\" />\n {coarse ? (\n <span aria-hidden=\"true\" />\n ) : (\n <SortHeader col=\"modified\" label={labels.sortModified} sortKey={sortKey} sortDirection={sortDirection} onSort={onSortChange} className=\"hidden sm:flex\" />\n )}\n </div>\n <ul role=\"list\">\n {files.map((file, idx) => (\n <ExplorerListRow\n key={file.id}\n file={file}\n idx={idx}\n selected={selectedIds.has(file.id)}\n dragging={draggingIds?.has(file.id) ?? file.id === draggingId}\n dropTarget={file.id === dropTargetId && file.kind === \"folder\"}\n isProtected={protectedIds?.has(file.id) ?? false}\n draggingId={draggingId}\n dropTargetId={dropTargetId}\n coarse={coarse}\n onSelect={onSelect}\n onActivate={onActivate}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n onDragOverRow={onDragOverRow}\n />\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nfunction ExplorerListRow({\n file,\n idx,\n selected,\n dragging,\n dropTarget,\n isProtected,\n draggingId,\n dropTargetId,\n coarse,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n onDragOverRow,\n}: {\n file: FileNode;\n idx: number;\n selected: boolean;\n dragging: boolean;\n dropTarget: boolean;\n isProtected: boolean;\n draggingId: string | null;\n dropTargetId: string | null;\n coarse: boolean;\n onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n onActivate: (file: FileNode) => void;\n onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n onDragStart: (id: string) => void;\n onDragEnd: () => void;\n onDrop: (destinationFolderId: string) => void;\n onDragOverRow: (id: string | null) => void;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const isFolder = file.kind === \"folder\";\n const pointer = useExplorerItemPointer({ file, coarse, onSelect, onActivate });\n\n return (\n <li\n role=\"row\"\n data-file-id={file.id}\n aria-selected={selected}\n draggable={!coarse}\n onDragStart={(e: DragEvent<HTMLLIElement>) => {\n e.dataTransfer.setData(DRAG_MIME, file.id);\n e.dataTransfer.effectAllowed = \"move\";\n onDragStart(file.id);\n }}\n onDragEnd={onDragEnd}\n onPointerDown={pointer.onPointerDown}\n onClick={pointer.onClick}\n onDoubleClick={pointer.onDoubleClick}\n onKeyDown={(e: KeyboardEvent<HTMLLIElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onActivate(file);\n }\n }}\n onContextMenu={\n onContextMenu\n ? (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (coarse) return;\n onContextMenu(file, e);\n }\n : undefined\n }\n onDragOver={(e) => {\n if (!isFolder || !draggingId) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (dropTargetId !== file.id) onDragOverRow(file.id);\n }}\n onDragLeave={() => {\n if (dropTargetId === file.id) onDragOverRow(null);\n }}\n onDrop={(e) => {\n if (!isFolder) return;\n e.preventDefault();\n const draggedId = e.dataTransfer.getData(DRAG_MIME);\n if (draggedId && draggedId !== file.id) onDrop(file.id);\n else onDragEnd();\n }}\n tabIndex={0}\n className={cn(\n \"group grid items-center gap-3 border-b border-border/60 px-3 py-3.5 text-sm outline-none last:border-b-0 sm:py-2\",\n \"touch-manipulation select-none [-webkit-touch-callout:none]\",\n ROW_GRID,\n \"hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n selected && \"bg-muted\",\n dragging && \"opacity-50\",\n dropTarget && \"ring-2 ring-primary ring-inset\",\n )}\n >\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums\">\n {String(idx + 1).padStart(2, \"0\")}\n </span>\n <span className={isFolder ? \"text-primary\" : \"text-muted-foreground\"}>\n <FileIcon kind={file.kind} mimeType={file.mimeType} className=\"size-5 text-current sm:size-4\" />\n </span>\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className={cn(\"truncate\", isFolder && \"text-primary\")}>{file.name}</span>\n {isProtected ? (\n <span className=\"flex shrink-0 items-center gap-0.5 rounded-[10px] bg-primary/10 px-1.5 text-[10px] text-primary\">\n <Link2 aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.inUse}\n </span>\n ) : null}\n </span>\n <span className=\"truncate text-right font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums\">\n {formatSize(file.size)}\n </span>\n {coarse ? (\n <button\n type=\"button\"\n aria-label={labels.itemActions}\n className=\"inline-flex size-11 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n onContextMenu?.(file, event);\n }}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"size-5\" />\n </button>\n ) : (\n <span className=\"hidden truncate font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums sm:block\">\n {formatDate(file.updatedAt)}\n </span>\n )}\n </li>\n );\n}\n\nfunction SortHeader({\n col,\n label,\n sortKey,\n sortDirection,\n onSort,\n className,\n}: {\n col: ExplorerColumn;\n label: string;\n sortKey?: ExplorerColumn;\n sortDirection?: SortDirection;\n onSort?: (k: ExplorerColumn) => void;\n className?: string;\n}): React.ReactElement {\n const active = sortKey === col;\n return (\n <button\n type=\"button\"\n role=\"columnheader\"\n aria-sort={active ? (sortDirection === \"asc\" ? \"ascending\" : \"descending\") : \"none\"}\n onClick={onSort ? () => onSort(col) : undefined}\n className={cn(\n \"flex items-center gap-1 text-left outline-none\",\n onSort ? \"cursor-pointer hover:text-foreground\" : \"cursor-default\",\n className,\n )}\n >\n <span>{label}</span>\n {active ? (\n sortDirection === \"asc\" ? (\n <ChevronUp aria-hidden=\"true\" className=\"size-3\" />\n ) : (\n <ChevronDown aria-hidden=\"true\" className=\"size-3\" />\n )\n ) : null}\n </button>\n );\n}\n\nconst formatSize = (bytes: number): string => {\n if (bytes === 0) return \"—\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const exp = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n const value = bytes / Math.pow(1024, exp);\n return `${value.toFixed(value >= 100 || exp === 0 ? 0 : 1)} ${units[exp]}`;\n};\n\nconst formatDate = (d: Date): string =>\n d.toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n\nexport const EXPLORER_DRAG_MIME = DRAG_MIME;\n","\"use client\";\n\nimport type { DragEvent, KeyboardEvent } from \"react\";\nimport { Link2, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { FileIcon } from \"./file-icon\";\nimport { EXPLORER_DRAG_MIME } from \"./explorer-list-view\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\nimport { useCoarsePointer, useExplorerItemPointer } from \"./use-explorer-item-pointer\";\n\nexport interface ExplorerGridViewProps {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds?: ReadonlySet<string>;\n readonly selectedIds: ReadonlySet<string>;\n readonly onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n readonly onActivate: (file: FileNode) => void;\n readonly onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n readonly onDragStart: (id: string) => void;\n readonly onDragEnd: () => void;\n readonly onDrop: (destinationFolderId: string) => void;\n readonly draggingId: string | null;\n readonly draggingIds?: ReadonlySet<string>;\n readonly dropTargetId: string | null;\n readonly onDragOverRow: (id: string | null) => void;\n readonly className?: string;\n}\n\nexport function ExplorerGridView(props: ExplorerGridViewProps): React.ReactElement {\n const {\n files,\n protectedIds,\n selectedIds,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n draggingId,\n draggingIds,\n dropTargetId,\n onDragOverRow,\n className,\n } = props;\n const labels = useExplorerLabels();\n const coarse = useCoarsePointer();\n\n return (\n <ul role=\"list\" className={cn(\"grid grid-cols-3 gap-1.5 p-3 sm:grid-cols-5 md:grid-cols-6 lg:grid-cols-8\", className)}>\n {files.map((file, idx) => (\n <ExplorerGridItem\n key={file.id}\n file={file}\n idx={idx}\n selected={selectedIds.has(file.id)}\n dragging={draggingIds?.has(file.id) ?? file.id === draggingId}\n dropTarget={file.id === dropTargetId && file.kind === \"folder\"}\n isProtected={protectedIds?.has(file.id) ?? false}\n draggingId={draggingId}\n dropTargetId={dropTargetId}\n coarse={coarse}\n folderLabel={labels.folder}\n inUseLabel={labels.inUse}\n actionsLabel={labels.itemActions}\n onSelect={onSelect}\n onActivate={onActivate}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n onDragOverRow={onDragOverRow}\n />\n ))}\n </ul>\n );\n}\n\nfunction ExplorerGridItem({\n file,\n idx,\n selected,\n dragging,\n dropTarget,\n isProtected,\n draggingId,\n dropTargetId,\n coarse,\n folderLabel,\n inUseLabel,\n actionsLabel,\n onSelect,\n onActivate,\n onContextMenu,\n onDragStart,\n onDragEnd,\n onDrop,\n onDragOverRow,\n}: {\n file: FileNode;\n idx: number;\n selected: boolean;\n dragging: boolean;\n dropTarget: boolean;\n isProtected: boolean;\n draggingId: string | null;\n dropTargetId: string | null;\n coarse: boolean;\n folderLabel: string;\n inUseLabel: string;\n actionsLabel: string;\n onSelect: (file: FileNode, event: { shiftKey: boolean }) => void;\n onActivate: (file: FileNode) => void;\n onContextMenu?: (file: FileNode, event: React.MouseEvent) => void;\n onDragStart: (id: string) => void;\n onDragEnd: () => void;\n onDrop: (destinationFolderId: string) => void;\n onDragOverRow: (id: string | null) => void;\n}): React.ReactElement {\n const pointer = useExplorerItemPointer({ file, coarse, onSelect, onActivate });\n return (\n <li className=\"relative\">\n {coarse && onContextMenu ? (\n <button\n type=\"button\"\n aria-label={actionsLabel}\n className=\"absolute right-0.5 top-0.5 z-10 inline-flex size-10 items-center justify-center rounded-[10px] text-muted-foreground\"\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n onContextMenu(file, event);\n }}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"size-5\" />\n </button>\n ) : null}\n <button\n type=\"button\"\n data-file-id={file.id}\n draggable={!coarse}\n aria-selected={selected}\n onDragStart={(e: DragEvent<HTMLButtonElement>) => {\n e.dataTransfer.setData(EXPLORER_DRAG_MIME, file.id);\n e.dataTransfer.effectAllowed = \"move\";\n onDragStart(file.id);\n }}\n onDragEnd={onDragEnd}\n onPointerDown={pointer.onPointerDown}\n onClick={pointer.onClick}\n onDoubleClick={pointer.onDoubleClick}\n onKeyDown={(e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onActivate(file);\n }\n }}\n onContextMenu={\n onContextMenu\n ? (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (coarse) return;\n onContextMenu(file, e);\n }\n : undefined\n }\n onDragOver={(e) => {\n if (file.kind !== \"folder\" || !draggingId) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (dropTargetId !== file.id) onDragOverRow(file.id);\n }}\n onDragLeave={() => {\n if (dropTargetId === file.id) onDragOverRow(null);\n }}\n onDrop={(e) => {\n if (file.kind !== \"folder\") return;\n e.preventDefault();\n onDrop(file.id);\n }}\n className={cn(\n \"group relative flex w-full flex-col items-stretch gap-1 overflow-hidden rounded-[10px] border border-border bg-background p-2 text-left outline-none\",\n \"touch-manipulation select-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\",\n selected && \"border-primary bg-muted\",\n dragging && \"opacity-50\",\n dropTarget && \"ring-2 ring-primary ring-inset\",\n )}\n >\n <span className=\"flex items-center gap-1 pr-8\">\n <span className=\"font-mono text-[9px] uppercase tracking-[0.12em] text-muted-foreground tabular-nums\">\n {String(idx + 1).padStart(2, \"0\")}\n </span>\n {isProtected ? (\n <span className=\"flex items-center gap-0.5 rounded-[10px] bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary\">\n <Link2 aria-hidden=\"true\" className=\"size-2.5\" />\n <span className=\"sr-only\">{inUseLabel}</span>\n </span>\n ) : null}\n </span>\n <span className={cn(\"flex items-center justify-center py-1\", file.kind === \"folder\" ? \"text-primary\" : \"text-muted-foreground\")}>\n <FileIcon kind={file.kind} mimeType={file.mimeType} className=\"size-12 text-current\" />\n </span>\n <span className={cn(\"truncate text-[11px]\", file.kind === \"folder\" && \"text-primary\")}>{file.name}</span>\n <span className=\"font-mono text-[9px] uppercase tracking-[0.12em] text-muted-foreground\">\n {file.kind === \"folder\" ? folderLabel : formatSizeShort(file.size)}\n </span>\n </button>\n </li>\n );\n}\n\nconst formatSizeShort = (bytes: number): string => {\n if (bytes === 0) return \"0 B\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const exp = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n const value = bytes / Math.pow(1024, exp);\n return `${value.toFixed(value >= 10 || exp === 0 ? 0 : 1)} ${units[exp]}`;\n};\n","\"use client\";\n\nimport { FolderPlus, LayoutGrid, List as ListIcon, Search, Trash, Upload } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { useExplorerLabels } from \"./labels\";\nimport type { ViewMode } from \"@vryzel/file-next-headless\";\nimport type { ExplorerColumn, SortDirection } from \"./explorer-list-view\";\n\nexport interface ExplorerToolbarProps {\n readonly view: ViewMode;\n readonly onViewChange: (v: ViewMode) => void;\n readonly query?: string;\n readonly onQueryChange?: (query: string) => void;\n readonly trashOpen?: boolean;\n readonly onTrashToggle?: () => void;\n readonly trashHasItems?: boolean;\n readonly onNewFolder?: () => void;\n readonly onUpload?: () => void;\n readonly uploading?: boolean;\n readonly uploadLabel?: string;\n readonly sortKey: ExplorerColumn;\n readonly sortDirection: SortDirection;\n readonly onSortChange: (key: ExplorerColumn) => void;\n readonly className?: string;\n}\n\nconst SORT_KEYS: ReadonlyArray<ExplorerColumn> = [\"name\", \"size\", \"modified\", \"kind\"];\n\nconst btn =\n \"inline-flex h-10 shrink-0 items-center justify-center gap-1.5 rounded-[10px] border border-border bg-background px-2.5 text-xs font-medium text-foreground outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 sm:h-8 sm:px-3\";\n\nexport function ExplorerToolbar(props: ExplorerToolbarProps): React.ReactElement {\n const {\n view,\n onViewChange,\n query,\n onQueryChange,\n trashOpen,\n onTrashToggle,\n trashHasItems = false,\n onNewFolder,\n onUpload,\n uploading = false,\n uploadLabel,\n sortKey,\n sortDirection,\n onSortChange,\n className,\n } = props;\n const labels = useExplorerLabels();\n const sortLabel: Record<ExplorerColumn, string> = {\n name: labels.sortName,\n size: labels.sortSize,\n modified: labels.sortModified,\n kind: labels.sortKind,\n };\n\n const viewToggle = (\n <div\n role=\"toolbar\"\n aria-label={labels.viewOptions}\n className=\"inline-flex shrink-0 items-center gap-0.5 rounded-[10px] border border-border bg-background p-0.5\"\n >\n <button\n type=\"button\"\n aria-label={labels.listView}\n aria-pressed={view === \"list\"}\n onClick={() => onViewChange(\"list\")}\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-[8px] outline-none focus-visible:ring-2 focus-visible:ring-ring sm:size-7\",\n view === \"list\"\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n <ListIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n aria-label={labels.gridView}\n aria-pressed={view === \"grid\"}\n onClick={() => onViewChange(\"grid\")}\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-[8px] outline-none focus-visible:ring-2 focus-visible:ring-ring sm:size-7\",\n view === \"grid\"\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n <LayoutGrid aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n );\n\n return (\n <div className={cn(\"flex min-w-0 flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\", className)}>\n <div className=\"flex min-w-0 items-center gap-2 sm:max-w-xs sm:flex-1\">\n {onQueryChange ? (\n <label className=\"relative min-w-0 flex-1 sm:min-w-40\">\n <Search\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\"\n />\n <input\n type=\"search\"\n value={query ?? \"\"}\n onChange={(event) => onQueryChange(event.target.value)}\n placeholder={labels.search}\n aria-label={labels.search}\n className=\"h-10 w-full rounded-[10px] border border-border bg-background pl-9 pr-2 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring sm:h-8\"\n />\n </label>\n ) : null}\n <div className=\"sm:hidden\">{viewToggle}</div>\n </div>\n <div className=\"flex min-w-0 items-center gap-2 sm:ml-auto\">\n {onUpload ? (\n <button type=\"button\" onClick={onUpload} disabled={uploading} aria-label={uploadLabel ?? labels.upload} className={btn}>\n <Upload aria-hidden=\"true\" className=\"size-4 sm:size-3.5\" />\n <span className=\"hidden sm:inline\">{uploadLabel ?? labels.upload}</span>\n </button>\n ) : null}\n {onNewFolder ? (\n <button type=\"button\" onClick={onNewFolder} aria-label={labels.newFolder} className={btn}>\n <FolderPlus aria-hidden=\"true\" className=\"size-4 sm:size-3.5\" />\n <span className=\"hidden sm:inline\">{labels.newFolder}</span>\n </button>\n ) : null}\n <div className=\"inline-flex h-10 min-w-0 flex-1 items-center rounded-[10px] border border-border sm:h-8 sm:max-w-48 sm:flex-none\">\n <select\n aria-label={sortLabel[sortKey]}\n value={sortKey}\n onChange={(event) => onSortChange(event.target.value as ExplorerColumn)}\n className=\"h-10 min-w-0 flex-1 appearance-none bg-transparent pl-2.5 pr-1 font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground outline-none sm:h-8\"\n >\n {SORT_KEYS.map((key) => (\n <option key={key} value={key}>\n {sortLabel[key]}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n aria-label={`${sortLabel[sortKey]} ${sortDirection}`}\n onClick={() => onSortChange(sortKey)}\n className=\"inline-flex size-10 shrink-0 items-center justify-center font-mono text-[10px] text-muted-foreground hover:bg-muted sm:size-8\"\n >\n {sortDirection === \"asc\" ? \"↑\" : \"↓\"}\n </button>\n </div>\n {onTrashToggle ? (\n <button\n type=\"button\"\n aria-label={labels.trash}\n aria-pressed={trashOpen === true}\n onClick={onTrashToggle}\n className={cn(\n \"relative inline-flex size-10 shrink-0 items-center justify-center rounded-[10px] border border-border outline-none focus-visible:ring-2 focus-visible:ring-ring sm:size-8\",\n trashOpen\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n <Trash aria-hidden=\"true\" className=\"size-4\" />\n {trashHasItems ? (\n <span aria-hidden=\"true\" className=\"absolute top-1 right-1 size-1.5 rounded-full bg-primary\" />\n ) : null}\n </button>\n ) : null}\n <div className=\"hidden sm:block\">{viewToggle}</div>\n </div>\n </div>\n );\n}\n","export function swallowClickThrough(): void {\n const swallow = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n window.removeEventListener(\"click\", swallow, true);\n window.removeEventListener(\"pointerup\", swallow, true);\n };\n window.addEventListener(\"click\", swallow, true);\n window.addEventListener(\"pointerup\", swallow, true);\n window.setTimeout(() => {\n window.removeEventListener(\"click\", swallow, true);\n window.removeEventListener(\"pointerup\", swallow, true);\n }, 400);\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect, useRef } from \"react\";\nimport {\n Copy,\n Download,\n Eye,\n FolderPlus,\n Link2,\n Pencil,\n RotateCcw,\n Upload,\n X,\n} from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { swallowClickThrough } from \"./swallow-click-through\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport interface ExplorerContextMenuActions {\n readonly deleteFile: (input: { id: string }) => Promise<unknown>;\n readonly renameFile: (id: string, newName: string) => Promise<void>;\n readonly restoreNode?: (input: { id: string }) => Promise<unknown>;\n readonly purgeNode?: (input: { id: string }) => Promise<unknown>;\n readonly createShare?: (input: { id: string }) => Promise<string>;\n}\n\nexport type ExplorerContextTarget =\n | { kind: \"item\"; file: FileNode; x: number; y: number }\n | { kind: \"blank\"; x: number; y: number };\n\nexport interface ExplorerContextMenuProps {\n readonly target: ExplorerContextTarget | null;\n readonly mode?: \"browse\" | \"trash\";\n readonly actions: ExplorerContextMenuActions;\n readonly protectedItem?: boolean;\n readonly onClose: () => void;\n readonly onPreview?: (file: FileNode) => void;\n readonly onDownload?: (file: FileNode) => void;\n readonly onRename?: (file: FileNode) => void;\n readonly onRequestDelete?: (file: FileNode) => void;\n readonly onRequestPurge?: (file: FileNode) => void;\n readonly onCopy?: (file: FileNode) => void;\n readonly onPaste?: (folder?: FileNode) => void;\n readonly onNewFolder?: () => void;\n readonly onUpload?: () => void;\n readonly extraFileAction?: {\n label: string;\n onSelect: (file: FileNode) => void;\n };\n}\n\nexport function ExplorerContextMenu(\n props: ExplorerContextMenuProps,\n): React.ReactElement | null {\n const {\n target,\n mode = \"browse\",\n actions,\n protectedItem = false,\n onClose,\n onPreview,\n onDownload,\n onRename,\n onRequestDelete,\n onRequestPurge,\n onCopy,\n onPaste,\n onNewFolder,\n onUpload,\n extraFileAction,\n } = props;\n const labels = useExplorerLabels();\n const menuRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const el = menuRef.current;\n if (!el || !target) return;\n const rect = el.getBoundingClientRect();\n const pad = 8;\n const left = Math.min(Math.max(pad, target.x), window.innerWidth - rect.width - pad);\n const top = Math.min(Math.max(pad, target.y), window.innerHeight - rect.height - pad);\n el.style.left = `${left}px`;\n el.style.top = `${top}px`;\n }, [target]);\n\n useEffect(() => {\n if (!target) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n const onPointer = (event: PointerEvent) => {\n if (menuRef.current?.contains(event.target as Node)) return;\n event.preventDefault();\n event.stopPropagation();\n swallowClickThrough();\n onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"pointerdown\", onPointer, true);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"pointerdown\", onPointer, true);\n };\n }, [onClose, target]);\n\n if (!target) return null;\n\n const close = () => {\n swallowClickThrough();\n onClose();\n };\n\n const itemClass =\n \"flex w-full min-h-11 cursor-pointer items-center gap-2 rounded-[10px] px-3 py-2.5 text-left text-sm outline-none hover:bg-accent disabled:opacity-40 sm:min-h-0 sm:px-2.5 sm:py-1.5\";\n\n return (\n <div\n ref={menuRef}\n role=\"menu\"\n className=\"fixed z-50 min-w-48 rounded-[10px] border border-border bg-card p-1 text-card-foreground shadow-xl\"\n style={{ left: target.x, top: target.y }}\n >\n {target.kind === \"blank\" ? (\n <>\n {onNewFolder ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onNewFolder(); }}>\n <FolderPlus aria-hidden=\"true\" className=\"size-4\" />\n {labels.newFolder}\n </button>\n ) : null}\n {onUpload ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onUpload(); }}>\n <Upload aria-hidden=\"true\" className=\"size-4\" />\n {labels.upload}\n </button>\n ) : null}\n {onPaste ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onPaste(); }}>\n <Copy aria-hidden=\"true\" className=\"size-4\" />\n {labels.paste}\n </button>\n ) : null}\n </>\n ) : mode === \"trash\" ? (\n <>\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); void actions.restoreNode?.({ id: target.file.id }); }}>\n <RotateCcw aria-hidden=\"true\" className=\"size-4\" />\n {labels.restore}\n </button>\n {onRequestPurge || actions.purgeNode ? (\n <>\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n role=\"menuitem\"\n className={cn(itemClass, \"text-destructive\")}\n onClick={() => {\n close();\n if (onRequestPurge) onRequestPurge(target.file);\n else void actions.purgeNode?.({ id: target.file.id });\n }}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n {labels.deleteForever}\n </button>\n </>\n ) : null}\n </>\n ) : (\n <>\n {target.file.kind === \"file\" && onPreview ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onPreview(target.file); }}>\n <Eye aria-hidden=\"true\" className=\"size-4\" />\n {labels.preview}\n </button>\n ) : null}\n {target.file.kind === \"file\" && onDownload ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onDownload(target.file); }}>\n <Download aria-hidden=\"true\" className=\"size-4\" />\n {labels.download}\n </button>\n ) : null}\n {target.file.kind === \"file\" && extraFileAction ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); extraFileAction.onSelect(target.file); }}>\n {extraFileAction.label}\n </button>\n ) : null}\n {onRename ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onRename(target.file); }}>\n <Pencil aria-hidden=\"true\" className=\"size-4\" />\n {labels.rename}\n </button>\n ) : null}\n {onCopy ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onCopy(target.file); }}>\n <Copy aria-hidden=\"true\" className=\"size-4\" />\n {labels.copy}\n </button>\n ) : null}\n {onPaste && target.file.kind === \"folder\" ? (\n <button type=\"button\" role=\"menuitem\" className={itemClass} onClick={() => { close(); onPaste(target.file); }}>\n <Copy aria-hidden=\"true\" className=\"size-4\" />\n {labels.paste}\n </button>\n ) : null}\n {actions.createShare ? (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={itemClass}\n onClick={() => {\n close();\n void actions.createShare!({ id: target.file.id }).then((token) =>\n navigator.clipboard.writeText(token),\n );\n }}\n >\n <Link2 aria-hidden=\"true\" className=\"size-4\" />\n {labels.copyShare}\n </button>\n ) : null}\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={protectedItem}\n className={cn(itemClass, \"text-destructive\")}\n onClick={() => {\n if (protectedItem) return;\n close();\n if (onRequestDelete) onRequestDelete(target.file);\n else void actions.deleteFile({ id: target.file.id });\n }}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n {labels.moveToTrash}\n </button>\n </>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"./cn\";\n\nexport function Overlay({\n open,\n onClose,\n className,\n children,\n}: {\n open: boolean;\n onClose: () => void;\n className?: string;\n children: ReactNode;\n}): React.ReactElement | null {\n if (!open) return null;\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4\"\n onClick={onClose}\n >\n <div\n role=\"dialog\"\n className={cn(\n \"w-full max-w-sm rounded-[10px] border border-border bg-card p-4 text-card-foreground shadow-xl\",\n className,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {children}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Overlay } from \"./overlay\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport function CreateFolderDialog({\n open,\n onOpenChange,\n onCreate,\n title,\n description,\n confirmLabel,\n initialName = \"\",\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onCreate: (name: string) => Promise<void> | void;\n title?: string;\n description?: string;\n confirmLabel?: string;\n initialName?: string;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const [name, setName] = useState(initialName);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!open) {\n setSaving(false);\n setError(null);\n return;\n }\n setName(initialName);\n const id = window.setTimeout(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, 0);\n return () => window.clearTimeout(id);\n }, [initialName, open]);\n\n async function submit() {\n const trimmed = name.trim();\n if (!trimmed || saving) return;\n setSaving(true);\n setError(null);\n try {\n await onCreate(trimmed);\n onOpenChange(false);\n } catch (cause) {\n const code =\n cause && typeof cause === \"object\" && \"code\" in cause\n ? String((cause as { code?: string }).code)\n : \"\";\n setError(code === \"Conflict\" ? labels.folderExists : labels.folderCreateFailed);\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Overlay open={open} onClose={() => onOpenChange(false)}>\n <h2 className=\"text-base font-semibold\">{title ?? labels.newFolder}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {description ?? labels.folderNameHint}\n </p>\n <input\n ref={inputRef}\n value={name}\n onChange={(event) => setName(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n void submit();\n }\n }}\n placeholder={labels.folderName}\n aria-invalid={Boolean(error)}\n className=\"mt-3 h-9 w-full rounded-[10px] border border-border bg-background px-3 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {error ? <p className=\"mt-2 text-sm text-destructive\">{error}</p> : null}\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n className=\"inline-flex h-8 items-center rounded-[10px] border border-border px-3 text-sm\"\n onClick={() => onOpenChange(false)}\n >\n {labels.cancel}\n </button>\n <button\n type=\"button\"\n disabled={!name.trim() || saving}\n className=\"inline-flex h-8 items-center rounded-[10px] bg-primary px-3 text-sm text-primary-foreground disabled:opacity-50\"\n onClick={() => void submit()}\n >\n {confirmLabel ?? labels.createFolder}\n </button>\n </div>\n </Overlay>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Overlay } from \"./overlay\";\nimport { formatLabel, useExplorerLabels } from \"./labels\";\n\nexport function ConfirmDeleteDialog({\n open,\n names,\n permanent = false,\n onOpenChange,\n onConfirm,\n}: {\n open: boolean;\n names: ReadonlyArray<string>;\n permanent?: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: () => Promise<void> | void;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const [saving, setSaving] = useState(false);\n const description =\n names.length === 1\n ? formatLabel(permanent ? labels.confirmPurge : labels.confirmDelete, {\n name: names[0] ?? \"\",\n })\n : formatLabel(permanent ? labels.confirmPurgeMany : labels.confirmDeleteMany, {\n count: names.length,\n });\n\n async function submit() {\n if (saving) return;\n setSaving(true);\n try {\n await onConfirm();\n onOpenChange(false);\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Overlay open={open} onClose={() => !saving && onOpenChange(false)}>\n <h2 className=\"text-base font-semibold\">\n {permanent ? labels.deleteForever : labels.moveToTrash}\n </h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n disabled={saving}\n className=\"inline-flex h-8 items-center rounded-[10px] border border-border px-3 text-sm\"\n onClick={() => onOpenChange(false)}\n >\n {labels.cancel}\n </button>\n <button\n type=\"button\"\n disabled={saving}\n className={\n permanent\n ? \"inline-flex h-8 items-center rounded-[10px] bg-destructive px-3 text-sm text-destructive-foreground\"\n : \"inline-flex h-8 items-center rounded-[10px] bg-primary px-3 text-sm text-primary-foreground\"\n }\n onClick={() => void submit()}\n >\n {saving\n ? labels.deleting\n : permanent\n ? labels.deleteForever\n : labels.moveToTrash}\n </button>\n </div>\n </Overlay>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Copy, Download, Link2, ListChecks, RotateCcw, X } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { swallowClickThrough } from \"./swallow-click-through\";\nimport type { FileNode } from \"./types\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport function ExplorerSelectionToast({\n files,\n protectedIds,\n trashOpen,\n onDownload,\n onCopy,\n onShare,\n onDelete,\n onRestore,\n onPurge,\n onClear,\n}: {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds: ReadonlySet<string>;\n readonly trashOpen: boolean;\n readonly onDownload?: (file: FileNode) => void;\n readonly onCopy?: () => void;\n readonly onShare?: () => void;\n readonly onDelete?: () => void;\n readonly onRestore?: () => void;\n readonly onPurge?: () => void;\n readonly onClear: () => void;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n const [open, setOpen] = useState(false);\n const [compact, setCompact] = useState(true);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (typeof window.matchMedia !== \"function\") return;\n const mq = window.matchMedia(\"(max-width: 767px), (pointer: coarse)\");\n const sync = () => setCompact(mq.matches);\n sync();\n mq.addEventListener(\"change\", sync);\n return () => mq.removeEventListener(\"change\", sync);\n }, []);\n\n useEffect(() => {\n if (files.length < 2) setOpen(false);\n }, [files.length]);\n\n useEffect(() => {\n if (!open) return;\n const onPointer = (event: PointerEvent) => {\n if (rootRef.current?.contains(event.target as Node)) return;\n event.preventDefault();\n event.stopPropagation();\n swallowClickThrough();\n setOpen(false);\n };\n const timer = window.setTimeout(() => {\n window.addEventListener(\"pointerdown\", onPointer, true);\n }, 0);\n return () => {\n window.clearTimeout(timer);\n window.removeEventListener(\"pointerdown\", onPointer, true);\n };\n }, [open]);\n\n if (files.length < 2) return null;\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"z-50 flex flex-col items-start gap-2\",\n compact ? \"fixed bottom-4 left-4\" : \"fixed right-4 bottom-4 w-[min(22rem,calc(100vw-2rem))]\",\n )}\n >\n {!compact || open ? (\n <div className=\"w-[min(18rem,calc(100vw-2rem))] md:w-full\">\n <SelectionActions\n files={files}\n protectedIds={protectedIds}\n trashOpen={trashOpen}\n onDownload={onDownload}\n onCopy={onCopy}\n onShare={onShare}\n onDelete={onDelete}\n onRestore={onRestore}\n onPurge={onPurge}\n onClear={onClear}\n />\n </div>\n ) : null}\n {compact ? (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${files.length} ${labels.selectedCount}`}\n className=\"relative inline-flex size-12 items-center justify-center rounded-[10px] border border-border bg-card shadow-xl\"\n onClick={(event) => {\n event.stopPropagation();\n setOpen((value) => !value);\n }}\n >\n <ListChecks aria-hidden=\"true\" className=\"size-5\" />\n <span className=\"absolute -right-1 -top-1 min-w-5 rounded-full bg-primary px-1 text-center font-mono text-[10px] leading-5 text-primary-foreground\">\n {files.length}\n </span>\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction SelectionActions({\n files,\n protectedIds,\n trashOpen,\n onDownload,\n onCopy,\n onShare,\n onDelete,\n onRestore,\n onPurge,\n onClear,\n}: {\n readonly files: ReadonlyArray<FileNode>;\n readonly protectedIds: ReadonlySet<string>;\n readonly trashOpen: boolean;\n readonly onDownload?: (file: FileNode) => void;\n readonly onCopy?: () => void;\n readonly onShare?: () => void;\n readonly onDelete?: () => void;\n readonly onRestore?: () => void;\n readonly onPurge?: () => void;\n readonly onClear: () => void;\n}): React.ReactElement {\n const labels = useExplorerLabels();\n const downloadable = files.filter((file) => file.kind === \"file\");\n const hasProtected = files.some((file) => protectedIds.has(file.id));\n const btn =\n \"inline-flex h-10 items-center gap-1.5 rounded-[10px] border border-border bg-background px-3 text-xs font-medium hover:bg-muted disabled:opacity-40 sm:h-8 sm:px-2.5\";\n\n return (\n <div role=\"status\" className=\"w-full rounded-[10px] border border-border bg-card p-3 shadow-xl\">\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary\">{String(files.length).padStart(2, \"0\")}</span>{\" \"}\n {labels.selectedCount}\n </span>\n <button\n type=\"button\"\n aria-label={labels.clearSelection}\n className=\"ml-auto inline-flex size-7 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onClick={(event) => {\n event.stopPropagation();\n swallowClickThrough();\n onClear();\n }}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {trashOpen ? (\n <>\n <button type=\"button\" className={btn} onClick={onRestore}>\n <RotateCcw aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.restore}\n </button>\n {onPurge ? (\n <button type=\"button\" className={cn(btn, \"text-destructive\")} onClick={onPurge}>\n <X aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.deleteForever}\n </button>\n ) : null}\n </>\n ) : (\n <>\n {onDownload && downloadable.length > 0 ? (\n <button type=\"button\" className={btn} onClick={() => downloadable.forEach(onDownload)}>\n <Download aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.download}\n </button>\n ) : null}\n {onCopy ? (\n <button type=\"button\" className={btn} onClick={onCopy}>\n <Copy aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.copy}\n </button>\n ) : null}\n {onShare && downloadable.length > 0 ? (\n <button type=\"button\" className={btn} onClick={onShare}>\n <Link2 aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.share}\n </button>\n ) : null}\n <button type=\"button\" disabled={hasProtected} className={cn(btn, \"text-destructive\")} onClick={onDelete}>\n <X aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.moveToTrash}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n\nexport function ExplorerClipboardToast({\n count,\n onPaste,\n onClear,\n}: {\n readonly count: number;\n readonly onPaste: () => void;\n readonly onClear: () => void;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n if (count < 1) return null;\n return (\n <div role=\"status\" className=\"pointer-events-auto w-full rounded-[10px] border border-border bg-card p-3 shadow-xl\">\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary\">{String(count).padStart(2, \"0\")}</span> {labels.copied}\n </span>\n <button\n type=\"button\"\n aria-label={labels.clearClipboard}\n className=\"ml-auto inline-flex size-7 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onClick={onClear}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"inline-flex h-8 items-center gap-1.5 rounded-[10px] border border-border px-2.5 text-xs font-medium hover:bg-muted\"\n onClick={onPaste}\n >\n <Copy aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.paste}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { X } from \"lucide-react\";\nimport { cn } from \"./cn\";\nimport { useExplorerLabels } from \"./labels\";\nimport type { UploadQueueItem } from \"./use-upload-queue\";\n\nexport function ExplorerUploadStatus({\n items,\n onDismiss,\n className,\n}: {\n readonly items: ReadonlyArray<UploadQueueItem>;\n readonly onDismiss: () => void;\n readonly className?: string;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n if (items.length === 0) return null;\n\n const done = items.filter((item) => item.status === \"success\").length;\n const failed = items.filter((item) => item.status === \"error\").length;\n const active = items.some(\n (item) => item.status === \"queued\" || item.status === \"uploading\",\n );\n const visible = items.slice(-6);\n\n return (\n <div\n role=\"status\"\n className={cn(\n \"w-full rounded-[10px] border border-border bg-card p-3 shadow-xl\",\n className,\n )}\n >\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary\">\n {String(done).padStart(2, \"0\")}/{String(items.length).padStart(2, \"0\")}\n </span>{\" \"}\n {labels.uploadStatus}\n {failed > 0 ? (\n <span className=\"text-destructive\"> · {failed}</span>\n ) : null}\n </span>\n {!active ? (\n <button\n type=\"button\"\n aria-label={labels.dismissUploads}\n className=\"ml-auto inline-flex size-7 items-center justify-center rounded-[10px] text-muted-foreground hover:bg-muted\"\n onClick={onDismiss}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n ) : (\n <span className=\"ml-auto\" />\n )}\n </div>\n <ul className=\"flex max-h-48 flex-col gap-1.5 overflow-y-auto\">\n {visible.map((item) => (\n <li key={item.id} className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-xs\">{item.name}</span>\n <span\n className={cn(\n \"shrink-0 font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\",\n item.status === \"error\" && \"text-destructive\",\n item.status === \"success\" && \"text-primary\",\n )}\n >\n {item.status === \"uploading\"\n ? `${item.progress}%`\n : item.status === \"queued\"\n ? labels.uploadQueued\n : item.status === \"success\"\n ? labels.uploadDone\n : labels.uploadFailed}\n </span>\n </div>\n {item.status === \"uploading\" ? (\n <div className=\"mt-1 h-1 overflow-hidden rounded-[10px] bg-muted\">\n <div className=\"h-full bg-primary\" style={{ width: `${item.progress}%` }} />\n </div>\n ) : null}\n {item.error ? (\n <p className=\"mt-0.5 truncate text-[10px] text-destructive\">{item.error}</p>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { RequestUploadResult } from \"@vryzel/file-next-headless\";\n\nexport type UploadQueueStatus = \"queued\" | \"uploading\" | \"success\" | \"error\";\n\nexport type UploadQueueItem = {\n readonly id: string;\n readonly name: string;\n readonly size: number;\n readonly type: string;\n readonly parentId: string | null;\n readonly status: UploadQueueStatus;\n readonly progress: number;\n readonly error?: string;\n};\n\ntype InternalItem = {\n id: string;\n name: string;\n size: number;\n type: string;\n parentId: string | null;\n status: UploadQueueStatus;\n progress: number;\n error?: string;\n content: Blob;\n};\n\nexport function useUploadQueue(options: {\n readonly requestUpload: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n parentId: string | null;\n }) => Promise<RequestUploadResult>;\n readonly confirmUpload?: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n }) => Promise<void> | void;\n}): {\n readonly items: ReadonlyArray<UploadQueueItem>;\n readonly enqueue: (files: ReadonlyArray<File>, parentId: string | null) => void;\n readonly dismiss: () => void;\n readonly active: boolean;\n} {\n const requestUploadRef = useRef(options.requestUpload);\n requestUploadRef.current = options.requestUpload;\n const confirmUploadRef = useRef(options.confirmUpload);\n confirmUploadRef.current = options.confirmUpload;\n\n const queueRef = useRef<InternalItem[]>([]);\n const running = useRef(false);\n const [items, setItems] = useState<ReadonlyArray<UploadQueueItem>>([]);\n\n const publish = useCallback(() => {\n setItems(queueRef.current.map(({ content: _content, ...item }) => item));\n }, []);\n\n const pump = useCallback(async () => {\n if (running.current) return;\n const next = queueRef.current.find((item) => item.status === \"queued\");\n if (!next) return;\n running.current = true;\n next.status = \"uploading\";\n next.progress = 0;\n publish();\n try {\n const target = await requestUploadRef.current({\n name: next.name,\n size: next.size,\n type: next.type,\n content: next.content,\n parentId: next.parentId,\n });\n let lastPublish = 0;\n await putFile(target, next, (progress) => {\n next.progress = progress;\n const now = Date.now();\n if (progress === 100 || now - lastPublish > 200) {\n lastPublish = now;\n publish();\n }\n });\n await confirmUploadRef.current?.({\n name: next.name,\n size: next.size,\n type: next.type,\n content: next.content,\n });\n next.status = \"success\";\n next.progress = 100;\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new Event(\"file-next-uploaded\"));\n }\n } catch (error) {\n next.status = \"error\";\n next.error = error instanceof Error ? error.message : \"Upload failed\";\n } finally {\n publish();\n running.current = false;\n void pump();\n }\n }, [publish]);\n\n const enqueue = useCallback(\n (files: ReadonlyArray<File>, parentId: string | null) => {\n if (files.length === 0) return;\n const added: InternalItem[] = files.map((file) => ({\n id:\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `${file.name}-${file.size}-${Date.now()}-${Math.random()}`,\n name: file.name,\n size: file.size,\n type: file.type,\n content: file,\n parentId,\n status: \"queued\",\n progress: 0,\n }));\n queueRef.current = [...queueRef.current, ...added];\n publish();\n void pump();\n },\n [publish, pump],\n );\n\n const dismiss = useCallback(() => {\n queueRef.current = queueRef.current.filter(\n (item) => item.status === \"queued\" || item.status === \"uploading\",\n );\n publish();\n }, [publish]);\n\n const active = items.some(\n (item) => item.status === \"queued\" || item.status === \"uploading\",\n );\n const itemCount = items.length;\n\n useEffect(() => {\n if (active || itemCount === 0) return undefined;\n const timeout = window.setTimeout(() => {\n dismiss();\n }, 3000);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [active, dismiss, itemCount]);\n\n return { items, enqueue, dismiss, active };\n}\n\nfunction putFile(\n target: RequestUploadResult,\n file: InternalItem,\n onProgress: (progress: number) => void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", (event) => {\n if (event.lengthComputable) {\n onProgress(Math.min(100, Math.round((event.loaded / event.total) * 100)));\n }\n });\n xhr.addEventListener(\"load\", () => {\n if (xhr.status < 200 || xhr.status >= 300) {\n let message = `Upload failed (${xhr.status})`;\n try {\n const parsed = JSON.parse(xhr.responseText) as {\n error?: { message?: string };\n };\n if (parsed.error?.message) message = parsed.error.message;\n } catch {\n /* keep fallback */\n }\n reject(new Error(message));\n return;\n }\n resolve();\n });\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Upload failed\"));\n });\n xhr.open(target.method ?? \"PUT\", target.url);\n xhr.setRequestHeader(\"Content-Type\", file.type || \"application/octet-stream\");\n for (const [header, value] of Object.entries(target.headers ?? {})) {\n xhr.setRequestHeader(header, value);\n }\n xhr.send(file.content);\n });\n}\n","\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { RequestUploadResult } from \"@vryzel/file-next-headless\";\nimport { ExplorerUploadStatus } from \"./explorer-upload-status\";\nimport { useUploadQueue, type UploadQueueItem } from \"./use-upload-queue\";\n\ntype Enqueue = (files: ReadonlyArray<File>, parentId: string | null) => void;\n\nconst EnqueueContext = createContext<Enqueue | null>(null);\n\nexport function useUploadEnqueue(): Enqueue | null {\n return useContext(EnqueueContext);\n}\n\nexport function UploadQueueProvider({\n requestUpload,\n confirmUpload,\n children,\n}: {\n requestUpload: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n parentId: string | null;\n }) => Promise<RequestUploadResult>;\n confirmUpload?: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n }) => Promise<void> | void;\n children: ReactNode;\n}): React.ReactElement {\n const uploads = useUploadQueue({ requestUpload, confirmUpload });\n const panel = useMemo(\n () => (\n <div className=\"fixed right-4 bottom-4 z-50 flex w-[min(22rem,calc(100vw-2rem))] flex-col gap-2\">\n <ExplorerUploadStatus items={uploads.items} onDismiss={uploads.dismiss} />\n </div>\n ),\n [uploads.dismiss, uploads.items],\n );\n\n return (\n <EnqueueContext.Provider value={uploads.enqueue}>\n {children}\n {panel}\n </EnqueueContext.Provider>\n );\n}\n\nexport type { UploadQueueItem };\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { useFileExplorer } from \"@vryzel/file-next-headless\";\nimport type { RequestUploadResult } from \"@vryzel/file-next-headless\";\nimport type { TenantId as BrandedTenantId } from \"@vryzel/file-next\";\nimport type { FileNode, FileSystemError, Result } from \"./types\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\nimport { ExplorerListView, type ExplorerColumn, type SortDirection } from \"./explorer-list-view\";\nimport { ExplorerGridView } from \"./explorer-grid-view\";\nimport { ExplorerToolbar } from \"./explorer-toolbar\";\nimport { ExplorerContextMenu, type ExplorerContextTarget } from \"./explorer-context-menu\";\nimport { CreateFolderDialog } from \"./create-folder-dialog\";\nimport { ConfirmDeleteDialog } from \"./confirm-delete-dialog\";\nimport { ExplorerClipboardToast, ExplorerSelectionToast } from \"./explorer-selection-toast\";\nimport { UploadQueueProvider, useUploadEnqueue } from \"./upload-queue\";\nimport { ExplorerLabelsProvider, useExplorerLabels, type ExplorerLabels } from \"./labels\";\nimport { cn } from \"./cn\";\n\nexport type { ExplorerColumn, SortDirection };\n\nexport interface FileExplorerActions {\n readonly deleteFile: (input: { id: string }) => Promise<unknown>;\n readonly moveFile: (input: {\n id: string;\n newParentId: string | null;\n newName?: string;\n }) => Promise<unknown>;\n readonly copyFile: (input: {\n id: string;\n newParentId: string | null;\n newName?: string;\n }) => Promise<unknown>;\n readonly renameFile: (id: string, newName: string) => Promise<void>;\n readonly restoreNode?: (input: { id: string }) => Promise<unknown>;\n readonly purgeNode?: (input: { id: string }) => Promise<unknown>;\n readonly createShare?: (input: { id: string }) => Promise<string>;\n readonly createFolder?: (input: {\n name: string;\n parentId: string | null;\n }) => Promise<unknown>;\n}\n\nconst PAGE_SIZE = 50;\n\ntype ListPageResult = Result<\n { items: ReadonlyArray<FileNode>; nextCursor?: string },\n FileSystemError\n>;\n\ntype OverlayQuery = (input: {\n query?: string;\n cursor?: string;\n limit?: number;\n trash?: boolean;\n}) => Promise<ListPageResult>;\n\nexport interface FileExplorerProps {\n readonly tenantId: string;\n readonly parentId: string | null;\n readonly listFiles: (input: {\n parentId: string | null;\n cursor?: string;\n limit?: number;\n }) => Promise<ListPageResult>;\n readonly actions: FileExplorerActions;\n readonly breadcrumbs?: ReadonlyArray<{ id: string; name: string }>;\n readonly onBreadcrumbNavigate?: (seg: { id: string; name: string }) => void;\n readonly initialView?: \"list\" | \"grid\";\n readonly autoFetch?: boolean;\n readonly onActivate?: (file: FileNode) => void;\n readonly onOpenFolder?: (folder: FileNode) => void;\n readonly searchFiles?: OverlayQuery;\n readonly listTrash?: OverlayQuery;\n readonly requestUpload?: (file: {\n name: string;\n size: number;\n type: string;\n content: Blob;\n parentId: string | null;\n }) => Promise<RequestUploadResult>;\n readonly confirmUpload?: () => Promise<void> | void;\n readonly usedBytes?: number;\n readonly quotaBytes?: number;\n readonly onMove?: (input: {\n itemIds: ReadonlyArray<string>;\n destinationFolderId: string;\n }) => Promise<void> | void;\n readonly refreshKey?: number;\n readonly className?: string;\n readonly persistViewKey?: string;\n readonly onPreview?: (file: FileNode) => void;\n readonly onDownload?: (file: FileNode) => void;\n readonly extraFileAction?: { label: string; onSelect: (file: FileNode) => void };\n readonly protectedIds?: ReadonlyArray<string>;\n readonly labels?: Partial<ExplorerLabels>;\n}\n\ntype ExplorerPrefs = {\n view: \"list\" | \"grid\";\n sortKey: ExplorerColumn;\n sortDir: SortDirection;\n};\n\nconst DEFAULT_PREFS: ExplorerPrefs = { view: \"list\", sortKey: \"name\", sortDir: \"asc\" };\n\nfunction reviveFile(node: FileNode): FileNode {\n const asDate = (value: Date | string) => (value instanceof Date ? value : new Date(value));\n return {\n ...node,\n createdAt: asDate(node.createdAt),\n updatedAt: asDate(node.updatedAt),\n deletedAt: node.deletedAt ? asDate(node.deletedAt) : null,\n };\n}\n\nfunction readPrefs(key: string): ExplorerPrefs {\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return DEFAULT_PREFS;\n if (raw === \"list\" || raw === \"grid\") return { ...DEFAULT_PREFS, view: raw };\n const parsed = JSON.parse(raw) as Partial<ExplorerPrefs>;\n const view = parsed.view === \"grid\" ? \"grid\" : \"list\";\n const sortKey: ExplorerColumn =\n parsed.sortKey === \"size\" || parsed.sortKey === \"modified\" || parsed.sortKey === \"kind\"\n ? parsed.sortKey\n : \"name\";\n const sortDir: SortDirection = parsed.sortDir === \"desc\" ? \"desc\" : \"asc\";\n return { view, sortKey, sortDir };\n } catch {\n return DEFAULT_PREFS;\n }\n}\n\nconst compareFiles = (\n a: FileNode,\n b: FileNode,\n key: ExplorerColumn,\n dir: SortDirection,\n): number => {\n if (a.kind !== b.kind) return a.kind === \"folder\" ? -1 : 1;\n let cmp = 0;\n switch (key) {\n case \"name\":\n cmp = a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" });\n break;\n case \"size\":\n cmp = a.size - b.size;\n break;\n case \"modified\":\n cmp = a.updatedAt.getTime() - b.updatedAt.getTime();\n break;\n case \"kind\":\n cmp = a.kind.localeCompare(b.kind);\n break;\n }\n return dir === \"asc\" ? cmp : -cmp;\n};\n\nfunction formatExplorerBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function FileExplorer(props: FileExplorerProps): React.ReactElement {\n const outerEnqueue = useUploadEnqueue();\n const tree = (\n <ExplorerLabelsProvider labels={props.labels}>\n <FileExplorerInner {...props} />\n </ExplorerLabelsProvider>\n );\n if (props.requestUpload && !outerEnqueue) {\n return (\n <UploadQueueProvider\n requestUpload={props.requestUpload}\n confirmUpload={\n props.confirmUpload\n ? async () => {\n await props.confirmUpload?.();\n }\n : undefined\n }\n >\n {tree}\n </UploadQueueProvider>\n );\n }\n return tree;\n}\n\nfunction FileExplorerInner(props: FileExplorerProps): React.ReactElement {\n const {\n tenantId,\n parentId,\n listFiles,\n actions,\n breadcrumbs,\n onBreadcrumbNavigate,\n initialView = \"list\",\n onActivate,\n onOpenFolder,\n searchFiles,\n listTrash,\n requestUpload,\n confirmUpload,\n usedBytes,\n quotaBytes,\n onMove = () => undefined,\n refreshKey,\n className,\n persistViewKey,\n onPreview,\n onDownload,\n extraFileAction,\n protectedIds,\n } = props;\n const labels = useExplorerLabels();\n const protectedSet = useMemo(() => new Set(protectedIds ?? []), [protectedIds]);\n\n const explorer = useFileExplorer({\n listFiles: ((input: { parentId: string | null }) =>\n listFiles({ parentId: input.parentId, limit: PAGE_SIZE })) as never,\n tenantId: tenantId as BrandedTenantId,\n parentId,\n initialView,\n autoFetch: false,\n onMove,\n });\n\n const uploadInputRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const [trashOpen, setTrashOpen] = useState(false);\n const [pageItems, setPageItems] = useState<ReadonlyArray<FileNode>>([]);\n const [pageStatus, setPageStatus] = useState<\"idle\" | \"loading\" | \"success\" | \"error\">(\"idle\");\n const [pageError, setPageError] = useState<FileSystemError | null>(null);\n const [loadingMore, setLoadingMore] = useState(false);\n const [browseHasMore, setBrowseHasMore] = useState(false);\n const [overlayHasMore, setOverlayHasMore] = useState(false);\n const browseCursor = useRef<string | undefined>(undefined);\n const overlayCursor = useRef<string | undefined>(undefined);\n const loadingMoreRef = useRef(false);\n const overlayMoreRef = useRef(false);\n const browseGen = useRef(0);\n const [overlayFiles, setOverlayFiles] = useState<ReadonlyArray<FileNode> | null>(null);\n const [overlayError, setOverlayError] = useState<FileSystemError | null>(null);\n const [overlayLoading, setOverlayLoading] = useState(false);\n const [overlayMore, setOverlayMore] = useState(false);\n const [sortKey, setSortKey] = useState<ExplorerColumn>(\"name\");\n const [sortDir, setSortDir] = useState<SortDirection>(\"asc\");\n const [prefsReady, setPrefsReady] = useState(!persistViewKey);\n const skipPrefsWrite = useRef(!persistViewKey);\n const [menu, setMenu] = useState<ExplorerContextTarget | null>(null);\n const [folderOpen, setFolderOpen] = useState(false);\n const [renameTarget, setRenameTarget] = useState<FileNode | null>(null);\n const [deleteTargets, setDeleteTargets] = useState<ReadonlyArray<FileNode>>([]);\n const [purgeTargets, setPurgeTargets] = useState<ReadonlyArray<FileNode>>([]);\n const [trashHasItems, setTrashHasItems] = useState(false);\n const [clipboard, setClipboard] = useState<ReadonlyArray<FileNode>>([]);\n const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(() => new Set());\n const anchorId = useRef<string | null>(null);\n\n useEffect(() => {\n if (!persistViewKey) return;\n const prefs = readPrefs(persistViewKey);\n explorer.setView(prefs.view);\n setSortKey(prefs.sortKey);\n setSortDir(prefs.sortDir);\n skipPrefsWrite.current = true;\n setPrefsReady(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [persistViewKey]);\n\n useEffect(() => {\n if (!persistViewKey || !prefsReady) return;\n if (skipPrefsWrite.current) {\n skipPrefsWrite.current = false;\n return;\n }\n window.localStorage.setItem(\n persistViewKey,\n JSON.stringify({ view: explorer.view, sortKey, sortDir } satisfies ExplorerPrefs),\n );\n }, [explorer.view, persistViewKey, prefsReady, sortDir, sortKey]);\n\n const handleSortChange = useCallback(\n (key: ExplorerColumn) => {\n if (key === sortKey) {\n setSortDir((dir) => (dir === \"asc\" ? \"desc\" : \"asc\"));\n return;\n }\n setSortKey(key);\n setSortDir(key === \"modified\" ? \"desc\" : \"asc\");\n },\n [sortKey],\n );\n\n const loadBrowse = useCallback(\n async (mode: \"reset\" | \"more\") => {\n const gen = mode === \"reset\" ? ++browseGen.current : browseGen.current;\n if (mode === \"more\") {\n if (!browseCursor.current || loadingMoreRef.current) return;\n loadingMoreRef.current = true;\n setLoadingMore(true);\n } else {\n setPageStatus(\"loading\");\n browseCursor.current = undefined;\n setBrowseHasMore(false);\n }\n const result = await listFiles({\n parentId,\n limit: PAGE_SIZE,\n cursor: mode === \"more\" ? browseCursor.current : undefined,\n });\n if (gen !== browseGen.current) {\n loadingMoreRef.current = false;\n setLoadingMore(false);\n return;\n }\n if (result.ok) {\n browseCursor.current = result.value.nextCursor;\n setBrowseHasMore(Boolean(result.value.nextCursor));\n const items = result.value.items.map(reviveFile);\n setPageItems((current) => (mode === \"more\" ? [...current, ...items] : items));\n setPageError(null);\n setPageStatus(\"success\");\n } else if (mode === \"reset\") {\n setPageItems([]);\n setPageError(result.error);\n setPageStatus(\"error\");\n }\n loadingMoreRef.current = false;\n setLoadingMore(false);\n },\n [listFiles, parentId],\n );\n\n const loadOverlay = useCallback(\n async (mode: \"reset\" | \"more\" = \"reset\") => {\n if (trashOpen && listTrash) {\n const trimmed = query.trim();\n if (trimmed && searchFiles) {\n setOverlayLoading(true);\n const result = await searchFiles({ query: trimmed, limit: PAGE_SIZE, trash: true });\n setOverlayLoading(false);\n if (result.ok) {\n setOverlayFiles(result.value.items.map(reviveFile));\n setOverlayError(null);\n } else setOverlayError(result.error);\n return;\n }\n if (mode === \"more\") {\n if (!overlayCursor.current || overlayMoreRef.current) return;\n overlayMoreRef.current = true;\n setOverlayMore(true);\n } else {\n setOverlayLoading(true);\n overlayCursor.current = undefined;\n setOverlayHasMore(false);\n }\n const result = await listTrash({\n limit: PAGE_SIZE,\n cursor: mode === \"more\" ? overlayCursor.current : undefined,\n });\n if (result.ok) {\n overlayCursor.current = result.value.nextCursor;\n setOverlayHasMore(Boolean(result.value.nextCursor));\n const items = result.value.items.map(reviveFile);\n setOverlayFiles((current) => (mode === \"more\" && current ? [...current, ...items] : items));\n setOverlayError(null);\n } else if (mode === \"reset\") setOverlayError(result.error);\n overlayMoreRef.current = false;\n setOverlayLoading(false);\n setOverlayMore(false);\n return;\n }\n const trimmed = query.trim();\n if (trimmed && searchFiles) {\n setOverlayLoading(true);\n const result = await searchFiles({ query: trimmed, limit: PAGE_SIZE });\n setOverlayLoading(false);\n if (result.ok) {\n setOverlayFiles(result.value.items.map(reviveFile));\n setOverlayError(null);\n } else setOverlayError(result.error);\n return;\n }\n overlayCursor.current = undefined;\n setOverlayHasMore(false);\n setOverlayFiles(null);\n setOverlayError(null);\n setOverlayLoading(false);\n },\n [listTrash, query, searchFiles, trashOpen],\n );\n\n const refreshTrashFlag = useCallback(async () => {\n if (!listTrash) {\n setTrashHasItems(false);\n return;\n }\n const result = await listTrash({ limit: 1 });\n setTrashHasItems(result.ok && result.value.items.length > 0);\n }, [listTrash]);\n\n const reload = useCallback(async () => {\n await loadBrowse(\"reset\");\n await loadOverlay(\"reset\");\n await refreshTrashFlag();\n }, [loadBrowse, loadOverlay, refreshTrashFlag]);\n\n const enqueueUploads = useUploadEnqueue();\n\n useEffect(() => {\n const onUploaded = () => {\n void reload();\n void confirmUpload?.();\n };\n window.addEventListener(\"file-next-uploaded\", onUploaded);\n return () => window.removeEventListener(\"file-next-uploaded\", onUploaded);\n }, [confirmUpload, reload]);\n\n useEffect(() => {\n void loadBrowse(\"reset\");\n }, [loadBrowse]);\n\n useEffect(() => {\n void refreshTrashFlag();\n }, [refreshTrashFlag]);\n\n useEffect(() => {\n const handle = window.setTimeout(() => {\n void loadOverlay(\"reset\");\n }, trashOpen ? 0 : 250);\n return () => window.clearTimeout(handle);\n }, [loadOverlay, trashOpen]);\n\n const sourceFiles = overlayFiles ?? pageItems;\n const hasMore = overlayFiles ? overlayHasMore : browseHasMore;\n const sortedFiles = useMemo(\n () => [...sourceFiles].sort((a, b) => compareFiles(a, b, sortKey, sortDir)),\n [sourceFiles, sortKey, sortDir],\n );\n\n useEffect(() => {\n if (refreshKey === undefined) return;\n void reload();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refreshKey]);\n\n const handleActivate = useCallback(\n (file: FileNode) => {\n if (file.kind === \"folder\") {\n onOpenFolder?.(file);\n return;\n }\n if (onPreview) onPreview(file);\n else if (onDownload) onDownload(file);\n else onActivate?.(file);\n },\n [onActivate, onDownload, onOpenFolder, onPreview],\n );\n\n const handleContextMenu = useCallback((file: FileNode, event: React.MouseEvent) => {\n setMenu({ kind: \"item\", file, x: event.clientX, y: event.clientY });\n }, []);\n\n const clearSelection = useCallback(() => {\n setSelectedIds(new Set());\n anchorId.current = null;\n }, []);\n\n useEffect(() => {\n clearSelection();\n }, [clearSelection, parentId, trashOpen]);\n\n const handleSelect = useCallback(\n (file: FileNode, event: { shiftKey: boolean }) => {\n const id = file.id;\n if (event.shiftKey && anchorId.current) {\n const from = sortedFiles.findIndex((item) => item.id === anchorId.current);\n const to = sortedFiles.findIndex((item) => item.id === id);\n if (from >= 0 && to >= 0) {\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n setSelectedIds(new Set(sortedFiles.slice(start, end + 1).map((item) => item.id)));\n return;\n }\n }\n setSelectedIds((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n anchorId.current = id;\n },\n [sortedFiles],\n );\n\n const selectedFiles = useMemo(\n () => sortedFiles.filter((file) => selectedIds.has(file.id)),\n [selectedIds, sortedFiles],\n );\n const selected = selectedFiles.length === 1 ? selectedFiles[0] : undefined;\n const draggingIds = useMemo(() => {\n const id = explorer.draggingId;\n if (!id) return new Set<string>();\n if (selectedIds.has(id)) return selectedIds;\n return new Set([id]);\n }, [explorer.draggingId, selectedIds]);\n\n const handleDropOnFolder = useCallback(\n (destinationFolderId: string) => {\n const ids = [...draggingIds].filter((id) => id !== destinationFolderId);\n explorer.endDrag();\n if (ids.length === 0) return;\n void Promise.resolve(onMove({ itemIds: ids, destinationFolderId })).then(clearSelection);\n },\n [clearSelection, draggingIds, explorer, onMove],\n );\n\n const copyToClipboard = useCallback(\n (files: ReadonlyArray<FileNode>) => {\n if (files.length === 0) return;\n setClipboard(files);\n clearSelection();\n },\n [clearSelection],\n );\n\n const pasteClipboard = useCallback(\n async (destinationId: string | null = parentId) => {\n if (clipboard.length === 0 || trashOpen) return;\n for (const node of clipboard) {\n if (node.id === destinationId) continue;\n await actions.copyFile({ id: node.id, newParentId: destinationId, newName: node.name });\n }\n setClipboard([]);\n await reload();\n },\n [actions, clipboard, parentId, reload, trashOpen],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (target.closest(\"input, textarea, [contenteditable=true]\")) return;\n const index = sortedFiles.findIndex((file) => file.id === (anchorId.current ?? selected?.id));\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"a\") {\n event.preventDefault();\n setSelectedIds(new Set(sortedFiles.map((file) => file.id)));\n return;\n }\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"c\") {\n if (selectedFiles.length === 0 || trashOpen) return;\n event.preventDefault();\n copyToClipboard(selectedFiles);\n return;\n }\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"v\") {\n if (clipboard.length === 0 || trashOpen) return;\n event.preventDefault();\n void pasteClipboard();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const nextIndex = Math.min(sortedFiles.length - 1, Math.max(0, (index < 0 ? 0 : index) + delta));\n const next = sortedFiles[nextIndex];\n if (!next) return;\n if (event.shiftKey && anchorId.current) {\n const from = sortedFiles.findIndex((item) => item.id === anchorId.current);\n const start = Math.min(from, nextIndex);\n const end = Math.max(from, nextIndex);\n setSelectedIds(new Set(sortedFiles.slice(start, end + 1).map((item) => item.id)));\n } else {\n setSelectedIds(new Set([next.id]));\n anchorId.current = next.id;\n }\n return;\n }\n if (event.key === \"Enter\" && selected) {\n event.preventDefault();\n handleActivate(selected);\n return;\n }\n if (event.key === \"F2\" && selected && !trashOpen) {\n event.preventDefault();\n setRenameTarget(selected);\n return;\n }\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && selectedFiles.length > 0) {\n event.preventDefault();\n if (trashOpen) {\n if (actions.purgeNode) setPurgeTargets(selectedFiles);\n return;\n }\n if (selectedFiles.some((file) => protectedSet.has(file.id))) return;\n setDeleteTargets(selectedFiles);\n return;\n }\n if (event.key === \"Escape\") {\n setMenu(null);\n clearSelection();\n }\n },\n [\n clipboard.length,\n clearSelection,\n copyToClipboard,\n handleActivate,\n pasteClipboard,\n protectedSet,\n selected,\n selectedFiles,\n sortedFiles,\n trashOpen,\n ],\n );\n\n const openUpload = () => uploadInputRef.current?.click();\n\n return (\n <div\n className={cn(\"flex min-h-0 flex-1 flex-col\", className)}\n onKeyDown={handleKeyDown}\n onDragOver={(event) => {\n if (!requestUpload || trashOpen) return;\n if (event.dataTransfer.types.includes(\"Files\")) event.preventDefault();\n }}\n onDrop={(event) => {\n if (!requestUpload || trashOpen) return;\n const files = event.dataTransfer.files;\n if (!files.length) return;\n event.preventDefault();\n enqueueUploads?.(Array.from(files), parentId);\n }}\n onContextMenu={(event) => {\n if (trashOpen) return;\n if ((event.target as HTMLElement).closest(\"[data-file-id]\")) return;\n event.preventDefault();\n setMenu({ kind: \"blank\", x: event.clientX, y: event.clientY });\n }}\n >\n {breadcrumbs && onBreadcrumbNavigate ? (\n <div className=\"border-b border-border px-4 py-3\">\n <Breadcrumbs segments={breadcrumbs} onNavigate={onBreadcrumbNavigate} />\n </div>\n ) : null}\n\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border px-4 py-3\">\n {requestUpload ? (\n <input\n ref={uploadInputRef}\n type=\"file\"\n multiple\n className=\"sr-only\"\n onChange={(event) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n enqueueUploads?.(Array.from(files), parentId);\n event.target.value = \"\";\n }}\n />\n ) : null}\n <ExplorerToolbar\n className=\"min-w-0 flex-1\"\n view={explorer.view}\n onViewChange={explorer.setView}\n onUpload={requestUpload && !trashOpen ? openUpload : undefined}\n onNewFolder={actions.createFolder && !trashOpen ? () => setFolderOpen(true) : undefined}\n query={query}\n onQueryChange={searchFiles ? setQuery : undefined}\n trashOpen={trashOpen}\n trashHasItems={trashHasItems}\n onTrashToggle={\n listTrash\n ? () => {\n setQuery(\"\");\n setTrashOpen((open) => !open);\n }\n : undefined\n }\n sortKey={sortKey}\n sortDirection={sortDir}\n onSortChange={handleSortChange}\n />\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {(overlayLoading || pageStatus === \"loading\") && sortedFiles.length === 0 ? (\n <p className=\"px-4 py-12 text-center font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n {labels.loading}\n </p>\n ) : overlayError || (pageStatus === \"error\" && pageError) ? (\n <div className=\"border-b border-destructive/30 bg-destructive/5 px-4 py-3 text-sm text-destructive\">\n {(overlayError ?? pageError)?.message ?? labels.folderCreateFailed}\n </div>\n ) : sortedFiles.length === 0 ? (\n <div className=\"flex min-h-full flex-col justify-center px-4 py-16 text-center\">\n <p className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n {trashOpen ? labels.emptyTrash : query.trim() ? labels.noMatches : labels.emptyFolder}\n </p>\n {trashOpen ? (\n <p className=\"mt-2 text-sm text-muted-foreground\">{labels.trashRetention}</p>\n ) : !query.trim() ? (\n <p className=\"mt-2 text-sm text-muted-foreground\">{labels.dropHint}</p>\n ) : null}\n </div>\n ) : explorer.view === \"list\" ? (\n <div\n onClick={(event) => {\n if ((event.target as HTMLElement).closest(\"[data-file-id]\")) return;\n clearSelection();\n }}\n >\n <ExplorerListView\n files={sortedFiles}\n protectedIds={protectedSet}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n onActivate={handleActivate}\n onContextMenu={handleContextMenu}\n onDragStart={explorer.beginDrag}\n onDragEnd={explorer.endDrag}\n onDrop={handleDropOnFolder}\n draggingId={explorer.draggingId}\n draggingIds={draggingIds}\n dropTargetId={explorer.dropTargetId}\n onDragOverRow={explorer.setDropTarget}\n sortKey={sortKey}\n sortDirection={sortDir}\n onSortChange={handleSortChange}\n />\n </div>\n ) : (\n <div\n onClick={(event) => {\n if ((event.target as HTMLElement).closest(\"[data-file-id]\")) return;\n clearSelection();\n }}\n >\n <ExplorerGridView\n files={sortedFiles}\n protectedIds={protectedSet}\n selectedIds={selectedIds}\n onSelect={handleSelect}\n onActivate={handleActivate}\n onContextMenu={handleContextMenu}\n onDragStart={explorer.beginDrag}\n onDragEnd={explorer.endDrag}\n onDrop={handleDropOnFolder}\n draggingId={explorer.draggingId}\n draggingIds={draggingIds}\n dropTargetId={explorer.dropTargetId}\n onDragOverRow={explorer.setDropTarget}\n />\n </div>\n )}\n </div>\n\n {hasMore && sortedFiles.length > 0 ? (\n <div className=\"shrink-0 border-t border-border p-3\">\n <button\n type=\"button\"\n disabled={loadingMore || overlayMore}\n onClick={() => {\n if (overlayFiles) void loadOverlay(\"more\");\n else void loadBrowse(\"more\");\n }}\n className=\"inline-flex h-8 w-full items-center justify-center rounded-[10px] border border-border text-xs font-medium hover:bg-muted disabled:opacity-50\"\n >\n {loadingMore || overlayMore ? labels.loading : labels.loadMore}\n </button>\n </div>\n ) : null}\n\n <footer className=\"flex shrink-0 items-center justify-between gap-3 border-t border-border px-4 py-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground\">\n <span className=\"text-primary tabular-nums\">\n {sortedFiles.length}\n {hasMore ? \"+\" : \"\"}\n </span>\n {trashOpen ? ` ${labels.inTrash}` : ` ${labels.items}`}\n </span>\n {quotaBytes != null ? (\n <span className=\"hidden font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground sm:inline\">\n {formatExplorerBytes(usedBytes ?? 0)} / {formatExplorerBytes(quotaBytes)}\n </span>\n ) : null}\n </footer>\n\n <ExplorerContextMenu\n target={menu}\n mode={trashOpen ? \"trash\" : \"browse\"}\n protectedItem={menu?.kind === \"item\" ? protectedSet.has(menu.file.id) : false}\n extraFileAction={extraFileAction}\n actions={{\n deleteFile: async (input) => {\n await actions.deleteFile(input);\n clearSelection();\n await reload();\n },\n renameFile: actions.renameFile,\n restoreNode: actions.restoreNode\n ? async (input) => {\n await actions.restoreNode?.(input);\n await reload();\n }\n : undefined,\n purgeNode: actions.purgeNode\n ? async (input) => {\n await actions.purgeNode?.(input);\n await reload();\n }\n : undefined,\n createShare: actions.createShare,\n }}\n onClose={() => setMenu(null)}\n onPreview={onPreview}\n onDownload={onDownload}\n onRename={setRenameTarget}\n onRequestDelete={(file) => setDeleteTargets([file])}\n onRequestPurge={\n actions.purgeNode ? (file) => setPurgeTargets([file]) : undefined\n }\n onCopy={(file) => copyToClipboard([file])}\n onPaste={\n clipboard.length > 0 && !trashOpen\n ? (folder) => void pasteClipboard(folder ? folder.id : parentId)\n : undefined\n }\n onNewFolder={actions.createFolder ? () => setFolderOpen(true) : undefined}\n onUpload={requestUpload ? openUpload : undefined}\n />\n\n <ExplorerSelectionToast\n files={selectedFiles}\n protectedIds={protectedSet}\n trashOpen={trashOpen}\n onDownload={onDownload}\n onCopy={trashOpen ? undefined : () => copyToClipboard(selectedFiles)}\n onShare={\n actions.createShare\n ? async () => {\n const tokens: string[] = [];\n for (const file of selectedFiles) {\n if (file.kind !== \"file\") continue;\n tokens.push(await actions.createShare!({ id: file.id }));\n }\n if (tokens.length > 0) await navigator.clipboard.writeText(tokens.join(\"\\n\"));\n }\n : undefined\n }\n onDelete={() => setDeleteTargets(selectedFiles)}\n onRestore={\n actions.restoreNode\n ? async () => {\n for (const file of selectedFiles) await actions.restoreNode?.({ id: file.id });\n clearSelection();\n await reload();\n }\n : undefined\n }\n onPurge={\n actions.purgeNode ? () => setPurgeTargets(selectedFiles) : undefined\n }\n onClear={clearSelection}\n />\n <div className=\"fixed right-4 bottom-4 z-50 w-[min(22rem,calc(100vw-2rem))]\">\n <ExplorerClipboardToast\n count={clipboard.length}\n onPaste={() => void pasteClipboard()}\n onClear={() => setClipboard([])}\n />\n </div>\n\n <CreateFolderDialog\n open={folderOpen}\n onOpenChange={setFolderOpen}\n onCreate={async (name) => {\n await actions.createFolder?.({ name, parentId });\n await reload();\n }}\n />\n <CreateFolderDialog\n open={Boolean(renameTarget)}\n onOpenChange={(open) => {\n if (!open) setRenameTarget(null);\n }}\n title={labels.rename}\n description={labels.renameHint}\n confirmLabel={labels.rename}\n initialName={renameTarget?.name ?? \"\"}\n onCreate={async (name) => {\n if (!renameTarget) return;\n await actions.renameFile(renameTarget.id, name);\n setRenameTarget(null);\n await reload();\n }}\n />\n <ConfirmDeleteDialog\n open={deleteTargets.length > 0}\n names={deleteTargets.map((file) => file.name)}\n onOpenChange={(open) => {\n if (!open) setDeleteTargets([]);\n }}\n onConfirm={async () => {\n for (const file of deleteTargets) await actions.deleteFile({ id: file.id });\n setDeleteTargets([]);\n clearSelection();\n await reload();\n }}\n />\n <ConfirmDeleteDialog\n open={purgeTargets.length > 0}\n names={purgeTargets.map((file) => file.name)}\n permanent\n onOpenChange={(open) => {\n if (!open) setPurgeTargets([]);\n }}\n onConfirm={async () => {\n for (const file of purgeTargets) await actions.purgeNode?.({ id: file.id });\n setPurgeTargets([]);\n clearSelection();\n await reload();\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Inbox } from \"lucide-react\";\nimport { cn } from \"./cn\";\n\nexport interface EmptyStateProps {\n readonly title: string;\n readonly description?: string;\n readonly icon?: ReactNode;\n readonly action?: ReactNode;\n readonly className?: string;\n}\n\nexport function EmptyState(props: EmptyStateProps): React.ReactElement {\n const { title, description, icon, action, className } = props;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border bg-muted/40 p-8 text-center\",\n className,\n )}\n >\n <div className=\"rounded-full bg-background p-3 text-muted-foreground shadow-sm\">\n {icon ?? <Inbox aria-hidden=\"true\" className=\"size-6\" />}\n </div>\n <h3 className=\"text-base font-semibold text-foreground\">{title}</h3>\n {description ? (\n <p className=\"max-w-sm text-sm text-muted-foreground\">{description}</p>\n ) : null}\n {action ? <div className=\"mt-2\">{action}</div> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { AlertCircleIcon } from \"lucide-react\";\nimport type { FileSystemError } from \"./types\";\nimport { cn } from \"./cn\";\n\nexport interface ErrorStateProps {\n readonly error: FileSystemError | { code: string; message: string };\n readonly onRetry?: () => void;\n readonly className?: string;\n}\n\nexport function ErrorState(props: ErrorStateProps): React.ReactElement {\n const { error, onRetry, className } = props;\n return (\n <div\n role=\"alert\"\n className={cn(\n \"flex items-start gap-3 rounded-lg border border-destructive/30 bg-destructive/5 p-4 text-sm\",\n className,\n )}\n >\n <AlertCircleIcon\n aria-hidden=\"true\"\n className=\"mt-0.5 size-5 shrink-0 text-destructive\"\n />\n <div className=\"flex-1\">\n <p className=\"font-medium text-destructive\">{error.code}</p>\n <p className=\"mt-1 text-muted-foreground\">{error.message}</p>\n </div>\n {onRetry ? (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex h-8 items-center justify-center rounded-[10px] border border-border bg-background px-3 text-sm font-medium hover:bg-accent\"\n >\n Retry\n </button>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport type { FileNode } from \"./types\";\nimport { Overlay } from \"./overlay\";\nimport { useExplorerLabels } from \"./labels\";\n\nexport function canPreviewFile(file: Pick<FileNode, \"mimeType\" | \"name\">): boolean {\n return previewKind(file.mimeType, file.name) !== \"none\";\n}\n\nfunction previewKind(mimeType: string, name: string) {\n const mime = mimeType.toLowerCase();\n const ext = name.split(\".\").pop()?.toLowerCase() ?? \"\";\n if (mime.startsWith(\"image/\") || [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\"].includes(ext)) {\n return \"image\";\n }\n if (mime === \"application/pdf\" || ext === \"pdf\") return \"pdf\";\n if (mime.startsWith(\"video/\") || [\"mp4\", \"webm\", \"mov\"].includes(ext)) return \"video\";\n if (mime.startsWith(\"text/\") || [\"txt\", \"csv\"].includes(ext)) return \"text\";\n return \"none\";\n}\n\nexport function FilePreviewDialog({\n file,\n src,\n onClose,\n onDownload,\n}: {\n file: FileNode | null;\n src: string;\n onClose: () => void;\n onDownload: (file: FileNode) => void;\n}): React.ReactElement | null {\n const labels = useExplorerLabels();\n if (!file) return null;\n const kind = previewKind(file.mimeType, file.name);\n\n return (\n <Overlay open onClose={onClose} className=\"max-w-4xl\">\n <h2 className=\"truncate pr-6 text-base font-semibold\">{file.name}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {file.mimeType || labels.unknownType}\n </p>\n <div className=\"mt-3\">\n {kind === \"image\" ? (\n <img\n src={src}\n alt={file.name}\n className=\"max-h-[70vh] w-full rounded-[10px] object-contain\"\n />\n ) : kind === \"pdf\" || kind === \"text\" ? (\n <iframe\n src={src}\n title={file.name}\n className=\"h-[70vh] w-full rounded-[10px] border border-border bg-background\"\n />\n ) : kind === \"video\" ? (\n <video\n controls\n playsInline\n preload=\"metadata\"\n src={src}\n className=\"max-h-[70vh] w-full rounded-[10px] bg-foreground\"\n >\n {labels.previewUnavailable}\n </video>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{labels.previewUnavailable}</p>\n )}\n </div>\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n className=\"inline-flex h-8 items-center rounded-[10px] border border-border px-3 text-sm\"\n onClick={() => onDownload(file)}\n >\n {labels.download}\n </button>\n </div>\n </Overlay>\n );\n}\n"]}
|