@alfakit/react 0.1.9 → 0.1.10
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/CHANGELOG.md +6 -0
- package/dist/components/dev-tools/dev-tools-inspector.js +1 -1
- package/dist/components/dev-tools/dev-tools-inspector.js.map +1 -1
- package/dist/components/fields/checkbox-list.js +2 -2
- package/dist/components/fields/checkbox-list.js.map +1 -1
- package/dist/components/fields/rich-editor-extensions.js +14 -4
- package/dist/components/fields/rich-editor-extensions.js.map +1 -1
- package/dist/components/file-manager/file-manager.js +2 -0
- package/dist/components/file-manager/file-manager.js.map +1 -1
- package/dist/components/layout/elements.d.ts.map +1 -1
- package/dist/components/layout/elements.js +16 -5
- package/dist/components/layout/elements.js.map +1 -1
- package/dist/components/layout/mixed-content.d.ts +6 -4
- package/dist/components/layout/mixed-content.d.ts.map +1 -1
- package/dist/components/layout/mixed-content.js +6 -4
- package/dist/components/layout/mixed-content.js.map +1 -1
- package/dist/components/layout/section.js +4 -2
- package/dist/components/layout/section.js.map +1 -1
- package/dist/components/notifications/notifications-menu.d.ts.map +1 -1
- package/dist/components/notifications/notifications-menu.js +45 -17
- package/dist/components/notifications/notifications-menu.js.map +1 -1
- package/dist/components/panel/shortcuts-overlay.js +13 -10
- package/dist/components/panel/shortcuts-overlay.js.map +1 -1
- package/dist/components/table/column-manager.js +4 -4
- package/dist/components/table/column-manager.js.map +1 -1
- package/dist/components/table/spreadsheet.js +8 -1
- package/dist/components/table/spreadsheet.js.map +1 -1
- package/dist/components/translation-manager/translation-manager.js +1 -1
- package/dist/components/translation-manager/translation-manager.js.map +1 -1
- package/dist/components/widgets/stats-overview.js +3 -3
- package/dist/components/widgets/stats-overview.js.map +1 -1
- package/dist/eject-manifest.json +2 -2
- package/dist/pages/page.d.ts.map +1 -1
- package/dist/pages/page.js +4 -7
- package/dist/pages/page.js.map +1 -1
- package/dist/standalone/alfakit-component.d.ts +0 -10
- package/dist/standalone/alfakit-component.d.ts.map +1 -1
- package/dist/standalone/alfakit-component.js +3 -2
- package/dist/standalone/alfakit-component.js.map +1 -1
- package/dist/standalone/runtime.js +2 -1
- package/dist/standalone/runtime.js.map +1 -1
- package/dist/standalone.css +2 -1
- package/dist/starter-kit/navigation.d.ts +6 -1
- package/dist/starter-kit/navigation.d.ts.map +1 -1
- package/dist/starter-kit/navigation.js +3 -2
- package/dist/starter-kit/navigation.js.map +1 -1
- package/dist/starter-kit/starter-kit.d.ts.map +1 -1
- package/dist/starter-kit/starter-kit.js +1 -1
- package/dist/starter-kit/starter-kit.js.map +1 -1
- package/dist/styles.css +2 -1
- package/dist/themes.css +4 -0
- package/package.json +2 -2
- package/src/components/dev-tools/dev-tools-inspector.tsx +1 -1
- package/src/components/fields/checkbox-list.tsx +2 -2
- package/src/components/fields/rich-editor-extensions.tsx +24 -2
- package/src/components/file-manager/file-manager.tsx +3 -1
- package/src/components/layout/elements.tsx +27 -4
- package/src/components/layout/mixed-content.tsx +8 -4
- package/src/components/layout/section.tsx +2 -2
- package/src/components/notifications/notifications-menu.tsx +42 -1
- package/src/components/panel/shortcuts-overlay.tsx +29 -24
- package/src/components/table/column-manager.tsx +6 -4
- package/src/components/table/spreadsheet.tsx +18 -7
- package/src/components/translation-manager/translation-manager.tsx +1 -1
- package/src/components/widgets/stats-overview.tsx +6 -3
- package/src/pages/page.tsx +7 -3
- package/src/standalone/alfakit-component.tsx +7 -2
- package/src/standalone/runtime.ts +3 -0
- package/src/starter-kit/navigation.ts +12 -1
- package/src/starter-kit/starter-kit.tsx +3 -2
- package/src/styles.css +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-manager.js","names":[],"sources":["../../../src/components/file-manager/file-manager.tsx"],"sourcesContent":["import type {\n FileManagerEntrySchema,\n FileManagerEnvironment,\n FileManagerKind,\n FileManagerSchema,\n FileManagerSortField,\n} from '@alfakit/core'\nimport {\n FileManagerController,\n clientErrorNotification,\n fetchEditableImage,\n fileManagerAcceptAttribute,\n fileManagerExpiry,\n fileManagerSize,\n} from '@alfakit/core'\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CopyIcon,\n DownloadIcon,\n FileArchiveIcon,\n FileIcon,\n FileImageIcon,\n FileMusicIcon,\n FilePlayIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FolderIcon,\n FolderInputIcon,\n FolderOpenIcon,\n FolderPlusIcon,\n FolderTreeIcon,\n InfoIcon,\n LayoutGridIcon,\n LinkIcon,\n ListIcon,\n PencilIcon,\n PresentationIcon,\n RefreshCwIcon,\n RotateCcwIcon,\n SearchIcon,\n Share2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadIcon,\n XIcon,\n type LucideIcon,\n} from 'lucide-react'\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type DragEvent,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n} from 'react'\nimport {\n useActionRunner,\n useChoice,\n useDirection,\n useFormatter,\n usePanel,\n useT,\n} from '../../context'\nimport { useIsMobile } from '../../hooks/use-mobile'\nimport { useStore } from '../../hooks/use-store'\nimport { cn } from '../../lib/utils'\nimport { usePageActionContext } from '../actions/action-context'\nimport { ImageEditorDialog, type ImageEditRequest } from '../fields/image-editor-dialog'\nimport { showToast } from '../notifications/flash-toasts'\nimport { Button } from '../ui/button'\nimport { Card } from '../ui/card'\nimport { Checkbox } from '../ui/checkbox'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\nimport { Input } from '../ui/input'\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../ui/sheet'\nimport { Spinner } from '../ui/spinner'\n\nconst SELECT =\n 'border-input focus-visible:border-ring focus-visible:ring-ring/50 h-9 min-w-0 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]'\n\nconst KIND_ICONS: Record<FileManagerKind, LucideIcon> = {\n folder: FolderIcon,\n image: FileImageIcon,\n video: FilePlayIcon,\n audio: FileMusicIcon,\n pdf: FileTextIcon,\n text: FileTextIcon,\n archive: FileArchiveIcon,\n document: FileTextIcon,\n spreadsheet: FileSpreadsheetIcon,\n presentation: PresentationIcon,\n other: FileIcon,\n}\n\nconst SORT_FIELDS: FileManagerSortField[] = ['name', 'size', 'modified', 'type']\n\nconst IMAGE_EDITOR = { aspectRatios: [null], circle: false }\n\n/**\n * The file manager of alfasix/alfakit-file-manager (schema component `file-manager`): a\n * folder tree, breadcrumbs, grid and list views, sorting, search, multi-selection with\n * mouse and keyboard, drag and drop (uploads and moves), uploads with progress, previews,\n * details, sharing and the trash. Everything is listed, checked and changed by the server.\n */\nexport function FileManager({ component }: { component?: FileManagerSchema }) {\n return component ? (\n <FileManagerView key={`${component.disk}:${component.mode}`} schema={component} />\n ) : null\n}\n\nexport interface FileManagerViewProps {\n schema: FileManagerSchema\n /** Picker: called with the chosen files. */\n onChoose?: (entries: FileManagerEntrySchema[]) => void\n onCancel?: () => void\n}\n\nexport function FileManagerView({ schema, onChoose, onCancel }: FileManagerViewProps) {\n const runner = useActionRunner()\n const page = usePageActionContext()\n const panel = usePanel()\n const t = useT()\n const choice = useChoice()\n const direction = useDirection()\n const formatter = useFormatter()\n const labelId = useId()\n const hintId = useId()\n const tt = (key: string, replacements?: Record<string, string | number>, fallback?: string) =>\n t(`file-manager.${key}`, replacements, fallback)\n\n const environment = (): FileManagerEnvironment => ({\n runner,\n token: page.token,\n uploadEndpoint: panel.endpoints.upload,\n uploadChunkEndpoint: panel.endpoints.uploadChunks,\n uploadChunkSize: panel.uploadChunkSize,\n t,\n choice,\n formatter,\n notify: (notifications) => notifications.forEach((notification) => showToast(notification)),\n error: (message) => showToast(clientErrorNotification('file-manager', message)),\n })\n const [controller] = useState(\n () => new FileManagerController(schema, environment(), formatter.locale),\n )\n\n useEffect(() => {\n controller.setEnvironment(environment())\n })\n\n const first = useRef(true)\n\n useEffect(() => {\n if (first.current) {\n first.current = false\n\n return\n }\n\n controller.setSchema(schema)\n }, [controller, schema])\n\n useEffect(() => {\n if (schema.mode === 'picker') void controller.ensureLoaded()\n\n return () => controller.dispose()\n }, [controller, schema.mode])\n\n const state = useStore(controller.store)\n const entries = controller.visibleEntries()\n const selected = controller.selectedEntries()\n const picker = schema.mode === 'picker'\n const listRef = useRef<HTMLDivElement | null>(null)\n const items = useRef(new Map<string, HTMLElement>())\n const uploadInput = useRef<HTMLInputElement | null>(null)\n const [foldersOpen, setFoldersOpen] = useState(false)\n const mobile = useIsMobile()\n const focusPath = state.focus ?? entries[0]?.path ?? null\n\n const focusItem = (path: string | undefined) => {\n if (path) requestAnimationFrame(() => items.current.get(path)?.focus())\n }\n\n const columns = () => {\n const element = listRef.current\n\n if (!element || state.view !== 'grid' || typeof getComputedStyle === 'undefined') return 1\n\n return Math.max(\n 1,\n getComputedStyle(element).gridTemplateColumns.split(' ').filter(Boolean).length,\n )\n }\n\n const onItemKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const result = controller.handleKey(event, columns(), direction)\n\n if (result.handled) {\n event.preventDefault()\n focusItem(result.focus)\n }\n }\n\n // Taps add to the selection once something is selected (there is no Ctrl on touch screens).\n const pointer = useRef('mouse')\n\n const onItemClick = (entry: FileManagerEntrySchema, event: MouseEvent<HTMLElement>) => {\n controller.click(entry.path, {\n shift: event.shiftKey,\n toggle: event.metaKey || event.ctrlKey,\n touch: pointer.current === 'touch',\n })\n }\n\n const onItemDoubleClick = (entry: FileManagerEntrySchema) => {\n if (picker && entry.type === 'file') {\n if (entry.selectable !== false && entry.value) onChoose?.([entry])\n\n return\n }\n\n controller.openEntry(entry)\n }\n\n const copying = (event: DragEvent) => event.ctrlKey || event.altKey || event.metaKey\n\n const dropHandlers = (target: string) => ({\n onDragOver: (event: DragEvent<HTMLElement>) => {\n if (controller.dragOver(target, event.dataTransfer, copying(event))) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n onDragLeave: (event: DragEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null))\n controller.dragLeave(target)\n },\n onDrop: (event: DragEvent<HTMLElement>) => {\n event.preventDefault()\n event.stopPropagation()\n void controller.drop(target, event.dataTransfer, copying(event))\n },\n })\n\n const canWrite = !picker && !state.trash\n const single = selected.length === 1 ? selected[0] : undefined\n const folderLabel = state.trash\n ? tt('trash', {}, 'Trash')\n : (state.breadcrumbs[state.breadcrumbs.length - 1]?.name ?? tt('root', {}, 'Files'))\n\n const tree = (\n <FolderTree\n controller={controller}\n onOpen={(path) => {\n setFoldersOpen(false)\n void controller.open(path)\n }}\n active={state.trash ? null : state.path}\n dropHandlers={canWrite ? dropHandlers : undefined}\n dropTarget={state.dropTarget}\n />\n )\n\n return (\n <Card\n className=\"relative gap-0 overflow-hidden py-0\"\n data-slot=\"file-manager\"\n data-view={state.view}\n data-mode={schema.mode}\n aria-labelledby={labelId}\n >\n <span id={labelId} className=\"sr-only\">\n {tt('label', {}, 'File manager')}\n </span>\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {state.announcement}\n </div>\n\n <div\n className=\"flex flex-wrap items-center gap-2 border-b p-3\"\n data-slot=\"file-manager-toolbar\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n className=\"md:hidden\"\n onClick={() => setFoldersOpen(true)}\n aria-label={tt('toggle_folders', {}, 'Show folders')}\n >\n <FolderTreeIcon aria-hidden=\"true\" />\n </Button>\n {schema.disks.length > 1 && (\n <label className=\"flex items-center\">\n <span className=\"sr-only\">{tt('disk', {}, 'Storage')}</span>\n <select\n className={SELECT}\n value={state.disk}\n onChange={(event) => controller.setDisk(event.target.value)}\n >\n {schema.disks.map((disk) => (\n <option key={disk.name} value={disk.name}>\n {disk.label}\n </option>\n ))}\n </select>\n </label>\n )}\n <nav\n aria-label={tt('breadcrumb', {}, 'Folder path')}\n className=\"min-w-0 flex-[1_1_12rem]\"\n data-slot=\"file-manager-breadcrumb\"\n >\n <ol className=\"flex min-w-0 flex-wrap items-center gap-1 text-sm\">\n <li className=\"flex items-center\">\n <button\n type=\"button\"\n className=\"hover:bg-accent rounded px-1.5 py-1 font-medium\"\n aria-current={!state.trash && state.path === '' ? 'page' : undefined}\n onClick={() =>\n state.trash ? void controller.showTrash(false) : void controller.open('')\n }\n >\n {tt('root', {}, 'Files')}\n </button>\n </li>\n {state.trash ? (\n <Crumb current>{tt('trash', {}, 'Trash')}</Crumb>\n ) : (\n state.breadcrumbs.map((crumb, index) => (\n <Crumb\n key={crumb.path}\n current={index === state.breadcrumbs.length - 1}\n onClick={() => void controller.open(crumb.path)}\n >\n {crumb.name}\n </Crumb>\n ))\n )}\n </ol>\n </nav>\n <div className=\"flex w-full flex-wrap items-center gap-2 sm:w-auto\">\n <div className=\"relative min-w-40 flex-1 sm:flex-none\">\n <SearchIcon\n className=\"text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n value={state.query}\n onChange={(event) => controller.setQuery(event.target.value)}\n placeholder={tt('search_placeholder', {}, 'Search…')}\n aria-label={tt('search', {}, 'Search in this folder')}\n className=\"h-9 ps-8 sm:w-52\"\n disabled={state.trash}\n />\n </div>\n {schema.search.recursive && !state.trash && (\n <label className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={state.recursive}\n onCheckedChange={(checked) => controller.setRecursive(checked === true)}\n />\n {tt('search_everywhere', {}, 'Include subfolders')}\n </label>\n )}\n <label className=\"flex items-center gap-1\">\n <span className=\"sr-only\">{tt('sort', {}, 'Sort by')}</span>\n <select\n className={SELECT}\n value={state.sort.field}\n onChange={(event) =>\n controller.setSort(event.target.value as FileManagerSortField, state.sort.direction)\n }\n >\n {SORT_FIELDS.map((field) => (\n <option key={field} value={field}>\n {tt(`sort_${field}`, {}, field)}\n </option>\n ))}\n </select>\n </label>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={() =>\n controller.setSort(state.sort.field, state.sort.direction === 'asc' ? 'desc' : 'asc')\n }\n aria-label={\n state.sort.direction === 'asc'\n ? tt('ascending', {}, 'Ascending')\n : tt('descending', {}, 'Descending')\n }\n >\n {state.sort.direction === 'asc' ? (\n <ArrowUpIcon aria-hidden=\"true\" />\n ) : (\n <ArrowDownIcon aria-hidden=\"true\" />\n )}\n </Button>\n <div className=\"flex rounded-md border\" role=\"group\" aria-label={tt('view', {}, 'View')}>\n <Button\n type=\"button\"\n variant={state.view === 'grid' ? 'secondary' : 'ghost'}\n size=\"icon-sm\"\n aria-pressed={state.view === 'grid'}\n aria-label={tt('view_grid', {}, 'Grid')}\n onClick={() => controller.setView('grid')}\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant={state.view === 'list' ? 'secondary' : 'ghost'}\n size=\"icon-sm\"\n aria-pressed={state.view === 'list'}\n aria-label={tt('view_list', {}, 'List')}\n onClick={() => controller.setView('list')}\n >\n <ListIcon aria-hidden=\"true\" />\n </Button>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => void controller.refresh()}\n aria-label={tt('refresh', {}, 'Refresh')}\n >\n <RefreshCwIcon aria-hidden=\"true\" className={cn(state.loading && 'animate-spin')} />\n </Button>\n {!state.trash && controller.can('createFolder') && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => controller.openDialog({ type: 'createFolder' })}\n >\n <FolderPlusIcon aria-hidden=\"true\" />\n <span className=\"max-sm:sr-only\">{tt('new_folder', {}, 'New folder')}</span>\n </Button>\n )}\n {!state.trash && controller.can('upload') && schema.upload && (\n <>\n <Button type=\"button\" size=\"sm\" onClick={() => uploadInput.current?.click()}>\n <UploadIcon aria-hidden=\"true\" />\n <span className=\"max-sm:sr-only\">{tt('upload', {}, 'Upload')}</span>\n </Button>\n <input\n ref={uploadInput}\n type=\"file\"\n multiple\n hidden\n accept={fileManagerAcceptAttribute(schema.upload.accept)}\n data-slot=\"file-manager-upload-input\"\n onChange={(event) => {\n if (event.target.files) void controller.upload(Array.from(event.target.files))\n event.target.value = ''\n }}\n />\n </>\n )}\n {schema.trash && !picker && (\n <Button\n type=\"button\"\n variant={state.trash ? 'secondary' : 'ghost'}\n size=\"sm\"\n aria-pressed={state.trash}\n onClick={() => void controller.showTrash(!state.trash)}\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span className=\"max-sm:sr-only\">\n {state.trash ? tt('back_to_files', {}, 'Back to files') : tt('trash', {}, 'Trash')}\n </span>\n </Button>\n )}\n </div>\n </div>\n\n {selected.length > 0 && !picker && (\n <div\n className=\"bg-muted/50 flex flex-wrap items-center gap-1 border-b px-3 py-2 text-sm\"\n data-slot=\"file-manager-selection\"\n >\n <span className=\"me-2 font-medium\">\n {tt('selected', { count: selected.length }, ':count selected')}\n </span>\n {state.trash ? (\n <>\n {controller.can('restore') && (\n <ToolButton icon={RotateCcwIcon} onClick={() => void controller.restore()}>\n {tt('restore', {}, 'Restore')}\n </ToolButton>\n )}\n {controller.can('delete') && (\n <ToolButton\n icon={Trash2Icon}\n onClick={() => controller.confirmDelete()}\n destructive\n >\n {tt('delete_permanently', {}, 'Delete permanently')}\n </ToolButton>\n )}\n </>\n ) : (\n <>\n {single && (\n <ToolButton\n icon={single.type === 'folder' ? FolderOpenIcon : SearchIcon}\n onClick={() => controller.openEntry(single)}\n >\n {single.type === 'folder' ? tt('open', {}, 'Open') : tt('preview', {}, 'Preview')}\n </ToolButton>\n )}\n {controller.can('download') && (single?.type === 'file' || controller.can('zip')) && (\n <ToolButton icon={DownloadIcon} onClick={() => void controller.download()}>\n {single?.type === 'file'\n ? tt('download', {}, 'Download')\n : tt('download_zip', {}, 'Download as zip')}\n </ToolButton>\n )}\n {single && controller.can('rename') && (\n <ToolButton\n icon={PencilIcon}\n onClick={() => controller.openDialog({ type: 'rename', entry: single })}\n >\n {tt('rename', {}, 'Rename')}\n </ToolButton>\n )}\n {controller.can('move') && (\n <ToolButton\n icon={FolderInputIcon}\n onClick={() =>\n controller.openDialog({\n type: 'move',\n paths: state.selection,\n destination: state.path,\n })\n }\n >\n {tt('move', {}, 'Move')}\n </ToolButton>\n )}\n {controller.can('copy') && (\n <ToolButton\n icon={CopyIcon}\n onClick={() =>\n controller.openDialog({\n type: 'copy',\n paths: state.selection,\n destination: state.path,\n })\n }\n >\n {tt('copy', {}, 'Copy')}\n </ToolButton>\n )}\n {single?.type === 'file' && controller.can('share') && schema.share && (\n <ToolButton icon={Share2Icon} onClick={() => void controller.openShare(single)}>\n {tt('share', {}, 'Share')}\n </ToolButton>\n )}\n <ToolButton icon={InfoIcon} onClick={() => void controller.showDetails(single)}>\n {tt('details', {}, 'Details')}\n </ToolButton>\n {controller.can('delete') && (\n <ToolButton\n icon={Trash2Icon}\n onClick={() => controller.confirmDelete()}\n destructive\n >\n {tt('delete', {}, 'Delete')}\n </ToolButton>\n )}\n </>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"ms-auto\"\n onClick={() => controller.clearSelection()}\n aria-label={tt('clear_selection', {}, 'Clear selection')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </div>\n )}\n\n <div className={cn('flex', picker ? 'h-[60vh]' : 'min-h-[28rem]')}>\n <aside\n className=\"hidden w-60 shrink-0 overflow-y-auto border-e p-2 md:block\"\n data-slot=\"file-manager-sidebar\"\n >\n {tree}\n </aside>\n\n <div\n className=\"relative min-w-0 flex-1 overflow-y-auto\"\n data-slot=\"file-manager-content\"\n data-drop-target={state.dropTarget === '' ? '' : undefined}\n {...(canWrite ? dropHandlers('') : {})}\n >\n {state.trash && state.retentionDays && (\n <p className=\"text-muted-foreground border-b px-4 py-2 text-xs\">\n {tt(\n 'trash_hint',\n { days: state.retentionDays },\n 'Items in the trash are deleted for good after :days days.',\n )}\n </p>\n )}\n {(state.truncated || state.resultsTruncated) && (\n <p className=\"text-muted-foreground border-b px-4 py-2 text-xs\" role=\"note\">\n {state.resultsTruncated\n ? tt(\n 'search_truncated',\n {},\n 'Only the first results are shown. Refine your search.',\n )\n : tt('truncated', {}, 'This folder has more items than can be shown here.')}\n </p>\n )}\n <p id={hintId} className=\"sr-only\">\n {tt(\n 'keyboard',\n {},\n 'Arrow keys move between items, Shift selects a range, Enter opens.',\n )}\n </p>\n\n {(state.loading || state.searching) && entries.length === 0 ? (\n <div className=\"flex justify-center py-16\">\n <Spinner />\n <span className=\"sr-only\">{tt('loading', {}, 'Loading files')}</span>\n </div>\n ) : entries.length === 0 ? (\n <div\n className=\"text-muted-foreground flex flex-col items-center gap-2 px-6 py-16 text-center text-sm\"\n data-slot=\"file-manager-empty\"\n >\n <FolderOpenIcon className=\"size-10 opacity-40\" aria-hidden=\"true\" />\n <p className=\"text-foreground font-medium\">\n {state.query\n ? tt('no_results', {}, 'Nothing matches your search')\n : state.trash\n ? tt('empty_trash_state', {}, 'The trash is empty')\n : tt('empty', {}, 'This folder is empty')}\n </p>\n {!state.query && canWrite && controller.can('upload') && (\n <p>{tt('empty_hint', {}, 'Drop files here or choose Upload.')}</p>\n )}\n </div>\n ) : (\n <div\n ref={listRef}\n role=\"listbox\"\n aria-multiselectable={!picker || schema.multiple === true}\n aria-labelledby={labelId}\n aria-describedby={hintId}\n aria-busy={state.loading || undefined}\n data-slot=\"file-manager-items\"\n className={cn(\n state.view === 'grid'\n ? 'grid grid-cols-2 gap-3 p-3 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6'\n : 'flex flex-col p-1',\n state.loading && 'opacity-60',\n )}\n >\n {state.view === 'list' && (\n <div\n className=\"text-muted-foreground hidden grid-cols-[1fr_7rem_10rem] gap-3 px-3 py-1.5 text-xs font-medium sm:grid\"\n aria-hidden=\"true\"\n >\n <span>{tt('name', {}, 'Name')}</span>\n <span className=\"text-end\">{tt('size', {}, 'Size')}</span>\n <span>{tt('modified', {}, 'Modified')}</span>\n </div>\n )}\n {entries.map((entry) => (\n <EntryItem\n key={entry.path}\n entry={entry}\n view={state.view}\n selected={state.selection.includes(entry.path)}\n focusable={entry.path === focusPath}\n dropTarget={state.dropTarget === entry.path}\n disabled={picker && entry.type === 'file' && entry.selectable === false}\n draggable={canWrite && (controller.can('move') || controller.can('copy'))}\n showLocation={state.results !== null}\n formatter={formatter}\n tt={tt}\n ref={(element) => {\n if (element) items.current.set(entry.path, element)\n else items.current.delete(entry.path)\n }}\n onPointerDown={(event) => (pointer.current = event.pointerType)}\n onClick={(event) => onItemClick(entry, event)}\n onDoubleClick={() => onItemDoubleClick(entry)}\n onKeyDown={onItemKeyDown}\n onFocus={() => controller.focus(entry.path)}\n onDragStart={(event) => controller.dragStart(entry.path, event.dataTransfer)}\n onDragEnd={() => controller.dragEnd()}\n dropHandlers={\n entry.type === 'folder' && canWrite ? dropHandlers(entry.path) : undefined\n }\n />\n ))}\n </div>\n )}\n\n {state.dropTarget === '' && (\n <div\n className=\"border-primary bg-primary/5 text-primary pointer-events-none absolute inset-2 flex items-center justify-center rounded-lg border-2 border-dashed text-sm font-medium\"\n data-slot=\"file-manager-drop\"\n >\n {tt('drop_here', { folder: folderLabel }, 'Drop files to upload them to :folder')}\n </div>\n )}\n </div>\n\n {state.detailsOpen && (\n <aside\n className=\"hidden w-72 shrink-0 overflow-y-auto border-s md:block\"\n data-slot=\"file-manager-details\"\n >\n <Details controller={controller} tt={tt} formatter={formatter} />\n </aside>\n )}\n </div>\n\n {state.trash && entries.length > 0 && controller.can('delete') && (\n <div className=\"flex justify-end border-t p-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => controller.openDialog({ type: 'emptyTrash' })}\n >\n <Trash2Icon aria-hidden=\"true\" />\n {tt('empty_trash', {}, 'Empty trash')}\n </Button>\n </div>\n )}\n\n {picker && (\n <div\n className=\"flex flex-wrap items-center justify-end gap-2 border-t p-3\"\n data-slot=\"file-manager-picker-footer\"\n >\n <span className=\"text-muted-foreground me-auto text-sm\">\n {selected.length > 0\n ? tt('selected', { count: controller.chosen().length }, ':count selected')\n : ''}\n </span>\n <Button type=\"button\" variant=\"outline\" onClick={onCancel}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button\n type=\"button\"\n disabled={controller.chosen().length === 0}\n onClick={() => onChoose?.(controller.chosen())}\n >\n <CheckIcon aria-hidden=\"true\" />\n {tt('picker_choose', {}, 'Choose')}\n </Button>\n </div>\n )}\n\n <Sheet open={foldersOpen} onOpenChange={setFoldersOpen}>\n <SheetContent side={direction === 'rtl' ? 'right' : 'left'} className=\"p-4\">\n <SheetHeader className=\"p-0\">\n <SheetTitle>{tt('folders', {}, 'Folders')}</SheetTitle>\n </SheetHeader>\n {tree}\n </SheetContent>\n </Sheet>\n\n <Sheet\n open={state.detailsOpen && mobile}\n onOpenChange={(open) => !open && controller.closeDetails()}\n >\n <SheetContent side={direction === 'rtl' ? 'left' : 'right'} className=\"p-0\">\n <SheetHeader>\n <SheetTitle>{tt('details', {}, 'Details')}</SheetTitle>\n </SheetHeader>\n <Details controller={controller} tt={tt} formatter={formatter} hideHeading />\n </SheetContent>\n </Sheet>\n\n <Uploads controller={controller} tt={tt} />\n <Dialogs controller={controller} tt={tt} choice={choice} formatter={formatter} />\n <Preview controller={controller} tt={tt} direction={direction} />\n </Card>\n )\n}\n\ntype Translate = (\n key: string,\n replacements?: Record<string, string | number>,\n fallback?: string,\n) => string\n\nfunction Crumb({\n children,\n current,\n onClick,\n}: {\n children: ReactNode\n current?: boolean\n onClick?: () => void\n}) {\n return (\n <li className=\"flex min-w-0 items-center gap-1\">\n <ChevronRightIcon\n className=\"text-muted-foreground size-3.5 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n {current || !onClick ? (\n <span className=\"truncate px-1.5 py-1 font-medium\" aria-current=\"page\">\n {children}\n </span>\n ) : (\n <button\n type=\"button\"\n className=\"hover:bg-accent truncate rounded px-1.5 py-1\"\n onClick={onClick}\n >\n {children}\n </button>\n )}\n </li>\n )\n}\n\nfunction ToolButton({\n icon: IconComponent,\n children,\n onClick,\n destructive,\n}: {\n icon: LucideIcon\n children: ReactNode\n onClick: () => void\n destructive?: boolean\n}) {\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClick}\n className={cn(destructive && 'text-destructive hover:text-destructive')}\n >\n <IconComponent aria-hidden=\"true\" />\n <span className=\"max-md:sr-only\">{children}</span>\n </Button>\n )\n}\n\ninterface DropHandlers {\n onDragOver: (event: DragEvent<HTMLElement>) => void\n onDragLeave: (event: DragEvent<HTMLElement>) => void\n onDrop: (event: DragEvent<HTMLElement>) => void\n}\n\nfunction EntryIcon({ entry, className }: { entry: FileManagerEntrySchema; className?: string }) {\n const IconComponent = KIND_ICONS[entry.kind] ?? FileIcon\n\n return (\n <IconComponent\n className={cn(entry.type === 'folder' && 'text-primary', className)}\n aria-hidden=\"true\"\n />\n )\n}\n\nfunction EntryItem({\n entry,\n view,\n selected,\n focusable,\n dropTarget,\n disabled,\n draggable,\n showLocation,\n formatter,\n tt,\n ref,\n dropHandlers,\n ...handlers\n}: {\n entry: FileManagerEntrySchema\n view: 'grid' | 'list'\n selected: boolean\n focusable: boolean\n dropTarget: boolean\n disabled: boolean\n draggable: boolean\n showLocation: boolean\n formatter: ReturnType<typeof useFormatter>\n tt: Translate\n ref: (element: HTMLDivElement | null) => void\n dropHandlers?: DropHandlers\n onPointerDown: (event: PointerEvent<HTMLElement>) => void\n onClick: (event: MouseEvent<HTMLElement>) => void\n onDoubleClick: () => void\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void\n onFocus: () => void\n onDragStart: (event: DragEvent<HTMLElement>) => void\n onDragEnd: () => void\n}) {\n const [broken, setBroken] = useState(false)\n const size = entry.type === 'file' ? fileManagerSize(entry.size, formatter) : ''\n const modified = entry.modified ? formatter.dateTime(entry.modified) : ''\n const location =\n showLocation && entry.path.includes('/')\n ? entry.path.slice(0, entry.path.lastIndexOf('/'))\n : null\n const thumbnail = entry.thumbnail && !broken ? entry.thumbnail : null\n\n return (\n <div\n ref={ref}\n role=\"option\"\n aria-label={entry.name}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n tabIndex={focusable ? 0 : -1}\n draggable={draggable}\n data-slot=\"file-manager-item\"\n data-type={entry.type}\n data-kind={entry.kind}\n data-selected={selected ? '' : undefined}\n data-drop-target={dropTarget ? '' : undefined}\n title={entry.name}\n className={cn(\n 'group focus-visible:ring-ring/50 relative cursor-default rounded-lg outline-none select-none focus-visible:ring-[3px]',\n view === 'grid'\n ? 'hover:bg-accent/50 flex flex-col gap-2 border p-2'\n : 'hover:bg-accent/50 grid grid-cols-[auto_1fr] items-center gap-3 px-3 py-2 sm:grid-cols-[auto_1fr_7rem_10rem]',\n selected && 'bg-primary/10 border-primary/40 hover:bg-primary/15',\n dropTarget && 'ring-primary ring-2',\n disabled && 'opacity-50',\n )}\n {...handlers}\n {...dropHandlers}\n >\n {view === 'grid' ? (\n <>\n <div className=\"bg-muted/60 flex aspect-[4/3] items-center justify-center overflow-hidden rounded-md\">\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n className=\"size-full object-cover\"\n onError={() => setBroken(true)}\n />\n ) : (\n <EntryIcon entry={entry} className=\"size-10\" />\n )}\n </div>\n <div className=\"min-w-0 px-0.5\">\n <p className=\"truncate text-sm font-medium\">{entry.name}</p>\n <p className=\"text-muted-foreground truncate text-xs\">\n {location ?? (entry.type === 'folder' ? tt(`kinds.folder`, {}, 'Folder') : size)}\n </p>\n </div>\n </>\n ) : (\n <>\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n className=\"size-8 rounded object-cover\"\n onError={() => setBroken(true)}\n />\n ) : (\n <EntryIcon entry={entry} className=\"size-5\" />\n )}\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium\">{entry.name}</p>\n {location && <p className=\"text-muted-foreground truncate text-xs\">{location}</p>}\n </div>\n <span className=\"text-muted-foreground hidden text-end text-sm tabular-nums sm:block\">\n {size}\n </span>\n <span className=\"text-muted-foreground hidden truncate text-sm sm:block\">{modified}</span>\n </>\n )}\n {selected && (\n <CheckIcon\n className=\"bg-primary text-primary-foreground absolute end-1.5 top-1.5 size-4 rounded-full p-0.5\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n )\n}\n\nfunction FolderTree({\n controller,\n onOpen,\n active,\n dropHandlers,\n dropTarget,\n}: {\n controller: FileManagerController\n onOpen: (path: string) => void\n active: string | null\n dropHandlers?: (target: string) => DropHandlers\n dropTarget?: string | null\n}) {\n const t = useT()\n useStore(controller.store)\n\n const renderLevel = (parent: string, level: number): ReactNode => {\n const folders = controller.children(parent)\n\n if (!folders || folders.length === 0) return null\n\n return (\n <ul className=\"flex flex-col\" role={level === 1 ? undefined : 'group'}>\n {folders.map((folder) => {\n const expanded = controller.isExpanded(folder.path)\n\n return (\n <li key={folder.path} data-slot=\"file-manager-tree-item\">\n <div\n className={cn(\n 'hover:bg-accent flex items-center gap-1 rounded-md pe-2 text-sm',\n active === folder.path && 'bg-accent font-medium',\n dropTarget === folder.path && 'ring-primary ring-2',\n )}\n style={{ paddingInlineStart: `${(level - 1) * 0.75}rem` }}\n {...(dropHandlers ? dropHandlers(folder.path) : {})}\n >\n {folder.hasChildren ? (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground rounded p-1\"\n aria-expanded={expanded}\n aria-label={t(\n expanded ? 'file-manager.collapse' : 'file-manager.expand',\n { name: folder.name },\n expanded ? 'Collapse :name' : 'Expand :name',\n )}\n onClick={() => void controller.toggleFolder(folder.path)}\n >\n <ChevronRightIcon\n className={cn(\n 'size-3.5 transition-transform',\n expanded ? 'rotate-90' : 'rtl:rotate-180',\n )}\n aria-hidden=\"true\"\n />\n </button>\n ) : (\n <span className=\"w-5.5 shrink-0\" aria-hidden=\"true\" />\n )}\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 py-1.5 text-start\"\n aria-current={active === folder.path ? 'page' : undefined}\n onClick={() => onOpen(folder.path)}\n >\n <FolderIcon className=\"text-primary size-4 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{folder.name}</span>\n </button>\n </div>\n {expanded && renderLevel(folder.path, level + 1)}\n </li>\n )\n })}\n </ul>\n )\n }\n\n return (\n <nav aria-label={t('file-manager.folders', {}, 'Folders')} data-slot=\"file-manager-tree\">\n <button\n type=\"button\"\n className={cn(\n 'hover:bg-accent flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-start text-sm',\n active === '' && 'bg-accent font-medium',\n dropTarget === '' && active !== '' && 'ring-primary ring-2',\n )}\n aria-current={active === '' ? 'page' : undefined}\n onClick={() => onOpen('')}\n >\n <FolderOpenIcon className=\"text-primary size-4\" aria-hidden=\"true\" />\n {t('file-manager.root', {}, 'Files')}\n </button>\n {renderLevel('', 1)}\n </nav>\n )\n}\n\nfunction Details({\n controller,\n tt,\n formatter,\n hideHeading,\n}: {\n controller: FileManagerController\n tt: Translate\n formatter: ReturnType<typeof useFormatter>\n hideHeading?: boolean\n}) {\n const state = useStore(controller.store)\n const details = state.details\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n {!hideHeading && (\n <div className=\"flex items-center justify-between gap-2\">\n <h3 className=\"text-sm font-semibold\">{tt('details', {}, 'Details')}</h3>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => controller.closeDetails()}\n aria-label={tt('close', {}, 'Close')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </div>\n )}\n {!details ? (\n <p className=\"text-muted-foreground text-sm\">{tt('picker_empty', {}, 'No file chosen')}</p>\n ) : (\n <>\n <div className=\"bg-muted/60 flex aspect-video items-center justify-center overflow-hidden rounded-md\">\n {details.thumbnail ? (\n <img src={details.thumbnail} alt=\"\" className=\"size-full object-contain\" />\n ) : (\n <EntryIcon entry={details} className=\"size-12\" />\n )}\n </div>\n <p className=\"font-medium break-all\">{details.name}</p>\n {state.detailsLoading && <Spinner />}\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-sm\">\n <DetailRow\n label={tt('type', {}, 'Type')}\n value={details.mime ?? tt(`kinds.${details.kind}`, {}, details.kind)}\n />\n {details.type === 'file' && (\n <DetailRow\n label={tt('size', {}, 'Size')}\n value={fileManagerSize(details.size, formatter)}\n />\n )}\n {details.items !== undefined && (\n <DetailRow\n label={tt('items', {}, 'Items')}\n value={`${formatter.number(details.items)}${details.itemsTruncated ? '+' : ''}`}\n />\n )}\n {details.width && details.height && (\n <DetailRow\n label={tt('dimensions', {}, 'Dimensions')}\n value={tt(\n 'dimensions_value',\n {\n width: formatter.number(details.width),\n height: formatter.number(details.height),\n },\n ':width × :height px',\n )}\n />\n )}\n {details.trashed ? (\n <>\n <DetailRow\n label={tt('original_location', {}, 'Original location')}\n value={details.trashed.originalPath}\n />\n {details.trashed.deletedAt && (\n <DetailRow\n label={tt('deleted_at', {}, 'Deleted')}\n value={formatter.dateTime(details.trashed.deletedAt)}\n />\n )}\n </>\n ) : (\n <>\n {details.modified && (\n <DetailRow\n label={tt('modified', {}, 'Modified')}\n value={formatter.dateTime(details.modified)}\n />\n )}\n {details.location !== undefined && (\n <DetailRow\n label={tt('location', {}, 'Location')}\n value={details.location === '' ? tt('root', {}, 'Files') : details.location}\n />\n )}\n {details.links !== undefined && (\n <DetailRow\n label={tt('links', {}, 'Links')}\n value={formatter.number(details.links)}\n />\n )}\n </>\n )}\n </dl>\n </>\n )}\n </div>\n )\n}\n\nfunction DetailRow({ label, value }: { label: string; value: string }) {\n return (\n <>\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"min-w-0 break-all\">{value}</dd>\n </>\n )\n}\n\nfunction Uploads({ controller, tt }: { controller: FileManagerController; tt: Translate }) {\n const state = useStore(controller.store)\n const formatter = useFormatter()\n\n if (state.uploads.length === 0) return null\n\n const done = state.uploads.filter((upload) => upload.status === 'done').length\n const finished = state.uploads.every(\n (upload) => upload.status === 'done' || upload.status === 'error',\n )\n\n return (\n <section\n className=\"bg-popover fixed end-4 bottom-4 z-40 flex max-h-80 w-[min(22rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-lg border shadow-lg\"\n aria-label={tt('uploads', {}, 'Uploads')}\n data-slot=\"file-manager-uploads\"\n >\n <header className=\"flex items-center gap-2 border-b px-3 py-2 text-sm font-medium\">\n <UploadIcon className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"flex-1\" role=\"status\">\n {tt('uploads_summary', { done, total: state.uploads.length }, ':done of :total uploaded')}\n </span>\n {finished && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => controller.clearUploads()}\n aria-label={tt('dismiss', {}, 'Dismiss')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n )}\n </header>\n <ul className=\"flex flex-col gap-2 overflow-y-auto p-3\">\n {state.uploads.map((upload) => (\n <li key={upload.id} className=\"flex flex-col gap-1 text-sm\" data-status={upload.status}>\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate\">{upload.name}</span>\n {upload.status === 'done' ? (\n <CheckIcon\n className=\"size-4 text-emerald-600\"\n aria-label={tt('upload_done', {}, 'Uploaded')}\n />\n ) : upload.status === 'error' ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => controller.dismissUpload(upload.id)}\n aria-label={tt('dismiss', {}, 'Dismiss')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n ) : (\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {formatter.percent(upload.progress)}\n </span>\n )}\n </div>\n {upload.status === 'error' ? (\n <p className=\"text-destructive text-xs\" role=\"alert\">\n {upload.error ?? tt('upload_failed', {}, 'Failed')}\n </p>\n ) : (\n upload.status !== 'done' && (\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(upload.progress * 100)}\n aria-label={tt(\n 'upload_progress',\n { name: upload.name, percent: formatter.percent(upload.progress) },\n ':name, :percent uploaded',\n )}\n className=\"bg-muted h-1.5 overflow-hidden rounded-full\"\n >\n <div\n className=\"bg-primary h-full rounded-full transition-[width]\"\n style={{ width: `${upload.progress * 100}%` }}\n />\n </div>\n )\n )}\n </li>\n ))}\n </ul>\n </section>\n )\n}\n\nfunction Dialogs({\n controller,\n tt,\n choice,\n formatter,\n}: {\n controller: FileManagerController\n tt: Translate\n choice: ReturnType<typeof useChoice>\n formatter: ReturnType<typeof useFormatter>\n}) {\n const state = useStore(controller.store)\n const dialog = state.dialog\n const [name, setName] = useState('')\n const [expiry, setExpiry] = useState<string>('')\n const [copied, setCopied] = useState(false)\n const nameId = useId()\n const errorId = useId()\n const close = () => controller.closeDialog()\n const share = controller.component.share\n\n // Reset the inputs when another dialog opens (state derived during render, no effect).\n const dialogKey = dialog ? `${dialog.type}:${'entry' in dialog ? dialog.entry.path : ''}` : ''\n const [openedDialog, setOpenedDialog] = useState('')\n\n if (dialogKey !== openedDialog) {\n setOpenedDialog(dialogKey)\n\n if (dialog?.type === 'rename') setName(dialog.entry.name)\n if (dialog?.type === 'createFolder') setName('')\n if (dialog?.type === 'share') {\n setExpiry(String(share?.expiries[0] ?? ''))\n setCopied(false)\n }\n }\n\n const error = state.error ? (\n <p id={errorId} className=\"text-destructive text-sm\" role=\"alert\">\n {state.error}\n </p>\n ) : null\n\n const copy = async (url: string) => {\n try {\n await navigator.clipboard.writeText(url)\n setCopied(true)\n } catch {\n setCopied(false)\n }\n }\n\n return (\n <>\n <Dialog\n open={dialog?.type === 'createFolder' || dialog?.type === 'rename'}\n onOpenChange={(open) => !open && close()}\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(event) => {\n event.preventDefault()\n\n if (dialog?.type === 'rename') void controller.rename(dialog.entry.path, name)\n else void controller.createFolder(name)\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {dialog?.type === 'rename'\n ? tt('rename_heading', { name: dialog.entry.name }, 'Rename “:name”')\n : tt('new_folder', {}, 'New folder')}\n </DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-2\">\n <label htmlFor={nameId} className=\"text-sm font-medium\">\n {dialog?.type === 'rename'\n ? tt('name', {}, 'Name')\n : tt('folder_name', {}, 'Folder name')}\n </label>\n <Input\n id={nameId}\n value={name}\n autoFocus\n onChange={(event) => setName(event.target.value)}\n aria-invalid={state.error ? true : undefined}\n aria-describedby={state.error ? errorId : undefined}\n />\n {error}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button type=\"submit\" disabled={state.busy || name.trim() === ''}>\n {state.busy && <Spinner />}\n {dialog?.type === 'rename' ? tt('save', {}, 'Save') : tt('create', {}, 'Create')}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={dialog?.type === 'move' || dialog?.type === 'copy'}\n onOpenChange={(open) => !open && close()}\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.type === 'move' || dialog?.type === 'copy'\n ? choice(\n `file-manager.${dialog.type}_heading`,\n dialog.paths.length,\n {},\n dialog.type === 'move' ? 'Move :count items' : 'Copy :count items',\n )\n : ''}\n </DialogTitle>\n <DialogDescription>{tt('destination', {}, 'Destination folder')}</DialogDescription>\n </DialogHeader>\n <div className=\"max-h-72 overflow-y-auto rounded-md border p-2\">\n {(dialog?.type === 'move' || dialog?.type === 'copy') && (\n <FolderTree\n controller={controller}\n active={dialog.destination}\n onOpen={(path) => controller.openDialog({ ...dialog, destination: path })}\n />\n )}\n </div>\n {error}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button\n type=\"button\"\n disabled={state.busy}\n onClick={() => {\n if (dialog?.type === 'move' || dialog?.type === 'copy')\n void controller.transfer(dialog.type, dialog.paths, dialog.destination)\n }}\n >\n {state.busy && <Spinner />}\n {dialog?.type === 'copy'\n ? tt('copy_here', {}, 'Copy here')\n : tt('move_here', {}, 'Move here')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={dialog?.type === 'delete' || dialog?.type === 'emptyTrash'}\n onOpenChange={(open) => !open && close()}\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.type === 'delete'\n ? choice(\n 'file-manager.delete_heading',\n dialog.paths.length,\n {},\n 'Delete :count items?',\n )\n : tt('empty_trash_heading', {}, 'Empty the trash?')}\n </DialogTitle>\n <DialogDescription>\n {dialog?.type === 'delete' && !dialog.permanent\n ? tt(\n 'delete_description_trash',\n {},\n 'They go to the trash, where you can restore them.',\n )\n : dialog?.type === 'emptyTrash'\n ? tt(\n 'empty_trash_description',\n {},\n 'Everything in the trash is deleted for good.',\n )\n : tt(\n 'delete_description',\n {},\n 'They are deleted for good. This cannot be undone.',\n )}\n </DialogDescription>\n </DialogHeader>\n {error}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={state.busy}\n onClick={() => {\n if (dialog?.type === 'delete') void controller.remove(dialog.paths)\n else void controller.emptyTrash()\n }}\n >\n {state.busy && <Spinner />}\n {dialog?.type === 'emptyTrash'\n ? tt('empty_trash', {}, 'Empty trash')\n : dialog?.type === 'delete' && dialog.permanent\n ? tt('delete_permanently', {}, 'Delete permanently')\n : tt('delete', {}, 'Delete')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog?.type === 'share'} onOpenChange={(open) => !open && close()}>\n <DialogContent data-slot=\"file-manager-dialog\">\n {dialog?.type === 'share' && (\n <>\n <DialogHeader>\n <DialogTitle>\n {tt('share_heading', { name: dialog.entry.name }, 'Share “:name”')}\n </DialogTitle>\n <DialogDescription>\n {tt(\n 'share_hint',\n {},\n 'Anyone with the link can open this file, without signing in.',\n )}\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-wrap items-end gap-2\">\n <label className=\"flex min-w-40 flex-1 flex-col gap-1 text-sm\">\n <span className=\"font-medium\">\n {tt('share_expiry', {}, 'Link expires after')}\n </span>\n <select\n className={SELECT}\n value={expiry}\n onChange={(event) => setExpiry(event.target.value)}\n >\n {(share?.expiries ?? []).map((minutes) => {\n const label = fileManagerExpiry(minutes)\n\n return (\n <option key={minutes} value={minutes}>\n {choice(`file-manager.${label.key}`, label.count, {}, `:count`)}\n </option>\n )\n })}\n {share?.publicLinks && (\n <option value=\"never\">{tt('expiry_never', {}, 'Never')}</option>\n )}\n </select>\n </label>\n <Button\n type=\"button\"\n disabled={state.busy}\n onClick={() =>\n void controller.createLink(expiry === 'never' ? null : Number(expiry))\n }\n >\n {state.busy ? <Spinner /> : <LinkIcon aria-hidden=\"true\" />}\n {tt('create_link', {}, 'Create link')}\n </Button>\n </div>\n {error}\n {dialog.url && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium\">{tt('link', {}, 'Shareable link')}</span>\n <div className=\"flex gap-2\">\n <Input\n readOnly\n value={dialog.url}\n dir=\"ltr\"\n onFocus={(event) => event.target.select()}\n aria-label={tt('link', {}, 'Shareable link')}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => void copy(dialog.url ?? '')}\n >\n {copied ? <CheckIcon aria-hidden=\"true\" /> : <CopyIcon aria-hidden=\"true\" />}\n {copied\n ? tt('link_copied', {}, 'Link copied')\n : tt('copy_link', {}, 'Copy link')}\n </Button>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n {dialog.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(dialog.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')}\n </span>\n </div>\n )}\n {share?.publicLinks && (\n <div className=\"flex flex-col gap-2\" data-slot=\"file-manager-links\">\n <h4 className=\"text-sm font-medium\">{tt('links', {}, 'Links')}</h4>\n {dialog.links === null ? (\n <Spinner />\n ) : dialog.links.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n {tt('no_links', {}, 'No links yet')}\n </p>\n ) : (\n <ul className=\"flex max-h-48 flex-col divide-y overflow-y-auto rounded-md border\">\n {dialog.links.map((link) => (\n <li key={link.id} className=\"flex items-center gap-2 px-3 py-2 text-sm\">\n <div className=\"min-w-0 flex-1\">\n <p\n className={cn(\n 'truncate',\n link.expired && 'text-muted-foreground line-through',\n )}\n dir=\"ltr\"\n >\n {link.url}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {link.expired\n ? tt('link_expired', {}, 'Expired')\n : link.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(link.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')}\n {' · '}\n {choice(\n 'file-manager.link_downloads',\n link.downloads,\n {},\n ':count downloads',\n )}\n </p>\n </div>\n {link.url && !link.expired && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => void copy(link.url ?? '')}\n aria-label={tt('copy_link', {}, 'Copy link')}\n >\n <CopyIcon aria-hidden=\"true\" />\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive\"\n onClick={() => void controller.revokeLink(link.id)}\n >\n {tt('revoke', {}, 'Revoke')}\n </Button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('close', {}, 'Close')}\n </Button>\n </DialogFooter>\n </>\n )}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n\nfunction Preview({\n controller,\n tt,\n direction,\n}: {\n controller: FileManagerController\n tt: Translate\n direction: 'ltr' | 'rtl'\n}) {\n const state = useStore(controller.store)\n const preview = state.preview\n const data = preview?.data\n const [editing, setEditing] = useState<ImageEditRequest | null>(null)\n const previous = controller.previewSibling(-1)\n const next = controller.previewSibling(1)\n\n const edit = async () => {\n if (!data?.url || !preview) return\n\n const source = await fetchEditableImage(data.url, preview.entry.name)\n\n if (!source) return\n\n setEditing({\n file: source,\n resolve: (edited) => {\n setEditing(null)\n if (edited && edited !== source) void controller.saveEditedImage(edited)\n },\n })\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const back = direction === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n const forward = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight'\n\n if (\n event.target instanceof HTMLElement &&\n ['VIDEO', 'AUDIO', 'INPUT'].includes(event.target.tagName)\n )\n return\n\n if (event.key === back && previous) void controller.openPreview(previous)\n if (event.key === forward && next) void controller.openPreview(next)\n }\n\n return (\n <>\n <Dialog open={preview !== null} onOpenChange={(open) => !open && controller.closePreview()}>\n <DialogContent\n className=\"flex max-h-[90vh] flex-col sm:max-w-4xl\"\n data-slot=\"file-manager-preview\"\n onKeyDown={onKeyDown}\n >\n <DialogHeader>\n <DialogTitle className=\"truncate pe-8\">{preview?.entry.name}</DialogTitle>\n </DialogHeader>\n <div className=\"bg-muted/40 flex min-h-64 flex-1 items-center justify-center overflow-auto rounded-md\">\n {!data ? (\n <Spinner />\n ) : !data.previewable ? (\n <div className=\"text-muted-foreground flex flex-col items-center gap-2 p-8 text-center text-sm\">\n {preview && <EntryIcon entry={preview.entry} className=\"size-12\" />}\n <p>{tt('preview_unavailable', {}, 'There is no preview for this type of file.')}</p>\n </div>\n ) : data.kind === 'image' ? (\n <img\n src={data.url}\n alt={preview?.entry.name ?? ''}\n className=\"max-h-[70vh] max-w-full object-contain\"\n />\n ) : data.kind === 'pdf' ? (\n <iframe\n src={data.url}\n title={preview?.entry.name ?? ''}\n className=\"h-[70vh] w-full rounded-md bg-white\"\n />\n ) : data.kind === 'video' ? (\n <video src={data.url} controls className=\"max-h-[70vh] max-w-full\">\n <track kind=\"captions\" />\n </video>\n ) : data.kind === 'audio' ? (\n <audio src={data.url} controls className=\"w-full max-w-md\" />\n ) : (\n <pre\n className=\"h-full max-h-[70vh] w-full overflow-auto p-4 font-mono text-xs whitespace-pre-wrap\"\n dir=\"auto\"\n tabIndex={0}\n >\n {data.text}\n </pre>\n )}\n </div>\n {data?.truncated && (\n <p className=\"text-muted-foreground text-xs\">\n {tt('preview_truncated', {}, 'Only the beginning of this file is shown.')}\n </p>\n )}\n <DialogFooter className=\"flex-row flex-wrap items-center sm:justify-between\">\n <div className=\"flex gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={!previous}\n onClick={() => previous && void controller.openPreview(previous)}\n aria-label={tt('previous', {}, 'Previous file')}\n >\n <ChevronLeftIcon className=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={!next}\n onClick={() => next && void controller.openPreview(next)}\n aria-label={tt('next', {}, 'Next file')}\n >\n <ChevronRightIcon className=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n </div>\n <div className=\"flex gap-2\">\n {data?.editable && data.url && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => void edit()}>\n <SquarePenIcon aria-hidden=\"true\" />\n {tt('edit_image', {}, 'Edit image')}\n </Button>\n )}\n {data?.downloadUrl && (\n <Button type=\"button\" size=\"sm\" asChild>\n <a href={data.downloadUrl}>\n <DownloadIcon aria-hidden=\"true\" />\n {tt('download', {}, 'Download')}\n </a>\n </Button>\n )}\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <ImageEditorDialog request={editing} options={IMAGE_EDITOR} />\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-manager.js","names":[],"sources":["../../../src/components/file-manager/file-manager.tsx"],"sourcesContent":["import type {\n FileManagerEntrySchema,\n FileManagerEnvironment,\n FileManagerKind,\n FileManagerSchema,\n FileManagerSortField,\n} from '@alfakit/core'\nimport {\n FileManagerController,\n clientErrorNotification,\n fetchEditableImage,\n fileManagerAcceptAttribute,\n fileManagerExpiry,\n fileManagerSize,\n} from '@alfakit/core'\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CopyIcon,\n DownloadIcon,\n FileArchiveIcon,\n FileIcon,\n FileImageIcon,\n FileMusicIcon,\n FilePlayIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FolderIcon,\n FolderInputIcon,\n FolderOpenIcon,\n FolderPlusIcon,\n FolderTreeIcon,\n InfoIcon,\n LayoutGridIcon,\n LinkIcon,\n ListIcon,\n PencilIcon,\n PresentationIcon,\n RefreshCwIcon,\n RotateCcwIcon,\n SearchIcon,\n Share2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadIcon,\n XIcon,\n type LucideIcon,\n} from 'lucide-react'\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type DragEvent,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n} from 'react'\nimport {\n useActionRunner,\n useChoice,\n useDirection,\n useFormatter,\n usePanel,\n useT,\n} from '../../context'\nimport { useIsMobile } from '../../hooks/use-mobile'\nimport { useStore } from '../../hooks/use-store'\nimport { cn } from '../../lib/utils'\nimport { usePageActionContext } from '../actions/action-context'\nimport { ImageEditorDialog, type ImageEditRequest } from '../fields/image-editor-dialog'\nimport { showToast } from '../notifications/flash-toasts'\nimport { Button } from '../ui/button'\nimport { Card } from '../ui/card'\nimport { Checkbox } from '../ui/checkbox'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\nimport { Input } from '../ui/input'\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../ui/sheet'\nimport { Spinner } from '../ui/spinner'\n\nconst SELECT =\n 'border-input focus-visible:border-ring focus-visible:ring-ring/50 h-9 min-w-0 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]'\n\nconst KIND_ICONS: Record<FileManagerKind, LucideIcon> = {\n folder: FolderIcon,\n image: FileImageIcon,\n video: FilePlayIcon,\n audio: FileMusicIcon,\n pdf: FileTextIcon,\n text: FileTextIcon,\n archive: FileArchiveIcon,\n document: FileTextIcon,\n spreadsheet: FileSpreadsheetIcon,\n presentation: PresentationIcon,\n other: FileIcon,\n}\n\nconst SORT_FIELDS: FileManagerSortField[] = ['name', 'size', 'modified', 'type']\n\nconst IMAGE_EDITOR = { aspectRatios: [null], circle: false }\n\n/**\n * The file manager of alfasix/alfakit-file-manager (schema component `file-manager`): a\n * folder tree, breadcrumbs, grid and list views, sorting, search, multi-selection with\n * mouse and keyboard, drag and drop (uploads and moves), uploads with progress, previews,\n * details, sharing and the trash. Everything is listed, checked and changed by the server.\n */\nexport function FileManager({ component }: { component?: FileManagerSchema }) {\n return component ? (\n <FileManagerView key={`${component.disk}:${component.mode}`} schema={component} />\n ) : null\n}\n\nexport interface FileManagerViewProps {\n schema: FileManagerSchema\n /** Picker: called with the chosen files. */\n onChoose?: (entries: FileManagerEntrySchema[]) => void\n onCancel?: () => void\n}\n\nexport function FileManagerView({ schema, onChoose, onCancel }: FileManagerViewProps) {\n const runner = useActionRunner()\n const page = usePageActionContext()\n const panel = usePanel()\n const t = useT()\n const choice = useChoice()\n const direction = useDirection()\n const formatter = useFormatter()\n const labelId = useId()\n const hintId = useId()\n const tt = (key: string, replacements?: Record<string, string | number>, fallback?: string) =>\n t(`file-manager.${key}`, replacements, fallback)\n\n const environment = (): FileManagerEnvironment => ({\n runner,\n token: page.token,\n uploadEndpoint: panel.endpoints.upload,\n uploadChunkEndpoint: panel.endpoints.uploadChunks,\n uploadChunkSize: panel.uploadChunkSize,\n t,\n choice,\n formatter,\n notify: (notifications) => notifications.forEach((notification) => showToast(notification)),\n error: (message) => showToast(clientErrorNotification('file-manager', message)),\n })\n const [controller] = useState(\n () => new FileManagerController(schema, environment(), formatter.locale),\n )\n\n useEffect(() => {\n controller.setEnvironment(environment())\n })\n\n const first = useRef(true)\n\n useEffect(() => {\n if (first.current) {\n first.current = false\n\n return\n }\n\n controller.setSchema(schema)\n }, [controller, schema])\n\n useEffect(() => {\n if (schema.mode === 'picker') void controller.ensureLoaded()\n\n return () => controller.dispose()\n }, [controller, schema.mode])\n\n const state = useStore(controller.store)\n const entries = controller.visibleEntries()\n const selected = controller.selectedEntries()\n const picker = schema.mode === 'picker'\n const listRef = useRef<HTMLDivElement | null>(null)\n const items = useRef(new Map<string, HTMLElement>())\n const uploadInput = useRef<HTMLInputElement | null>(null)\n const [foldersOpen, setFoldersOpen] = useState(false)\n const mobile = useIsMobile()\n const focusPath = state.focus ?? entries[0]?.path ?? null\n\n const focusItem = (path: string | undefined) => {\n if (path) requestAnimationFrame(() => items.current.get(path)?.focus())\n }\n\n const columns = () => {\n const element = listRef.current\n\n if (!element || state.view !== 'grid' || typeof getComputedStyle === 'undefined') return 1\n\n return Math.max(\n 1,\n getComputedStyle(element).gridTemplateColumns.split(' ').filter(Boolean).length,\n )\n }\n\n const onItemKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const result = controller.handleKey(event, columns(), direction)\n\n if (result.handled) {\n event.preventDefault()\n focusItem(result.focus)\n }\n }\n\n // Taps add to the selection once something is selected (there is no Ctrl on touch screens).\n const pointer = useRef('mouse')\n\n const onItemClick = (entry: FileManagerEntrySchema, event: MouseEvent<HTMLElement>) => {\n controller.click(entry.path, {\n shift: event.shiftKey,\n toggle: event.metaKey || event.ctrlKey,\n touch: pointer.current === 'touch',\n })\n }\n\n const onItemDoubleClick = (entry: FileManagerEntrySchema) => {\n if (picker && entry.type === 'file') {\n if (entry.selectable !== false && entry.value) onChoose?.([entry])\n\n return\n }\n\n controller.openEntry(entry)\n }\n\n const copying = (event: DragEvent) => event.ctrlKey || event.altKey || event.metaKey\n\n const dropHandlers = (target: string) => ({\n onDragOver: (event: DragEvent<HTMLElement>) => {\n if (controller.dragOver(target, event.dataTransfer, copying(event))) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n onDragLeave: (event: DragEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null))\n controller.dragLeave(target)\n },\n onDrop: (event: DragEvent<HTMLElement>) => {\n event.preventDefault()\n event.stopPropagation()\n void controller.drop(target, event.dataTransfer, copying(event))\n },\n })\n\n const canWrite = !picker && !state.trash\n const single = selected.length === 1 ? selected[0] : undefined\n const folderLabel = state.trash\n ? tt('trash', {}, 'Trash')\n : (state.breadcrumbs[state.breadcrumbs.length - 1]?.name ?? tt('root', {}, 'Files'))\n\n const tree = (\n <FolderTree\n controller={controller}\n onOpen={(path) => {\n setFoldersOpen(false)\n void controller.open(path)\n }}\n active={state.trash ? null : state.path}\n dropHandlers={canWrite ? dropHandlers : undefined}\n dropTarget={state.dropTarget}\n />\n )\n\n return (\n <Card\n className=\"relative gap-0 overflow-hidden py-0\"\n data-slot=\"file-manager\"\n data-view={state.view}\n data-mode={schema.mode}\n aria-labelledby={labelId}\n >\n <span id={labelId} className=\"sr-only\">\n {tt('label', {}, 'File manager')}\n </span>\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {state.announcement}\n </div>\n\n <div\n className=\"flex flex-wrap items-center gap-2 border-b p-3\"\n data-slot=\"file-manager-toolbar\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n className=\"md:hidden\"\n onClick={() => setFoldersOpen(true)}\n aria-label={tt('toggle_folders', {}, 'Show folders')}\n >\n <FolderTreeIcon aria-hidden=\"true\" />\n </Button>\n {schema.disks.length > 1 && (\n <label className=\"flex items-center\">\n <span className=\"sr-only\">{tt('disk', {}, 'Storage')}</span>\n <select\n className={SELECT}\n value={state.disk}\n onChange={(event) => controller.setDisk(event.target.value)}\n >\n {schema.disks.map((disk) => (\n <option key={disk.name} value={disk.name}>\n {disk.label}\n </option>\n ))}\n </select>\n </label>\n )}\n <nav\n aria-label={tt('breadcrumb', {}, 'Folder path')}\n className=\"min-w-0 flex-[1_1_12rem]\"\n data-slot=\"file-manager-breadcrumb\"\n >\n <ol className=\"flex min-w-0 flex-wrap items-center gap-1 text-sm\">\n <li className=\"flex items-center\">\n <button\n type=\"button\"\n className=\"hover:bg-accent rounded px-1.5 py-1 font-medium\"\n aria-current={!state.trash && state.path === '' ? 'page' : undefined}\n onClick={() =>\n state.trash ? void controller.showTrash(false) : void controller.open('')\n }\n >\n {tt('root', {}, 'Files')}\n </button>\n </li>\n {state.trash ? (\n <Crumb current>{tt('trash', {}, 'Trash')}</Crumb>\n ) : (\n state.breadcrumbs.map((crumb, index) => (\n <Crumb\n key={crumb.path}\n current={index === state.breadcrumbs.length - 1}\n onClick={() => void controller.open(crumb.path)}\n >\n {crumb.name}\n </Crumb>\n ))\n )}\n </ol>\n </nav>\n <div className=\"flex w-full flex-wrap items-center gap-2 sm:w-auto\">\n <div className=\"relative min-w-40 flex-1 sm:flex-none\">\n <SearchIcon\n className=\"text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n value={state.query}\n onChange={(event) => controller.setQuery(event.target.value)}\n placeholder={tt('search_placeholder', {}, 'Search…')}\n aria-label={tt('search', {}, 'Search in this folder')}\n className=\"h-9 ps-8 sm:w-52\"\n disabled={state.trash}\n />\n </div>\n {schema.search.recursive && !state.trash && (\n <label className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={state.recursive}\n onCheckedChange={(checked) => controller.setRecursive(checked === true)}\n />\n {tt('search_everywhere', {}, 'Include subfolders')}\n </label>\n )}\n <label className=\"flex items-center gap-1\">\n <span className=\"sr-only\">{tt('sort', {}, 'Sort by')}</span>\n <select\n className={SELECT}\n value={state.sort.field}\n onChange={(event) =>\n controller.setSort(event.target.value as FileManagerSortField, state.sort.direction)\n }\n >\n {SORT_FIELDS.map((field) => (\n <option key={field} value={field}>\n {tt(`sort_${field}`, {}, field)}\n </option>\n ))}\n </select>\n </label>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={() =>\n controller.setSort(state.sort.field, state.sort.direction === 'asc' ? 'desc' : 'asc')\n }\n aria-label={\n state.sort.direction === 'asc'\n ? tt('ascending', {}, 'Ascending')\n : tt('descending', {}, 'Descending')\n }\n >\n {state.sort.direction === 'asc' ? (\n <ArrowUpIcon aria-hidden=\"true\" />\n ) : (\n <ArrowDownIcon aria-hidden=\"true\" />\n )}\n </Button>\n <div className=\"flex rounded-md border\" role=\"group\" aria-label={tt('view', {}, 'View')}>\n <Button\n type=\"button\"\n variant={state.view === 'grid' ? 'secondary' : 'ghost'}\n size=\"icon-sm\"\n aria-pressed={state.view === 'grid'}\n aria-label={tt('view_grid', {}, 'Grid')}\n onClick={() => controller.setView('grid')}\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant={state.view === 'list' ? 'secondary' : 'ghost'}\n size=\"icon-sm\"\n aria-pressed={state.view === 'list'}\n aria-label={tt('view_list', {}, 'List')}\n onClick={() => controller.setView('list')}\n >\n <ListIcon aria-hidden=\"true\" />\n </Button>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => void controller.refresh()}\n aria-label={tt('refresh', {}, 'Refresh')}\n >\n <RefreshCwIcon aria-hidden=\"true\" className={cn(state.loading && 'animate-spin')} />\n </Button>\n {!state.trash && controller.can('createFolder') && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => controller.openDialog({ type: 'createFolder' })}\n >\n <FolderPlusIcon aria-hidden=\"true\" />\n <span className=\"max-sm:sr-only\">{tt('new_folder', {}, 'New folder')}</span>\n </Button>\n )}\n {!state.trash && controller.can('upload') && schema.upload && (\n <>\n <Button type=\"button\" size=\"sm\" onClick={() => uploadInput.current?.click()}>\n <UploadIcon aria-hidden=\"true\" />\n <span className=\"max-sm:sr-only\">{tt('upload', {}, 'Upload')}</span>\n </Button>\n <input\n ref={uploadInput}\n type=\"file\"\n multiple\n hidden\n accept={fileManagerAcceptAttribute(schema.upload.accept)}\n data-slot=\"file-manager-upload-input\"\n onChange={(event) => {\n if (event.target.files) void controller.upload(Array.from(event.target.files))\n event.target.value = ''\n }}\n />\n </>\n )}\n {schema.trash && !picker && (\n <Button\n type=\"button\"\n variant={state.trash ? 'secondary' : 'ghost'}\n size=\"sm\"\n aria-pressed={state.trash}\n onClick={() => void controller.showTrash(!state.trash)}\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span className=\"max-sm:sr-only\">\n {state.trash ? tt('back_to_files', {}, 'Back to files') : tt('trash', {}, 'Trash')}\n </span>\n </Button>\n )}\n </div>\n </div>\n\n {selected.length > 0 && !picker && (\n <div\n className=\"bg-muted/50 flex flex-wrap items-center gap-1 border-b px-3 py-2 text-sm\"\n data-slot=\"file-manager-selection\"\n >\n <span className=\"me-2 font-medium\">\n {tt('selected', { count: selected.length }, ':count selected')}\n </span>\n {state.trash ? (\n <>\n {controller.can('restore') && (\n <ToolButton icon={RotateCcwIcon} onClick={() => void controller.restore()}>\n {tt('restore', {}, 'Restore')}\n </ToolButton>\n )}\n {controller.can('delete') && (\n <ToolButton\n icon={Trash2Icon}\n onClick={() => controller.confirmDelete()}\n destructive\n >\n {tt('delete_permanently', {}, 'Delete permanently')}\n </ToolButton>\n )}\n </>\n ) : (\n <>\n {single && (\n <ToolButton\n icon={single.type === 'folder' ? FolderOpenIcon : SearchIcon}\n onClick={() => controller.openEntry(single)}\n >\n {single.type === 'folder' ? tt('open', {}, 'Open') : tt('preview', {}, 'Preview')}\n </ToolButton>\n )}\n {controller.can('download') && (single?.type === 'file' || controller.can('zip')) && (\n <ToolButton icon={DownloadIcon} onClick={() => void controller.download()}>\n {single?.type === 'file'\n ? tt('download', {}, 'Download')\n : tt('download_zip', {}, 'Download as zip')}\n </ToolButton>\n )}\n {single && controller.can('rename') && (\n <ToolButton\n icon={PencilIcon}\n onClick={() => controller.openDialog({ type: 'rename', entry: single })}\n >\n {tt('rename', {}, 'Rename')}\n </ToolButton>\n )}\n {controller.can('move') && (\n <ToolButton\n icon={FolderInputIcon}\n onClick={() =>\n controller.openDialog({\n type: 'move',\n paths: state.selection,\n destination: state.path,\n })\n }\n >\n {tt('move', {}, 'Move')}\n </ToolButton>\n )}\n {controller.can('copy') && (\n <ToolButton\n icon={CopyIcon}\n onClick={() =>\n controller.openDialog({\n type: 'copy',\n paths: state.selection,\n destination: state.path,\n })\n }\n >\n {tt('copy', {}, 'Copy')}\n </ToolButton>\n )}\n {single?.type === 'file' && controller.can('share') && schema.share && (\n <ToolButton icon={Share2Icon} onClick={() => void controller.openShare(single)}>\n {tt('share', {}, 'Share')}\n </ToolButton>\n )}\n <ToolButton icon={InfoIcon} onClick={() => void controller.showDetails(single)}>\n {tt('details', {}, 'Details')}\n </ToolButton>\n {controller.can('delete') && (\n <ToolButton\n icon={Trash2Icon}\n onClick={() => controller.confirmDelete()}\n destructive\n >\n {tt('delete', {}, 'Delete')}\n </ToolButton>\n )}\n </>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"ms-auto\"\n onClick={() => controller.clearSelection()}\n aria-label={tt('clear_selection', {}, 'Clear selection')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </div>\n )}\n\n <div className={cn('flex', picker ? 'h-[60vh]' : 'min-h-[28rem]')}>\n <aside\n className=\"hidden w-60 shrink-0 overflow-y-auto border-e p-2 md:block\"\n data-slot=\"file-manager-sidebar\"\n >\n {tree}\n </aside>\n\n <div\n className=\"relative min-w-0 flex-1 overflow-y-auto\"\n data-slot=\"file-manager-content\"\n data-drop-target={state.dropTarget === '' ? '' : undefined}\n {...(canWrite ? dropHandlers('') : {})}\n >\n {state.trash && state.retentionDays && (\n <p className=\"text-muted-foreground border-b px-4 py-2 text-xs\">\n {tt(\n 'trash_hint',\n { days: state.retentionDays },\n 'Items in the trash are deleted for good after :days days.',\n )}\n </p>\n )}\n {(state.truncated || state.resultsTruncated) && (\n <p className=\"text-muted-foreground border-b px-4 py-2 text-xs\" role=\"note\">\n {state.resultsTruncated\n ? tt(\n 'search_truncated',\n {},\n 'Only the first results are shown. Refine your search.',\n )\n : tt('truncated', {}, 'This folder has more items than can be shown here.')}\n </p>\n )}\n <p id={hintId} className=\"sr-only\">\n {tt(\n 'keyboard',\n {},\n 'Arrow keys move between items, Shift selects a range, Enter opens.',\n )}\n </p>\n\n {(state.loading || state.searching) && entries.length === 0 ? (\n <div className=\"flex justify-center py-16\">\n <Spinner />\n <span className=\"sr-only\">{tt('loading', {}, 'Loading files')}</span>\n </div>\n ) : entries.length === 0 ? (\n <div\n className=\"text-muted-foreground flex flex-col items-center gap-2 px-6 py-16 text-center text-sm\"\n data-slot=\"file-manager-empty\"\n >\n <FolderOpenIcon className=\"size-10 opacity-40\" aria-hidden=\"true\" />\n <p className=\"text-foreground font-medium\">\n {state.query\n ? tt('no_results', {}, 'Nothing matches your search')\n : state.trash\n ? tt('empty_trash_state', {}, 'The trash is empty')\n : tt('empty', {}, 'This folder is empty')}\n </p>\n {!state.query && canWrite && controller.can('upload') && (\n <p>{tt('empty_hint', {}, 'Drop files here or choose Upload.')}</p>\n )}\n </div>\n ) : (\n <div\n ref={listRef}\n role=\"listbox\"\n aria-multiselectable={!picker || schema.multiple === true}\n aria-labelledby={labelId}\n aria-describedby={hintId}\n aria-busy={state.loading || undefined}\n data-slot=\"file-manager-items\"\n className={cn(\n state.view === 'grid'\n ? 'grid grid-cols-2 gap-3 p-3 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6'\n : 'flex flex-col p-1',\n state.loading && 'opacity-60',\n )}\n >\n {state.view === 'list' && (\n <div\n className=\"text-muted-foreground hidden grid-cols-[1fr_7rem_10rem] gap-3 px-3 py-1.5 text-xs font-medium sm:grid\"\n aria-hidden=\"true\"\n >\n <span>{tt('name', {}, 'Name')}</span>\n <span className=\"text-end\">{tt('size', {}, 'Size')}</span>\n <span>{tt('modified', {}, 'Modified')}</span>\n </div>\n )}\n {entries.map((entry) => (\n <EntryItem\n key={entry.path}\n entry={entry}\n view={state.view}\n selected={state.selection.includes(entry.path)}\n focusable={entry.path === focusPath}\n dropTarget={state.dropTarget === entry.path}\n disabled={picker && entry.type === 'file' && entry.selectable === false}\n draggable={canWrite && (controller.can('move') || controller.can('copy'))}\n showLocation={state.results !== null}\n formatter={formatter}\n tt={tt}\n ref={(element) => {\n if (element) items.current.set(entry.path, element)\n else items.current.delete(entry.path)\n }}\n onPointerDown={(event) => (pointer.current = event.pointerType)}\n onClick={(event) => onItemClick(entry, event)}\n onDoubleClick={() => onItemDoubleClick(entry)}\n onKeyDown={onItemKeyDown}\n onFocus={() => controller.focus(entry.path)}\n onDragStart={(event) => controller.dragStart(entry.path, event.dataTransfer)}\n onDragEnd={() => controller.dragEnd()}\n dropHandlers={\n entry.type === 'folder' && canWrite ? dropHandlers(entry.path) : undefined\n }\n />\n ))}\n </div>\n )}\n\n {state.dropTarget === '' && (\n <div\n className=\"border-primary bg-primary/5 text-primary pointer-events-none absolute inset-2 flex items-center justify-center rounded-lg border-2 border-dashed text-sm font-medium\"\n data-slot=\"file-manager-drop\"\n >\n {tt('drop_here', { folder: folderLabel }, 'Drop files to upload them to :folder')}\n </div>\n )}\n </div>\n\n {state.detailsOpen && (\n <aside\n className=\"hidden w-72 shrink-0 overflow-y-auto border-s md:block\"\n data-slot=\"file-manager-details\"\n >\n <Details controller={controller} tt={tt} formatter={formatter} />\n </aside>\n )}\n </div>\n\n {state.trash && entries.length > 0 && controller.can('delete') && (\n <div className=\"flex justify-end border-t p-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => controller.openDialog({ type: 'emptyTrash' })}\n >\n <Trash2Icon aria-hidden=\"true\" />\n {tt('empty_trash', {}, 'Empty trash')}\n </Button>\n </div>\n )}\n\n {picker && (\n <div\n className=\"flex flex-wrap items-center justify-end gap-2 border-t p-3\"\n data-slot=\"file-manager-picker-footer\"\n >\n <span className=\"text-muted-foreground me-auto text-sm\">\n {selected.length > 0\n ? tt('selected', { count: controller.chosen().length }, ':count selected')\n : ''}\n </span>\n <Button type=\"button\" variant=\"outline\" onClick={onCancel}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button\n type=\"button\"\n disabled={controller.chosen().length === 0}\n onClick={() => onChoose?.(controller.chosen())}\n >\n <CheckIcon aria-hidden=\"true\" />\n {tt('picker_choose', {}, 'Choose')}\n </Button>\n </div>\n )}\n\n <Sheet open={foldersOpen} onOpenChange={setFoldersOpen}>\n <SheetContent side={direction === 'rtl' ? 'right' : 'left'} className=\"p-4\">\n <SheetHeader className=\"p-0\">\n <SheetTitle>{tt('folders', {}, 'Folders')}</SheetTitle>\n </SheetHeader>\n {tree}\n </SheetContent>\n </Sheet>\n\n <Sheet\n open={state.detailsOpen && mobile}\n onOpenChange={(open) => !open && controller.closeDetails()}\n >\n <SheetContent side={direction === 'rtl' ? 'left' : 'right'} className=\"p-0\">\n <SheetHeader>\n <SheetTitle>{tt('details', {}, 'Details')}</SheetTitle>\n </SheetHeader>\n <Details controller={controller} tt={tt} formatter={formatter} hideHeading />\n </SheetContent>\n </Sheet>\n\n <Uploads controller={controller} tt={tt} />\n <Dialogs controller={controller} tt={tt} choice={choice} formatter={formatter} />\n <Preview controller={controller} tt={tt} direction={direction} />\n </Card>\n )\n}\n\ntype Translate = (\n key: string,\n replacements?: Record<string, string | number>,\n fallback?: string,\n) => string\n\nfunction Crumb({\n children,\n current,\n onClick,\n}: {\n children: ReactNode\n current?: boolean\n onClick?: () => void\n}) {\n return (\n <li className=\"flex min-w-0 items-center gap-1\">\n <ChevronRightIcon\n className=\"text-muted-foreground size-3.5 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n {current || !onClick ? (\n <span className=\"truncate px-1.5 py-1 font-medium\" aria-current=\"page\">\n {children}\n </span>\n ) : (\n <button\n type=\"button\"\n className=\"hover:bg-accent truncate rounded px-1.5 py-1\"\n onClick={onClick}\n >\n {children}\n </button>\n )}\n </li>\n )\n}\n\nfunction ToolButton({\n icon: IconComponent,\n children,\n onClick,\n destructive,\n}: {\n icon: LucideIcon\n children: ReactNode\n onClick: () => void\n destructive?: boolean\n}) {\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClick}\n className={cn(destructive && 'text-destructive hover:text-destructive')}\n >\n <IconComponent aria-hidden=\"true\" />\n <span className=\"max-md:sr-only\">{children}</span>\n </Button>\n )\n}\n\ninterface DropHandlers {\n onDragOver: (event: DragEvent<HTMLElement>) => void\n onDragLeave: (event: DragEvent<HTMLElement>) => void\n onDrop: (event: DragEvent<HTMLElement>) => void\n}\n\nfunction EntryIcon({ entry, className }: { entry: FileManagerEntrySchema; className?: string }) {\n const IconComponent = KIND_ICONS[entry.kind] ?? FileIcon\n\n return (\n <IconComponent\n className={cn(entry.type === 'folder' && 'text-primary', className)}\n aria-hidden=\"true\"\n />\n )\n}\n\nfunction EntryItem({\n entry,\n view,\n selected,\n focusable,\n dropTarget,\n disabled,\n draggable,\n showLocation,\n formatter,\n tt,\n ref,\n dropHandlers,\n ...handlers\n}: {\n entry: FileManagerEntrySchema\n view: 'grid' | 'list'\n selected: boolean\n focusable: boolean\n dropTarget: boolean\n disabled: boolean\n draggable: boolean\n showLocation: boolean\n formatter: ReturnType<typeof useFormatter>\n tt: Translate\n ref: (element: HTMLDivElement | null) => void\n dropHandlers?: DropHandlers\n onPointerDown: (event: PointerEvent<HTMLElement>) => void\n onClick: (event: MouseEvent<HTMLElement>) => void\n onDoubleClick: () => void\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void\n onFocus: () => void\n onDragStart: (event: DragEvent<HTMLElement>) => void\n onDragEnd: () => void\n}) {\n const [broken, setBroken] = useState(false)\n const size = entry.type === 'file' ? fileManagerSize(entry.size, formatter) : ''\n const modified = entry.modified ? formatter.dateTime(entry.modified) : ''\n const location =\n showLocation && entry.path.includes('/')\n ? entry.path.slice(0, entry.path.lastIndexOf('/'))\n : null\n const thumbnail = entry.thumbnail && !broken ? entry.thumbnail : null\n\n return (\n <div\n ref={ref}\n role=\"option\"\n aria-label={entry.name}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n tabIndex={focusable ? 0 : -1}\n draggable={draggable}\n data-slot=\"file-manager-item\"\n data-type={entry.type}\n data-kind={entry.kind}\n data-selected={selected ? '' : undefined}\n data-drop-target={dropTarget ? '' : undefined}\n title={entry.name}\n className={cn(\n 'group focus-visible:ring-ring/50 relative cursor-default rounded-lg outline-none select-none focus-visible:ring-[3px]',\n view === 'grid'\n ? 'hover:bg-accent/50 flex flex-col gap-2 border p-2'\n : 'hover:bg-accent/50 grid grid-cols-[auto_1fr] items-center gap-3 px-3 py-2 sm:grid-cols-[auto_1fr_7rem_10rem]',\n selected && 'bg-primary/10 border-primary/40 hover:bg-primary/15',\n dropTarget && 'ring-primary ring-2',\n disabled && 'opacity-50',\n )}\n {...handlers}\n {...dropHandlers}\n >\n {view === 'grid' ? (\n <>\n <div className=\"bg-muted/60 flex aspect-[4/3] items-center justify-center overflow-hidden rounded-md\">\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n className=\"size-full object-cover\"\n onError={() => setBroken(true)}\n />\n ) : (\n <EntryIcon entry={entry} className=\"size-10\" />\n )}\n </div>\n <div className=\"min-w-0 px-0.5\">\n <p className=\"truncate text-sm font-medium\">{entry.name}</p>\n <p className=\"text-muted-foreground truncate text-xs\">\n {location ?? (entry.type === 'folder' ? tt(`kinds.folder`, {}, 'Folder') : size)}\n </p>\n </div>\n </>\n ) : (\n <>\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n className=\"size-8 rounded object-cover\"\n onError={() => setBroken(true)}\n />\n ) : (\n <EntryIcon entry={entry} className=\"size-5\" />\n )}\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium\">{entry.name}</p>\n {location && <p className=\"text-muted-foreground truncate text-xs\">{location}</p>}\n </div>\n <span className=\"text-muted-foreground hidden text-end text-sm tabular-nums sm:block\">\n {size}\n </span>\n <span className=\"text-muted-foreground hidden truncate text-sm sm:block\">{modified}</span>\n </>\n )}\n {selected && (\n <CheckIcon\n className=\"bg-primary text-primary-foreground absolute end-1.5 top-1.5 size-4 rounded-full p-0.5\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n )\n}\n\nfunction FolderTree({\n controller,\n onOpen,\n active,\n dropHandlers,\n dropTarget,\n}: {\n controller: FileManagerController\n onOpen: (path: string) => void\n active: string | null\n dropHandlers?: (target: string) => DropHandlers\n dropTarget?: string | null\n}) {\n const t = useT()\n useStore(controller.store)\n\n const renderLevel = (parent: string, level: number): ReactNode => {\n const folders = controller.children(parent)\n\n if (!folders || folders.length === 0) return null\n\n return (\n <ul className=\"flex flex-col\" role={level === 1 ? undefined : 'group'}>\n {folders.map((folder) => {\n const expanded = controller.isExpanded(folder.path)\n\n return (\n <li key={folder.path} data-slot=\"file-manager-tree-item\">\n <div\n className={cn(\n 'hover:bg-accent flex items-center gap-1 rounded-md pe-2 text-sm',\n active === folder.path && 'bg-accent font-medium',\n dropTarget === folder.path && 'ring-primary ring-2',\n )}\n style={{ paddingInlineStart: `${(level - 1) * 0.75}rem` }}\n {...(dropHandlers ? dropHandlers(folder.path) : {})}\n >\n {folder.hasChildren ? (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground rounded p-1\"\n aria-expanded={expanded}\n aria-label={t(\n expanded ? 'file-manager.collapse' : 'file-manager.expand',\n { name: folder.name },\n expanded ? 'Collapse :name' : 'Expand :name',\n )}\n onClick={() => void controller.toggleFolder(folder.path)}\n >\n <ChevronRightIcon\n className={cn(\n 'size-3.5 transition-transform',\n expanded ? 'rotate-90' : 'rtl:rotate-180',\n )}\n aria-hidden=\"true\"\n />\n </button>\n ) : (\n <span className=\"w-5.5 shrink-0\" aria-hidden=\"true\" />\n )}\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 py-1.5 text-start\"\n aria-current={active === folder.path ? 'page' : undefined}\n onClick={() => onOpen(folder.path)}\n >\n <FolderIcon className=\"text-primary size-4 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{folder.name}</span>\n </button>\n </div>\n {expanded && renderLevel(folder.path, level + 1)}\n </li>\n )\n })}\n </ul>\n )\n }\n\n return (\n <nav aria-label={t('file-manager.folders', {}, 'Folders')} data-slot=\"file-manager-tree\">\n <button\n type=\"button\"\n className={cn(\n 'hover:bg-accent flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-start text-sm',\n active === '' && 'bg-accent font-medium',\n dropTarget === '' && active !== '' && 'ring-primary ring-2',\n )}\n aria-current={active === '' ? 'page' : undefined}\n onClick={() => onOpen('')}\n >\n <FolderOpenIcon className=\"text-primary size-4\" aria-hidden=\"true\" />\n {t('file-manager.root', {}, 'Files')}\n </button>\n {renderLevel('', 1)}\n </nav>\n )\n}\n\nfunction Details({\n controller,\n tt,\n formatter,\n hideHeading,\n}: {\n controller: FileManagerController\n tt: Translate\n formatter: ReturnType<typeof useFormatter>\n hideHeading?: boolean\n}) {\n const state = useStore(controller.store)\n const details = state.details\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n {!hideHeading && (\n <div className=\"flex items-center justify-between gap-2\">\n <h3 className=\"text-sm font-semibold\">{tt('details', {}, 'Details')}</h3>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => controller.closeDetails()}\n aria-label={tt('close', {}, 'Close')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </div>\n )}\n {!details ? (\n <p className=\"text-muted-foreground text-sm\">{tt('picker_empty', {}, 'No file chosen')}</p>\n ) : (\n <>\n <div className=\"bg-muted/60 flex aspect-video items-center justify-center overflow-hidden rounded-md\">\n {details.thumbnail ? (\n <img src={details.thumbnail} alt=\"\" className=\"size-full object-contain\" />\n ) : (\n <EntryIcon entry={details} className=\"size-12\" />\n )}\n </div>\n <p className=\"font-medium break-all\">{details.name}</p>\n {state.detailsLoading && <Spinner />}\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-sm\">\n <DetailRow\n label={tt('type', {}, 'Type')}\n value={details.mime ?? tt(`kinds.${details.kind}`, {}, details.kind)}\n />\n {details.type === 'file' && (\n <DetailRow\n label={tt('size', {}, 'Size')}\n value={fileManagerSize(details.size, formatter)}\n />\n )}\n {details.items !== undefined && (\n <DetailRow\n label={tt('items', {}, 'Items')}\n value={`${formatter.number(details.items)}${details.itemsTruncated ? '+' : ''}`}\n />\n )}\n {details.width && details.height && (\n <DetailRow\n label={tt('dimensions', {}, 'Dimensions')}\n value={tt(\n 'dimensions_value',\n {\n width: formatter.number(details.width),\n height: formatter.number(details.height),\n },\n ':width × :height px',\n )}\n />\n )}\n {details.trashed ? (\n <>\n <DetailRow\n label={tt('original_location', {}, 'Original location')}\n value={details.trashed.originalPath}\n />\n {details.trashed.deletedAt && (\n <DetailRow\n label={tt('deleted_at', {}, 'Deleted')}\n value={formatter.dateTime(details.trashed.deletedAt)}\n />\n )}\n </>\n ) : (\n <>\n {details.modified && (\n <DetailRow\n label={tt('modified', {}, 'Modified')}\n value={formatter.dateTime(details.modified)}\n />\n )}\n {details.location !== undefined && (\n <DetailRow\n label={tt('location', {}, 'Location')}\n value={details.location === '' ? tt('root', {}, 'Files') : details.location}\n />\n )}\n {details.links !== undefined && (\n <DetailRow\n label={tt('links', {}, 'Links')}\n value={formatter.number(details.links)}\n />\n )}\n </>\n )}\n </dl>\n </>\n )}\n </div>\n )\n}\n\nfunction DetailRow({ label, value }: { label: string; value: string }) {\n return (\n <>\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"min-w-0 break-all\">{value}</dd>\n </>\n )\n}\n\nfunction Uploads({ controller, tt }: { controller: FileManagerController; tt: Translate }) {\n const state = useStore(controller.store)\n const formatter = useFormatter()\n\n if (state.uploads.length === 0) return null\n\n const done = state.uploads.filter((upload) => upload.status === 'done').length\n const finished = state.uploads.every(\n (upload) => upload.status === 'done' || upload.status === 'error',\n )\n\n return (\n <section\n className=\"bg-popover fixed end-4 bottom-4 z-40 flex max-h-80 w-[min(22rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-lg border shadow-lg\"\n aria-label={tt('uploads', {}, 'Uploads')}\n data-slot=\"file-manager-uploads\"\n >\n <header className=\"flex items-center gap-2 border-b px-3 py-2 text-sm font-medium\">\n <UploadIcon className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"flex-1\" role=\"status\">\n {tt('uploads_summary', { done, total: state.uploads.length }, ':done of :total uploaded')}\n </span>\n {finished && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => controller.clearUploads()}\n aria-label={tt('dismiss', {}, 'Dismiss')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n )}\n </header>\n <ul className=\"flex flex-col gap-2 overflow-y-auto p-3\">\n {state.uploads.map((upload) => (\n <li key={upload.id} className=\"flex flex-col gap-1 text-sm\" data-status={upload.status}>\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate\">{upload.name}</span>\n {upload.status === 'done' ? (\n <CheckIcon\n className=\"size-4 text-emerald-600\"\n aria-label={tt('upload_done', {}, 'Uploaded')}\n />\n ) : upload.status === 'error' ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => controller.dismissUpload(upload.id)}\n aria-label={tt('dismiss', {}, 'Dismiss')}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n ) : (\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {formatter.percent(upload.progress)}\n </span>\n )}\n </div>\n {upload.status === 'error' ? (\n <p className=\"text-destructive text-xs\" role=\"alert\">\n {upload.error ?? tt('upload_failed', {}, 'Failed')}\n </p>\n ) : (\n upload.status !== 'done' && (\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(upload.progress * 100)}\n aria-label={tt(\n 'upload_progress',\n { name: upload.name, percent: formatter.percent(upload.progress) },\n ':name, :percent uploaded',\n )}\n className=\"bg-muted h-1.5 overflow-hidden rounded-full\"\n >\n <div\n className=\"bg-primary h-full rounded-full transition-[width]\"\n style={{ width: `${upload.progress * 100}%` }}\n />\n </div>\n )\n )}\n </li>\n ))}\n </ul>\n </section>\n )\n}\n\nfunction Dialogs({\n controller,\n tt,\n choice,\n formatter,\n}: {\n controller: FileManagerController\n tt: Translate\n choice: ReturnType<typeof useChoice>\n formatter: ReturnType<typeof useFormatter>\n}) {\n const state = useStore(controller.store)\n const dialog = state.dialog\n const [name, setName] = useState('')\n const [expiry, setExpiry] = useState<string>('')\n const [copied, setCopied] = useState(false)\n const nameId = useId()\n const errorId = useId()\n const close = () => controller.closeDialog()\n const share = controller.component.share\n\n // Reset the inputs when another dialog opens (state derived during render, no effect).\n const dialogKey = dialog ? `${dialog.type}:${'entry' in dialog ? dialog.entry.path : ''}` : ''\n const [openedDialog, setOpenedDialog] = useState('')\n\n if (dialogKey !== openedDialog) {\n setOpenedDialog(dialogKey)\n\n if (dialog?.type === 'rename') setName(dialog.entry.name)\n if (dialog?.type === 'createFolder') setName('')\n if (dialog?.type === 'share') {\n setExpiry(String(share?.expiries[0] ?? ''))\n setCopied(false)\n }\n }\n\n const error = state.error ? (\n <p id={errorId} className=\"text-destructive text-sm\" role=\"alert\">\n {state.error}\n </p>\n ) : null\n\n const copy = async (url: string) => {\n try {\n await navigator.clipboard.writeText(url)\n setCopied(true)\n } catch {\n setCopied(false)\n }\n }\n\n return (\n <>\n <Dialog\n open={dialog?.type === 'createFolder' || dialog?.type === 'rename'}\n onOpenChange={(open) => !open && close()}\n >\n {/* The title and the labelled field say it all: no description. */}\n <DialogContent data-slot=\"file-manager-dialog\" aria-describedby={undefined}>\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(event) => {\n event.preventDefault()\n\n if (dialog?.type === 'rename') void controller.rename(dialog.entry.path, name)\n else void controller.createFolder(name)\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {dialog?.type === 'rename'\n ? tt('rename_heading', { name: dialog.entry.name }, 'Rename “:name”')\n : tt('new_folder', {}, 'New folder')}\n </DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-2\">\n <label htmlFor={nameId} className=\"text-sm font-medium\">\n {dialog?.type === 'rename'\n ? tt('name', {}, 'Name')\n : tt('folder_name', {}, 'Folder name')}\n </label>\n <Input\n id={nameId}\n value={name}\n autoFocus\n onChange={(event) => setName(event.target.value)}\n aria-invalid={state.error ? true : undefined}\n aria-describedby={state.error ? errorId : undefined}\n />\n {error}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button type=\"submit\" disabled={state.busy || name.trim() === ''}>\n {state.busy && <Spinner />}\n {dialog?.type === 'rename' ? tt('save', {}, 'Save') : tt('create', {}, 'Create')}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={dialog?.type === 'move' || dialog?.type === 'copy'}\n onOpenChange={(open) => !open && close()}\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.type === 'move' || dialog?.type === 'copy'\n ? choice(\n `file-manager.${dialog.type}_heading`,\n dialog.paths.length,\n {},\n dialog.type === 'move' ? 'Move :count items' : 'Copy :count items',\n )\n : ''}\n </DialogTitle>\n <DialogDescription>{tt('destination', {}, 'Destination folder')}</DialogDescription>\n </DialogHeader>\n <div className=\"max-h-72 overflow-y-auto rounded-md border p-2\">\n {(dialog?.type === 'move' || dialog?.type === 'copy') && (\n <FolderTree\n controller={controller}\n active={dialog.destination}\n onOpen={(path) => controller.openDialog({ ...dialog, destination: path })}\n />\n )}\n </div>\n {error}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button\n type=\"button\"\n disabled={state.busy}\n onClick={() => {\n if (dialog?.type === 'move' || dialog?.type === 'copy')\n void controller.transfer(dialog.type, dialog.paths, dialog.destination)\n }}\n >\n {state.busy && <Spinner />}\n {dialog?.type === 'copy'\n ? tt('copy_here', {}, 'Copy here')\n : tt('move_here', {}, 'Move here')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={dialog?.type === 'delete' || dialog?.type === 'emptyTrash'}\n onOpenChange={(open) => !open && close()}\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.type === 'delete'\n ? choice(\n 'file-manager.delete_heading',\n dialog.paths.length,\n {},\n 'Delete :count items?',\n )\n : tt('empty_trash_heading', {}, 'Empty the trash?')}\n </DialogTitle>\n <DialogDescription>\n {dialog?.type === 'delete' && !dialog.permanent\n ? tt(\n 'delete_description_trash',\n {},\n 'They go to the trash, where you can restore them.',\n )\n : dialog?.type === 'emptyTrash'\n ? tt(\n 'empty_trash_description',\n {},\n 'Everything in the trash is deleted for good.',\n )\n : tt(\n 'delete_description',\n {},\n 'They are deleted for good. This cannot be undone.',\n )}\n </DialogDescription>\n </DialogHeader>\n {error}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('cancel', {}, 'Cancel')}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n disabled={state.busy}\n onClick={() => {\n if (dialog?.type === 'delete') void controller.remove(dialog.paths)\n else void controller.emptyTrash()\n }}\n >\n {state.busy && <Spinner />}\n {dialog?.type === 'emptyTrash'\n ? tt('empty_trash', {}, 'Empty trash')\n : dialog?.type === 'delete' && dialog.permanent\n ? tt('delete_permanently', {}, 'Delete permanently')\n : tt('delete', {}, 'Delete')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog?.type === 'share'} onOpenChange={(open) => !open && close()}>\n <DialogContent data-slot=\"file-manager-dialog\">\n {dialog?.type === 'share' && (\n <>\n <DialogHeader>\n <DialogTitle>\n {tt('share_heading', { name: dialog.entry.name }, 'Share “:name”')}\n </DialogTitle>\n <DialogDescription>\n {tt(\n 'share_hint',\n {},\n 'Anyone with the link can open this file, without signing in.',\n )}\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-wrap items-end gap-2\">\n <label className=\"flex min-w-40 flex-1 flex-col gap-1 text-sm\">\n <span className=\"font-medium\">\n {tt('share_expiry', {}, 'Link expires after')}\n </span>\n <select\n className={SELECT}\n value={expiry}\n onChange={(event) => setExpiry(event.target.value)}\n >\n {(share?.expiries ?? []).map((minutes) => {\n const label = fileManagerExpiry(minutes)\n\n return (\n <option key={minutes} value={minutes}>\n {choice(`file-manager.${label.key}`, label.count, {}, `:count`)}\n </option>\n )\n })}\n {share?.publicLinks && (\n <option value=\"never\">{tt('expiry_never', {}, 'Never')}</option>\n )}\n </select>\n </label>\n <Button\n type=\"button\"\n disabled={state.busy}\n onClick={() =>\n void controller.createLink(expiry === 'never' ? null : Number(expiry))\n }\n >\n {state.busy ? <Spinner /> : <LinkIcon aria-hidden=\"true\" />}\n {tt('create_link', {}, 'Create link')}\n </Button>\n </div>\n {error}\n {dialog.url && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium\">{tt('link', {}, 'Shareable link')}</span>\n <div className=\"flex gap-2\">\n <Input\n readOnly\n value={dialog.url}\n dir=\"ltr\"\n onFocus={(event) => event.target.select()}\n aria-label={tt('link', {}, 'Shareable link')}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => void copy(dialog.url ?? '')}\n >\n {copied ? <CheckIcon aria-hidden=\"true\" /> : <CopyIcon aria-hidden=\"true\" />}\n {copied\n ? tt('link_copied', {}, 'Link copied')\n : tt('copy_link', {}, 'Copy link')}\n </Button>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n {dialog.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(dialog.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')}\n </span>\n </div>\n )}\n {share?.publicLinks && (\n <div className=\"flex flex-col gap-2\" data-slot=\"file-manager-links\">\n <h4 className=\"text-sm font-medium\">{tt('links', {}, 'Links')}</h4>\n {dialog.links === null ? (\n <Spinner />\n ) : dialog.links.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n {tt('no_links', {}, 'No links yet')}\n </p>\n ) : (\n <ul className=\"flex max-h-48 flex-col divide-y overflow-y-auto rounded-md border\">\n {dialog.links.map((link) => (\n <li key={link.id} className=\"flex items-center gap-2 px-3 py-2 text-sm\">\n <div className=\"min-w-0 flex-1\">\n <p\n className={cn(\n 'truncate',\n link.expired && 'text-muted-foreground line-through',\n )}\n dir=\"ltr\"\n >\n {link.url}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {link.expired\n ? tt('link_expired', {}, 'Expired')\n : link.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(link.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')}\n {' · '}\n {choice(\n 'file-manager.link_downloads',\n link.downloads,\n {},\n ':count downloads',\n )}\n </p>\n </div>\n {link.url && !link.expired && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={() => void copy(link.url ?? '')}\n aria-label={tt('copy_link', {}, 'Copy link')}\n >\n <CopyIcon aria-hidden=\"true\" />\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive\"\n onClick={() => void controller.revokeLink(link.id)}\n >\n {tt('revoke', {}, 'Revoke')}\n </Button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {tt('close', {}, 'Close')}\n </Button>\n </DialogFooter>\n </>\n )}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n\nfunction Preview({\n controller,\n tt,\n direction,\n}: {\n controller: FileManagerController\n tt: Translate\n direction: 'ltr' | 'rtl'\n}) {\n const state = useStore(controller.store)\n const preview = state.preview\n const data = preview?.data\n const [editing, setEditing] = useState<ImageEditRequest | null>(null)\n const previous = controller.previewSibling(-1)\n const next = controller.previewSibling(1)\n\n const edit = async () => {\n if (!data?.url || !preview) return\n\n const source = await fetchEditableImage(data.url, preview.entry.name)\n\n if (!source) return\n\n setEditing({\n file: source,\n resolve: (edited) => {\n setEditing(null)\n if (edited && edited !== source) void controller.saveEditedImage(edited)\n },\n })\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const back = direction === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n const forward = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight'\n\n if (\n event.target instanceof HTMLElement &&\n ['VIDEO', 'AUDIO', 'INPUT'].includes(event.target.tagName)\n )\n return\n\n if (event.key === back && previous) void controller.openPreview(previous)\n if (event.key === forward && next) void controller.openPreview(next)\n }\n\n return (\n <>\n <Dialog open={preview !== null} onOpenChange={(open) => !open && controller.closePreview()}>\n <DialogContent\n className=\"flex max-h-[90vh] flex-col sm:max-w-4xl\"\n data-slot=\"file-manager-preview\"\n aria-describedby={undefined}\n onKeyDown={onKeyDown}\n >\n <DialogHeader>\n <DialogTitle className=\"truncate pe-8\">{preview?.entry.name}</DialogTitle>\n </DialogHeader>\n <div className=\"bg-muted/40 flex min-h-64 flex-1 items-center justify-center overflow-auto rounded-md\">\n {!data ? (\n <Spinner />\n ) : !data.previewable ? (\n <div className=\"text-muted-foreground flex flex-col items-center gap-2 p-8 text-center text-sm\">\n {preview && <EntryIcon entry={preview.entry} className=\"size-12\" />}\n <p>{tt('preview_unavailable', {}, 'There is no preview for this type of file.')}</p>\n </div>\n ) : data.kind === 'image' ? (\n <img\n src={data.url}\n alt={preview?.entry.name ?? ''}\n className=\"max-h-[70vh] max-w-full object-contain\"\n />\n ) : data.kind === 'pdf' ? (\n <iframe\n src={data.url}\n title={preview?.entry.name ?? ''}\n className=\"h-[70vh] w-full rounded-md bg-white\"\n />\n ) : data.kind === 'video' ? (\n <video src={data.url} controls className=\"max-h-[70vh] max-w-full\">\n <track kind=\"captions\" />\n </video>\n ) : data.kind === 'audio' ? (\n <audio src={data.url} controls className=\"w-full max-w-md\" />\n ) : (\n <pre\n className=\"h-full max-h-[70vh] w-full overflow-auto p-4 font-mono text-xs whitespace-pre-wrap\"\n dir=\"auto\"\n tabIndex={0}\n >\n {data.text}\n </pre>\n )}\n </div>\n {data?.truncated && (\n <p className=\"text-muted-foreground text-xs\">\n {tt('preview_truncated', {}, 'Only the beginning of this file is shown.')}\n </p>\n )}\n <DialogFooter className=\"flex-row flex-wrap items-center sm:justify-between\">\n <div className=\"flex gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={!previous}\n onClick={() => previous && void controller.openPreview(previous)}\n aria-label={tt('previous', {}, 'Previous file')}\n >\n <ChevronLeftIcon className=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={!next}\n onClick={() => next && void controller.openPreview(next)}\n aria-label={tt('next', {}, 'Next file')}\n >\n <ChevronRightIcon className=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n </div>\n <div className=\"flex gap-2\">\n {data?.editable && data.url && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => void edit()}>\n <SquarePenIcon aria-hidden=\"true\" />\n {tt('edit_image', {}, 'Edit image')}\n </Button>\n )}\n {data?.downloadUrl && (\n <Button type=\"button\" size=\"sm\" asChild>\n <a href={data.downloadUrl}>\n <DownloadIcon aria-hidden=\"true\" />\n {tt('download', {}, 'Download')}\n </a>\n </Button>\n )}\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <ImageEditorDialog request={editing} options={IMAGE_EDITOR} />\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elements.d.ts","names":[],"sources":["../../../src/components/layout/elements.tsx"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"elements.d.ts","names":[],"sources":["../../../src/components/layout/elements.tsx"],"mappings":";;;wBAiCgB,gBAAgB;EAAe,WAAW;oBAAY,IAAA;wBAqCtD,mBAAmB;EAAe,WAAW;oBAAe,IAAA;wBAqE5D,sBAAsB;EAAe,WAAW;oBAA2B,IAAA;wBA4D3E,gBAAgB;EAAe,WAAW;IAAY,+CAAA;wBA2BtD,iBAAiB;EAAe,WAAW;oBAAa,IAAA;wBAoCxD,yBAAyB;EAAe,WAAW;oBAAqB,IAAA"}
|
|
@@ -5,6 +5,8 @@ import { Icon } from "../../lib/icons.js";
|
|
|
5
5
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip.js";
|
|
6
6
|
import { extraProps } from "../../lib/attributes.js";
|
|
7
7
|
import { ActionList } from "../actions/action-list.js";
|
|
8
|
+
import { useOptionalFormStore } from "../form/form-context.js";
|
|
9
|
+
import { useFieldActionContext } from "../schema/field-actions.js";
|
|
8
10
|
import { RenderComponent } from "../schema/schema-renderer.js";
|
|
9
11
|
import { MixedContent } from "./mixed-content.js";
|
|
10
12
|
import { actionsAlignmentClass, flexItemClasses, flexLayoutClasses, schemaGapClass } from "@alfakit/core";
|
|
@@ -39,7 +41,10 @@ const CALLOUT_ICON_SIZES = {
|
|
|
39
41
|
"2xl": "size-8"
|
|
40
42
|
};
|
|
41
43
|
function CalloutComponent({ component }) {
|
|
42
|
-
const
|
|
44
|
+
const form = useOptionalFormStore();
|
|
45
|
+
const pageContext = usePageActionContext();
|
|
46
|
+
const fieldContext = useFieldActionContext(component);
|
|
47
|
+
const context = form ? fieldContext : pageContext;
|
|
43
48
|
const tone = component.color ?? component.status;
|
|
44
49
|
const iconColor = component.iconColor ?? (component.color ? void 0 : component.status);
|
|
45
50
|
return /* @__PURE__ */ jsxs("div", {
|
|
@@ -77,20 +82,25 @@ function CalloutComponent({ component }) {
|
|
|
77
82
|
/* @__PURE__ */ jsx(MixedContent, {
|
|
78
83
|
items: component.footer,
|
|
79
84
|
name: "callout-footer",
|
|
80
|
-
className: "mt-2"
|
|
85
|
+
className: "mt-2",
|
|
86
|
+
context
|
|
81
87
|
})
|
|
82
88
|
]
|
|
83
89
|
}),
|
|
84
90
|
/* @__PURE__ */ jsx(MixedContent, {
|
|
85
91
|
items: component.controls,
|
|
86
92
|
name: "callout-controls",
|
|
87
|
-
className: "-me-1 -mt-1 shrink-0 gap-1"
|
|
93
|
+
className: "-me-1 -mt-1 shrink-0 gap-1",
|
|
94
|
+
context
|
|
88
95
|
})
|
|
89
96
|
]
|
|
90
97
|
});
|
|
91
98
|
}
|
|
92
99
|
function EmptyStateComponent({ component }) {
|
|
93
|
-
const
|
|
100
|
+
const form = useOptionalFormStore();
|
|
101
|
+
const pageContext = usePageActionContext();
|
|
102
|
+
const fieldContext = useFieldActionContext(component);
|
|
103
|
+
const context = form ? fieldContext : pageContext;
|
|
94
104
|
return /* @__PURE__ */ jsxs("div", {
|
|
95
105
|
"data-slot": "empty-state",
|
|
96
106
|
...extraProps(component.extraAttributes, cn("flex flex-col items-center justify-center gap-3 px-6 py-10 text-center", component.contained && "rounded-xl border border-dashed")),
|
|
@@ -118,7 +128,8 @@ function EmptyStateComponent({ component }) {
|
|
|
118
128
|
/* @__PURE__ */ jsx(MixedContent, {
|
|
119
129
|
items: component.footer,
|
|
120
130
|
name: "empty-state-footer",
|
|
121
|
-
className: "justify-center"
|
|
131
|
+
className: "justify-center",
|
|
132
|
+
context
|
|
122
133
|
})
|
|
123
134
|
]
|
|
124
135
|
});
|