@harryy/react-file-browser 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/dist/adapters/cloud-adapter-base.d.ts +27 -0
  4. package/dist/adapters/cloud-adapter-base.d.ts.map +1 -0
  5. package/dist/adapters/in-memory/in-memory-file-browser-adapter.d.ts +53 -0
  6. package/dist/adapters/in-memory/in-memory-file-browser-adapter.d.ts.map +1 -0
  7. package/dist/adapters/in-memory/index.d.ts +2 -0
  8. package/dist/adapters/in-memory/index.d.ts.map +1 -0
  9. package/dist/adapters/in-memory/index.js +270 -0
  10. package/dist/adapters/in-memory/index.js.map +1 -0
  11. package/dist/adapters/r2/index.d.ts +7 -0
  12. package/dist/adapters/r2/index.d.ts.map +1 -0
  13. package/dist/adapters/r2/index.js +11 -0
  14. package/dist/adapters/r2/index.js.map +1 -0
  15. package/dist/adapters/s3/index.d.ts +7 -0
  16. package/dist/adapters/s3/index.d.ts.map +1 -0
  17. package/dist/adapters/s3/index.js +11 -0
  18. package/dist/adapters/s3/index.js.map +1 -0
  19. package/dist/adapters/s3-compatible-adapter.d.ts +50 -0
  20. package/dist/adapters/s3-compatible-adapter.d.ts.map +1 -0
  21. package/dist/adapters/supabase/index.d.ts +7 -0
  22. package/dist/adapters/supabase/index.d.ts.map +1 -0
  23. package/dist/adapters/supabase/index.js +216 -0
  24. package/dist/adapters/supabase/index.js.map +1 -0
  25. package/dist/adapters/supabase/supabase-file-browser-adapter.d.ts +88 -0
  26. package/dist/adapters/supabase/supabase-file-browser-adapter.d.ts.map +1 -0
  27. package/dist/chunks/browser-4lIkMGbo.js +436 -0
  28. package/dist/chunks/browser-4lIkMGbo.js.map +1 -0
  29. package/dist/chunks/cloud-adapter-base-CBUoZYLS.js +39 -0
  30. package/dist/chunks/cloud-adapter-base-CBUoZYLS.js.map +1 -0
  31. package/dist/chunks/path-CPm7s9NF.js +52 -0
  32. package/dist/chunks/path-CPm7s9NF.js.map +1 -0
  33. package/dist/chunks/s3-compatible-adapter-D9agsn9e.js +317 -0
  34. package/dist/chunks/s3-compatible-adapter-D9agsn9e.js.map +1 -0
  35. package/dist/components/file-browser.d.ts +28 -0
  36. package/dist/components/file-browser.d.ts.map +1 -0
  37. package/dist/core/path.d.ts +9 -0
  38. package/dist/core/path.d.ts.map +1 -0
  39. package/dist/core/types.d.ts +84 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/upload-drop.d.ts +7 -0
  42. package/dist/core/upload-drop.d.ts.map +1 -0
  43. package/dist/core/use-file-browser.d.ts +78 -0
  44. package/dist/core/use-file-browser.d.ts.map +1 -0
  45. package/dist/index.d.ts +9 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +3212 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/theme/index.d.ts +25 -0
  50. package/dist/theme/index.d.ts.map +1 -0
  51. package/dist/theme/index.js +28 -0
  52. package/dist/theme/index.js.map +1 -0
  53. package/dist/transfers/file-browser-provider.d.ts +13 -0
  54. package/dist/transfers/file-browser-provider.d.ts.map +1 -0
  55. package/dist/transfers/transfer-manager.d.ts +118 -0
  56. package/dist/transfers/transfer-manager.d.ts.map +1 -0
  57. package/package.json +137 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../src/core/use-file-browser.ts","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/lucide-react/dist/esm/context.mjs","../node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/lucide-react/dist/esm/icons/chevron-left.mjs","../node_modules/lucide-react/dist/esm/icons/chevron-right.mjs","../node_modules/lucide-react/dist/esm/icons/copy.mjs","../node_modules/lucide-react/dist/esm/icons/download.mjs","../node_modules/lucide-react/dist/esm/icons/file.mjs","../node_modules/lucide-react/dist/esm/icons/folder-input.mjs","../node_modules/lucide-react/dist/esm/icons/folder.mjs","../node_modules/lucide-react/dist/esm/icons/grid-2x2.mjs","../node_modules/lucide-react/dist/esm/icons/list.mjs","../node_modules/lucide-react/dist/esm/icons/pause.mjs","../node_modules/lucide-react/dist/esm/icons/pencil.mjs","../node_modules/lucide-react/dist/esm/icons/play.mjs","../node_modules/lucide-react/dist/esm/icons/scissors.mjs","../node_modules/lucide-react/dist/esm/icons/search.mjs","../node_modules/lucide-react/dist/esm/icons/square-check-big.mjs","../node_modules/lucide-react/dist/esm/icons/square.mjs","../node_modules/lucide-react/dist/esm/icons/trash-2.mjs","../node_modules/lucide-react/dist/esm/icons/upload.mjs","../node_modules/lucide-react/dist/esm/icons/x.mjs","../src/core/upload-drop.ts","../src/transfers/transfer-manager.ts","../src/transfers/file-browser-provider.tsx","../src/components/file-browser.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { Dispatch, SetStateAction } from 'react'\nimport { FileBrowserAdapterError, FileBrowserBulkActionError } from './types'\nimport type { FileBrowserAdapter, FileNode } from './types'\nimport { joinFileBrowserPath, normalizeFileBrowserPath } from './path'\n\nexport type FileBrowserStatus = 'idle' | 'loading' | 'ready' | 'error'\nexport type FileBrowserView = 'grid' | 'list'\nexport type FileBrowserKindFilter = 'all' | 'files' | 'folders'\nexport type FileBrowserUploadConflictResolution = 'replace' | 'keep-both' | 'skip'\nexport type FileBrowserUploadFilesOptions = {\n\tonConflict?: FileBrowserUploadConflictResolution\n}\nexport type FileBrowserClipboard = { type: 'copy'; paths: string[] } | { type: 'cut'; paths: string[] } | null\n\nexport type FileBrowserCapabilities = {\n\tcreateFolder: boolean\n\trename: boolean\n\tmove: boolean\n\tcopy: boolean\n\tstat: boolean\n\texists: boolean\n\tmultipart: boolean\n\tbulkDownload: boolean\n}\n\nexport type UseFileBrowserOptions = {\n\tadapter: FileBrowserAdapter\n\tinitialPath?: string\n}\n\nexport type UseFileBrowserResult = {\n\tadapter: FileBrowserAdapter\n\tcapabilities: FileBrowserCapabilities\n\tcurrentPath: string\n\tstatus: FileBrowserStatus\n\titems: FileNode[]\n\terror: Error | null\n\thasMore: boolean\n\tselectedPaths: string[]\n\tselectedItems: FileNode[]\n\tfocusedPath: string | null\n\tclipboard: FileBrowserClipboard\n\tview: FileBrowserView\n\tsearchQuery: string\n\tfilterKind: FileBrowserKindFilter\n\tsortBy: 'name' | 'modifiedAt' | 'size'\n\tsortDirection: 'asc' | 'desc'\n\tfilteredItems: FileNode[]\n\tsetView: Dispatch<SetStateAction<FileBrowserView>>\n\tsetSearchQuery: Dispatch<SetStateAction<string>>\n\tsetFilterKind: Dispatch<SetStateAction<FileBrowserKindFilter>>\n\tsetSortBy: Dispatch<SetStateAction<'name' | 'modifiedAt' | 'size'>>\n\tsetSortDirection: Dispatch<SetStateAction<'asc' | 'desc'>>\n\trefresh: () => Promise<void>\n\tloadMore: () => Promise<void>\n\tnavigate: (path: string) => Promise<void>\n\topen: (node: FileNode) => Promise<void>\n\tselectOnly: (path: string) => void\n\ttoggleSelection: (path: string) => void\n\tselectRange: (path: string) => void\n\tsetSelection: (paths: string[], options?: { additive?: boolean }) => void\n\tselectAllLoaded: () => void\n\tclearSelection: () => void\n\tcreateFolder: (name: string) => Promise<FileNode>\n\trename: (path: string, newName: string) => Promise<FileNode>\n\tdeleteSelected: () => Promise<void>\n\tdeletePaths: (paths: string[]) => Promise<void>\n\tmovePathsTo: (paths: string[], toDir: string) => Promise<void>\n\tmoveSelectedTo: (toDir: string) => Promise<void>\n\tcopySelection: (paths?: string[]) => void\n\tcutSelection: (paths?: string[]) => void\n\tpasteInto: (toDir: string) => Promise<void>\n\tuploadFiles: (files: File[] | FileList, options?: FileBrowserUploadFilesOptions) => Promise<FileNode[]>\n}\n\nexport function useFileBrowser({ adapter, initialPath = '/' }: UseFileBrowserOptions): UseFileBrowserResult {\n\tconst [currentPath, setCurrentPath] = useState(() => normalizeFileBrowserPath(initialPath))\n\tconst [status, setStatus] = useState<FileBrowserStatus>('loading')\n\tconst [items, setItems] = useState<FileNode[]>([])\n\tconst [cursor, setCursor] = useState<string | undefined>()\n\tconst [error, setError] = useState<Error | null>(null)\n\tconst [selected, setSelected] = useState<Set<string>>(() => new Set())\n\tconst [focusedPath, setFocusedPath] = useState<string | null>(null)\n\tconst [rangeAnchor, setRangeAnchor] = useState<string | null>(null)\n\tconst [clipboard, setClipboard] = useState<FileBrowserClipboard>(null)\n\tconst [view, setView] = useState<FileBrowserView>('grid')\n\tconst [searchQuery, setSearchQuery] = useState('')\n\tconst [filterKind, setFilterKind] = useState<FileBrowserKindFilter>('all')\n\tconst [sortBy, setSortBy] = useState<'name' | 'modifiedAt' | 'size'>('name')\n\tconst [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')\n\tconst requestIdRef = useRef(0)\n\tconst currentPathRef = useRef(currentPath)\n\n\tconst capabilities = useMemo<FileBrowserCapabilities>(\n\t\t() => ({\n\t\t\tcreateFolder: typeof adapter.createFolder === 'function',\n\t\t\trename: typeof adapter.rename === 'function',\n\t\t\tmove: typeof adapter.move === 'function',\n\t\t\tcopy: typeof adapter.copy === 'function',\n\t\t\tstat: typeof adapter.stat === 'function',\n\t\t\texists: typeof adapter.exists === 'function',\n\t\t\tmultipart:\n\t\t\t\ttypeof adapter.createMultipartUpload === 'function' &&\n\t\t\t\ttypeof adapter.uploadPart === 'function' &&\n\t\t\t\ttypeof adapter.completeMultipartUpload === 'function',\n\t\t\tbulkDownload: typeof adapter.bulkDownloadUrl === 'function'\n\t\t}),\n\t\t[adapter]\n\t)\n\n\tconst selectedPaths = useMemo(() => sortPaths(Array.from(selected)), [selected])\n\tconst selectedItems = useMemo(() => items.filter((item) => selected.has(item.path)), [items, selected])\n\n\tconst filteredItems = useMemo(() => {\n\t\tconst query = searchQuery.trim().toLowerCase()\n\t\treturn [...items]\n\t\t\t.filter((item) => (query ? item.name.toLowerCase().includes(query) : true))\n\t\t\t.filter((item) => (filterKind === 'all' ? true : item.kind === (filterKind === 'files' ? 'file' : 'folder')))\n\t\t\t.sort((left, right) => compareNodes(left, right, sortBy, sortDirection))\n\t}, [filterKind, items, searchQuery, sortBy, sortDirection])\n\n\tconst loadPath = useCallback(\n\t\tasync (path: string, mode: 'replace' | 'append') => {\n\t\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\t\tconst requestId = ++requestIdRef.current\n\n\t\t\tsetStatus((current) => (mode === 'replace' || current === 'idle' ? 'loading' : current))\n\t\t\tsetError(null)\n\n\t\t\ttry {\n\t\t\t\tconst result = await adapter.list(normalized, {\n\t\t\t\t\tcursor: mode === 'append' ? cursor : undefined\n\t\t\t\t})\n\n\t\t\t\tif (requestId !== requestIdRef.current) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tsetItems((current) => (mode === 'append' ? mergeItems(current, result.items) : result.items))\n\t\t\t\tsetCursor(result.cursor)\n\t\t\t\tsetStatus('ready')\n\t\t\t} catch (caught) {\n\t\t\t\tif (requestId !== requestIdRef.current) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tsetError(toError(caught))\n\t\t\t\tsetStatus('error')\n\t\t\t}\n\t\t},\n\t\t[adapter, cursor]\n\t)\n\n\tconst refresh = useCallback(async () => {\n\t\tawait loadPath(currentPath, 'replace')\n\t}, [currentPath, loadPath])\n\n\tconst navigate = useCallback(\n\t\tasync (path: string) => {\n\t\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\t\tcurrentPathRef.current = normalized\n\t\t\tsetCurrentPath(normalized)\n\t\t\tsetSelected(new Set())\n\t\t\tsetFocusedPath(null)\n\t\t\tsetRangeAnchor(null)\n\t\t\tsetCursor(undefined)\n\t\t\tawait loadPath(normalized, 'replace')\n\t\t},\n\t\t[loadPath]\n\t)\n\n\tconst loadMore = useCallback(async () => {\n\t\tif (!cursor || status === 'loading') {\n\t\t\treturn\n\t\t}\n\n\t\tawait loadPath(currentPath, 'append')\n\t}, [currentPath, cursor, loadPath, status])\n\n\tuseEffect(() => {\n\t\tvoid Promise.resolve().then(() => loadPath(currentPath, 'replace'))\n\t\t// The initial adapter load is intentionally scoped to adapter replacement.\n\t\t// Navigation calls loadPath directly after updating currentPath.\n\t\t// oxlint-disable-next-line react/exhaustive-deps\n\t}, [adapter])\n\n\tconst selectOnly = useCallback((path: string) => {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tsetSelected(new Set([normalized]))\n\t\tsetFocusedPath(normalized)\n\t\tsetRangeAnchor(normalized)\n\t}, [])\n\n\tconst toggleSelection = useCallback((path: string) => {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tsetSelected((current) => {\n\t\t\tconst next = new Set(current)\n\t\t\tif (next.has(normalized)) {\n\t\t\t\tnext.delete(normalized)\n\t\t\t} else {\n\t\t\t\tnext.add(normalized)\n\t\t\t}\n\t\t\treturn next\n\t\t})\n\t\tsetFocusedPath(normalized)\n\t}, [])\n\n\tconst selectRange = useCallback(\n\t\t(path: string) => {\n\t\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\t\tconst anchor = rangeAnchor ?? focusedPath ?? normalized\n\t\t\tconst visiblePaths = filteredItems.map((item) => item.path)\n\t\t\tconst anchorIndex = visiblePaths.indexOf(anchor)\n\t\t\tconst targetIndex = visiblePaths.indexOf(normalized)\n\n\t\t\tif (anchorIndex === -1 || targetIndex === -1) {\n\t\t\t\tselectOnly(normalized)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst start = Math.min(anchorIndex, targetIndex)\n\t\t\tconst end = Math.max(anchorIndex, targetIndex)\n\t\t\tsetSelected(new Set(visiblePaths.slice(start, end + 1)))\n\t\t\tsetFocusedPath(normalized)\n\t\t},\n\t\t[filteredItems, focusedPath, rangeAnchor, selectOnly]\n\t)\n\n\tconst setSelection = useCallback((paths: string[], options: { additive?: boolean } = {}) => {\n\t\tconst normalizedPaths = paths.map(normalizeFileBrowserPath)\n\t\tsetSelected((current) => {\n\t\t\tconst next = options.additive ? new Set(current) : new Set<string>()\n\t\t\tfor (const path of normalizedPaths) {\n\t\t\t\tnext.add(path)\n\t\t\t}\n\t\t\treturn next\n\t\t})\n\t\tsetFocusedPath(normalizedPaths.at(-1) ?? null)\n\t\tsetRangeAnchor(normalizedPaths.at(0) ?? null)\n\t}, [])\n\n\tconst selectAllLoaded = useCallback(() => {\n\t\tsetSelected(new Set(items.map((item) => item.path)))\n\t\tsetFocusedPath(items.at(0)?.path ?? null)\n\t\tsetRangeAnchor(items.at(0)?.path ?? null)\n\t}, [items])\n\n\tconst clearSelection = useCallback(() => {\n\t\tsetSelected(new Set())\n\t\tsetFocusedPath(null)\n\t\tsetRangeAnchor(null)\n\t}, [])\n\n\tconst open = useCallback(\n\t\tasync (node: FileNode) => {\n\t\t\tif (node.kind === 'folder') {\n\t\t\t\tawait navigate(node.path)\n\t\t\t} else {\n\t\t\t\tselectOnly(node.path)\n\t\t\t}\n\t\t},\n\t\t[navigate, selectOnly]\n\t)\n\n\tconst createFolder = useCallback(\n\t\tasync (name: string) => {\n\t\t\tif (!adapter.createFolder) {\n\t\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Folder creation is not supported by this adapter')\n\t\t\t}\n\t\t\tconst path = joinFileBrowserPath(currentPath, name.trim())\n\t\t\tconst optimistic: FileNode = {\n\t\t\t\tpath,\n\t\t\t\tname: name.trim(),\n\t\t\t\tkind: 'folder',\n\t\t\t\tmodifiedAt: new Date().toISOString()\n\t\t\t}\n\t\t\tsetItems((current) => mergeItems(current, [optimistic]))\n\n\t\t\ttry {\n\t\t\t\tconst created = await adapter.createFolder(path)\n\t\t\t\tsetItems((current) => mergeItems(removePaths(current, [path]), [created]))\n\t\t\t\treturn created\n\t\t\t} catch (caught) {\n\t\t\t\tsetItems((current) => removePaths(current, [path]))\n\t\t\t\tthrow caught\n\t\t\t}\n\t\t},\n\t\t[adapter, currentPath]\n\t)\n\n\tconst rename = useCallback(\n\t\tasync (path: string, newName: string) => {\n\t\t\tif (!adapter.rename) {\n\t\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Rename is not supported by this adapter')\n\t\t\t}\n\n\t\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\t\tconst previous = items\n\t\t\tsetItems((current) =>\n\t\t\t\tcurrent.map((item) => (item.path === normalized ? { ...item, name: newName.trim() } : item))\n\t\t\t)\n\n\t\t\ttry {\n\t\t\t\tconst renamed = await adapter.rename(normalized, newName.trim())\n\t\t\t\tsetItems((current) => current.map((item) => (item.path === normalized ? renamed : item)))\n\t\t\t\treturn renamed\n\t\t\t} catch (caught) {\n\t\t\t\tsetItems(previous)\n\t\t\t\tthrow caught\n\t\t\t}\n\t\t},\n\t\t[adapter, items]\n\t)\n\n\tconst deletePaths = useCallback(\n\t\tasync (paths: string[]) => {\n\t\t\tconst normalizedPaths = paths.map(normalizeFileBrowserPath)\n\t\t\tconst previousItems = items\n\t\t\tconst previousSelected = selected\n\n\t\t\tsetItems((current) => removePaths(current, normalizedPaths))\n\t\t\tsetSelected((current) => {\n\t\t\t\tconst next = new Set(current)\n\t\t\t\tfor (const path of normalizedPaths) {\n\t\t\t\t\tnext.delete(path)\n\t\t\t\t}\n\t\t\t\treturn next\n\t\t\t})\n\n\t\t\ttry {\n\t\t\t\tawait adapter.delete(normalizedPaths)\n\t\t\t} catch (caught) {\n\t\t\t\tif (caught instanceof FileBrowserBulkActionError) {\n\t\t\t\t\tconst succeededPaths = caught.succeededPaths.map(normalizeFileBrowserPath)\n\t\t\t\t\tconst failedPaths = caught.failures.map((failure) => normalizeFileBrowserPath(failure.path))\n\t\t\t\t\tsetItems(removePaths(previousItems, succeededPaths))\n\t\t\t\t\tsetSelected(new Set(failedPaths))\n\t\t\t\t\tsetFocusedPath(failedPaths.at(0) ?? null)\n\t\t\t\t\tsetRangeAnchor(failedPaths.at(0) ?? null)\n\t\t\t\t\tthrow caught\n\t\t\t\t}\n\t\t\t\tsetItems(previousItems)\n\t\t\t\tsetSelected(previousSelected)\n\t\t\t\tthrow caught\n\t\t\t}\n\t\t},\n\t\t[adapter, items, selected]\n\t)\n\n\tconst deleteSelected = useCallback(async () => {\n\t\tawait deletePaths(selectedPaths)\n\t}, [deletePaths, selectedPaths])\n\n\tconst movePathsTo = useCallback(\n\t\tasync (paths: string[], toDir: string) => {\n\t\t\tif (!adapter.move) {\n\t\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Move is not supported by this adapter')\n\t\t\t}\n\n\t\t\tconst normalizedPaths = paths.map(normalizeFileBrowserPath)\n\t\t\tif (normalizedPaths.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst destination = normalizeFileBrowserPath(toDir)\n\t\t\ttry {\n\t\t\t\tawait adapter.move(normalizedPaths, destination)\n\t\t\t} catch (caught) {\n\t\t\t\tif (caught instanceof FileBrowserBulkActionError) {\n\t\t\t\t\tconst succeededPaths = caught.succeededPaths.map(normalizeFileBrowserPath)\n\t\t\t\t\tconst failedPaths = caught.failures.map((failure) => normalizeFileBrowserPath(failure.path))\n\t\t\t\t\tif (destination === currentPath) {\n\t\t\t\t\t\tawait refresh()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetItems((current) => removePaths(current, succeededPaths))\n\t\t\t\t\t}\n\t\t\t\t\tsetSelected(new Set(failedPaths))\n\t\t\t\t\tsetFocusedPath(failedPaths.at(0) ?? null)\n\t\t\t\t\tsetRangeAnchor(failedPaths.at(0) ?? null)\n\t\t\t\t\tthrow caught\n\t\t\t\t}\n\t\t\t\tthrow caught\n\t\t\t}\n\t\t\tsetSelected((current) => {\n\t\t\t\tconst next = new Set(current)\n\t\t\t\tfor (const path of normalizedPaths) {\n\t\t\t\t\tnext.delete(path)\n\t\t\t\t}\n\t\t\t\treturn next\n\t\t\t})\n\t\t\tsetFocusedPath(null)\n\t\t\tsetRangeAnchor(null)\n\n\t\t\tif (destination === currentPath) {\n\t\t\t\tawait refresh()\n\t\t\t} else {\n\t\t\t\tsetItems((current) => removePaths(current, normalizedPaths))\n\t\t\t}\n\t\t},\n\t\t[adapter, currentPath, refresh]\n\t)\n\n\tconst moveSelectedTo = useCallback(\n\t\tasync (toDir: string) => {\n\t\t\tawait movePathsTo(selectedPaths, toDir)\n\t\t\tsetClipboard((current) => (current?.type === 'cut' ? null : current))\n\t\t},\n\t\t[movePathsTo, selectedPaths]\n\t)\n\n\tconst copySelection = useCallback(\n\t\t(paths = selectedPaths) => {\n\t\t\tsetClipboard({ type: 'copy', paths: paths.map(normalizeFileBrowserPath) })\n\t\t},\n\t\t[selectedPaths]\n\t)\n\n\tconst cutSelection = useCallback(\n\t\t(paths = selectedPaths) => {\n\t\t\tsetClipboard({ type: 'cut', paths: paths.map(normalizeFileBrowserPath) })\n\t\t},\n\t\t[selectedPaths]\n\t)\n\n\tconst pasteInto = useCallback(\n\t\tasync (toDir: string) => {\n\t\t\tif (!clipboard || clipboard.paths.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst destination = normalizeFileBrowserPath(toDir)\n\t\t\tif (clipboard.type === 'copy') {\n\t\t\t\tif (!adapter.copy) {\n\t\t\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Copy is not supported by this adapter')\n\t\t\t\t}\n\t\t\t\tawait adapter.copy(clipboard.paths, destination)\n\t\t\t} else {\n\t\t\t\tif (!adapter.move) {\n\t\t\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Move is not supported by this adapter')\n\t\t\t\t}\n\t\t\t\tawait movePathsTo(clipboard.paths, destination)\n\t\t\t\tsetClipboard(null)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (destination === currentPath) {\n\t\t\t\tawait refresh()\n\t\t\t}\n\t\t},\n\t\t[adapter, clipboard, currentPath, movePathsTo, refresh]\n\t)\n\n\tconst uploadFiles = useCallback(\n\t\tasync (files: File[] | FileList, options: FileBrowserUploadFilesOptions = {}) => {\n\t\t\tif (options.onConflict === 'skip') {\n\t\t\t\treturn []\n\t\t\t}\n\n\t\t\tconst fileArray = Array.from(files)\n\t\t\tconst uploaded: FileNode[] = []\n\n\t\t\tfor (const file of fileArray) {\n\t\t\t\tconst path = joinFileBrowserPath(currentPathRef.current, file.name)\n\t\t\t\tconst result = await adapter.upload(path, file, {\n\t\t\t\t\tonConflict: options.onConflict ?? 'keep-both'\n\t\t\t\t})\n\t\t\t\tuploaded.push(result)\n\t\t\t\tsetItems((current) => mergeItems(current, [result]))\n\t\t\t}\n\n\t\t\treturn uploaded\n\t\t},\n\t\t[adapter]\n\t)\n\n\treturn {\n\t\tadapter,\n\t\tcapabilities,\n\t\tcurrentPath,\n\t\tstatus,\n\t\titems,\n\t\terror,\n\t\thasMore: Boolean(cursor),\n\t\tselectedPaths,\n\t\tselectedItems,\n\t\tfocusedPath,\n\t\tclipboard,\n\t\tview,\n\t\tsearchQuery,\n\t\tfilterKind,\n\t\tsortBy,\n\t\tsortDirection,\n\t\tfilteredItems,\n\t\tsetView,\n\t\tsetSearchQuery,\n\t\tsetFilterKind,\n\t\tsetSortBy,\n\t\tsetSortDirection,\n\t\trefresh,\n\t\tloadMore,\n\t\tnavigate,\n\t\topen,\n\t\tselectOnly,\n\t\ttoggleSelection,\n\t\tselectRange,\n\t\tsetSelection,\n\t\tselectAllLoaded,\n\t\tclearSelection,\n\t\tcreateFolder,\n\t\trename,\n\t\tdeleteSelected,\n\t\tdeletePaths,\n\t\tmovePathsTo,\n\t\tmoveSelectedTo,\n\t\tcopySelection,\n\t\tcutSelection,\n\t\tpasteInto,\n\t\tuploadFiles\n\t}\n}\n\nfunction mergeItems(current: FileNode[], incoming: FileNode[]): FileNode[] {\n\tconst map = new Map(current.map((item) => [item.path, item]))\n\tfor (const item of incoming) {\n\t\tmap.set(item.path, item)\n\t}\n\treturn Array.from(map.values()).sort((left, right) => compareNodes(left, right, 'name', 'asc'))\n}\n\nfunction removePaths(items: FileNode[], paths: string[]): FileNode[] {\n\tconst remove = new Set(paths)\n\treturn items.filter((item) => !remove.has(item.path))\n}\n\nfunction compareNodes(\n\tleft: FileNode,\n\tright: FileNode,\n\tsortBy: 'name' | 'modifiedAt' | 'size',\n\tdirection: 'asc' | 'desc'\n): number {\n\tconst multiplier = direction === 'asc' ? 1 : -1\n\n\tif (left.kind !== right.kind) {\n\t\treturn left.kind === 'folder' ? -1 : 1\n\t}\n\n\tif (sortBy === 'size') {\n\t\treturn ((left.size ?? 0) - (right.size ?? 0)) * multiplier\n\t}\n\n\tif (sortBy === 'modifiedAt') {\n\t\treturn String(left.modifiedAt ?? '').localeCompare(String(right.modifiedAt ?? '')) * multiplier\n\t}\n\n\treturn (\n\t\tleft.name.localeCompare(right.name, undefined, {\n\t\t\tnumeric: true,\n\t\t\tsensitivity: 'base'\n\t\t}) * multiplier\n\t)\n}\n\nfunction sortPaths(paths: string[]): string[] {\n\treturn [...paths].sort((left, right) => left.localeCompare(right))\n}\n\nfunction toError(caught: unknown): Error {\n\treturn caught instanceof Error ? caught : new Error(String(caught))\n}\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\",\n key: \"fm4g5t\"\n }\n ],\n [\"path\", { d: \"M2 13h10\", key: \"pgb2dq\" }],\n [\"path\", { d: \"m9 16 3-3-3-3\", key: \"6m91ic\" }]\n];\nconst FolderInput = createLucideIcon(\"folder-input\", __iconNode);\n\nexport { __iconNode, FolderInput as default };\n//# sourceMappingURL=folder-input.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }],\n [\"path\", { d: \"M3 12h18\", key: \"1i2n21\" }],\n [\"rect\", { x: \"3\", y: \"3\", width: \"18\", height: \"18\", rx: \"2\", key: \"h1oib\" }]\n];\nconst Grid2x2 = createLucideIcon(\"grid-2x2\", __iconNode);\n\nexport { __iconNode, Grid2x2 as default };\n//# sourceMappingURL=grid-2x2.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 5h.01\", key: \"18ugdj\" }],\n [\"path\", { d: \"M3 12h.01\", key: \"nlz23k\" }],\n [\"path\", { d: \"M3 19h.01\", key: \"noohij\" }],\n [\"path\", { d: \"M8 5h13\", key: \"1pao27\" }],\n [\"path\", { d: \"M8 12h13\", key: \"1za7za\" }],\n [\"path\", { d: \"M8 19h13\", key: \"m83p4d\" }]\n];\nconst List = createLucideIcon(\"list\", __iconNode);\n\nexport { __iconNode, List as default };\n//# sourceMappingURL=list.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n];\nconst Pencil = createLucideIcon(\"pencil\", __iconNode);\n\nexport { __iconNode, Pencil as default };\n//# sourceMappingURL=pencil.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\",\n key: \"10ikf1\"\n }\n ]\n];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"6\", cy: \"6\", r: \"3\", key: \"1lh9wr\" }],\n [\"path\", { d: \"M8.12 8.12 12 12\", key: \"1alkpv\" }],\n [\"path\", { d: \"M20 4 8.12 15.88\", key: \"xgtan2\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M14.8 14.8 20 20\", key: \"ptml3r\" }]\n];\nconst Scissors = createLucideIcon(\"scissors\", __iconNode);\n\nexport { __iconNode, Scissors as default };\n//# sourceMappingURL=scissors.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344\", key: \"2acyp4\" }\n ],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst SquareCheckBig = createLucideIcon(\"square-check-big\", __iconNode);\n\nexport { __iconNode, SquareCheckBig as default };\n//# sourceMappingURL=square-check-big.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n];\nconst Square = createLucideIcon(\"square\", __iconNode);\n\nexport { __iconNode, Square as default };\n//# sourceMappingURL=square.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.mjs.map\n","export type FileBrowserUploadCandidate = {\n\tfile: File\n\trelativePath: string\n}\n\ntype FileSystemEntryLike = FileSystemFileEntryLike | FileSystemDirectoryEntryLike\n\ntype FileSystemFileEntryLike = {\n\tisFile: true\n\tisDirectory: false\n\tname: string\n\tfile: (success: (file: File) => void, error?: (error: DOMException) => void) => void\n}\n\ntype FileSystemDirectoryEntryLike = {\n\tisFile: false\n\tisDirectory: true\n\tname: string\n\tcreateReader: () => {\n\t\treadEntries: (success: (entries: FileSystemEntryLike[]) => void, error?: (error: DOMException) => void) => void\n\t}\n}\n\ntype DataTransferItemWithEntry = {\n\twebkitGetAsEntry?: () => FileSystemEntryLike | null\n}\n\nexport async function collectUploadCandidatesFromDataTransfer(\n\tdataTransfer: DataTransfer\n): Promise<FileBrowserUploadCandidate[]> {\n\tconst entries = Array.from(dataTransfer.items)\n\t\t.map((item) => (item as unknown as DataTransferItemWithEntry).webkitGetAsEntry?.())\n\t\t.filter((entry): entry is FileSystemEntryLike => Boolean(entry))\n\n\tif (entries.length === 0) {\n\t\treturn getFileBrowserUploadCandidates(dataTransfer.files)\n\t}\n\n\tconst candidates: FileBrowserUploadCandidate[] = []\n\tfor (const entry of entries) {\n\t\tcandidates.push(...(await collectEntryCandidates(entry)))\n\t}\n\treturn candidates\n}\n\nexport function getFileBrowserUploadCandidates(files: File[] | FileList): FileBrowserUploadCandidate[] {\n\treturn Array.from(files).map((file) => ({\n\t\tfile,\n\t\trelativePath: sanitizeRelativePath(getFileRelativePath(file))\n\t}))\n}\n\nasync function collectEntryCandidates(entry: FileSystemEntryLike, prefix = ''): Promise<FileBrowserUploadCandidate[]> {\n\tif (entry.isFile) {\n\t\tconst file = await readEntryFile(entry)\n\t\treturn [\n\t\t\t{\n\t\t\t\tfile,\n\t\t\t\trelativePath: sanitizeRelativePath(joinRelativePath(prefix, file.name))\n\t\t\t}\n\t\t]\n\t}\n\n\tconst nextPrefix = joinRelativePath(prefix, entry.name)\n\tconst entries = await readAllDirectoryEntries(entry)\n\tconst candidates: FileBrowserUploadCandidate[] = []\n\n\tfor (const child of entries) {\n\t\tcandidates.push(...(await collectEntryCandidates(child, nextPrefix)))\n\t}\n\n\treturn candidates\n}\n\nfunction readEntryFile(entry: FileSystemFileEntryLike): Promise<File> {\n\treturn new Promise((resolve, reject) => {\n\t\tentry.file(resolve, reject)\n\t})\n}\n\nasync function readAllDirectoryEntries(entry: FileSystemDirectoryEntryLike): Promise<FileSystemEntryLike[]> {\n\tconst reader = entry.createReader()\n\tconst entries: FileSystemEntryLike[] = []\n\n\twhile (true) {\n\t\tconst batch = await new Promise<FileSystemEntryLike[]>((resolve, reject) => {\n\t\t\treader.readEntries(resolve, reject)\n\t\t})\n\t\tif (batch.length === 0) {\n\t\t\tbreak\n\t\t}\n\t\tentries.push(...batch)\n\t}\n\n\treturn entries\n}\n\nfunction getFileRelativePath(file: File): string {\n\tconst withRelativePath = file as File & { webkitRelativePath?: string }\n\treturn withRelativePath.webkitRelativePath || file.name\n}\n\nfunction joinRelativePath(...parts: string[]): string {\n\treturn parts.filter(Boolean).join('/')\n}\n\nfunction sanitizeRelativePath(path: string): string {\n\treturn path\n\t\t.replaceAll('\\\\', '/')\n\t\t.split('/')\n\t\t.filter((part) => part && part !== '.' && part !== '..')\n\t\t.join('/')\n}\n","import { zipSync } from 'fflate'\nimport type { Zippable } from 'fflate'\nimport { FileBrowserAdapterError } from '../core/types'\nimport type { FileBrowserAdapter, FileBrowserUploadOptions, FileNode, MultipartUploadPart } from '../core/types'\nimport { getFileBrowserBasename, getFileBrowserDirname, joinFileBrowserPath } from '../core/path'\n\nexport type TransferStatus = 'queued' | 'uploading' | 'paused' | 'failed' | 'completed' | 'cancelled'\n\nexport type UploadTransfer = {\n\tid: string\n\tkind: 'upload'\n\tstatus: TransferStatus\n\tpath: string\n\tname: string\n\tloadedBytes: number\n\ttotalBytes: number\n\tbytesPerSecond?: number\n\tcompletedParts: MultipartUploadPart[]\n\tcreatedAt: string\n\tupdatedAt: string\n\terror?: string\n\tuploadId?: string\n\tpartSize?: number\n\tfile?: File\n\tonConflict?: FileBrowserUploadOptions['onConflict']\n\tadapter?: FileBrowserAdapter\n\tresult?: FileNode\n\tabortController?: AbortController\n\tgroup?: UploadTransferGroup\n}\n\nexport type UploadTransferGroup = {\n\tid: string\n\tname: string\n\ttotalFiles: number\n\tcreatedFolders: number\n}\n\nexport type BulkDownloadJob = {\n\tid: string\n\tkind: 'bulk-download'\n\tstatus: 'preparing' | 'warning' | 'ready' | 'failed'\n\tstrategy: 'single' | 'server' | 'client'\n\tpaths: string[]\n\tselectedBytes: number\n\tcreatedAt: string\n\tupdatedAt: string\n\turl?: string\n\texpiresAt?: string\n\twarning?: 'client_zip_size'\n\terror?: string\n}\n\ntype InternalBulkDownloadJob = BulkDownloadJob & {\n\tadapter?: FileBrowserAdapter\n}\n\nexport type TransferSnapshot = {\n\tuploads: UploadTransfer[]\n\tdownloads: BulkDownloadJob[]\n}\n\nexport type EnqueueUploadInput = {\n\tadapter: FileBrowserAdapter\n\tdestinationPath: string\n\tfile: File\n\tonConflict?: FileBrowserUploadOptions['onConflict']\n\tgroup?: UploadTransferGroup\n}\n\nexport type ResumeRestoredUploadInput = {\n\tid: string\n\tadapter: FileBrowserAdapter\n\tfile: File\n\tonConflict?: FileBrowserUploadOptions['onConflict']\n}\n\nexport type PrepareBulkDownloadInput = {\n\tadapter: FileBrowserAdapter\n\tpaths: string[]\n\tselectedBytes: number\n\twarnZipSizeBytes?: number\n}\n\nexport type PrepareSingleDownloadInput = {\n\tadapter: FileBrowserAdapter\n\tpath: string\n\tselectedBytes?: number\n}\n\nexport type TransferManagerOptions = {\n\tstorage?: Storage\n\tstorageKey?: string\n\tidFactory?: () => string\n\tnow?: () => Date\n}\n\ntype UploadSpeedSample = {\n\tloadedBytes: number\n\ttimeMs: number\n}\n\nconst DEFAULT_STORAGE_KEY = 'react-file-browser-transfers'\nconst DOWNLOAD_RETENTION_MS = 24 * 60 * 60 * 1000\n\nexport class TransferManager {\n\tprivate readonly uploads = new Map<string, UploadTransfer>()\n\tprivate readonly downloads = new Map<string, InternalBulkDownloadJob>()\n\tprivate readonly uploadSpeedSamples = new Map<string, UploadSpeedSample>()\n\tprivate readonly subscribers = new Set<() => void>()\n\tprivate readonly activeTasks = new Set<Promise<void>>()\n\tprivate readonly storage?: Storage\n\tprivate readonly storageKey: string\n\tprivate readonly idFactory: () => string\n\tprivate readonly now: () => Date\n\tprivate snapshotCache: TransferSnapshot | undefined\n\n\tconstructor(options: TransferManagerOptions = {}) {\n\t\tthis.storage = options.storage\n\t\tthis.storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY\n\t\tthis.idFactory = options.idFactory ?? createId\n\t\tthis.now = options.now ?? (() => new Date())\n\t\tthis.restorePersisted()\n\t\tif (this.downloads.size > 0) {\n\t\t\tthis.pruneExpiredDownloads()\n\t\t}\n\t}\n\n\tsubscribe(listener: () => void): () => void {\n\t\tthis.subscribers.add(listener)\n\t\treturn () => {\n\t\t\tthis.subscribers.delete(listener)\n\t\t}\n\t}\n\n\tgetSnapshot(): TransferSnapshot {\n\t\tthis.snapshotCache ??= {\n\t\t\tuploads: Array.from(this.uploads.values()).map(cloneUpload),\n\t\t\tdownloads: Array.from(this.downloads.values()).map((download) => ({\n\t\t\t\t...cloneDownload(download)\n\t\t\t}))\n\t\t}\n\t\treturn this.snapshotCache\n\t}\n\n\tgetUpload(id: string): UploadTransfer | undefined {\n\t\tconst upload = this.uploads.get(id)\n\t\treturn upload ? cloneUpload(upload) : undefined\n\t}\n\n\tgetRestorableUploads(): UploadTransfer[] {\n\t\treturn Array.from(this.uploads.values())\n\t\t\t.filter((upload) => ['queued', 'uploading', 'paused', 'failed'].includes(upload.status))\n\t\t\t.filter((upload) => !upload.file || !upload.adapter)\n\t\t\t.map(cloneUpload)\n\t}\n\n\tdismissRestoredUploads(ids: string[]): void {\n\t\tfor (const id of ids) {\n\t\t\tconst upload = this.uploads.get(id)\n\t\t\tif (!upload) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tupload.status = 'cancelled'\n\t\t\tthis.uploadSpeedSamples.delete(id)\n\t\t\tupload.updatedAt = this.timestamp()\n\t\t}\n\t\tthis.persistAndNotify()\n\t}\n\n\tdismissDownload(id: string): void {\n\t\tconst download = this.downloads.get(id)\n\t\tif (!download) {\n\t\t\treturn\n\t\t}\n\n\t\trevokeDownloadUrl(download.url)\n\t\tthis.downloads.delete(id)\n\t\tthis.persistAndNotify()\n\t}\n\n\thasActiveTransfers(): boolean {\n\t\tconst snapshot = this.getSnapshot()\n\t\treturn (\n\t\t\tsnapshot.uploads.some((upload) => ['queued', 'uploading'].includes(upload.status)) ||\n\t\t\tsnapshot.downloads.some((download) => download.status === 'preparing')\n\t\t)\n\t}\n\n\tenqueueUpload({ adapter, destinationPath, file, group, onConflict }: EnqueueUploadInput): string {\n\t\tconst id = this.idFactory()\n\t\tconst timestamp = this.timestamp()\n\t\tconst upload: UploadTransfer = {\n\t\t\tid,\n\t\t\tkind: 'upload',\n\t\t\tstatus: 'queued',\n\t\t\tpath: destinationPath,\n\t\t\tname: file.name,\n\t\t\tloadedBytes: 0,\n\t\t\ttotalBytes: file.size,\n\t\t\tcompletedParts: [],\n\t\t\tcreatedAt: timestamp,\n\t\t\tupdatedAt: timestamp,\n\t\t\tadapter,\n\t\t\tfile,\n\t\t\tgroup,\n\t\t\tonConflict,\n\t\t\tabortController: new AbortController()\n\t\t}\n\t\tthis.uploads.set(id, upload)\n\t\tthis.persistAndNotify()\n\t\tthis.track(this.runUpload(id))\n\t\treturn id\n\t}\n\n\tresumeUpload(id: string): Promise<void> {\n\t\tconst upload = this.uploads.get(id)\n\t\tif (!upload || !upload.adapter || !upload.file) {\n\t\t\treturn Promise.resolve()\n\t\t}\n\n\t\tupload.status = 'queued'\n\t\tupload.error = undefined\n\t\tupload.bytesPerSecond = undefined\n\t\tthis.uploadSpeedSamples.delete(id)\n\t\tupload.abortController = new AbortController()\n\t\tupload.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\t\tthis.track(this.runUpload(id))\n\t\treturn Promise.resolve()\n\t}\n\n\tresumeRestoredUpload({ adapter, file, id, onConflict }: ResumeRestoredUploadInput): Promise<void> {\n\t\tconst upload = this.uploads.get(id)\n\t\tif (!upload) {\n\t\t\treturn Promise.resolve()\n\t\t}\n\n\t\tupload.adapter = adapter\n\t\tupload.file = file\n\t\tupload.name = file.name\n\t\tupload.totalBytes = file.size\n\t\tupload.onConflict = onConflict ?? upload.onConflict\n\t\tupload.status = 'queued'\n\t\tupload.error = undefined\n\t\tupload.bytesPerSecond = undefined\n\t\tthis.uploadSpeedSamples.delete(id)\n\t\tupload.abortController = new AbortController()\n\t\tupload.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\t\tthis.track(this.runUpload(id))\n\t\treturn Promise.resolve()\n\t}\n\n\tpauseUpload(id: string): void {\n\t\tconst upload = this.uploads.get(id)\n\t\tif (!upload) {\n\t\t\treturn\n\t\t}\n\t\tupload.abortController?.abort()\n\t\tupload.status = 'paused'\n\t\tthis.uploadSpeedSamples.delete(id)\n\t\tupload.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\t}\n\n\tasync cancelUpload(id: string): Promise<void> {\n\t\tconst upload = this.uploads.get(id)\n\t\tif (!upload) {\n\t\t\treturn\n\t\t}\n\n\t\tupload.abortController?.abort()\n\t\tupload.status = 'cancelled'\n\t\tthis.uploadSpeedSamples.delete(id)\n\t\tupload.updatedAt = this.timestamp()\n\t\tif (upload.uploadId && upload.adapter?.abortMultipartUpload) {\n\t\t\tawait upload.adapter.abortMultipartUpload(upload.uploadId)\n\t\t}\n\t\tthis.persistAndNotify()\n\t}\n\n\tasync waitForIdle(): Promise<void> {\n\t\twhile (this.activeTasks.size > 0) {\n\t\t\tawait Promise.allSettled(Array.from(this.activeTasks))\n\t\t}\n\t}\n\n\tasync prepareBulkDownload({\n\t\tadapter,\n\t\tpaths,\n\t\tselectedBytes,\n\t\twarnZipSizeBytes = Number.POSITIVE_INFINITY\n\t}: PrepareBulkDownloadInput): Promise<BulkDownloadJob> {\n\t\tconst id = this.idFactory()\n\t\tconst timestamp = this.timestamp()\n\t\tconst job: InternalBulkDownloadJob = {\n\t\t\tid,\n\t\t\tkind: 'bulk-download',\n\t\t\tstatus: 'preparing',\n\t\t\tstrategy: adapter.bulkDownloadUrl ? 'server' : 'client',\n\t\t\tadapter,\n\t\t\tpaths: [...paths],\n\t\t\tselectedBytes,\n\t\t\tcreatedAt: timestamp,\n\t\t\tupdatedAt: timestamp\n\t\t}\n\t\tthis.downloads.set(id, job)\n\t\tthis.persistAndNotify()\n\n\t\ttry {\n\t\t\tif (adapter.bulkDownloadUrl) {\n\t\t\t\tconst result = await adapter.bulkDownloadUrl(paths)\n\t\t\t\tjob.status = 'ready'\n\t\t\t\tjob.url = result.url\n\t\t\t\tjob.expiresAt = result.expiresAt\n\t\t\t} else if (selectedBytes > warnZipSizeBytes) {\n\t\t\t\tjob.status = 'warning'\n\t\t\t\tjob.warning = 'client_zip_size'\n\t\t\t} else {\n\t\t\t\tjob.url = await createClientZipUrl(adapter, paths)\n\t\t\t\tjob.status = 'ready'\n\t\t\t}\n\t\t} catch (caught) {\n\t\t\tjob.status = 'failed'\n\t\t\tjob.error = toErrorMessage(caught)\n\t\t}\n\n\t\tjob.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\t\treturn cloneDownload(job)\n\t}\n\n\tasync prepareSingleDownload({\n\t\tadapter,\n\t\tpath,\n\t\tselectedBytes = 0\n\t}: PrepareSingleDownloadInput): Promise<BulkDownloadJob> {\n\t\tconst id = this.idFactory()\n\t\tconst timestamp = this.timestamp()\n\t\tconst job: InternalBulkDownloadJob = {\n\t\t\tid,\n\t\t\tkind: 'bulk-download',\n\t\t\tstatus: 'preparing',\n\t\t\tstrategy: 'single',\n\t\t\tadapter,\n\t\t\tpaths: [path],\n\t\t\tselectedBytes,\n\t\t\tcreatedAt: timestamp,\n\t\t\tupdatedAt: timestamp\n\t\t}\n\t\tthis.downloads.set(id, job)\n\t\tthis.persistAndNotify()\n\n\t\ttry {\n\t\t\tjob.url = await adapter.signedUrl(path)\n\t\t\tjob.status = 'ready'\n\t\t} catch (caught) {\n\t\t\tjob.status = 'failed'\n\t\t\tjob.error = toErrorMessage(caught)\n\t\t}\n\n\t\tjob.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\t\treturn cloneDownload(job)\n\t}\n\n\tasync confirmBulkDownload(id: string): Promise<BulkDownloadJob | undefined> {\n\t\tconst job = this.downloads.get(id)\n\t\tif (!job) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tif (job.status !== 'warning') {\n\t\t\treturn cloneDownload(job)\n\t\t}\n\n\t\tif (!job.adapter) {\n\t\t\tjob.status = 'failed'\n\t\t\tjob.error = 'This download can no longer continue in the current session.'\n\t\t\tjob.updatedAt = this.timestamp()\n\t\t\tthis.persistAndNotify()\n\t\t\treturn cloneDownload(job)\n\t\t}\n\n\t\tjob.status = 'preparing'\n\t\tjob.warning = undefined\n\t\tjob.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\n\t\ttry {\n\t\t\tjob.url = await createClientZipUrl(job.adapter, job.paths)\n\t\t\tjob.status = 'ready'\n\t\t} catch (caught) {\n\t\t\tjob.status = 'failed'\n\t\t\tjob.error = toErrorMessage(caught)\n\t\t}\n\n\t\tjob.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\t\treturn cloneDownload(job)\n\t}\n\n\tprivate async runUpload(id: string): Promise<void> {\n\t\tconst upload = this.uploads.get(id)\n\t\tif (!upload?.adapter || !upload.file) {\n\t\t\treturn\n\t\t}\n\n\t\tupload.status = 'uploading'\n\t\tupload.updatedAt = this.timestamp()\n\t\tthis.persistAndNotify()\n\n\t\ttry {\n\t\t\tconst result = hasMultipart(upload.adapter)\n\t\t\t\t? await this.runMultipartUpload(upload)\n\t\t\t\t: await this.runSimpleUpload(upload)\n\t\t\tupload.status = 'completed'\n\t\t\tupload.loadedBytes = upload.totalBytes\n\t\t\tupload.result = result\n\t\t\tthis.uploadSpeedSamples.delete(upload.id)\n\t\t\tupload.updatedAt = this.timestamp()\n\t\t\tthis.persistAndNotify()\n\t\t} catch (caught) {\n\t\t\tif (['paused', 'cancelled'].includes(upload.status)) {\n\t\t\t\tthis.uploadSpeedSamples.delete(upload.id)\n\t\t\t\tthis.persistAndNotify()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tupload.status = 'failed'\n\t\t\tupload.error = toErrorMessage(caught)\n\t\t\tthis.uploadSpeedSamples.delete(upload.id)\n\t\t\tupload.updatedAt = this.timestamp()\n\t\t\tthis.persistAndNotify()\n\t\t}\n\t}\n\n\tprivate async runSimpleUpload(upload: UploadTransfer): Promise<FileNode> {\n\t\tif (!upload.adapter || !upload.file) {\n\t\t\tthrow new Error('Upload is missing adapter or file')\n\t\t}\n\n\t\treturn upload.adapter.upload(upload.path, upload.file, {\n\t\t\tonConflict: upload.onConflict,\n\t\t\tsignal: upload.abortController?.signal,\n\t\t\tonProgress: (loaded, total) => {\n\t\t\t\tthis.updateUploadProgress(upload, loaded, total)\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate async runMultipartUpload(upload: UploadTransfer): Promise<FileNode> {\n\t\tconst adapter = upload.adapter\n\t\tconst file = upload.file\n\t\tif (!adapter || !file || !hasMultipart(adapter)) {\n\t\t\tthrow new Error('Multipart upload is not available')\n\t\t}\n\n\t\tif (!upload.uploadId || !upload.partSize) {\n\t\t\tawait prepareMultipartDestination(upload)\n\t\t\tconst created = await adapter.createMultipartUpload(upload.path, file.size)\n\t\t\tupload.uploadId = created.uploadId\n\t\t\tupload.partSize = created.partSize\n\t\t\tupload.updatedAt = this.timestamp()\n\t\t\tthis.persistAndNotify()\n\t\t}\n\n\t\tconst partSize = upload.partSize\n\t\tconst partCount = Math.ceil(file.size / partSize)\n\t\tfor (let partNumber = 1; partNumber <= partCount; partNumber += 1) {\n\t\t\tif (upload.completedParts.some((part) => part.partNumber === partNumber)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst start = (partNumber - 1) * partSize\n\t\t\tconst end = Math.min(start + partSize, file.size)\n\t\t\tconst chunk = file.slice(start, end)\n\t\t\tconst completedBeforePart = completedBytes(upload)\n\t\t\tconst result = await adapter.uploadPart({\n\t\t\t\tuploadId: upload.uploadId,\n\t\t\t\tpartNumber,\n\t\t\t\tchunk,\n\t\t\t\tsignal: upload.abortController?.signal,\n\t\t\t\tonProgress: (loaded) => {\n\t\t\t\t\tthis.updateUploadProgress(upload, completedBeforePart + loaded, upload.totalBytes)\n\t\t\t\t}\n\t\t\t})\n\t\t\tupload.completedParts = [...upload.completedParts, { partNumber, etag: result.etag }].sort(\n\t\t\t\t(left, right) => left.partNumber - right.partNumber\n\t\t\t)\n\t\t\tupload.loadedBytes = completedBytes(upload)\n\t\t\tupload.updatedAt = this.timestamp()\n\t\t\tthis.persistAndNotify()\n\t\t}\n\n\t\treturn adapter.completeMultipartUpload({\n\t\t\tuploadId: upload.uploadId,\n\t\t\tparts: upload.completedParts\n\t\t})\n\t}\n\n\tprivate updateUploadProgress(upload: UploadTransfer, loadedBytes: number, totalBytes: number): void {\n\t\tconst sampledAt = this.now()\n\t\tconst timeMs = sampledAt.getTime()\n\t\tconst previous = this.uploadSpeedSamples.get(upload.id)\n\n\t\tupload.loadedBytes = loadedBytes\n\t\tupload.totalBytes = totalBytes\n\t\tif (previous && loadedBytes > previous.loadedBytes && timeMs > previous.timeMs) {\n\t\t\tupload.bytesPerSecond = ((loadedBytes - previous.loadedBytes) / (timeMs - previous.timeMs)) * 1000\n\t\t}\n\t\tthis.uploadSpeedSamples.set(upload.id, { loadedBytes, timeMs })\n\t\tupload.updatedAt = sampledAt.toISOString()\n\t\tthis.persistAndNotify()\n\t}\n\n\tprivate track(task: Promise<void>): void {\n\t\tthis.activeTasks.add(task)\n\t\tvoid task.finally(() => {\n\t\t\tthis.activeTasks.delete(task)\n\t\t})\n\t}\n\n\tprivate persistAndNotify(): void {\n\t\tthis.snapshotCache = undefined\n\t\tthis.persist()\n\t\tfor (const subscriber of this.subscribers) {\n\t\t\tsubscriber()\n\t\t}\n\t}\n\n\tprivate persist(): void {\n\t\tif (!this.storage) {\n\t\t\treturn\n\t\t}\n\n\t\tconst payload = {\n\t\t\tuploads: Array.from(this.uploads.values()).map((upload) => ({\n\t\t\t\t...cloneUpload(upload),\n\t\t\t\tfile: undefined,\n\t\t\t\tadapter: undefined,\n\t\t\t\tabortController: undefined\n\t\t\t})),\n\t\t\tdownloads: Array.from(this.downloads.values()).map(cloneDownload)\n\t\t}\n\t\tthis.storage.setItem(this.storageKey, JSON.stringify(payload))\n\t}\n\n\tprivate restorePersisted(): void {\n\t\tif (!this.storage) {\n\t\t\treturn\n\t\t}\n\n\t\tconst raw = this.storage.getItem(this.storageKey)\n\t\tif (!raw) {\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(raw) as Partial<TransferSnapshot>\n\t\t\tfor (const upload of parsed.uploads ?? []) {\n\t\t\t\tthis.uploads.set(upload.id, {\n\t\t\t\t\t...upload,\n\t\t\t\t\tfile: undefined,\n\t\t\t\t\tadapter: undefined,\n\t\t\t\t\tabortController: undefined\n\t\t\t\t})\n\t\t\t}\n\t\t\tfor (const download of parsed.downloads ?? []) {\n\t\t\t\tthis.downloads.set(download.id, { ...download })\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.storage.removeItem(this.storageKey)\n\t\t}\n\t}\n\n\tprivate timestamp(): string {\n\t\treturn this.now().toISOString()\n\t}\n\n\tprivate pruneExpiredDownloads(): void {\n\t\tconst nowMs = this.now().getTime()\n\t\tlet changed = false\n\n\t\tfor (const [id, download] of this.downloads) {\n\t\t\tif (!isExpiredOrStaleDownload(download, nowMs)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trevokeDownloadUrl(download.url)\n\t\t\tthis.downloads.delete(id)\n\t\t\tchanged = true\n\t\t}\n\n\t\tif (!changed) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.snapshotCache = undefined\n\t\tthis.persist()\n\t}\n}\n\nfunction hasMultipart(\n\tadapter: FileBrowserAdapter\n): adapter is FileBrowserAdapter &\n\tRequired<Pick<FileBrowserAdapter, 'createMultipartUpload' | 'uploadPart' | 'completeMultipartUpload'>> {\n\treturn (\n\t\ttypeof adapter.createMultipartUpload === 'function' &&\n\t\ttypeof adapter.uploadPart === 'function' &&\n\t\ttypeof adapter.completeMultipartUpload === 'function'\n\t)\n}\n\nfunction completedBytes(upload: UploadTransfer): number {\n\tconst partSize = upload.partSize ?? upload.totalBytes\n\treturn upload.completedParts.reduce((total, part) => {\n\t\tconst start = (part.partNumber - 1) * partSize\n\t\treturn total + Math.min(partSize, upload.totalBytes - start)\n\t}, 0)\n}\n\nasync function prepareMultipartDestination(upload: UploadTransfer): Promise<void> {\n\tconst adapter = upload.adapter\n\tif (!adapter?.exists) {\n\t\treturn\n\t}\n\tconst exists: NonNullable<FileBrowserAdapter['exists']> = (paths) => adapter.exists?.(paths) ?? Promise.resolve({})\n\n\tconst current = await exists([upload.path])\n\tif (!current[upload.path]) {\n\t\treturn\n\t}\n\n\tif (upload.onConflict === 'keep-both') {\n\t\tupload.path = await nextAvailableUploadPath(exists, upload.path)\n\t\treturn\n\t}\n\n\tif (upload.onConflict !== 'replace') {\n\t\tthrow new FileBrowserAdapterError('conflict', `A file browser entry already exists at ${upload.path}`)\n\t}\n}\n\nasync function nextAvailableUploadPath(\n\texists: NonNullable<FileBrowserAdapter['exists']>,\n\tpath: string\n): Promise<string> {\n\tconst dir = getFileBrowserDirname(path)\n\tconst basename = getFileBrowserBasename(path)\n\tconst dotIndex = basename.lastIndexOf('.')\n\tconst hasExtension = dotIndex > 0\n\tconst stem = hasExtension ? basename.slice(0, dotIndex) : basename\n\tconst extension = hasExtension ? basename.slice(dotIndex) : ''\n\n\tfor (let index = 1; index < Number.MAX_SAFE_INTEGER; index += 1) {\n\t\tconst candidate = joinFileBrowserPath(dir, `${stem} (${index})${extension}`)\n\t\tconst result = await exists([candidate])\n\t\tif (!result[candidate]) {\n\t\t\treturn candidate\n\t\t}\n\t}\n\n\tthrow new FileBrowserAdapterError('conflict', `Could not allocate a unique file browser path for ${path}`)\n}\n\nfunction cloneUpload(upload: UploadTransfer): UploadTransfer {\n\treturn {\n\t\t...upload,\n\t\tgroup: upload.group ? { ...upload.group } : undefined,\n\t\tcompletedParts: upload.completedParts.map((part) => ({ ...part }))\n\t}\n}\n\nfunction cloneDownload(download: InternalBulkDownloadJob): BulkDownloadJob {\n\tconst { adapter: _adapter, ...snapshot } = download\n\tvoid _adapter\n\treturn {\n\t\t...snapshot,\n\t\tpaths: [...download.paths]\n\t}\n}\n\nfunction isExpiredOrStaleDownload(download: InternalBulkDownloadJob, nowMs: number): boolean {\n\tif (download.status === 'preparing') {\n\t\treturn false\n\t}\n\n\tif (download.expiresAt) {\n\t\tconst expiresAtMs = Date.parse(download.expiresAt)\n\t\tif (Number.isFinite(expiresAtMs) && expiresAtMs <= nowMs) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\tconst updatedAtMs = Date.parse(download.updatedAt)\n\treturn Number.isFinite(updatedAtMs) && nowMs - updatedAtMs > DOWNLOAD_RETENTION_MS\n}\n\nfunction revokeDownloadUrl(url: string | undefined): void {\n\tif (!url?.startsWith('blob:') || typeof URL === 'undefined' || typeof URL.revokeObjectURL !== 'function') {\n\t\treturn\n\t}\n\n\tURL.revokeObjectURL(url)\n}\n\nfunction createId(): string {\n\treturn `transfer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`\n}\n\nfunction toErrorMessage(caught: unknown): string {\n\treturn caught instanceof Error ? caught.message : String(caught)\n}\n\ntype ClientZipEntry = {\n\tpath: string\n\tarchivePath: string\n}\n\nasync function createClientZipUrl(adapter: FileBrowserAdapter, paths: string[]): Promise<string> {\n\tconst entries = await collectClientZipEntries(adapter, paths)\n\tconst zippable: Zippable = {}\n\n\tfor (const entry of entries) {\n\t\tconst url = await adapter.signedUrl(entry.path)\n\t\tconst response = await fetch(url)\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Could not fetch ${entry.path} for the client zip`)\n\t\t}\n\t\tzippable[entry.archivePath] = new Uint8Array(await response.arrayBuffer())\n\t}\n\n\tconst zip = zipSync(zippable)\n\treturn URL.createObjectURL(new Blob([zip], { type: 'application/zip' }))\n}\n\nasync function collectClientZipEntries(adapter: FileBrowserAdapter, paths: string[]): Promise<ClientZipEntry[]> {\n\tconst entries: ClientZipEntry[] = []\n\tconst seen = new Set<string>()\n\n\tfor (const path of paths) {\n\t\tawait collectClientZipPath(adapter, path, entries, seen)\n\t}\n\n\treturn entries\n}\n\nasync function collectClientZipPath(\n\tadapter: FileBrowserAdapter,\n\tpath: string,\n\tentries: ClientZipEntry[],\n\tseen: Set<string>\n): Promise<void> {\n\tif (seen.has(path)) {\n\t\treturn\n\t}\n\tseen.add(path)\n\n\tconst node = await tryStat(adapter, path)\n\tif (node?.kind === 'file') {\n\t\tentries.push({ path, archivePath: toArchivePath(path) })\n\t\treturn\n\t}\n\n\tif (node?.kind === 'folder') {\n\t\tawait collectClientZipFolder(adapter, path, entries, seen)\n\t\treturn\n\t}\n\n\tconst listed = await tryListFolder(adapter, path)\n\tif (listed) {\n\t\tfor (const item of listed) {\n\t\t\tawait collectClientZipPath(adapter, item.path, entries, seen)\n\t\t}\n\t\treturn\n\t}\n\n\tentries.push({ path, archivePath: toArchivePath(path) })\n}\n\nasync function collectClientZipFolder(\n\tadapter: FileBrowserAdapter,\n\tpath: string,\n\tentries: ClientZipEntry[],\n\tseen: Set<string>\n): Promise<void> {\n\tlet cursor: string | undefined\n\tdo {\n\t\tconst result = await adapter.list(path, { cursor })\n\t\tfor (const item of result.items) {\n\t\t\tawait collectClientZipPath(adapter, item.path, entries, seen)\n\t\t}\n\t\tcursor = result.cursor\n\t} while (cursor)\n}\n\nasync function tryStat(adapter: FileBrowserAdapter, path: string): Promise<FileNode | undefined> {\n\tif (!adapter.stat) {\n\t\treturn undefined\n\t}\n\n\ttry {\n\t\treturn await adapter.stat(path)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nasync function tryListFolder(adapter: FileBrowserAdapter, path: string): Promise<FileNode[] | undefined> {\n\ttry {\n\t\tlet cursor: string | undefined\n\t\tconst items: FileNode[] = []\n\t\tdo {\n\t\t\tconst result = await adapter.list(path, { cursor })\n\t\t\titems.push(...result.items)\n\t\t\tcursor = result.cursor\n\t\t} while (cursor)\n\t\treturn items\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nfunction toArchivePath(path: string): string {\n\treturn path.replace(/^\\/+/, '') || 'download'\n}\n","import { Download, Pause, Play, X } from 'lucide-react'\nimport { createContext, useContext, useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport type { PropsWithChildren } from 'react'\nimport { createPortal } from 'react-dom'\nimport { TransferManager } from './transfer-manager'\nimport type {\n\tBulkDownloadJob,\n\tResumeRestoredUploadInput,\n\tTransferManagerOptions,\n\tTransferSnapshot,\n\tUploadTransfer,\n\tUploadTransferGroup\n} from './transfer-manager'\n\nconst TransferContext = createContext<TransferManager | null>(null)\nconst WIDGET_CONTROL_MOTION =\n\t'transition-[background-color,border-color,color,box-shadow,opacity] duration-150 ease-out motion-reduce:transition-none'\nconst WIDGET_SURFACE_MOTION =\n\t'transition-[background-color,border-color,box-shadow,opacity] duration-200 ease-out motion-reduce:transition-none'\n\nexport type FileBrowserProviderProps = PropsWithChildren<{\n\tmanager?: TransferManager\n\toptions?: TransferManagerOptions\n\tresolveRestoredUpload?: (\n\t\tupload: UploadTransfer\n\t) => Omit<ResumeRestoredUploadInput, 'id'> | Promise<Omit<ResumeRestoredUploadInput, 'id'> | undefined> | undefined\n\tshowFloatingWidget?: boolean\n}>\n\nexport function FileBrowserProvider({\n\tchildren,\n\tmanager,\n\toptions,\n\tresolveRestoredUpload,\n\tshowFloatingWidget = true\n}: FileBrowserProviderProps) {\n\tconst transferManager = useMemo(() => manager ?? new TransferManager(withDefaultStorage(options)), [manager, options])\n\tconst snapshot = useTransfersSnapshot(transferManager)\n\tconst [resumePromptDismissed, setResumePromptDismissed] = useState(false)\n\tconst restorableUploads = transferManager.getRestorableUploads()\n\n\tuseBeforeUnloadGuard(transferManager)\n\n\tasync function resumeRestoredUploads(uploads: UploadTransfer[]) {\n\t\tfor (const upload of uploads) {\n\t\t\tif (upload.adapter && upload.file) {\n\t\t\t\tawait transferManager.resumeUpload(upload.id)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst resolved = await resolveRestoredUpload?.(upload)\n\t\t\tif (resolved) {\n\t\t\t\tawait transferManager.resumeRestoredUpload({\n\t\t\t\t\tid: upload.id,\n\t\t\t\t\t...resolved\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tsetResumePromptDismissed(true)\n\t}\n\n\treturn (\n\t\t<TransferContext.Provider value={transferManager}>\n\t\t\t{children}\n\t\t\t{showFloatingWidget ? <FloatingTransferWidget manager={transferManager} snapshot={snapshot} /> : null}\n\t\t\t{!resumePromptDismissed && restorableUploads.length > 0 ? (\n\t\t\t\t<ResumeUploadsPrompt\n\t\t\t\t\tcount={restorableUploads.length}\n\t\t\t\t\tonDismiss={() => {\n\t\t\t\t\t\ttransferManager.dismissRestoredUploads(restorableUploads.map((upload) => upload.id))\n\t\t\t\t\t\tsetResumePromptDismissed(true)\n\t\t\t\t\t}}\n\t\t\t\t\tonResume={() => {\n\t\t\t\t\t\tvoid resumeRestoredUploads(restorableUploads)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</TransferContext.Provider>\n\t)\n}\n\nexport function useTransfers(): TransferManager {\n\tconst manager = useContext(TransferContext)\n\treturn manager ?? fallbackTransferManager\n}\n\nexport function useTransferSnapshot(): TransferSnapshot {\n\treturn useTransfersSnapshot(useTransfers())\n}\n\nfunction useTransfersSnapshot(manager: TransferManager): TransferSnapshot {\n\treturn useSyncExternalStore(\n\t\t(listener) => manager.subscribe(listener),\n\t\t() => manager.getSnapshot(),\n\t\t() => ({ uploads: [], downloads: [] })\n\t)\n}\n\nfunction useBeforeUnloadGuard(manager: TransferManager): void {\n\tuseEffect(() => {\n\t\tconst listener = (event: BeforeUnloadEvent) => {\n\t\t\tif (!manager.hasActiveTransfers()) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tevent.returnValue = ''\n\t\t}\n\t\twindow.addEventListener('beforeunload', listener)\n\t\treturn () => window.removeEventListener('beforeunload', listener)\n\t}, [manager])\n}\n\nfunction withDefaultStorage(options: TransferManagerOptions | undefined): TransferManagerOptions {\n\tif (options?.storage) {\n\t\treturn options\n\t}\n\n\tconst storage = typeof window === 'undefined' ? undefined : window.localStorage\n\tif (!storage) {\n\t\treturn options ?? {}\n\t}\n\n\treturn {\n\t\t...options,\n\t\tstorage\n\t}\n}\n\nfunction FloatingTransferWidget({ manager, snapshot }: { manager: TransferManager; snapshot: TransferSnapshot }) {\n\tconst activeUploads = snapshot.uploads.filter(isVisibleUpload)\n\tconst uploadGroups = getActiveUploadGroups(snapshot.uploads)\n\tconst groupedUploadIds = new Set(uploadGroups.flatMap((group) => group.activeUploads.map((upload) => upload.id)))\n\tconst standaloneUploads = activeUploads.filter((upload) => !groupedUploadIds.has(upload.id))\n\tconst downloads = snapshot.downloads.filter((download) =>\n\t\t['preparing', 'warning', 'ready', 'failed'].includes(download.status)\n\t)\n\n\tif (activeUploads.length === 0 && downloads.length === 0) {\n\t\treturn null\n\t}\n\n\tconst content = (\n\t\t<aside\n\t\t\taria-label=\"Transfers\"\n\t\t\tclassName={`fixed bottom-4 right-4 z-50 w-[min(360px,calc(100vw-2rem))] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-3 text-[12px] text-[var(--fb-text)] shadow-[0_16px_44px_color-mix(in_oklch,var(--fb-text)_16%,transparent)] ${WIDGET_SURFACE_MOTION}`}\n\t\t>\n\t\t\t<div className=\"mb-2 flex items-center justify-between gap-2\">\n\t\t\t\t<div className=\"font-semibold\">Transfers</div>\n\t\t\t\t<div className=\"text-[11px] text-[var(--fb-muted)]\">{activeUploads.length + downloads.length} active</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t{uploadGroups.map((group) => (\n\t\t\t\t\t<UploadGroupCard group={group} key={group.group.id} manager={manager} />\n\t\t\t\t))}\n\t\t\t\t{standaloneUploads.map((upload) => (\n\t\t\t\t\t<UploadTransferRow key={upload.id} manager={manager} upload={upload} />\n\t\t\t\t))}\n\t\t\t\t{downloads.map((download) => (\n\t\t\t\t\t<div className=\"text-[11px] text-[var(--fb-muted)]\" key={download.id}>\n\t\t\t\t\t\t{download.status === 'ready' && download.url ? (\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\taria-label=\"Open prepared download\"\n\t\t\t\t\t\t\t\t\tclassName={`inline-flex min-w-0 items-center gap-1 rounded-[calc(var(--fb-radius)-4px)] px-1.5 py-1 font-medium text-[var(--fb-accent)] hover:bg-[var(--fb-accent-soft)] ${WIDGET_CONTROL_MOTION}`}\n\t\t\t\t\t\t\t\t\tdownload\n\t\t\t\t\t\t\t\t\thref={download.url}\n\t\t\t\t\t\t\t\t\tonClick={() => manager.dismissDownload(download.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Download aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{formatDownloadReadyLabel(download)}</span>\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\taria-label=\"Dismiss download\"\n\t\t\t\t\t\t\t\t\tclassName={widgetIconButton()}\n\t\t\t\t\t\t\t\t\tonClick={() => manager.dismissDownload(download.id)}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<X aria-hidden=\"true\" className=\"size-3.5\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{download.status === 'warning' ? (\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t\t\t\t<span>Large client zip</span>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclassName={widgetTextButton()}\n\t\t\t\t\t\t\t\t\tonClick={() => void manager.confirmBulkDownload(download.id)}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tContinue\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{download.status === 'preparing' ? <span>Preparing zip</span> : null}\n\t\t\t\t\t\t{download.status === 'failed' ? (\n\t\t\t\t\t\t\t<span className=\"text-[var(--fb-danger)]\">{download.error ?? 'Download failed'}</span>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</aside>\n\t)\n\n\treturn createPortal(content, document.body)\n}\n\ntype ActiveUploadGroup = {\n\tgroup: UploadTransferGroup\n\tuploads: UploadTransfer[]\n\tactiveUploads: UploadTransfer[]\n\tcompletedCount: number\n}\n\nfunction UploadGroupCard({ group, manager }: { group: ActiveUploadGroup; manager: TransferManager }) {\n\treturn (\n\t\t<div className={WIDGET_SURFACE_MOTION}>\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t<div className=\"truncate font-semibold\">Uploading {group.group.name}</div>\n\t\t\t\t\t<div className=\"text-[11px] text-[var(--fb-muted)]\">{formatUploadGroupSummary(group)}</div>\n\t\t\t\t</div>\n\t\t\t\t<button\n\t\t\t\t\taria-label={`Cancel upload group ${group.group.name}`}\n\t\t\t\t\tclassName={widgetIconButton()}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tfor (const upload of group.activeUploads) {\n\t\t\t\t\t\t\tvoid manager.cancelUpload(upload.id)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\ttitle=\"Cancel\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t<X aria-hidden=\"true\" className=\"size-3.5\" />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className={`mt-2 flex flex-col gap-1.5 border-l border-[var(--fb-border)] pl-3 ${WIDGET_SURFACE_MOTION}`}>\n\t\t\t\t{group.activeUploads.map((upload) => (\n\t\t\t\t\t<UploadTransferRow compact key={upload.id} manager={manager} upload={upload} />\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction UploadTransferRow({\n\tcompact = false,\n\tmanager,\n\tupload\n}: {\n\tcompact?: boolean\n\tmanager: TransferManager\n\tupload: UploadTransfer\n}) {\n\treturn (\n\t\t<div className={WIDGET_SURFACE_MOTION}>\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t<span className=\"block truncate font-medium\">{upload.name}</span>\n\t\t\t\t\t<span className=\"text-[11px] text-[var(--fb-muted)]\">{formatUploadStatus(upload)}</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-1\">\n\t\t\t\t\t{['queued', 'uploading'].includes(upload.status) ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\taria-label={`Pause upload ${upload.name}`}\n\t\t\t\t\t\t\tclassName={widgetIconButton()}\n\t\t\t\t\t\t\tonClick={() => manager.pauseUpload(upload.id)}\n\t\t\t\t\t\t\ttitle=\"Pause\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Pause aria-hidden=\"true\" className=\"size-3.5\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{['failed', 'paused'].includes(upload.status) ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\taria-label={`Resume upload ${upload.name}`}\n\t\t\t\t\t\t\tclassName={widgetIconButton()}\n\t\t\t\t\t\t\tonClick={() => void manager.resumeUpload(upload.id)}\n\t\t\t\t\t\t\ttitle=\"Resume\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Play aria-hidden=\"true\" className=\"size-3.5\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<button\n\t\t\t\t\t\taria-label={`Cancel upload ${upload.name}`}\n\t\t\t\t\t\tclassName={widgetIconButton()}\n\t\t\t\t\t\tonClick={() => void manager.cancelUpload(upload.id)}\n\t\t\t\t\t\ttitle=\"Cancel\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X aria-hidden=\"true\" className=\"size-3.5\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={`h-1.5 overflow-hidden rounded-full bg-[var(--fb-surface-2)] ${WIDGET_SURFACE_MOTION} ${\n\t\t\t\t\tcompact ? 'mt-1' : 'mt-1.5'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-full rounded-full bg-[var(--fb-accent)] transition-[width] duration-300 ease-out motion-reduce:transition-none\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: `${Math.min(100, upload.totalBytes ? (upload.loadedBytes / upload.totalBytes) * 100 : 0)}%`\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction ResumeUploadsPrompt({\n\tcount,\n\tonDismiss,\n\tonResume\n}: {\n\tcount: number\n\tonDismiss: () => void\n\tonResume: () => void\n}) {\n\treturn createPortal(\n\t\t<div\n\t\t\taria-label=\"Resume uploads\"\n\t\t\taria-modal=\"true\"\n\t\t\tclassName={`fixed inset-0 z-50 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_20%,transparent)] p-4 text-[13px] text-[var(--fb-text)] ${WIDGET_SURFACE_MOTION}`}\n\t\t\trole=\"dialog\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={`w-[min(380px,100%)] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 shadow-[0_18px_50px_color-mix(in_oklch,var(--fb-text)_18%,transparent)] ${WIDGET_SURFACE_MOTION}`}\n\t\t\t>\n\t\t\t\t<h2 className=\"m-0 text-[14px] font-semibold\">Resume uploads</h2>\n\t\t\t\t<p className=\"mt-2 text-[12px] text-[var(--fb-muted)]\">\n\t\t\t\t\tResume {count} upload{count === 1 ? '?' : 's?'}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t<button className={widgetTextButton()} onClick={onDismiss} type=\"button\">\n\t\t\t\t\t\tDismiss\n\t\t\t\t\t</button>\n\t\t\t\t\t<button className={widgetPrimaryButton()} onClick={onResume} type=\"button\">\n\t\t\t\t\t\tResume uploads\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>,\n\t\tdocument.body\n\t)\n}\n\nconst fallbackTransferManager = new TransferManager()\n\nfunction widgetIconButton() {\n\treturn `grid size-7 place-items-center rounded-[calc(var(--fb-radius)-4px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] text-[var(--fb-muted)] outline-none hover:bg-[var(--fb-bg)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${WIDGET_CONTROL_MOTION}`\n}\n\nfunction widgetTextButton() {\n\treturn `inline-flex h-7 items-center rounded-[calc(var(--fb-radius)-4px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] px-2 text-[11px] font-medium text-[var(--fb-text)] outline-none hover:bg-[var(--fb-bg)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${WIDGET_CONTROL_MOTION}`\n}\n\nfunction widgetPrimaryButton() {\n\treturn `inline-flex h-7 items-center rounded-[calc(var(--fb-radius)-4px)] border border-[var(--fb-accent)] bg-[var(--fb-accent)] px-2 text-[11px] font-semibold text-[var(--fb-surface)] outline-none hover:opacity-90 focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${WIDGET_CONTROL_MOTION}`\n}\n\nfunction isVisibleUpload(upload: UploadTransfer): boolean {\n\treturn ['queued', 'uploading', 'failed', 'paused'].includes(upload.status)\n}\n\nfunction getActiveUploadGroups(uploads: UploadTransfer[]): ActiveUploadGroup[] {\n\tconst groups = new Map<string, ActiveUploadGroup>()\n\n\tfor (const upload of uploads) {\n\t\tif (!upload.group) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst existing = groups.get(upload.group.id) ?? {\n\t\t\tgroup: upload.group,\n\t\t\tuploads: [],\n\t\t\tactiveUploads: [],\n\t\t\tcompletedCount: 0\n\t\t}\n\t\texisting.uploads.push(upload)\n\t\tif (upload.status === 'completed') {\n\t\t\texisting.completedCount += 1\n\t\t}\n\t\tif (isVisibleUpload(upload)) {\n\t\t\texisting.activeUploads.push(upload)\n\t\t}\n\t\tgroups.set(upload.group.id, existing)\n\t}\n\n\treturn Array.from(groups.values()).filter((group) => group.activeUploads.length > 0)\n}\n\nfunction formatUploadGroupSummary(group: ActiveUploadGroup): string {\n\tconst folders = group.group.createdFolders\n\tconst files = `${group.completedCount} of ${group.group.totalFiles} files`\n\tif (folders <= 0) {\n\t\treturn files\n\t}\n\n\treturn `${files}, ${folders} folder${folders === 1 ? '' : 's'} created`\n}\n\nfunction formatUploadStatus(upload: UploadTransfer): string {\n\tif (\n\t\tupload.status !== 'uploading' ||\n\t\ttypeof upload.bytesPerSecond !== 'number' ||\n\t\t!Number.isFinite(upload.bytesPerSecond) ||\n\t\tupload.bytesPerSecond <= 0\n\t) {\n\t\treturn upload.status\n\t}\n\n\treturn `${upload.status}, ${formatTransferBytes(upload.bytesPerSecond)}/s`\n}\n\nfunction formatTransferBytes(bytes: number): string {\n\tconst units = ['B', 'KB', 'MB', 'GB', 'TB']\n\tlet value = Math.max(0, bytes)\n\tlet unitIndex = 0\n\n\twhile (value >= 1024 && unitIndex < units.length - 1) {\n\t\tvalue /= 1024\n\t\tunitIndex += 1\n\t}\n\n\tconst formatted = unitIndex === 0 || value >= 10 ? Math.round(value).toString() : value.toFixed(1)\n\treturn `${formatted} ${units[unitIndex]}`\n}\n\nfunction formatDownloadReadyLabel(download: BulkDownloadJob): string {\n\tconst expiresIn = download.expiresAt ? formatExpiresIn(download.expiresAt) : undefined\n\n\treturn expiresIn ? `Download ready, expires in ${expiresIn}` : 'Download ready'\n}\n\nfunction formatExpiresIn(expiresAt: string): string | undefined {\n\tconst remainingMs = Date.parse(expiresAt) - Date.now()\n\tif (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n\t\treturn undefined\n\t}\n\n\tif (remainingMs < 60 * 60 * 1000) {\n\t\treturn `${Math.ceil(remainingMs / (60 * 1000))}m`\n\t}\n\n\tif (remainingMs < 24 * 60 * 60 * 1000) {\n\t\treturn `${Math.ceil(remainingMs / (60 * 60 * 1000))}h`\n\t}\n\n\treturn `${Math.ceil(remainingMs / (24 * 60 * 60 * 1000))}d`\n}\n","import {\n\tCheckSquare,\n\tChevronLeft,\n\tChevronRight,\n\tCopy as CopyIcon,\n\tDownload,\n\tFile,\n\tFolder,\n\tFolderInput,\n\tGrid2X2,\n\tList,\n\tPencil,\n\tScissors,\n\tSearch,\n\tSquare,\n\tTrash2,\n\tUpload,\n\tX as XIcon\n} from 'lucide-react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { CSSProperties, DragEvent, KeyboardEvent, MouseEvent } from 'react'\nimport Selecto from 'react-selecto'\nimport type { OnSelect } from 'react-selecto'\nimport type { FileBrowserDensity } from '../theme'\nimport { useFileBrowser } from '../core/use-file-browser'\nimport type { FileBrowserUploadConflictResolution } from '../core/use-file-browser'\nimport { getFileBrowserDirname, joinFileBrowserPath, normalizeFileBrowserPath } from '../core/path'\nimport { FileBrowserAdapterError, FileBrowserBulkActionError } from '../core/types'\nimport type { FileBrowserAdapter, FileNode } from '../core/types'\nimport { collectUploadCandidatesFromDataTransfer, getFileBrowserUploadCandidates } from '../core/upload-drop'\nimport type { FileBrowserUploadCandidate } from '../core/upload-drop'\nimport { useTransferSnapshot, useTransfers } from '../transfers/file-browser-provider'\nimport type { UploadTransferGroup } from '../transfers/transfer-manager'\n\nexport type FileBrowserProps = {\n\tadapter: FileBrowserAdapter\n\tinitialPath?: string\n\tdensity?: FileBrowserDensity\n\treadOnly?: boolean\n\tshowDetailsPanel?: boolean\n\tuploadPolicy?: FileBrowserUploadPolicy\n\twarnZipSizeBytes?: number\n}\n\nexport type FileBrowserUploadPolicy = {\n\tallowedMimeTypes?: string[]\n\tmaxFileSizeBytes?: number\n\tremainingQuotaBytes?: number\n\tvalidate?: (\n\t\tcandidate: FileBrowserUploadCandidate,\n\t\tcontext: {\n\t\t\tacceptedBytes: number\n\t\t\tcurrentPath: string\n\t\t}\n\t) => string | string[] | null | undefined\n}\n\nexport type FileBrowserUploadRejection = {\n\tfileName: string\n\trelativePath: string\n\treasons: string[]\n}\n\ntype ContextMenuState =\n\t| {\n\t\t\ttarget: 'item'\n\t\t\titem: FileNode\n\t\t\tx: number\n\t\t\ty: number\n\t\t\tmode?: 'context' | 'sheet'\n\t }\n\t| {\n\t\t\ttarget: 'empty'\n\t\t\tx: number\n\t\t\ty: number\n\t\t\tmode?: 'context' | 'sheet'\n\t }\n\ntype UploadConflictQueue = {\n\tcandidates: FileBrowserUploadCandidate[]\n\tconflictPaths: string[]\n\tgroup?: UploadTransferGroup\n\tindex: number\n}\n\ntype MoveDestination = {\n\tpath: string\n\tname: string\n\tdepth: number\n}\n\ntype MoveDestinationStatus = 'idle' | 'loading' | 'ready' | 'error'\n\ntype PreviewState = {\n\titem: FileNode\n\tstatus: 'loading' | 'ready' | 'error'\n\turl?: string\n\terror?: string\n}\n\nconst FILE_BROWSER_DRAG_MIME = 'application/x.react-file-browser.paths'\nconst SELECTED_ITEM_DOUBLE_CLICK_WINDOW_MS = 220\nconst CLIPBOARD_NOTICE_DURATION_MS = 5000\nconst CONTROL_MOTION =\n\t'transition-[background-color,border-color,color,box-shadow,opacity] duration-150 ease-out motion-reduce:transition-none'\nconst SURFACE_MOTION =\n\t'transition-[background-color,border-color,box-shadow,opacity] duration-200 ease-out motion-reduce:transition-none'\n\n// Density drives layout scale through CSS variables set inline on the root, so the effect works for\n// every consumer without shipping global CSS. Classes below reference these vars (e.g. h-[var(--fb-control-h)]).\nconst DENSITY_STYLES: Record<FileBrowserDensity, CSSProperties> = {\n\tcomfortable: {\n\t\t'--fb-font': '13px',\n\t\t'--fb-control-h': '32px',\n\t\t'--fb-cell-x': '12px',\n\t\t'--fb-cell-y': '8px',\n\t\t'--fb-pad': '12px',\n\t\t'--fb-card-min': '150px',\n\t\t'--fb-card-minh': '132px',\n\t\t'--fb-card-pad': '8px',\n\t\t'--fb-thumb-h': '64px',\n\t\t'--fb-grid-gap': '12px',\n\t\t'--fb-panel-w': '18rem',\n\t\t'--fb-panel-pad': '16px'\n\t} as CSSProperties,\n\tcompact: {\n\t\t'--fb-font': '12px',\n\t\t'--fb-control-h': '28px',\n\t\t'--fb-cell-x': '10px',\n\t\t'--fb-cell-y': '6px',\n\t\t'--fb-pad': '8px',\n\t\t'--fb-card-min': '124px',\n\t\t'--fb-card-minh': '108px',\n\t\t'--fb-card-pad': '6px',\n\t\t'--fb-thumb-h': '48px',\n\t\t'--fb-grid-gap': '8px',\n\t\t'--fb-panel-w': '15rem',\n\t\t'--fb-panel-pad': '12px'\n\t} as CSSProperties\n}\n\nexport function FileBrowser({\n\tadapter,\n\tinitialPath = '/',\n\tdensity = 'comfortable',\n\treadOnly = false,\n\tshowDetailsPanel = true,\n\tuploadPolicy,\n\twarnZipSizeBytes\n}: FileBrowserProps) {\n\tconst browser = useFileBrowser({ adapter, initialPath })\n\tconst transfers = useTransfers()\n\tconst transferSnapshot = useTransferSnapshot()\n\tconst [newFolderOpen, setNewFolderOpen] = useState(false)\n\tconst [newFolderName, setNewFolderName] = useState('')\n\tconst [newFolderError, setNewFolderError] = useState<string | null>(null)\n\tconst [renameItem, setRenameItem] = useState<FileNode | null>(null)\n\tconst [renameValue, setRenameValue] = useState('')\n\tconst [renameError, setRenameError] = useState<string | null>(null)\n\tconst [inlineRenameItem, setInlineRenameItem] = useState<FileNode | null>(null)\n\tconst [inlineRenameValue, setInlineRenameValue] = useState('')\n\tconst [inlineRenameError, setInlineRenameError] = useState<string | null>(null)\n\tconst [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false)\n\tconst [moveDialogOpen, setMoveDialogOpen] = useState(false)\n\tconst [bulkFailure, setBulkFailure] = useState<FileBrowserBulkActionError | null>(null)\n\tconst [moveDestination, setMoveDestination] = useState(initialPath)\n\tconst [moveDestinations, setMoveDestinations] = useState<MoveDestination[]>([])\n\tconst [moveDestinationStatus, setMoveDestinationStatus] = useState<MoveDestinationStatus>('idle')\n\tconst [moveDestinationError, setMoveDestinationError] = useState<string | null>(null)\n\tconst [contextMenu, setContextMenu] = useState<ContextMenuState | null>(null)\n\tconst [uploadConflictQueue, setUploadConflictQueue] = useState<UploadConflictQueue | null>(null)\n\tconst [uploadRejections, setUploadRejections] = useState<FileBrowserUploadRejection[]>([])\n\tconst [applyUploadResolution, setApplyUploadResolution] = useState(false)\n\tconst [clipboardNotice, setClipboardNotice] = useState<string | null>(null)\n\tconst [dropActive, setDropActive] = useState(false)\n\tconst [preview, setPreview] = useState<PreviewState | null>(null)\n\tconst rootRef = useRef<HTMLElement | null>(null)\n\tconst uploadInputRef = useRef<HTMLInputElement | null>(null)\n\tconst pendingSelectedItemUnselectRef = useRef<{\n\t\tpath: string\n\t\ttimeoutId: ReturnType<typeof setTimeout>\n\t} | null>(null)\n\tconst lastItemClickRef = useRef<{ path: string; timeMs: number } | null>(null)\n\tconst doubleClickOpenPathRef = useRef<string | null>(null)\n\tconst refreshedUploadIdsRef = useRef<Set<string>>(new Set())\n\tconst selected = browser.selectedItems.at(0) ?? null\n\tconst previewFiles = useMemo(\n\t\t() => browser.filteredItems.filter((item) => item.kind === 'file'),\n\t\t[browser.filteredItems]\n\t)\n\tconst openPreview = useCallback(\n\t\tasync (item: FileNode) => {\n\t\t\tsetPreview({ item, status: 'loading' })\n\t\t\ttry {\n\t\t\t\tconst url = await adapter.signedUrl(item.path)\n\t\t\t\tsetPreview((current) => (current?.item.path === item.path ? { item, status: 'ready', url } : current))\n\t\t\t} catch (error) {\n\t\t\t\tsetPreview((current) =>\n\t\t\t\t\tcurrent?.item.path === item.path ? { item, status: 'error', error: toErrorMessage(error) } : current\n\t\t\t\t)\n\t\t\t}\n\t\t},\n\t\t[adapter]\n\t)\n\tconst cancelPendingSelectedItemUnselect = useCallback(() => {\n\t\tif (!pendingSelectedItemUnselectRef.current) {\n\t\t\treturn\n\t\t}\n\n\t\tclearTimeout(pendingSelectedItemUnselectRef.current.timeoutId)\n\t\tpendingSelectedItemUnselectRef.current = null\n\t}, [])\n\tconst scheduleSelectedItemUnselect = useCallback(\n\t\t(path: string) => {\n\t\t\tcancelPendingSelectedItemUnselect()\n\t\t\tpendingSelectedItemUnselectRef.current = {\n\t\t\t\tpath,\n\t\t\t\ttimeoutId: setTimeout(() => {\n\t\t\t\t\tif (pendingSelectedItemUnselectRef.current?.path !== path) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tpendingSelectedItemUnselectRef.current = null\n\t\t\t\t\tbrowser.clearSelection()\n\t\t\t\t}, SELECTED_ITEM_DOUBLE_CLICK_WINDOW_MS)\n\t\t\t}\n\t\t},\n\t\t[browser, cancelPendingSelectedItemUnselect]\n\t)\n\tconst selectItemWithEvent = useCallback(\n\t\t(path: string, event: MouseEvent | KeyboardEvent) => {\n\t\t\tconst clickedAt = Date.now()\n\t\t\tconst previousClick = lastItemClickRef.current\n\t\t\tconst isFastRepeatClick =\n\t\t\t\tpreviousClick?.path === path && clickedAt - previousClick.timeMs <= SELECTED_ITEM_DOUBLE_CLICK_WINDOW_MS\n\n\t\t\tif ('detail' in event && event.detail > 1) {\n\t\t\t\tif (isFastRepeatClick) {\n\t\t\t\t\tcancelPendingSelectedItemUnselect()\n\t\t\t\t\tdoubleClickOpenPathRef.current = path\n\t\t\t\t}\n\t\t\t\tlastItemClickRef.current = { path, timeMs: clickedAt }\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tdoubleClickOpenPathRef.current = null\n\t\t\tlastItemClickRef.current = { path, timeMs: clickedAt }\n\t\t\tselectWithEvent(browser, path, event, {\n\t\t\t\tcancelPendingSelectedItemUnselect,\n\t\t\t\tscheduleSelectedItemUnselect\n\t\t\t})\n\t\t},\n\t\t[browser, cancelPendingSelectedItemUnselect, scheduleSelectedItemUnselect]\n\t)\n\tconst openItemFromDoubleClick = useCallback(\n\t\t(item: FileNode) => {\n\t\t\tif (doubleClickOpenPathRef.current !== item.path) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tdoubleClickOpenPathRef.current = null\n\t\t\tcancelPendingSelectedItemUnselect()\n\t\t\tif (item.kind === 'folder') {\n\t\t\t\tvoid browser.navigate(item.path)\n\t\t\t} else {\n\t\t\t\tvoid openPreview(item)\n\t\t\t}\n\t\t},\n\t\t[browser, cancelPendingSelectedItemUnselect, openPreview]\n\t)\n\tuseEffect(\n\t\t() => () => {\n\t\t\tcancelPendingSelectedItemUnselect()\n\t\t},\n\t\t[cancelPendingSelectedItemUnselect]\n\t)\n\tconst totalSelectedBytes = useMemo(\n\t\t() => browser.selectedItems.reduce((total, item) => total + (item.size ?? 0), 0),\n\t\t[browser.selectedItems]\n\t)\n\tconst moveKeyboardSelection = useCallback(\n\t\t(key: string, extendSelection: boolean) => {\n\t\t\tconst visibleItems = browser.filteredItems\n\t\t\tif (visibleItems.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst currentPath = browser.focusedPath ?? browser.selectedPaths.at(-1)\n\t\t\tconst currentIndex = visibleItems.findIndex((item) => item.path === currentPath)\n\t\t\tconst fallbackIndex = key === 'ArrowUp' || key === 'ArrowLeft' || key === 'End' ? visibleItems.length - 1 : 0\n\t\t\tconst nextIndex =\n\t\t\t\tcurrentIndex === -1 ? fallbackIndex : getNextKeyboardIndex(key, currentIndex, visibleItems.length)\n\t\t\tconst next = visibleItems[nextIndex]\n\n\t\t\tif (extendSelection) {\n\t\t\t\tbrowser.selectRange(next.path)\n\t\t\t} else {\n\t\t\t\tbrowser.selectOnly(next.path)\n\t\t\t}\n\t\t},\n\t\t[browser]\n\t)\n\tconst copySelectedItems = useCallback(\n\t\t(paths = browser.selectedPaths) => {\n\t\t\tif (paths.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tbrowser.copySelection(paths)\n\t\t\tsetClipboardNotice(`Copied ${formatItemCount(paths.length)}`)\n\t\t},\n\t\t[browser]\n\t)\n\tconst cutSelectedItems = useCallback(\n\t\t(paths = browser.selectedPaths) => {\n\t\t\tif (paths.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tbrowser.cutSelection(paths)\n\t\t\tsetClipboardNotice(`Cut ${formatItemCount(paths.length)}`)\n\t\t},\n\t\t[browser]\n\t)\n\tconst copyItemPaths = useCallback(async (paths: string[]) => {\n\t\tif (paths.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait navigator.clipboard.writeText(paths.join(', '))\n\t\tsetClipboardNotice(paths.length === 1 ? 'Copied path' : `Copied ${paths.length} paths`)\n\t}, [])\n\tconst pasteClipboardInto = useCallback(\n\t\tasync (toDir: string) => {\n\t\t\tconst pastedCount = browser.clipboard?.paths.length ?? 0\n\t\t\tawait browser.pasteInto(toDir)\n\t\t\tif (pastedCount > 0) {\n\t\t\t\tsetClipboardNotice(`Pasted ${formatItemCount(pastedCount)}`)\n\t\t\t}\n\t\t},\n\t\t[browser]\n\t)\n\n\tuseEffect(() => {\n\t\tconst listener = (event: globalThis.KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tbrowser.clearSelection()\n\t\t\t\tsetInlineRenameItem(null)\n\t\t\t\tsetInlineRenameValue('')\n\t\t\t\tsetInlineRenameError(null)\n\t\t\t\tsetRenameItem(null)\n\t\t\t\tsetRenameError(null)\n\t\t\t\tsetNewFolderError(null)\n\t\t\t\tsetDeleteConfirmOpen(false)\n\t\t\t\tsetMoveDialogOpen(false)\n\t\t\t\tsetBulkFailure(null)\n\t\t\t\tsetContextMenu(null)\n\t\t\t\tsetUploadConflictQueue(null)\n\t\t\t\tsetPreview(null)\n\t\t\t}\n\t\t\tif (isEditableEventTarget(event.target)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (isKeyboardNavigationKey(event.key)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tmoveKeyboardSelection(event.key, event.shiftKey)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!readOnly && event.key === 'F2' && browser.capabilities.rename && browser.selectedItems.length === 1) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst item = browser.selectedItems[0]\n\t\t\t\tsetRenameItem(null)\n\t\t\t\tsetRenameError(null)\n\t\t\t\tsetInlineRenameItem(item)\n\t\t\t\tsetInlineRenameValue(item.name)\n\t\t\t\tsetInlineRenameError(null)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!readOnly && (event.key === 'Delete' || event.key === 'Backspace') && browser.selectedPaths.length > 0) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tsetDeleteConfirmOpen(true)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ((event.metaKey || event.ctrlKey) && !readOnly) {\n\t\t\t\tconst key = event.key.toLowerCase()\n\t\t\t\tif (key === 'c' && browser.capabilities.copy && browser.selectedPaths.length > 0) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tcopySelectedItems()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (key === 'x' && browser.capabilities.move && browser.selectedPaths.length > 0) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tcutSelectedItems()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (key === 'v' && browser.clipboard) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tvoid pasteClipboardInto(browser.currentPath)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.key === 'Enter' && browser.selectedItems.length === 1) {\n\t\t\t\tconst item = browser.selectedItems[0]\n\t\t\t\tif (item.kind === 'folder') {\n\t\t\t\t\tvoid browser.navigate(item.path)\n\t\t\t\t} else {\n\t\t\t\t\tvoid openPreview(item)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'a') {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tbrowser.selectAllLoaded()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keydown', listener)\n\t\treturn () => document.removeEventListener('keydown', listener)\n\t}, [browser, copySelectedItems, cutSelectedItems, moveKeyboardSelection, openPreview, pasteClipboardInto, readOnly])\n\n\tuseEffect(() => {\n\t\tif (!browser.focusedPath) {\n\t\t\treturn\n\t\t}\n\n\t\tconst item = rootRef.current?.querySelector<HTMLElement>(\n\t\t\t`[data-fb-path=\"${escapeAttributeSelector(browser.focusedPath)}\"]`\n\t\t)\n\t\titem?.focus()\n\t}, [browser.focusedPath, browser.filteredItems, browser.view])\n\n\tuseEffect(() => {\n\t\tif (!contextMenu) {\n\t\t\treturn\n\t\t}\n\t\tconst close = () => setContextMenu(null)\n\t\tdocument.addEventListener('click', close)\n\t\treturn () => document.removeEventListener('click', close)\n\t}, [contextMenu])\n\n\tuseEffect(() => {\n\t\tif (!clipboardNotice) {\n\t\t\treturn\n\t\t}\n\t\tconst timer = setTimeout(() => setClipboardNotice(null), CLIPBOARD_NOTICE_DURATION_MS)\n\t\treturn () => clearTimeout(timer)\n\t}, [clipboardNotice])\n\n\tuseEffect(() => {\n\t\tfor (const upload of transferSnapshot.uploads) {\n\t\t\tif (upload.status !== 'completed' || !upload.result || refreshedUploadIdsRef.current.has(upload.id)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trefreshedUploadIdsRef.current.add(upload.id)\n\t\t\tif (getFileBrowserDirname(upload.result.path) === browser.currentPath) {\n\t\t\t\tvoid browser.refresh()\n\t\t\t}\n\t\t}\n\t}, [browser, transferSnapshot.uploads])\n\n\tuseEffect(() => {\n\t\tif (!moveDialogOpen) {\n\t\t\treturn\n\t\t}\n\n\t\tlet cancelled = false\n\n\t\tvoid Promise.resolve()\n\t\t\t.then(async () => {\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\tsetMoveDestinationStatus('loading')\n\t\t\t\tsetMoveDestinationError(null)\n\t\t\t\treturn collectMoveDestinations(adapter, browser.selectedPaths)\n\t\t\t})\n\t\t\t.then((destinations) => {\n\t\t\t\tif (cancelled || destinations.length === 0) {\n\t\t\t\t\tif (!cancelled && destinations.length === 0) {\n\t\t\t\t\t\tsetMoveDestinations([])\n\t\t\t\t\t\tsetMoveDestinationStatus('ready')\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tsetMoveDestinations(destinations)\n\t\t\t\tsetMoveDestinationStatus('ready')\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tsetMoveDestinations([])\n\t\t\t\tsetMoveDestinationStatus('error')\n\t\t\t\tsetMoveDestinationError(toErrorMessage(error))\n\t\t\t})\n\n\t\treturn () => {\n\t\t\tcancelled = true\n\t\t}\n\t}, [adapter, browser.selectedPaths, moveDialogOpen])\n\n\tasync function createFolder() {\n\t\tif (!newFolderName.trim()) {\n\t\t\treturn\n\t\t}\n\t\tsetNewFolderError(null)\n\t\ttry {\n\t\t\tawait browser.createFolder(newFolderName)\n\t\t\tsetNewFolderName('')\n\t\t\tsetNewFolderOpen(false)\n\t\t} catch (error) {\n\t\t\tsetNewFolderError(toErrorMessage(error))\n\t\t}\n\t}\n\n\tfunction openRenameDialog(item = browser.selectedItems.at(0)) {\n\t\tif (!item) {\n\t\t\treturn\n\t\t}\n\t\tsetInlineRenameItem(null)\n\t\tsetInlineRenameValue('')\n\t\tsetInlineRenameError(null)\n\t\tsetRenameItem(item)\n\t\tsetRenameValue(item.name)\n\t\tsetRenameError(null)\n\t}\n\n\tasync function renameSelectedItem() {\n\t\tconst nextName = renameValue.trim()\n\t\tif (!renameItem || !nextName) {\n\t\t\treturn\n\t\t}\n\t\tsetRenameError(null)\n\t\ttry {\n\t\t\tawait browser.rename(renameItem.path, nextName)\n\t\t\tsetRenameItem(null)\n\t\t\tsetRenameValue('')\n\t\t} catch (error) {\n\t\t\tsetRenameError(toErrorMessage(error))\n\t\t}\n\t}\n\n\tasync function commitInlineRename() {\n\t\tconst item = inlineRenameItem\n\t\tconst nextName = inlineRenameValue.trim()\n\t\tsetInlineRenameError(null)\n\t\tif (!item || !nextName || nextName === item.name) {\n\t\t\tsetInlineRenameItem(null)\n\t\t\tsetInlineRenameValue('')\n\t\t\treturn\n\t\t}\n\t\ttry {\n\t\t\tawait browser.rename(item.path, nextName)\n\t\t\tsetInlineRenameItem(null)\n\t\t\tsetInlineRenameValue('')\n\t\t} catch (error) {\n\t\t\tsetInlineRenameItem(item)\n\t\t\tsetInlineRenameValue(nextName)\n\t\t\tsetInlineRenameError(toErrorMessage(error))\n\t\t}\n\t}\n\n\tfunction cancelInlineRename() {\n\t\tsetInlineRenameItem(null)\n\t\tsetInlineRenameValue('')\n\t\tsetInlineRenameError(null)\n\t}\n\n\tasync function deleteSelectedItems() {\n\t\ttry {\n\t\t\tawait browser.deleteSelected()\n\t\t\tsetDeleteConfirmOpen(false)\n\t\t} catch (error) {\n\t\t\tif (error instanceof FileBrowserBulkActionError) {\n\t\t\t\tsetDeleteConfirmOpen(false)\n\t\t\t\tsetBulkFailure(error)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tfunction openMoveDialog() {\n\t\tif (browser.selectedPaths.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tsetMoveDestination(browser.currentPath)\n\t\tsetMoveDialogOpen(true)\n\t}\n\n\tasync function moveSelectedItems() {\n\t\ttry {\n\t\t\tawait browser.moveSelectedTo(moveDestination)\n\t\t\tsetMoveDialogOpen(false)\n\t\t} catch (error) {\n\t\t\tif (error instanceof FileBrowserBulkActionError) {\n\t\t\t\tsetMoveDialogOpen(false)\n\t\t\t\tsetBulkFailure(error)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tfunction startItemDrag(item: FileNode, event: DragEvent) {\n\t\tif (readOnly || !browser.capabilities.move) {\n\t\t\treturn\n\t\t}\n\n\t\tconst paths = browser.selectedPaths.includes(item.path) ? browser.selectedPaths : [item.path]\n\t\tbrowser.setSelection(paths)\n\t\tevent.dataTransfer.effectAllowed = 'move'\n\t\tevent.dataTransfer.setData(FILE_BROWSER_DRAG_MIME, JSON.stringify(paths))\n\t}\n\n\tfunction allowFolderDrop(item: FileNode, event: DragEvent) {\n\t\tif (readOnly || !browser.capabilities.move || item.kind !== 'folder') {\n\t\t\treturn\n\t\t}\n\n\t\tif (getDraggedPaths(event.dataTransfer).length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t\tevent.dataTransfer.dropEffect = 'move'\n\t}\n\n\tasync function moveDraggedItemsToFolder(item: FileNode, event: DragEvent) {\n\t\tif (readOnly || !browser.capabilities.move || item.kind !== 'folder') {\n\t\t\treturn\n\t\t}\n\n\t\tconst paths = getDraggedPaths(event.dataTransfer)\n\t\tif (paths.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t\ttry {\n\t\t\tawait browser.movePathsTo(paths, item.path)\n\t\t} catch (error) {\n\t\t\tif (error instanceof FileBrowserBulkActionError) {\n\t\t\t\tsetBulkFailure(error)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tfunction openItemContextMenu(item: FileNode, event: MouseEvent) {\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t\tif (!browser.selectedPaths.includes(item.path)) {\n\t\t\tbrowser.selectOnly(item.path)\n\t\t}\n\t\tsetContextMenu({\n\t\t\ttarget: 'item',\n\t\t\titem,\n\t\t\tx: event.clientX,\n\t\t\ty: event.clientY,\n\t\t\tmode: 'context'\n\t\t})\n\t}\n\n\tfunction openItemTouchMenu(item: FileNode) {\n\t\tif (!browser.selectedPaths.includes(item.path)) {\n\t\t\tbrowser.selectOnly(item.path)\n\t\t}\n\t\tsetContextMenu({\n\t\t\ttarget: 'item',\n\t\t\titem,\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tmode: 'sheet'\n\t\t})\n\t}\n\n\tfunction openEmptyContextMenu(event: MouseEvent) {\n\t\tevent.preventDefault()\n\t\tbrowser.clearSelection()\n\t\tsetContextMenu({\n\t\t\ttarget: 'empty',\n\t\t\tx: event.clientX,\n\t\t\ty: event.clientY,\n\t\t\tmode: 'context'\n\t\t})\n\t}\n\n\tfunction clearSelectionFromEmptySurface(event: MouseEvent<HTMLElement>) {\n\t\tif (event.target !== event.currentTarget || hasSelectionModifier(event)) {\n\t\t\treturn\n\t\t}\n\t\tbrowser.clearSelection()\n\t}\n\n\tfunction showAdjacentPreview(direction: -1 | 1) {\n\t\tif (!preview || previewFiles.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst currentIndex = previewFiles.findIndex((item) => item.path === preview.item.path)\n\t\tconst safeIndex = currentIndex >= 0 ? currentIndex : 0\n\t\tconst nextIndex = (safeIndex + direction + previewFiles.length) % previewFiles.length\n\t\tconst next = previewFiles[nextIndex]\n\t\tvoid openPreview(next)\n\t\tbrowser.selectOnly(next.path)\n\t}\n\n\tasync function downloadSelection() {\n\t\tif (browser.selectedItems.length === 1 && browser.selectedItems[0].kind === 'file') {\n\t\t\tawait downloadItem(browser.selectedItems[0])\n\t\t\treturn\n\t\t}\n\n\t\tconst paths = browser.selectedPaths.length > 0 ? browser.selectedPaths : browser.items.map((item) => item.path)\n\t\tawait downloadPaths(paths, totalSelectedBytes)\n\t}\n\n\tasync function downloadItem(item: FileNode) {\n\t\tif (item.kind === 'file') {\n\t\t\tawait transfers.prepareSingleDownload({\n\t\t\t\tadapter,\n\t\t\t\tpath: item.path,\n\t\t\t\tselectedBytes: item.size ?? 0\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tawait downloadPaths([item.path], item.size ?? 0)\n\t}\n\n\tasync function downloadPaths(paths: string[], selectedBytes: number) {\n\t\tawait transfers.prepareBulkDownload({\n\t\t\tadapter,\n\t\t\tpaths,\n\t\t\tselectedBytes,\n\t\t\twarnZipSizeBytes\n\t\t})\n\t}\n\n\tasync function uploadInputFiles(files: FileList | null) {\n\t\tif (!files || files.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait beginUploadFiles(files)\n\t\tif (uploadInputRef.current) {\n\t\t\tuploadInputRef.current.value = ''\n\t\t}\n\t}\n\n\tasync function beginUploadFiles(files: File[] | FileList) {\n\t\tconst candidates = getFileBrowserUploadCandidates(files)\n\t\tawait beginUploadCandidates(candidates)\n\t}\n\n\tasync function beginUploadDrop(dataTransfer: DataTransfer) {\n\t\tconst candidates = await collectUploadCandidatesFromDataTransfer(dataTransfer)\n\t\tawait beginUploadCandidates(candidates)\n\t}\n\n\tasync function beginUploadCandidates(candidates: FileBrowserUploadCandidate[]) {\n\t\tif (candidates.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { acceptedCandidates, rejectedCandidates } = applyUploadPolicy(candidates, uploadPolicy, browser.currentPath)\n\t\tif (rejectedCandidates.length > 0) {\n\t\t\tsetUploadRejections(rejectedCandidates)\n\t\t}\n\t\tif (acceptedCandidates.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst supportedCandidates = rejectUnsupportedFolderUploads(acceptedCandidates)\n\t\tif (supportedCandidates.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst createdFolders = await ensureUploadFolders(supportedCandidates)\n\t\tconst group = getUploadTransferGroup(browser.currentPath, supportedCandidates, createdFolders)\n\t\tconst conflictPaths = await findUploadConflictPaths(supportedCandidates)\n\t\tprocessUploadQueue(supportedCandidates, conflictPaths, 0, undefined, group)\n\t}\n\n\tfunction rejectUnsupportedFolderUploads(candidates: FileBrowserUploadCandidate[]) {\n\t\tif (browser.capabilities.createFolder) {\n\t\t\treturn candidates\n\t\t}\n\n\t\tconst [folderCandidates, flatCandidates] = partitionUploadCandidates(candidates, (candidate) =>\n\t\t\tcandidate.relativePath.includes('/')\n\t\t)\n\t\tif (folderCandidates.length > 0) {\n\t\t\tsetUploadRejections((current) => [\n\t\t\t\t...current,\n\t\t\t\t...folderCandidates.map((candidate) => ({\n\t\t\t\t\tfileName: candidate.file.name,\n\t\t\t\t\trelativePath: candidate.relativePath,\n\t\t\t\t\treasons: ['Folder uploads require folder creation support']\n\t\t\t\t}))\n\t\t\t])\n\t\t}\n\t\treturn flatCandidates\n\t}\n\n\tasync function ensureUploadFolders(candidates: FileBrowserUploadCandidate[]) {\n\t\tconst folders = getUploadFolderPaths(candidates)\n\t\tlet createdFolders = 0\n\n\t\tif (!adapter.createFolder) {\n\t\t\tif (folders.length > 0) {\n\t\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Folder uploads require folder creation support')\n\t\t\t}\n\t\t\treturn 0\n\t\t}\n\n\t\tfor (const folder of folders) {\n\t\t\ttry {\n\t\t\t\tawait adapter.createFolder(joinUploadRelativePath(browser.currentPath, folder))\n\t\t\t\tcreatedFolders += 1\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FileBrowserAdapterError && error.code === 'conflict') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\n\t\tif (createdFolders > 0) {\n\t\t\tawait browser.refresh()\n\t\t}\n\t\treturn createdFolders\n\t}\n\n\tasync function findUploadConflictPaths(candidates: FileBrowserUploadCandidate[]) {\n\t\tconst paths = candidates.map((candidate) => joinUploadRelativePath(browser.currentPath, candidate.relativePath))\n\n\t\tif (adapter.exists) {\n\t\t\ttry {\n\t\t\t\tconst result = await adapter.exists(paths)\n\t\t\t\treturn paths.filter((path) => result[path])\n\t\t\t} catch {\n\t\t\t\t// Fall back to list lookups below.\n\t\t\t}\n\t\t}\n\n\t\tconst existingPaths = new Set(browser.items.map((item) => item.path))\n\t\tconst conflicts: string[] = []\n\t\tfor (const path of paths) {\n\t\t\tif (existingPaths.has(path) || (await uploadPathExistsByListing(path))) {\n\t\t\t\tconflicts.push(path)\n\t\t\t}\n\t\t}\n\t\treturn conflicts\n\t}\n\n\tasync function uploadPathExistsByListing(path: string): Promise<boolean> {\n\t\tconst parentPath = getFileBrowserDirname(path)\n\t\tlet cursor: string | undefined\n\n\t\tdo {\n\t\t\tconst result = await adapter.list(parentPath, { cursor })\n\t\t\tif (result.items.some((item) => item.path === path)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tcursor = result.cursor\n\t\t} while (cursor)\n\n\t\treturn false\n\t}\n\n\tfunction processUploadQueue(\n\t\tcandidates: FileBrowserUploadCandidate[],\n\t\tconflictPaths: string[],\n\t\tstartIndex: number,\n\t\tresolution?: FileBrowserUploadConflictResolution,\n\t\tgroup?: UploadTransferGroup\n\t) {\n\t\tconst conflicts = new Set(conflictPaths)\n\n\t\tfor (let index = startIndex; index < candidates.length; index += 1) {\n\t\t\tconst candidate = candidates[index]\n\t\t\tconst path = joinUploadRelativePath(browser.currentPath, candidate.relativePath)\n\n\t\t\tif (conflicts.has(path)) {\n\t\t\t\tif (!resolution) {\n\t\t\t\t\tsetUploadConflictQueue({ candidates, conflictPaths, group, index })\n\t\t\t\t\tsetApplyUploadResolution(false)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (resolution !== 'skip') {\n\t\t\t\t\tenqueueUploadTransfer(candidate, resolution, group)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tenqueueUploadTransfer(candidate, undefined, group)\n\t\t\t}\n\t\t}\n\n\t\tsetUploadConflictQueue(null)\n\t\tsetApplyUploadResolution(false)\n\t}\n\n\tfunction resolveUploadConflict(resolution: FileBrowserUploadConflictResolution) {\n\t\tif (!uploadConflictQueue) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { candidates, conflictPaths, group, index } = uploadConflictQueue\n\t\tif (applyUploadResolution) {\n\t\t\tprocessUploadQueue(candidates, conflictPaths, index, resolution, group)\n\t\t\treturn\n\t\t}\n\n\t\tconst candidate = candidates[index]\n\t\tif (resolution !== 'skip') {\n\t\t\tenqueueUploadTransfer(candidate, resolution, group)\n\t\t}\n\t\tprocessUploadQueue(candidates, conflictPaths, index + 1, undefined, group)\n\t}\n\n\tfunction enqueueUploadTransfer(\n\t\tcandidate: FileBrowserUploadCandidate,\n\t\tresolution?: FileBrowserUploadConflictResolution,\n\t\tgroup?: UploadTransferGroup\n\t) {\n\t\ttransfers.enqueueUpload({\n\t\t\tadapter,\n\t\t\tdestinationPath: joinUploadRelativePath(browser.currentPath, candidate.relativePath),\n\t\t\tfile: candidate.file,\n\t\t\tgroup,\n\t\t\tonConflict: resolution === 'skip' ? undefined : resolution\n\t\t})\n\t}\n\n\treturn (\n\t\t<section\n\t\t\tclassName={`flex min-h-[520px] w-full overflow-hidden rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] font-[inherit] text-[length:var(--fb-font)] text-[var(--fb-text)] ${SURFACE_MOTION}`}\n\t\t\tdata-fb-density={density}\n\t\t\tref={rootRef}\n\t\t\tstyle={DENSITY_STYLES[density]}\n\t\t\tonDragEnter={(event) => {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tif (!readOnly) {\n\t\t\t\t\tsetDropActive(true)\n\t\t\t\t}\n\t\t\t}}\n\t\t\tonDragLeave={(event) => {\n\t\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\t\tsetDropActive(false)\n\t\t\t\t}\n\t\t\t}}\n\t\t\tonDragOver={(event) => {\n\t\t\t\tevent.preventDefault()\n\t\t\t}}\n\t\t\tonDrop={(event) => {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tsetDropActive(false)\n\t\t\t\tif (readOnly) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvoid beginUploadDrop(event.dataTransfer)\n\t\t\t}}\n\t\t\tonPaste={(event) => {\n\t\t\t\tif (readOnly) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst files = Array.from(event.clipboardData.files).filter((file) => file.type.startsWith('image/'))\n\t\t\t\tif (files.length > 0) {\n\t\t\t\t\tvoid beginUploadFiles(files)\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<div aria-atomic=\"true\" aria-live=\"polite\" className=\"sr-only\" role=\"status\">\n\t\t\t\t{formatScreenReaderStatus({\n\t\t\t\t\tcurrentPath: browser.currentPath,\n\t\t\t\t\titemCount: browser.filteredItems.length,\n\t\t\t\t\tselectedCount: browser.selectedPaths.length,\n\t\t\t\t\tstatus: browser.status\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div className=\"flex min-w-0 flex-1 flex-col\">\n\t\t\t\t<header\n\t\t\t\t\tclassName={`flex flex-wrap items-center gap-2 border-b border-[var(--fb-border)] bg-[var(--fb-surface)] px-[var(--fb-pad)] py-[var(--fb-cell-y)] ${SURFACE_MOTION}`}\n\t\t\t\t>\n\t\t\t\t\t<Breadcrumbs path={browser.currentPath} onNavigate={browser.navigate} />\n\t\t\t\t\t{clipboardNotice ? (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\taria-label=\"Clipboard status\"\n\t\t\t\t\t\t\tclassName={`rounded-[calc(var(--fb-radius)-4px)] bg-[var(--fb-accent-soft)] px-2 py-1 text-[12px] font-medium text-[var(--fb-accent)] ${CONTROL_MOTION}`}\n\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{clipboardNotice}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"ml-auto flex min-w-0 items-center gap-1.5\">\n\t\t\t\t\t\t<label className=\"relative block min-w-[140px] max-w-[220px]\">\n\t\t\t\t\t\t\t<Search\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-[var(--fb-muted)]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\taria-label=\"Search files\"\n\t\t\t\t\t\t\t\tclassName={`h-[var(--fb-control-h)] w-full rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] pl-7 pr-2 text-[12px] text-[var(--fb-text)] outline-none focus:border-[var(--fb-accent)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`}\n\t\t\t\t\t\t\t\tonChange={(event) => browser.setSearchQuery(event.target.value)}\n\t\t\t\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\t\tvalue={browser.searchQuery}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\taria-label=\"Filter files\"\n\t\t\t\t\t\t\tclassName={selectInput()}\n\t\t\t\t\t\t\tonChange={(event) => browser.setFilterKind(event.target.value as 'all' | 'files' | 'folders')}\n\t\t\t\t\t\t\tvalue={browser.filterKind}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<option value=\"all\">All</option>\n\t\t\t\t\t\t\t<option value=\"folders\">Folders</option>\n\t\t\t\t\t\t\t<option value=\"files\">Files</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\taria-label=\"Sort files\"\n\t\t\t\t\t\t\tclassName={selectInput()}\n\t\t\t\t\t\t\tonChange={(event) => browser.setSortBy(event.target.value as 'name' | 'modifiedAt' | 'size')}\n\t\t\t\t\t\t\tvalue={browser.sortBy}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<option value=\"name\">Name</option>\n\t\t\t\t\t\t\t<option value=\"modifiedAt\">Modified</option>\n\t\t\t\t\t\t\t<option value=\"size\">Size</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\taria-label=\"Toggle sort direction\"\n\t\t\t\t\t\t\tclassName={toolButton(false)}\n\t\t\t\t\t\t\tonClick={() => browser.setSortDirection((current) => (current === 'asc' ? 'desc' : 'asc'))}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{browser.sortDirection === 'asc' ? 'Asc' : 'Desc'}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\taria-label=\"Grid view\"\n\t\t\t\t\t\t\tclassName={toolButton(browser.view === 'grid')}\n\t\t\t\t\t\t\tonClick={() => browser.setView('grid')}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Grid2X2 aria-hidden=\"true\" className=\"size-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\taria-label=\"List view\"\n\t\t\t\t\t\t\tclassName={toolButton(browser.view === 'list')}\n\t\t\t\t\t\t\tonClick={() => browser.setView('list')}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<List aria-hidden=\"true\" className=\"size-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{!readOnly && browser.capabilities.createFolder ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclassName={commandButton(false)}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tsetNewFolderError(null)\n\t\t\t\t\t\t\t\t\tsetNewFolderOpen(true)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Folder aria-hidden=\"true\" className=\"size-4\" />\n\t\t\t\t\t\t\t\tNew folder\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\taria-label=\"Upload files\"\n\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\tonChange={(event) => void uploadInputFiles(event.target.files)}\n\t\t\t\t\t\t\tref={uploadInputRef}\n\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\tclassName=\"hidden\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!readOnly ? (\n\t\t\t\t\t\t\t<button className={primaryButton()} onClick={() => uploadInputRef.current?.click()} type=\"button\">\n\t\t\t\t\t\t\t\t<Upload aria-hidden=\"true\" className=\"size-4\" />\n\t\t\t\t\t\t\t\tUpload\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t</header>\n\n\t\t\t\t<ActionBar\n\t\t\t\t\tcanCopy={!readOnly && browser.capabilities.copy}\n\t\t\t\t\tcanCut={!readOnly && browser.capabilities.move}\n\t\t\t\t\tcanDelete={!readOnly}\n\t\t\t\t\tcanMove={!readOnly && browser.capabilities.move}\n\t\t\t\t\tcanRename={!readOnly && browser.capabilities.rename}\n\t\t\t\t\titemCount={browser.filteredItems.length}\n\t\t\t\t\tonCopy={() => copySelectedItems()}\n\t\t\t\t\tonCut={() => cutSelectedItems()}\n\t\t\t\t\tonDelete={() => setDeleteConfirmOpen(true)}\n\t\t\t\t\tonDownload={() => void downloadSelection()}\n\t\t\t\t\tonMove={openMoveDialog}\n\t\t\t\t\tonRename={openRenameDialog}\n\t\t\t\t\tonSelectAll={browser.selectAllLoaded}\n\t\t\t\t\tonSelectNone={browser.clearSelection}\n\t\t\t\t\tselectedCount={browser.selectedPaths.length}\n\t\t\t\t/>\n\n\t\t\t\t{uploadRejections.length > 0 ? (\n\t\t\t\t\t<UploadRejectionAlert onDismiss={() => setUploadRejections([])} rejections={uploadRejections} />\n\t\t\t\t) : null}\n\n\t\t\t\t<div\n\t\t\t\t\tclassName={`relative min-h-0 flex-1 overflow-auto bg-[var(--fb-bg)] p-[var(--fb-pad)] ${SURFACE_MOTION}`}\n\t\t\t\t\tonClick={clearSelectionFromEmptySurface}\n\t\t\t\t\tonContextMenu={openEmptyContextMenu}\n\t\t\t\t>\n\t\t\t\t\t{browser.status === 'loading' && browser.items.length === 0 ? (\n\t\t\t\t\t\t<SkeletonGrid />\n\t\t\t\t\t) : browser.status === 'error' ? (\n\t\t\t\t\t\t<StateMessage\n\t\t\t\t\t\t\ttitle={getErrorState(browser.error).title}\n\t\t\t\t\t\t\ttone=\"danger\"\n\t\t\t\t\t\t\tvalue={getErrorState(browser.error).value}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : browser.filteredItems.length === 0 ? (\n\t\t\t\t\t\t<StateMessage title=\"This folder is empty\" value=\"Create a folder or upload files to start.\" />\n\t\t\t\t\t) : browser.view === 'grid' ? (\n\t\t\t\t\t\t<FileGrid\n\t\t\t\t\t\t\tbrowser={browser}\n\t\t\t\t\t\t\tcanMove={!readOnly && browser.capabilities.move}\n\t\t\t\t\t\t\tinlineRenameError={inlineRenameError}\n\t\t\t\t\t\t\tinlineRenameLabel={inlineRenameItem?.name ?? ''}\n\t\t\t\t\t\t\tinlineRenameItem={inlineRenameItem}\n\t\t\t\t\t\t\tinlineRenameValue={inlineRenameValue}\n\t\t\t\t\t\t\tonDragStart={startItemDrag}\n\t\t\t\t\t\t\tonFolderDragOver={allowFolderDrop}\n\t\t\t\t\t\t\tonFolderDrop={(item, event) => void moveDraggedItemsToFolder(item, event)}\n\t\t\t\t\t\t\tonEmptyClick={() => browser.clearSelection()}\n\t\t\t\t\t\t\tonInlineRenameCancel={cancelInlineRename}\n\t\t\t\t\t\t\tonInlineRenameChange={(value) => {\n\t\t\t\t\t\t\t\tsetInlineRenameValue(value)\n\t\t\t\t\t\t\t\tsetInlineRenameError(null)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonInlineRenameCommit={() => void commitInlineRename()}\n\t\t\t\t\t\t\tonContextMenu={openItemContextMenu}\n\t\t\t\t\t\t\tonOpenItem={openItemFromDoubleClick}\n\t\t\t\t\t\t\tonSelectItem={selectItemWithEvent}\n\t\t\t\t\t\t\tonTouchMenu={openItemTouchMenu}\n\t\t\t\t\t\t\tselectedPaths={browser.selectedPaths}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FileTable\n\t\t\t\t\t\t\tbrowser={browser}\n\t\t\t\t\t\t\tcanMove={!readOnly && browser.capabilities.move}\n\t\t\t\t\t\t\tinlineRenameError={inlineRenameError}\n\t\t\t\t\t\t\tinlineRenameLabel={inlineRenameItem?.name ?? ''}\n\t\t\t\t\t\t\tinlineRenameItem={inlineRenameItem}\n\t\t\t\t\t\t\tinlineRenameValue={inlineRenameValue}\n\t\t\t\t\t\t\tonDragStart={startItemDrag}\n\t\t\t\t\t\t\tonFolderDragOver={allowFolderDrop}\n\t\t\t\t\t\t\tonFolderDrop={(item, event) => void moveDraggedItemsToFolder(item, event)}\n\t\t\t\t\t\t\tonInlineRenameCancel={cancelInlineRename}\n\t\t\t\t\t\t\tonInlineRenameChange={(value) => {\n\t\t\t\t\t\t\t\tsetInlineRenameValue(value)\n\t\t\t\t\t\t\t\tsetInlineRenameError(null)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonInlineRenameCommit={() => void commitInlineRename()}\n\t\t\t\t\t\t\tonContextMenu={openItemContextMenu}\n\t\t\t\t\t\t\tonOpenItem={openItemFromDoubleClick}\n\t\t\t\t\t\t\tonSelectItem={selectItemWithEvent}\n\t\t\t\t\t\t\tselectedPaths={browser.selectedPaths}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{dropActive ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={`pointer-events-none absolute inset-3 z-10 grid place-items-center rounded-[var(--fb-radius)] border-2 border-dashed border-[var(--fb-accent)] bg-[var(--fb-accent-soft)] text-[13px] font-semibold text-[var(--fb-accent)] ${SURFACE_MOTION}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tDrop files to upload\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t<footer\n\t\t\t\t\tclassName={`flex h-9 items-center justify-between border-t border-[var(--fb-border)] px-[var(--fb-pad)] text-[11px] text-[var(--fb-muted)] ${SURFACE_MOTION}`}\n\t\t\t\t>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{browser.filteredItems.length} items\n\t\t\t\t\t\t{browser.selectedPaths.length ? ` · ${browser.selectedPaths.length} selected` : ''}\n\t\t\t\t\t</span>\n\t\t\t\t\t{browser.hasMore ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclassName={`rounded-[calc(var(--fb-radius)-4px)] px-2 py-1 font-medium text-[var(--fb-accent)] hover:bg-[var(--fb-accent-soft)] ${CONTROL_MOTION}`}\n\t\t\t\t\t\t\tonClick={() => void browser.loadMore()}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span />\n\t\t\t\t\t)}\n\t\t\t\t</footer>\n\t\t\t</div>\n\n\t\t\t{showDetailsPanel ? (\n\t\t\t\t<DetailsPanel\n\t\t\t\t\titem={selected}\n\t\t\t\t\tonCopyPath={() => void copyItemPaths(browser.selectedPaths)}\n\t\t\t\t\tonDownload={() => void downloadSelection()}\n\t\t\t\t\tselectedCount={browser.selectedItems.length}\n\t\t\t\t\ttotalBytes={totalSelectedBytes}\n\t\t\t\t/>\n\t\t\t) : null}\n\n\t\t\t{contextMenu ? (\n\t\t\t\t<ContextMenu\n\t\t\t\t\tbrowser={browser}\n\t\t\t\t\tmenu={contextMenu}\n\t\t\t\t\tonClose={() => setContextMenu(null)}\n\t\t\t\t\tonDelete={() => setDeleteConfirmOpen(true)}\n\t\t\t\t\tonDownload={() => void downloadSelection()}\n\t\t\t\t\tonMove={openMoveDialog}\n\t\t\t\t\tonNewFolder={() => {\n\t\t\t\t\t\tsetNewFolderError(null)\n\t\t\t\t\t\tsetNewFolderOpen(true)\n\t\t\t\t\t}}\n\t\t\t\t\tonCopy={() => copySelectedItems()}\n\t\t\t\t\tonCopyPath={(item) =>\n\t\t\t\t\t\tvoid copyItemPaths(browser.selectedPaths.includes(item.path) ? browser.selectedPaths : [item.path])\n\t\t\t\t\t}\n\t\t\t\t\tonCut={() => cutSelectedItems()}\n\t\t\t\t\tonPaste={() => void pasteClipboardInto(browser.currentPath)}\n\t\t\t\t\tonRename={openRenameDialog}\n\t\t\t\t\tonUpload={() => uploadInputRef.current?.click()}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t/>\n\t\t\t) : null}\n\n\t\t\t{newFolderOpen ? (\n\t\t\t\t<div\n\t\t\t\t\taria-label=\"New folder\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\tclassName={`fixed inset-0 z-40 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_20%,transparent)] p-4 ${SURFACE_MOTION}`}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t>\n\t\t\t\t\t<form\n\t\t\t\t\t\tclassName={`w-[min(360px,100%)] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 shadow-[0_18px_50px_color-mix(in_oklch,var(--fb-text)_18%,transparent)] ${SURFACE_MOTION}`}\n\t\t\t\t\t\tonSubmit={(event) => {\n\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\tvoid createFolder()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<h2 className=\"m-0 text-[14px] font-semibold\">New folder</h2>\n\t\t\t\t\t\t<label className=\"mt-3 block text-[12px] font-medium text-[var(--fb-muted)]\">\n\t\t\t\t\t\t\tFolder name\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\taria-label=\"Folder name\"\n\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\tclassName={`mt-1 h-9 w-full rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] px-2 text-[13px] text-[var(--fb-text)] outline-none focus:border-[var(--fb-accent)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`}\n\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\tsetNewFolderName(event.target.value)\n\t\t\t\t\t\t\t\t\tsetNewFolderError(null)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={newFolderName}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t{newFolderError ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={`mt-3 rounded-[calc(var(--fb-radius)-4px)] border border-[var(--fb-danger)] bg-[var(--fb-danger-soft)] px-2 py-1.5 text-[12px] text-[var(--fb-danger)] ${SURFACE_MOTION}`}\n\t\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{newFolderError}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<div className=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclassName={commandButton(false)}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tsetNewFolderError(null)\n\t\t\t\t\t\t\t\t\tsetNewFolderOpen(false)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button className={primaryButton()} type=\"submit\">\n\t\t\t\t\t\t\t\tCreate folder\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t{renameItem ? (\n\t\t\t\t<div\n\t\t\t\t\taria-label=\"Rename item\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\tclassName={`fixed inset-0 z-40 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_20%,transparent)] p-4 ${SURFACE_MOTION}`}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t>\n\t\t\t\t\t<form\n\t\t\t\t\t\tclassName={`w-[min(360px,100%)] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 shadow-[0_18px_50px_color-mix(in_oklch,var(--fb-text)_18%,transparent)] ${SURFACE_MOTION}`}\n\t\t\t\t\t\tonSubmit={(event) => {\n\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\tvoid renameSelectedItem()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<h2 className=\"m-0 text-[14px] font-semibold\">Rename</h2>\n\t\t\t\t\t\t<label className=\"mt-3 block text-[12px] font-medium text-[var(--fb-muted)]\">\n\t\t\t\t\t\t\tNew name\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\taria-label=\"New name\"\n\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\tclassName={`mt-1 h-9 w-full rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] px-2 text-[13px] text-[var(--fb-text)] outline-none focus:border-[var(--fb-accent)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`}\n\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\tsetRenameValue(event.target.value)\n\t\t\t\t\t\t\t\t\tsetRenameError(null)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={renameValue}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t{renameError ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={`mt-3 rounded-[calc(var(--fb-radius)-4px)] border border-[var(--fb-danger)] bg-[var(--fb-danger-soft)] px-2 py-1.5 text-[12px] text-[var(--fb-danger)] ${SURFACE_MOTION}`}\n\t\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{renameError}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<div className=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclassName={commandButton(false)}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tsetRenameItem(null)\n\t\t\t\t\t\t\t\t\tsetRenameValue('')\n\t\t\t\t\t\t\t\t\tsetRenameError(null)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button className={primaryButton()} type=\"submit\">\n\t\t\t\t\t\t\t\tRename item\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t{deleteConfirmOpen ? (\n\t\t\t\t<div\n\t\t\t\t\taria-label=\"Delete selected items\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\tclassName={`fixed inset-0 z-40 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_20%,transparent)] p-4 ${SURFACE_MOTION}`}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t>\n\t\t\t\t\t<form\n\t\t\t\t\t\tclassName={`w-[min(400px,100%)] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 shadow-[0_18px_50px_color-mix(in_oklch,var(--fb-text)_18%,transparent)] ${SURFACE_MOTION}`}\n\t\t\t\t\t\tonSubmit={(event) => {\n\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\tvoid deleteSelectedItems()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<h2 className=\"m-0 text-[14px] font-semibold\">Delete selected items</h2>\n\t\t\t\t\t\t<p className=\"mt-2 text-[12px] text-[var(--fb-muted)]\">This removes the selected entries from storage.</p>\n\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\tclassName={`mt-3 max-h-32 overflow-auto rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-bg)] p-2 text-[12px] ${SURFACE_MOTION}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{browser.selectedItems.map((item) => (\n\t\t\t\t\t\t\t\t<li className=\"truncate py-1\" key={item.path}>\n\t\t\t\t\t\t\t\t\t{item.name}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<div className=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t\t\t<button className={commandButton(false)} onClick={() => setDeleteConfirmOpen(false)} type=\"button\">\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button className={dangerButton()} type=\"submit\">\n\t\t\t\t\t\t\t\tDelete selected\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t{moveDialogOpen ? (\n\t\t\t\t<div\n\t\t\t\t\taria-label=\"Move selected items\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\tclassName={`fixed inset-0 z-40 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_20%,transparent)] p-4 ${SURFACE_MOTION}`}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t>\n\t\t\t\t\t<form\n\t\t\t\t\t\tclassName={`w-[min(420px,100%)] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 shadow-[0_18px_50px_color-mix(in_oklch,var(--fb-text)_18%,transparent)] ${SURFACE_MOTION}`}\n\t\t\t\t\t\tonSubmit={(event) => {\n\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\tvoid moveSelectedItems()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<h2 className=\"m-0 text-[14px] font-semibold\">Move selected items</h2>\n\t\t\t\t\t\t<p className=\"mt-2 text-[12px] text-[var(--fb-muted)]\">Choose a destination folder from the folder tree.</p>\n\t\t\t\t\t\t<MoveDestinationPicker\n\t\t\t\t\t\t\tcurrentPath={browser.currentPath}\n\t\t\t\t\t\t\tdestinations={moveDestinations}\n\t\t\t\t\t\t\terror={moveDestinationError}\n\t\t\t\t\t\t\tonSelect={setMoveDestination}\n\t\t\t\t\t\t\tselectedPath={moveDestination}\n\t\t\t\t\t\t\tstatus={moveDestinationStatus}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"mt-3 truncate text-[11px] text-[var(--fb-muted)]\">Destination: {moveDestination}</div>\n\t\t\t\t\t\t<div className=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t\t\t<button className={commandButton(false)} onClick={() => setMoveDialogOpen(false)} type=\"button\">\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button className={primaryButton()} type=\"submit\">\n\t\t\t\t\t\t\t\tMove here\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t{bulkFailure ? <BulkFailureDialog error={bulkFailure} onClose={() => setBulkFailure(null)} /> : null}\n\n\t\t\t{uploadConflictQueue ? (\n\t\t\t\t<UploadConflictDialog\n\t\t\t\t\tapplyToAll={applyUploadResolution}\n\t\t\t\t\tcurrentPath={browser.currentPath}\n\t\t\t\t\tonApplyToAllChange={setApplyUploadResolution}\n\t\t\t\t\tonCancel={() => {\n\t\t\t\t\t\tsetUploadConflictQueue(null)\n\t\t\t\t\t\tsetApplyUploadResolution(false)\n\t\t\t\t\t}}\n\t\t\t\t\tonResolve={(resolution) => resolveUploadConflict(resolution)}\n\t\t\t\t\tqueue={uploadConflictQueue}\n\t\t\t\t/>\n\t\t\t) : null}\n\n\t\t\t{preview ? (\n\t\t\t\t<div\n\t\t\t\t\taria-label={`Preview ${preview.item.name}`}\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\tclassName={`fixed inset-0 z-40 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_35%,transparent)] p-4 ${SURFACE_MOTION}`}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`w-[min(720px,100%)] overflow-hidden rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] shadow-[0_22px_70px_color-mix(in_oklch,var(--fb-text)_24%,transparent)] ${SURFACE_MOTION}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={`flex h-12 items-center justify-between border-b border-[var(--fb-border)] px-4 ${SURFACE_MOTION}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"min-w-0 truncate font-semibold\">Preview {preview.item.name}</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\taria-label=\"Previous file\"\n\t\t\t\t\t\t\t\t\tclassName={toolButton(false)}\n\t\t\t\t\t\t\t\t\tdisabled={previewFiles.length <= 1}\n\t\t\t\t\t\t\t\t\tonClick={() => showAdjacentPreview(-1)}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ChevronLeft aria-hidden=\"true\" className=\"size-4\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\taria-label=\"Next file\"\n\t\t\t\t\t\t\t\t\tclassName={toolButton(false)}\n\t\t\t\t\t\t\t\t\tdisabled={previewFiles.length <= 1}\n\t\t\t\t\t\t\t\t\tonClick={() => showAdjacentPreview(1)}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ChevronRight aria-hidden=\"true\" className=\"size-4\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button className={toolButton(false)} onClick={() => setPreview(null)} type=\"button\">\n\t\t\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className={`grid min-h-[260px] place-items-center bg-[var(--fb-bg)] p-8 ${SURFACE_MOTION}`}>\n\t\t\t\t\t\t\t{(preview.item.mimeType?.startsWith('image/') && preview.url) || preview.item.thumbnailUrl ? (\n\t\t\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={preview.item.name}\n\t\t\t\t\t\t\t\t\t\tclassName={`max-h-[420px] max-w-full rounded-[calc(var(--fb-radius)-2px)] object-contain ${SURFACE_MOTION}`}\n\t\t\t\t\t\t\t\t\t\tsrc={preview.url ?? preview.item.thumbnailUrl}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<PreviewOriginalLink preview={preview} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t\t\t<File className=\"mx-auto size-12 text-[var(--fb-muted)]\" />\n\t\t\t\t\t\t\t\t\t<div className=\"mt-3 font-semibold\">{preview.item.name}</div>\n\t\t\t\t\t\t\t\t\t<div className=\"mt-1 text-[12px] text-[var(--fb-muted)]\">{preview.item.mimeType ?? 'File'}</div>\n\t\t\t\t\t\t\t\t\t{preview.status === 'loading' ? (\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-3 text-[12px] text-[var(--fb-muted)]\">Loading preview</div>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t{preview.status === 'error' ? (\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-3 text-[12px] text-[var(--fb-danger)]\">\n\t\t\t\t\t\t\t\t\t\t\t{preview.error ?? 'Could not load preview'}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t<PreviewOriginalLink preview={preview} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</section>\n\t)\n}\n\ntype BrowserLike = ReturnType<typeof useFileBrowser>\n\nfunction joinUploadRelativePath(currentPath: string, relativePath: string) {\n\treturn relativePath\n\t\t.split('/')\n\t\t.filter(Boolean)\n\t\t.reduce((path, part) => joinFileBrowserPath(path, part), currentPath)\n}\n\nfunction getUploadFolderPaths(candidates: FileBrowserUploadCandidate[]) {\n\tconst folders = new Set<string>()\n\n\tfor (const { relativePath } of candidates) {\n\t\tconst parts = relativePath.split('/').filter(Boolean)\n\t\tfor (let index = 1; index < parts.length; index += 1) {\n\t\t\tfolders.add(parts.slice(0, index).join('/'))\n\t\t}\n\t}\n\n\treturn Array.from(folders).sort((a, b) => a.split('/').length - b.split('/').length || a.localeCompare(b))\n}\n\nfunction partitionUploadCandidates(\n\tcandidates: FileBrowserUploadCandidate[],\n\tpredicate: (candidate: FileBrowserUploadCandidate) => boolean\n): [FileBrowserUploadCandidate[], FileBrowserUploadCandidate[]] {\n\tconst matched: FileBrowserUploadCandidate[] = []\n\tconst unmatched: FileBrowserUploadCandidate[] = []\n\n\tfor (const candidate of candidates) {\n\t\tif (predicate(candidate)) {\n\t\t\tmatched.push(candidate)\n\t\t} else {\n\t\t\tunmatched.push(candidate)\n\t\t}\n\t}\n\n\treturn [matched, unmatched]\n}\n\nfunction getUploadTransferGroup(\n\tcurrentPath: string,\n\tcandidates: FileBrowserUploadCandidate[],\n\tcreatedFolders = 0\n): UploadTransferGroup | undefined {\n\tif (getUploadFolderPaths(candidates).length === 0) {\n\t\treturn undefined\n\t}\n\n\tconst topLevelFolders = candidates\n\t\t.map((candidate) => candidate.relativePath.split('/').filter(Boolean)[0])\n\t\t.filter((folder): folder is string => Boolean(folder))\n\tconst uniqueTopLevelFolders = Array.from(new Set(topLevelFolders))\n\tconst name = uniqueTopLevelFolders.length === 1 ? uniqueTopLevelFolders[0] : 'Folder upload'\n\tconst id =\n\t\tuniqueTopLevelFolders.length === 1\n\t\t\t? joinUploadRelativePath(currentPath, name)\n\t\t\t: `${normalizeFileBrowserPath(currentPath)}#folder-upload`\n\n\treturn {\n\t\tid,\n\t\tname,\n\t\ttotalFiles: candidates.length,\n\t\tcreatedFolders\n\t}\n}\n\nasync function collectMoveDestinations(\n\tadapter: FileBrowserAdapter,\n\texcludedPaths: string[]\n): Promise<MoveDestination[]> {\n\tconst destinations: MoveDestination[] = []\n\tconst excluded = excludedPaths.map(normalizeFileBrowserPath)\n\n\tasync function collect(path: string, depth: number): Promise<void> {\n\t\tlet cursor: string | undefined\n\t\tdo {\n\t\t\tconst result = await adapter.list(path, { cursor })\n\t\t\tconst folders = result.items\n\t\t\t\t.filter((item) => item.kind === 'folder')\n\t\t\t\t.sort((left, right) =>\n\t\t\t\t\tleft.name.localeCompare(right.name, undefined, {\n\t\t\t\t\t\tnumeric: true,\n\t\t\t\t\t\tsensitivity: 'base'\n\t\t\t\t\t})\n\t\t\t\t)\n\n\t\t\tfor (const folder of folders) {\n\t\t\t\tif (isExcludedDestination(folder.path, excluded)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tdestinations.push({\n\t\t\t\t\tpath: folder.path,\n\t\t\t\t\tname: folder.name,\n\t\t\t\t\tdepth\n\t\t\t\t})\n\t\t\t\tawait collect(folder.path, depth + 1)\n\t\t\t}\n\n\t\t\tcursor = result.cursor\n\t\t} while (cursor)\n\t}\n\n\tawait collect('/', 0)\n\treturn destinations\n}\n\nfunction isExcludedDestination(path: string, excludedPaths: string[]) {\n\tconst normalized = normalizeFileBrowserPath(path)\n\treturn excludedPaths.some((excluded) => normalized === excluded || normalized.startsWith(`${excluded}/`))\n}\n\nfunction applyUploadPolicy(\n\tcandidates: FileBrowserUploadCandidate[],\n\tpolicy: FileBrowserUploadPolicy | undefined,\n\tcurrentPath: string\n) {\n\tif (!policy) {\n\t\treturn { acceptedCandidates: candidates, rejectedCandidates: [] }\n\t}\n\n\tconst acceptedCandidates: FileBrowserUploadCandidate[] = []\n\tconst rejectedCandidates: FileBrowserUploadRejection[] = []\n\tlet acceptedBytes = 0\n\n\tfor (const candidate of candidates) {\n\t\tconst reasons: string[] = []\n\n\t\tif (policy.maxFileSizeBytes !== undefined && candidate.file.size > policy.maxFileSizeBytes) {\n\t\t\treasons.push(`File is larger than ${formatBytes(policy.maxFileSizeBytes)}`)\n\t\t}\n\n\t\tif (policy.allowedMimeTypes?.length && !isAllowedUploadType(candidate.file, policy.allowedMimeTypes)) {\n\t\t\treasons.push(`File type ${candidate.file.type || 'unknown'} is not allowed`)\n\t\t}\n\n\t\tif (policy.remainingQuotaBytes !== undefined && acceptedBytes + candidate.file.size > policy.remainingQuotaBytes) {\n\t\t\treasons.push(`Upload exceeds remaining quota of ${formatBytes(policy.remainingQuotaBytes)}`)\n\t\t}\n\n\t\tconst customReason = policy.validate?.(candidate, {\n\t\t\tacceptedBytes,\n\t\t\tcurrentPath\n\t\t})\n\t\tif (Array.isArray(customReason)) {\n\t\t\treasons.push(...customReason.filter(Boolean))\n\t\t} else if (customReason) {\n\t\t\treasons.push(customReason)\n\t\t}\n\n\t\tif (reasons.length > 0) {\n\t\t\trejectedCandidates.push({\n\t\t\t\tfileName: candidate.file.name,\n\t\t\t\trelativePath: candidate.relativePath,\n\t\t\t\treasons\n\t\t\t})\n\t\t\tcontinue\n\t\t}\n\n\t\tacceptedBytes += candidate.file.size\n\t\tacceptedCandidates.push(candidate)\n\t}\n\n\treturn { acceptedCandidates, rejectedCandidates }\n}\n\nfunction isAllowedUploadType(file: File, allowedMimeTypes: string[]) {\n\treturn allowedMimeTypes.some((allowed) => {\n\t\tif (allowed.endsWith('/*')) {\n\t\t\treturn file.type.startsWith(allowed.slice(0, -1))\n\t\t}\n\t\tif (allowed.startsWith('.')) {\n\t\t\treturn file.name.toLowerCase().endsWith(allowed.toLowerCase())\n\t\t}\n\t\treturn file.type === allowed\n\t})\n}\n\nfunction FileGrid({\n\tbrowser,\n\tcanMove,\n\tinlineRenameError,\n\tinlineRenameLabel,\n\tinlineRenameItem,\n\tinlineRenameValue,\n\tselectedPaths,\n\tonContextMenu,\n\tonDragStart,\n\tonEmptyClick,\n\tonFolderDragOver,\n\tonFolderDrop,\n\tonInlineRenameCancel,\n\tonInlineRenameChange,\n\tonInlineRenameCommit,\n\tonOpenItem,\n\tonSelectItem,\n\tonTouchMenu\n}: {\n\tbrowser: BrowserLike\n\tcanMove: boolean\n\tinlineRenameError: string | null\n\tinlineRenameLabel: string\n\tinlineRenameItem: FileNode | null\n\tinlineRenameValue: string\n\tselectedPaths: string[]\n\tonContextMenu: (item: FileNode, event: MouseEvent) => void\n\tonDragStart: (item: FileNode, event: DragEvent) => void\n\tonEmptyClick: () => void\n\tonFolderDragOver: (item: FileNode, event: DragEvent) => void\n\tonFolderDrop: (item: FileNode, event: DragEvent) => void\n\tonInlineRenameCancel: () => void\n\tonInlineRenameChange: (value: string) => void\n\tonInlineRenameCommit: () => void\n\tonOpenItem: (item: FileNode) => void\n\tonSelectItem: (path: string, event: MouseEvent) => void\n\tonTouchMenu: (item: FileNode) => void\n}) {\n\tconst [gridElement, setGridElement] = useState<HTMLDivElement | null>(null)\n\n\tfunction handleMarqueeSelect(event: OnSelect) {\n\t\tconst inputEvent = event.inputEvent as MouseEvent | KeyboardEvent | undefined\n\t\tconst paths = event.selected\n\t\t\t.map((element) => element.getAttribute('data-fb-path'))\n\t\t\t.filter((path): path is string => Boolean(path))\n\n\t\tbrowser.setSelection(paths, {\n\t\t\tadditive: Boolean(inputEvent?.shiftKey || inputEvent?.metaKey || inputEvent?.ctrlKey)\n\t\t})\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{gridElement ? (\n\t\t\t\t<Selecto\n\t\t\t\t\tclassName=\"[background:var(--fb-accent-soft)!important] [border-color:var(--fb-accent)!important]\"\n\t\t\t\t\tcontainer={gridElement}\n\t\t\t\t\tdragContainer={gridElement}\n\t\t\t\t\thitRate={10}\n\t\t\t\t\tonSelect={handleMarqueeSelect}\n\t\t\t\t\tpreventClickEventOnDrag\n\t\t\t\t\tselectByClick={false}\n\t\t\t\t\tselectableTargets={[\n\t\t\t\t\t\t() => Array.from(gridElement.querySelectorAll<HTMLElement | SVGElement>(\"[data-fb-selectable='true']\"))\n\t\t\t\t\t]}\n\t\t\t\t\tselectFromInside={false}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<div\n\t\t\t\taria-label=\"Files\"\n\t\t\t\tclassName=\"relative grid min-h-full content-start grid-cols-[repeat(auto-fill,minmax(var(--fb-card-min),1fr))] gap-[var(--fb-grid-gap)]\"\n\t\t\t\tonClick={(event) => {\n\t\t\t\t\tif (event.target === event.currentTarget && !hasSelectionModifier(event)) {\n\t\t\t\t\t\tonEmptyClick()\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tref={setGridElement}\n\t\t\t\trole=\"grid\"\n\t\t\t>\n\t\t\t\t{browser.filteredItems.map((item) => (\n\t\t\t\t\t<FileCard\n\t\t\t\t\t\tcanMove={canMove}\n\t\t\t\t\t\titem={item}\n\t\t\t\t\t\tkey={item.path}\n\t\t\t\t\t\tonOpen={() => onOpenItem(item)}\n\t\t\t\t\t\tonContextMenu={(event) => onContextMenu(item, event)}\n\t\t\t\t\t\tonDragStart={(event) => onDragStart(item, event)}\n\t\t\t\t\t\tonFolderDragOver={(event) => onFolderDragOver(item, event)}\n\t\t\t\t\t\tonFolderDrop={(event) => onFolderDrop(item, event)}\n\t\t\t\t\t\tinlineRenameError={inlineRenameError}\n\t\t\t\t\t\tinlineRenameLabel={inlineRenameLabel}\n\t\t\t\t\t\tinlineRenameValue={inlineRenameValue}\n\t\t\t\t\t\tisRenaming={inlineRenameItem?.path === item.path}\n\t\t\t\t\t\tonInlineRenameCancel={onInlineRenameCancel}\n\t\t\t\t\t\tonInlineRenameChange={onInlineRenameChange}\n\t\t\t\t\t\tonInlineRenameCommit={onInlineRenameCommit}\n\t\t\t\t\t\tonSelect={(event) => onSelectItem(item.path, event)}\n\t\t\t\t\t\tonTouchMenu={() => onTouchMenu(item)}\n\t\t\t\t\t\tselected={selectedPaths.includes(item.path)}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</>\n\t)\n}\n\nfunction FileCard({\n\tcanMove,\n\tinlineRenameError,\n\tinlineRenameLabel,\n\tinlineRenameValue,\n\tisRenaming,\n\titem,\n\tselected,\n\tonSelect,\n\tonOpen,\n\tonContextMenu,\n\tonDragStart,\n\tonFolderDragOver,\n\tonFolderDrop,\n\tonInlineRenameCancel,\n\tonInlineRenameChange,\n\tonInlineRenameCommit,\n\tonTouchMenu\n}: {\n\tcanMove: boolean\n\tinlineRenameError: string | null\n\tinlineRenameLabel: string\n\tinlineRenameValue: string\n\tisRenaming: boolean\n\titem: FileNode\n\tselected: boolean\n\tonSelect: (event: MouseEvent) => void\n\tonOpen: () => void\n\tonContextMenu: (event: MouseEvent) => void\n\tonDragStart: (event: DragEvent) => void\n\tonFolderDragOver: (event: DragEvent) => void\n\tonFolderDrop: (event: DragEvent) => void\n\tonInlineRenameCancel: () => void\n\tonInlineRenameChange: (value: string) => void\n\tonInlineRenameCommit: () => void\n\tonTouchMenu: () => void\n}) {\n\tconst longPressTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n\tfunction clearLongPressTimer() {\n\t\tif (longPressTimeoutRef.current) {\n\t\t\tclearTimeout(longPressTimeoutRef.current)\n\t\t\tlongPressTimeoutRef.current = null\n\t\t}\n\t}\n\n\tfunction startLongPressTimer() {\n\t\tclearLongPressTimer()\n\t\tlongPressTimeoutRef.current = setTimeout(() => {\n\t\t\tlongPressTimeoutRef.current = null\n\t\t\tonTouchMenu()\n\t\t}, 520)\n\t}\n\n\treturn (\n\t\t<article\n\t\t\taria-selected={selected}\n\t\t\tdata-fb-path={item.path}\n\t\t\tdata-fb-selectable=\"true\"\n\t\t\tdraggable={canMove}\n\t\t\tclassName={`group relative flex min-h-[var(--fb-card-minh)] cursor-default flex-col rounded-[calc(var(--fb-radius)-1px)] border p-[var(--fb-card-pad)] outline-none hover:shadow-[0_8px_22px_color-mix(in_oklch,var(--fb-text)_8%,transparent)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${SURFACE_MOTION} ${\n\t\t\t\tselected\n\t\t\t\t\t? 'border-[var(--fb-accent)] bg-[var(--fb-accent-soft)]'\n\t\t\t\t\t: 'border-[var(--fb-border)] bg-[var(--fb-surface)] hover:border-[var(--fb-border-strong)]'\n\t\t\t}`}\n\t\t\tonClick={onSelect}\n\t\t\tonContextMenu={onContextMenu}\n\t\t\tonDoubleClick={onOpen}\n\t\t\tonDragOver={item.kind === 'folder' ? onFolderDragOver : undefined}\n\t\t\tonDragStart={canMove ? onDragStart : undefined}\n\t\t\tonDrop={item.kind === 'folder' ? onFolderDrop : undefined}\n\t\t\tonTouchCancel={clearLongPressTimer}\n\t\t\tonTouchEnd={clearLongPressTimer}\n\t\t\tonTouchMove={clearLongPressTimer}\n\t\t\tonTouchStart={startLongPressTimer}\n\t\t\trole=\"gridcell\"\n\t\t\ttabIndex={0}\n\t\t>\n\t\t\t<span\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={`absolute right-2 top-2 grid size-4 place-items-center rounded border text-[10px] ${CONTROL_MOTION} ${\n\t\t\t\t\tselected\n\t\t\t\t\t\t? 'border-[var(--fb-accent)] bg-[var(--fb-accent)] text-[var(--fb-surface)]'\n\t\t\t\t\t\t: 'border-[var(--fb-border)] bg-[var(--fb-surface)] opacity-0 group-hover:opacity-100'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{selected ? '✓' : ''}\n\t\t\t</span>\n\t\t\t<div\n\t\t\t\tclassName={`grid h-[var(--fb-thumb-h)] place-items-center rounded-[calc(var(--fb-radius)-3px)] bg-[var(--fb-surface-2)] group-hover:bg-[var(--fb-bg)] ${CONTROL_MOTION}`}\n\t\t\t>\n\t\t\t\t{item.kind === 'folder' ? (\n\t\t\t\t\t<Folder aria-hidden=\"true\" className=\"size-9 text-[var(--fb-folder)]\" />\n\t\t\t\t) : (\n\t\t\t\t\t<File aria-hidden=\"true\" className=\"size-9 text-[var(--fb-muted)]\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{isRenaming ? (\n\t\t\t\t<InlineRenameInput\n\t\t\t\t\titem={item}\n\t\t\t\t\terror={inlineRenameError}\n\t\t\t\t\tlabel={inlineRenameLabel}\n\t\t\t\t\tonCancel={onInlineRenameCancel}\n\t\t\t\t\tonChange={onInlineRenameChange}\n\t\t\t\t\tonCommit={onInlineRenameCommit}\n\t\t\t\t\tvalue={inlineRenameValue}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<button\n\t\t\t\t\tclassName={`mt-2 min-w-0 truncate text-left text-[12.5px] font-semibold text-[var(--fb-text)] outline-none ${CONTROL_MOTION}`}\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\t\tonSelect(event)\n\t\t\t\t\t}}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t{item.name}\n\t\t\t\t</button>\n\t\t\t)}\n\t\t\t<div className=\"mt-1 text-[11px] text-[var(--fb-muted)]\">\n\t\t\t\t{item.kind === 'folder' ? 'Folder' : formatBytes(item.size ?? 0)}\n\t\t\t</div>\n\t\t</article>\n\t)\n}\n\nfunction InlineRenameInput({\n\terror,\n\titem,\n\tlabel,\n\tonCancel,\n\tonChange,\n\tonCommit,\n\tvalue\n}: {\n\terror: string | null\n\titem: FileNode\n\tlabel: string\n\tonCancel: () => void\n\tonChange: (value: string) => void\n\tonCommit: () => void\n\tvalue: string\n}) {\n\treturn (\n\t\t<div className=\"min-w-0\">\n\t\t\t<input\n\t\t\t\taria-label={`Rename ${label || item.name}`}\n\t\t\t\tautoFocus\n\t\t\t\tclassName={`mt-2 min-w-0 rounded-[calc(var(--fb-radius)-4px)] border border-[var(--fb-accent)] bg-[var(--fb-surface)] px-1.5 py-1 text-[12.5px] font-semibold text-[var(--fb-text)] outline-none ring-2 ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`}\n\t\t\t\tonBlur={onCommit}\n\t\t\t\tonChange={(event) => onChange(event.target.value)}\n\t\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\t\tonDoubleClick={(event) => event.stopPropagation()}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tif (event.key === 'Enter') {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\tonCommit()\n\t\t\t\t\t}\n\t\t\t\t\tif (event.key === 'Escape') {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\tonCancel()\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tvalue={value}\n\t\t\t/>\n\t\t\t{error ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName={`mt-1 rounded-[calc(var(--fb-radius)-5px)] border border-[var(--fb-danger)] bg-[var(--fb-danger-soft)] px-1.5 py-1 text-[11px] text-[var(--fb-danger)] ${SURFACE_MOTION}`}\n\t\t\t\t\trole=\"alert\"\n\t\t\t\t>\n\t\t\t\t\t{error}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n\nfunction FileTable({\n\tbrowser,\n\tcanMove,\n\tinlineRenameError,\n\tinlineRenameLabel,\n\tinlineRenameItem,\n\tinlineRenameValue,\n\tselectedPaths,\n\tonContextMenu,\n\tonDragStart,\n\tonFolderDragOver,\n\tonFolderDrop,\n\tonInlineRenameCancel,\n\tonInlineRenameChange,\n\tonInlineRenameCommit,\n\tonOpenItem,\n\tonSelectItem\n}: {\n\tbrowser: BrowserLike\n\tcanMove: boolean\n\tinlineRenameError: string | null\n\tinlineRenameLabel: string\n\tinlineRenameItem: FileNode | null\n\tinlineRenameValue: string\n\tselectedPaths: string[]\n\tonContextMenu: (item: FileNode, event: MouseEvent) => void\n\tonDragStart: (item: FileNode, event: DragEvent) => void\n\tonFolderDragOver: (item: FileNode, event: DragEvent) => void\n\tonFolderDrop: (item: FileNode, event: DragEvent) => void\n\tonInlineRenameCancel: () => void\n\tonInlineRenameChange: (value: string) => void\n\tonInlineRenameCommit: () => void\n\tonOpenItem: (item: FileNode) => void\n\tonSelectItem: (path: string, event: MouseEvent) => void\n}) {\n\treturn (\n\t\t<table\n\t\t\taria-label=\"Files\"\n\t\t\tclassName={`w-full border-separate border-spacing-0 overflow-hidden rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] text-left ${SURFACE_MOTION}`}\n\t\t>\n\t\t\t<thead className=\"text-[11px] text-[var(--fb-muted)]\">\n\t\t\t\t<tr>\n\t\t\t\t\t<th className=\"border-b border-[var(--fb-border)] px-[var(--fb-cell-x)] py-[var(--fb-cell-y)] font-medium\">\n\t\t\t\t\t\tName\n\t\t\t\t\t</th>\n\t\t\t\t\t<th className=\"border-b border-[var(--fb-border)] px-[var(--fb-cell-x)] py-[var(--fb-cell-y)] font-medium\">\n\t\t\t\t\t\tSize\n\t\t\t\t\t</th>\n\t\t\t\t\t<th className=\"border-b border-[var(--fb-border)] px-[var(--fb-cell-x)] py-[var(--fb-cell-y)] font-medium\">\n\t\t\t\t\t\tModified\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t{browser.filteredItems.map((item) => (\n\t\t\t\t\t<tr\n\t\t\t\t\t\taria-selected={selectedPaths.includes(item.path)}\n\t\t\t\t\t\tdata-fb-path={item.path}\n\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\tselectedPaths.includes(item.path)\n\t\t\t\t\t\t\t\t? `bg-[var(--fb-accent-soft)] outline-none focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`\n\t\t\t\t\t\t\t\t: `outline-none hover:bg-[var(--fb-bg)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdraggable={canMove}\n\t\t\t\t\t\tkey={item.path}\n\t\t\t\t\t\tonClick={(event) => onSelectItem(item.path, event)}\n\t\t\t\t\t\tonContextMenu={(event) => onContextMenu(item, event)}\n\t\t\t\t\t\tonDragOver={(event) => onFolderDragOver(item, event)}\n\t\t\t\t\t\tonDragStart={(event) => onDragStart(item, event)}\n\t\t\t\t\t\tonDrop={(event) => onFolderDrop(item, event)}\n\t\t\t\t\t\tonDoubleClick={() => onOpenItem(item)}\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t>\n\t\t\t\t\t\t<td className=\"border-b border-[var(--fb-border)] px-[var(--fb-cell-x)] py-[var(--fb-cell-y)]\">\n\t\t\t\t\t\t\t<div className=\"flex min-w-0 items-center gap-2\">\n\t\t\t\t\t\t\t\t{item.kind === 'folder' ? (\n\t\t\t\t\t\t\t\t\t<Folder className=\"size-4 text-[var(--fb-folder)]\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<File className=\"size-4 text-[var(--fb-muted)]\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{inlineRenameItem?.path === item.path ? (\n\t\t\t\t\t\t\t\t\t<InlineRenameInput\n\t\t\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\t\t\terror={inlineRenameError}\n\t\t\t\t\t\t\t\t\t\tlabel={inlineRenameLabel}\n\t\t\t\t\t\t\t\t\t\tonCancel={onInlineRenameCancel}\n\t\t\t\t\t\t\t\t\t\tonChange={onInlineRenameChange}\n\t\t\t\t\t\t\t\t\t\tonCommit={onInlineRenameCommit}\n\t\t\t\t\t\t\t\t\t\tvalue={inlineRenameValue}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclassName={`truncate font-medium ${CONTROL_MOTION}`}\n\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\t\t\t\t\t\t\tonSelectItem(item.path, event)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{item.name}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td className=\"border-b border-[var(--fb-border)] px-[var(--fb-cell-x)] py-[var(--fb-cell-y)] text-[12px] text-[var(--fb-muted)]\">\n\t\t\t\t\t\t\t{item.kind === 'folder' ? 'Folder' : formatBytes(item.size ?? 0)}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td className=\"border-b border-[var(--fb-border)] px-[var(--fb-cell-x)] py-[var(--fb-cell-y)] text-[12px] text-[var(--fb-muted)]\">\n\t\t\t\t\t\t\t{item.modifiedAt ? new Date(item.modifiedAt).toLocaleDateString() : '—'}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t))}\n\t\t\t</tbody>\n\t\t</table>\n\t)\n}\n\nfunction ContextMenu({\n\tbrowser,\n\tmenu,\n\tonClose,\n\tonDelete,\n\tonDownload,\n\tonCopy,\n\tonCopyPath,\n\tonCut,\n\tonMove,\n\tonNewFolder,\n\tonPaste,\n\tonRename,\n\tonUpload,\n\treadOnly\n}: {\n\tbrowser: BrowserLike\n\tmenu: ContextMenuState\n\tonClose: () => void\n\tonDelete: () => void\n\tonDownload: () => void\n\tonCopy: () => void\n\tonCopyPath: (item: FileNode) => void\n\tonCut: () => void\n\tonMove: () => void\n\tonNewFolder: () => void\n\tonPaste: () => void\n\tonRename: (item?: FileNode) => void\n\tonUpload: () => void\n\treadOnly: boolean\n}) {\n\tconst isItemMenu = menu.target === 'item'\n\tconst isSheet = menu.mode === 'sheet'\n\n\tfunction run(action: () => void) {\n\t\taction()\n\t\tonClose()\n\t}\n\n\treturn (\n\t\t<div\n\t\t\taria-label={isItemMenu ? 'Item actions' : 'Folder actions'}\n\t\t\tclassName={`fixed z-50 rounded-[calc(var(--fb-radius)-2px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-1 text-[12px] text-[var(--fb-text)] shadow-[0_16px_44px_color-mix(in_oklch,var(--fb-text)_16%,transparent)] ${SURFACE_MOTION} ${\n\t\t\t\tisSheet ? 'inset-x-3 bottom-3 max-h-[80vh] overflow-auto' : 'min-w-40'\n\t\t\t}`}\n\t\t\tdata-fb-menu={isSheet ? 'sheet' : 'context'}\n\t\t\trole=\"menu\"\n\t\t\tstyle={isSheet ? undefined : { left: menu.x, top: menu.y }}\n\t\t>\n\t\t\t{isItemMenu && !readOnly && browser.capabilities.rename ? (\n\t\t\t\t<ContextMenuButton onClick={() => run(() => onRename(menu.item))}>Rename</ContextMenuButton>\n\t\t\t) : null}\n\t\t\t{isItemMenu && !readOnly && browser.capabilities.move ? (\n\t\t\t\t<ContextMenuButton onClick={() => run(onMove)}>Move</ContextMenuButton>\n\t\t\t) : null}\n\t\t\t{isItemMenu && !readOnly && browser.capabilities.copy ? (\n\t\t\t\t<ContextMenuButton onClick={() => run(onCopy)}>Copy</ContextMenuButton>\n\t\t\t) : null}\n\t\t\t{isItemMenu && !readOnly && browser.capabilities.move ? (\n\t\t\t\t<ContextMenuButton onClick={() => run(onCut)}>Cut</ContextMenuButton>\n\t\t\t) : null}\n\t\t\t{isItemMenu ? (\n\t\t\t\t<>\n\t\t\t\t\t<ContextMenuButton onClick={() => run(() => onCopyPath(menu.item))}>\n\t\t\t\t\t\t{browser.selectedPaths.includes(menu.item.path) && browser.selectedPaths.length > 1\n\t\t\t\t\t\t\t? 'Copy paths'\n\t\t\t\t\t\t\t: 'Copy path'}\n\t\t\t\t\t</ContextMenuButton>\n\t\t\t\t\t<ContextMenuButton onClick={() => run(onDownload)}>Download</ContextMenuButton>\n\t\t\t\t\t{!readOnly ? (\n\t\t\t\t\t\t<ContextMenuButton\n\t\t\t\t\t\t\tdanger\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonDelete()\n\t\t\t\t\t\t\t\tonClose()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t</ContextMenuButton>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{!readOnly ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{browser.capabilities.createFolder ? (\n\t\t\t\t\t\t\t\t<ContextMenuButton onClick={() => run(onNewFolder)}>New folder</ContextMenuButton>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<ContextMenuButton onClick={() => run(onUpload)}>Upload</ContextMenuButton>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{!readOnly && browser.clipboard ? (\n\t\t\t\t\t\t<ContextMenuButton onClick={() => run(onPaste)}>Paste here</ContextMenuButton>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nfunction ContextMenuButton({ children, danger, onClick }: { children: string; danger?: boolean; onClick: () => void }) {\n\treturn (\n\t\t<button\n\t\t\tclassName={`flex h-8 w-full items-center rounded-[calc(var(--fb-radius)-4px)] px-2 text-left font-medium outline-none hover:bg-[var(--fb-bg)] focus:bg-[var(--fb-bg)] ${CONTROL_MOTION} ${\n\t\t\t\tdanger ? 'text-[var(--fb-danger)]' : ''\n\t\t\t}`}\n\t\t\tonClick={onClick}\n\t\t\trole=\"menuitem\"\n\t\t\ttype=\"button\"\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t)\n}\n\nfunction UploadConflictDialog({\n\tapplyToAll,\n\tcurrentPath,\n\tonApplyToAllChange,\n\tonCancel,\n\tonResolve,\n\tqueue\n}: {\n\tapplyToAll: boolean\n\tcurrentPath: string\n\tonApplyToAllChange: (value: boolean) => void\n\tonCancel: () => void\n\tonResolve: (resolution: FileBrowserUploadConflictResolution) => void\n\tqueue: UploadConflictQueue\n}) {\n\tconst candidate = queue.candidates[queue.index]\n\tconst path = joinUploadRelativePath(currentPath, candidate.relativePath)\n\tconst conflictIndex = queue.conflictPaths.indexOf(path) + 1\n\n\treturn (\n\t\t<div\n\t\t\taria-label=\"File conflict\"\n\t\t\taria-modal=\"true\"\n\t\t\tclassName={`fixed inset-0 z-40 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_20%,transparent)] p-4 ${SURFACE_MOTION}`}\n\t\t\trole=\"dialog\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={`w-[min(420px,100%)] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 shadow-[0_18px_50px_color-mix(in_oklch,var(--fb-text)_18%,transparent)] ${SURFACE_MOTION}`}\n\t\t\t>\n\t\t\t\t<h2 className=\"m-0 text-[14px] font-semibold\">File conflict</h2>\n\t\t\t\t<p className=\"mt-2 text-[12px] text-[var(--fb-muted)]\">\n\t\t\t\t\t{candidate.relativePath} already exists in this folder.\n\t\t\t\t</p>\n\t\t\t\t<div\n\t\t\t\t\tclassName={`mt-3 rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-bg)] p-2 text-[12px] ${SURFACE_MOTION}`}\n\t\t\t\t>\n\t\t\t\t\tConflict {conflictIndex} of {queue.conflictPaths.length}\n\t\t\t\t</div>\n\t\t\t\t<label className=\"mt-3 flex items-center gap-2 text-[12px] font-medium text-[var(--fb-muted)]\">\n\t\t\t\t\t<input checked={applyToAll} onChange={(event) => onApplyToAllChange(event.target.checked)} type=\"checkbox\" />\n\t\t\t\t\tApply to all conflicts\n\t\t\t\t</label>\n\t\t\t\t<div className=\"mt-4 flex flex-wrap justify-end gap-2\">\n\t\t\t\t\t<button className={commandButton(false)} onClick={onCancel} type=\"button\">\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t\t<button className={commandButton(false)} onClick={() => onResolve('skip')} type=\"button\">\n\t\t\t\t\t\tSkip\n\t\t\t\t\t</button>\n\t\t\t\t\t<button className={commandButton(false)} onClick={() => onResolve('replace')} type=\"button\">\n\t\t\t\t\t\tReplace\n\t\t\t\t\t</button>\n\t\t\t\t\t<button className={primaryButton()} onClick={() => onResolve('keep-both')} type=\"button\">\n\t\t\t\t\t\tKeep both\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction BulkFailureDialog({ error, onClose }: { error: FileBrowserBulkActionError; onClose: () => void }) {\n\tconst completedCount = error.succeededPaths.length\n\n\treturn (\n\t\t<div\n\t\t\taria-label=\"Partial bulk failure\"\n\t\t\taria-modal=\"true\"\n\t\t\tclassName={`fixed inset-0 z-40 grid place-items-center bg-[color-mix(in_oklch,var(--fb-text)_20%,transparent)] p-4 ${SURFACE_MOTION}`}\n\t\t\trole=\"dialog\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={`w-[min(440px,100%)] rounded-[var(--fb-radius)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 shadow-[0_18px_50px_color-mix(in_oklch,var(--fb-text)_18%,transparent)] ${SURFACE_MOTION}`}\n\t\t\t>\n\t\t\t\t<h2 className=\"m-0 text-[14px] font-semibold\">Partial bulk failure</h2>\n\t\t\t\t<p className=\"mt-2 text-[12px] text-[var(--fb-muted)]\">\n\t\t\t\t\t{completedCount} of {error.totalCount} completed\n\t\t\t\t</p>\n\t\t\t\t<ul\n\t\t\t\t\tclassName={`mt-3 max-h-40 overflow-auto rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-bg)] p-2 text-[12px] ${SURFACE_MOTION}`}\n\t\t\t\t>\n\t\t\t\t\t{error.failures.map((failure) => (\n\t\t\t\t\t\t<li className=\"py-1\" key={failure.path}>\n\t\t\t\t\t\t\t<div className=\"truncate font-medium\">\n\t\t\t\t\t\t\t\t{failure.path.split('/').filter(Boolean).at(-1) ?? failure.path}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"text-[var(--fb-danger)]\">{failure.message}</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t\t<div className=\"mt-4 flex justify-end\">\n\t\t\t\t\t<button className={primaryButton()} onClick={onClose} type=\"button\">\n\t\t\t\t\t\tOK\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction MoveDestinationPicker({\n\tcurrentPath,\n\tdestinations,\n\terror,\n\tonSelect,\n\tselectedPath,\n\tstatus\n}: {\n\tcurrentPath: string\n\tdestinations: MoveDestination[]\n\terror: string | null\n\tonSelect: (path: string) => void\n\tselectedPath: string\n\tstatus: MoveDestinationStatus\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`mt-3 max-h-64 overflow-auto rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-bg)] p-2 ${SURFACE_MOTION}`}\n\t\t>\n\t\t\t<MoveDestinationButton\n\t\t\t\tactive={selectedPath === currentPath}\n\t\t\t\tlabel=\"Current folder\"\n\t\t\t\tonClick={() => onSelect(currentPath)}\n\t\t\t\tpath={currentPath}\n\t\t\t/>\n\t\t\t<MoveDestinationButton active={selectedPath === '/'} label=\"Files\" onClick={() => onSelect('/')} path=\"/\" />\n\t\t\t{status === 'loading' ? (\n\t\t\t\t<div className=\"px-2 py-3 text-[12px] text-[var(--fb-muted)]\">Loading folders</div>\n\t\t\t) : null}\n\t\t\t{status === 'error' ? (\n\t\t\t\t<div className=\"px-2 py-3 text-[12px] text-[var(--fb-danger)]\">{error ?? 'Could not load folders'}</div>\n\t\t\t) : null}\n\t\t\t{status === 'ready' && destinations.length === 0 ? (\n\t\t\t\t<div className=\"px-2 py-3 text-[12px] text-[var(--fb-muted)]\">No folders available.</div>\n\t\t\t) : null}\n\t\t\t{destinations.map((destination) => (\n\t\t\t\t<MoveDestinationButton\n\t\t\t\t\tactive={selectedPath === destination.path}\n\t\t\t\t\tdepth={destination.depth}\n\t\t\t\t\tkey={destination.path}\n\t\t\t\t\tlabel={destination.name}\n\t\t\t\t\tonClick={() => onSelect(destination.path)}\n\t\t\t\t\tpath={destination.path}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t)\n}\n\nfunction MoveDestinationButton({\n\tactive,\n\tdepth = 0,\n\tlabel,\n\tonClick,\n\tpath\n}: {\n\tactive: boolean\n\tdepth?: number\n\tlabel: string\n\tonClick: () => void\n\tpath: string\n}) {\n\treturn (\n\t\t<button\n\t\t\taria-label={`Move destination ${path}`}\n\t\t\tclassName={`mt-1 flex h-8 w-full items-center gap-2 rounded-[calc(var(--fb-radius)-4px)] px-2 text-left text-[12px] font-medium ${CONTROL_MOTION} ${\n\t\t\t\tactive ? 'bg-[var(--fb-accent-soft)] text-[var(--fb-accent)]' : 'hover:bg-[var(--fb-surface)]'\n\t\t\t}`}\n\t\t\tonClick={onClick}\n\t\t\tstyle={{ paddingLeft: `calc((${depth} * 6 + 2) * var(--fb-gap))` }}\n\t\t\ttype=\"button\"\n\t\t>\n\t\t\t<Folder aria-hidden=\"true\" className=\"size-4 shrink-0\" />\n\t\t\t<span className=\"truncate\">{label}</span>\n\t\t</button>\n\t)\n}\n\nfunction ActionBar({\n\tselectedCount,\n\titemCount,\n\tcanRename,\n\tcanMove,\n\tcanCopy,\n\tcanCut,\n\tcanDelete,\n\tonRename,\n\tonMove,\n\tonCopy,\n\tonCut,\n\tonDelete,\n\tonDownload,\n\tonSelectAll,\n\tonSelectNone\n}: {\n\tselectedCount: number\n\titemCount: number\n\tcanRename: boolean\n\tcanMove: boolean\n\tcanCopy: boolean\n\tcanCut: boolean\n\tcanDelete: boolean\n\tonRename: () => void\n\tonMove: () => void\n\tonCopy: () => void\n\tonCut: () => void\n\tonDelete: () => void\n\tonDownload: () => void\n\tonSelectAll: () => void\n\tonSelectNone: () => void\n}) {\n\tconst hasSelection = selectedCount > 0\n\n\treturn (\n\t\t<div\n\t\t\taria-label=\"Selection actions\"\n\t\t\tclassName={`flex min-h-11 flex-wrap items-center gap-2 border-b border-[var(--fb-border)] px-[var(--fb-pad)] py-1.5 ${SURFACE_MOTION} ${\n\t\t\t\thasSelection ? 'bg-[var(--fb-accent-soft)]' : 'bg-[var(--fb-surface)]'\n\t\t\t}`}\n\t\t\trole=\"toolbar\"\n\t\t>\n\t\t\t<span className=\"mr-auto text-[12px] font-semibold\">{selectedCount} selected</span>\n\t\t\t<button className={commandButton(false)} disabled={itemCount === 0} onClick={onSelectAll} type=\"button\">\n\t\t\t\t<CheckSquare className=\"size-4\" />\n\t\t\t\tSelect all\n\t\t\t</button>\n\t\t\t<button className={commandButton(false)} disabled={!hasSelection} onClick={onSelectNone} type=\"button\">\n\t\t\t\t<XIcon className=\"size-4\" />\n\t\t\t\tSelect none\n\t\t\t</button>\n\t\t\t{hasSelection && canRename && selectedCount === 1 ? (\n\t\t\t\t<button className={commandButton(false)} onClick={() => onRename()} type=\"button\">\n\t\t\t\t\t<Pencil className=\"size-4\" />\n\t\t\t\t\tRename\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t\t{hasSelection && canMove ? (\n\t\t\t\t<button className={commandButton(false)} onClick={onMove} type=\"button\">\n\t\t\t\t\t<FolderInput className=\"size-4\" />\n\t\t\t\t\tMove\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t\t{hasSelection && canCopy ? (\n\t\t\t\t<button className={commandButton(false)} onClick={onCopy} type=\"button\">\n\t\t\t\t\t<CopyIcon className=\"size-4\" />\n\t\t\t\t\tCopy\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t\t{hasSelection && canCut ? (\n\t\t\t\t<button className={commandButton(false)} onClick={onCut} type=\"button\">\n\t\t\t\t\t<Scissors className=\"size-4\" />\n\t\t\t\t\tCut\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t\t{hasSelection ? (\n\t\t\t\t<button className={commandButton(false)} onClick={onDownload} type=\"button\">\n\t\t\t\t\t<Download className=\"size-4\" />\n\t\t\t\t\tDownload\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t\t{hasSelection && canDelete ? (\n\t\t\t\t<button className={dangerButton()} onClick={onDelete} type=\"button\">\n\t\t\t\t\t<Trash2 className=\"size-4\" />\n\t\t\t\t\tDelete\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n\nfunction Breadcrumbs({ path, onNavigate }: { path: string; onNavigate: (path: string) => Promise<void> }) {\n\tconst parts = path.split('/').filter(Boolean)\n\tconst crumbs = [{ label: 'Files', path: '/' }].concat(\n\t\tparts.map((part, index) => ({\n\t\t\tlabel: part,\n\t\t\tpath: `/${parts.slice(0, index + 1).join('/')}`\n\t\t}))\n\t)\n\tconst visibleCrumbs = getVisibleBreadcrumbs(crumbs)\n\n\treturn (\n\t\t<nav aria-label=\"Breadcrumb\" className=\"flex min-w-0 items-center gap-1\">\n\t\t\t{visibleCrumbs.map((crumb, index) => (\n\t\t\t\t<span className=\"flex min-w-0 items-center gap-1\" key={crumb.key}>\n\t\t\t\t\t{index > 0 ? (\n\t\t\t\t\t\t<span className=\"text-[var(--fb-muted)]\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t/\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{crumb.kind === 'collapsed' ? (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\taria-label=\"Collapsed breadcrumb\"\n\t\t\t\t\t\t\tclassName={`rounded-[calc(var(--fb-radius)-4px)] px-1.5 py-1 text-[12px] font-semibold text-[var(--fb-muted)] ${CONTROL_MOTION}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t...\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclassName={`max-w-[160px] truncate rounded-[calc(var(--fb-radius)-4px)] px-1.5 py-1 text-[12px] font-semibold hover:bg-[var(--fb-bg)] ${CONTROL_MOTION}`}\n\t\t\t\t\t\t\tonClick={() => void onNavigate(crumb.path)}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{crumb.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</nav>\n\t)\n}\n\ntype BreadcrumbCrumb = {\n\tlabel: string\n\tpath: string\n}\n\ntype VisibleBreadcrumbCrumb =\n\t| (BreadcrumbCrumb & {\n\t\t\tkind: 'crumb'\n\t\t\tkey: string\n\t })\n\t| {\n\t\t\tkind: 'collapsed'\n\t\t\tkey: string\n\t }\n\nfunction getVisibleBreadcrumbs(crumbs: BreadcrumbCrumb[]): VisibleBreadcrumbCrumb[] {\n\tif (crumbs.length <= 4) {\n\t\treturn crumbs.map((crumb) => ({ ...crumb, kind: 'crumb', key: crumb.path }))\n\t}\n\n\treturn [\n\t\t{ ...crumbs[0], kind: 'crumb', key: crumbs[0].path },\n\t\t{ ...crumbs[1], kind: 'crumb', key: crumbs[1].path },\n\t\t{ kind: 'collapsed', key: 'collapsed' },\n\t\t...crumbs.slice(-2).map((crumb) => ({\n\t\t\t...crumb,\n\t\t\tkind: 'crumb' as const,\n\t\t\tkey: crumb.path\n\t\t}))\n\t]\n}\n\nfunction DetailsPanel({\n\titem,\n\tonCopyPath,\n\tonDownload,\n\tselectedCount,\n\ttotalBytes\n}: {\n\titem: FileNode | null\n\tonCopyPath: () => void\n\tonDownload: () => void\n\tselectedCount: number\n\ttotalBytes: number\n}) {\n\tif (!item) {\n\t\treturn (\n\t\t\t<aside\n\t\t\t\taria-label=\"Details\"\n\t\t\t\tclassName={`hidden w-[var(--fb-panel-w)] shrink-0 border-l border-[var(--fb-border)] bg-[var(--fb-surface)] p-[var(--fb-panel-pad)] md:flex ${SURFACE_MOTION}`}\n\t\t\t>\n\t\t\t\t<div className=\"flex min-h-full flex-1 flex-col items-center justify-center text-center\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`grid h-28 w-full place-items-center rounded-[var(--fb-radius)] bg-[var(--fb-bg)] ${SURFACE_MOTION}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Square className=\"size-12 text-[var(--fb-muted)]\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<h2 className=\"mt-4 text-[14px] font-semibold\">No item selected</h2>\n\t\t\t\t</div>\n\t\t\t</aside>\n\t\t)\n\t}\n\n\tif (selectedCount > 1) {\n\t\treturn (\n\t\t\t<aside\n\t\t\t\taria-label=\"Details\"\n\t\t\t\tclassName={`hidden w-[var(--fb-panel-w)] shrink-0 border-l border-[var(--fb-border)] bg-[var(--fb-surface)] p-[var(--fb-panel-pad)] md:block ${SURFACE_MOTION}`}\n\t\t\t>\n\t\t\t\t<div className={`grid h-28 place-items-center rounded-[var(--fb-radius)] bg-[var(--fb-bg)] ${SURFACE_MOTION}`}>\n\t\t\t\t\t<CopyIcon className=\"size-12 text-[var(--fb-muted)]\" />\n\t\t\t\t</div>\n\t\t\t\t<h2 className=\"mt-4 text-[14px] font-semibold\">{formatItemCount(selectedCount)} selected</h2>\n\t\t\t\t<dl className=\"mt-3 space-y-2 text-[12px]\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<dt className=\"text-[var(--fb-muted)]\">Total size</dt>\n\t\t\t\t\t\t<dd className=\"font-medium\">{formatBytes(totalBytes)}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t\t<button\n\t\t\t\t\taria-label={`Download ${formatItemCount(selectedCount)}`}\n\t\t\t\t\tclassName={`${commandButton(false)} mt-4 w-full justify-center`}\n\t\t\t\t\tonClick={onDownload}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t<Download className=\"size-4\" />\n\t\t\t\t\tDownload\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\taria-label={`Copy ${formatItemCount(selectedCount)} paths`}\n\t\t\t\t\tclassName={`${commandButton(false)} mt-2 w-full justify-center`}\n\t\t\t\t\tonClick={onCopyPath}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t<CopyIcon className=\"size-4\" />\n\t\t\t\t\tCopy paths\n\t\t\t\t</button>\n\t\t\t</aside>\n\t\t)\n\t}\n\n\treturn (\n\t\t<aside\n\t\t\taria-label=\"Details\"\n\t\t\tclassName={`hidden w-72 shrink-0 border-l border-[var(--fb-border)] bg-[var(--fb-surface)] p-4 md:block ${SURFACE_MOTION}`}\n\t\t>\n\t\t\t<div className={`grid h-28 place-items-center rounded-[var(--fb-radius)] bg-[var(--fb-bg)] ${SURFACE_MOTION}`}>\n\t\t\t\t{item.kind === 'folder' ? (\n\t\t\t\t\t<Folder className=\"size-12 text-[var(--fb-folder)]\" />\n\t\t\t\t) : (\n\t\t\t\t\t<File className=\"size-12 text-[var(--fb-muted)]\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<h2 className=\"mt-4 truncate text-[14px] font-semibold\">{item.name}</h2>\n\t\t\t<dl className=\"mt-3 space-y-2 text-[12px]\">\n\t\t\t\t<div>\n\t\t\t\t\t<dt className=\"text-[var(--fb-muted)]\">Path</dt>\n\t\t\t\t\t<dd className=\"truncate font-medium\">{item.path}</dd>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<dt className=\"text-[var(--fb-muted)]\">Type</dt>\n\t\t\t\t\t<dd className=\"font-medium\">{item.kind}</dd>\n\t\t\t\t</div>\n\t\t\t\t{item.kind === 'file' ? (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<dt className=\"text-[var(--fb-muted)]\">Size</dt>\n\t\t\t\t\t\t<dd className=\"font-medium\">{formatBytes(item.size ?? 0)}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</dl>\n\t\t\t<button\n\t\t\t\taria-label={`Download ${item.name}`}\n\t\t\t\tclassName={`${commandButton(false)} mt-4 w-full justify-center`}\n\t\t\t\tonClick={onDownload}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Download className=\"size-4\" />\n\t\t\t\tDownload\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\taria-label={`Copy path of ${item.name}`}\n\t\t\t\tclassName={`${commandButton(false)} mt-2 w-full justify-center`}\n\t\t\t\tonClick={onCopyPath}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<CopyIcon className=\"size-4\" />\n\t\t\t\tCopy path\n\t\t\t</button>\n\t\t</aside>\n\t)\n}\n\nfunction PreviewOriginalLink({ preview }: { preview: PreviewState }) {\n\tif (!preview.url) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<a\n\t\t\taria-label={`Open original ${preview.item.name}`}\n\t\t\tclassName={`mt-4 inline-flex h-8 items-center rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] px-2.5 text-[12px] font-medium text-[var(--fb-accent)] outline-none hover:bg-[var(--fb-bg)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`}\n\t\t\thref={preview.url}\n\t\t\trel=\"noreferrer\"\n\t\t\ttarget=\"_blank\"\n\t\t>\n\t\t\tOpen original\n\t\t</a>\n\t)\n}\n\nfunction SkeletonGrid() {\n\treturn (\n\t\t<div\n\t\t\taria-label=\"Files\"\n\t\t\tclassName=\"grid grid-cols-[repeat(auto-fill,minmax(var(--fb-card-min),1fr))] gap-[var(--fb-grid-gap)]\"\n\t\t\trole=\"grid\"\n\t\t>\n\t\t\t{Array.from({ length: 8 }, (_, index) => (\n\t\t\t\t<div\n\t\t\t\t\tclassName={`min-h-[var(--fb-card-minh)] animate-pulse rounded-[calc(var(--fb-radius)-1px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] p-[var(--fb-card-pad)] ${SURFACE_MOTION}`}\n\t\t\t\t\tkey={index}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"h-[var(--fb-thumb-h)] rounded-[calc(var(--fb-radius)-3px)] bg-[var(--fb-surface-2)]\" />\n\t\t\t\t\t<div className=\"mt-3 h-3 w-3/4 rounded bg-[var(--fb-surface-2)]\" />\n\t\t\t\t\t<div className=\"mt-2 h-3 w-1/2 rounded bg-[var(--fb-surface-2)]\" />\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t)\n}\n\nfunction StateMessage({ title, value, tone }: { title: string; value: string; tone?: 'danger' }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`grid min-h-[280px] place-items-center rounded-[var(--fb-radius)] border border-dashed border-[var(--fb-border)] bg-[var(--fb-surface)] p-8 text-center ${SURFACE_MOTION}`}\n\t\t>\n\t\t\t<div>\n\t\t\t\t<div className={`font-semibold ${tone === 'danger' ? 'text-[var(--fb-danger)]' : ''}`}>{title}</div>\n\t\t\t\t<div className=\"mt-1 text-[12px] text-[var(--fb-muted)]\">{value}</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction UploadRejectionAlert({\n\tonDismiss,\n\trejections\n}: {\n\tonDismiss: () => void\n\trejections: FileBrowserUploadRejection[]\n}) {\n\treturn (\n\t\t<div\n\t\t\taria-label=\"Upload rejected\"\n\t\t\tclassName=\"border-b border-[var(--fb-border)] bg-[var(--fb-danger-soft)] px-3 py-2 text-[12px] text-[var(--fb-text)]\"\n\t\t\trole=\"alert\"\n\t\t>\n\t\t\t<div className=\"flex items-start gap-3\">\n\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t<div className=\"font-semibold text-[var(--fb-danger)]\">Upload rejected</div>\n\t\t\t\t\t<ul className=\"mt-1 space-y-1\">\n\t\t\t\t\t\t{rejections.map((rejection) => (\n\t\t\t\t\t\t\t<li className=\"min-w-0\" key={rejection.relativePath}>\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{rejection.relativePath}</span>\n\t\t\t\t\t\t\t\t<span className=\"text-[var(--fb-muted)]\"> {rejection.reasons.join('; ')}</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<button\n\t\t\t\t\taria-label=\"Dismiss upload rejection\"\n\t\t\t\t\tclassName={commandButton(false)}\n\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\tDismiss\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction selectWithEvent(\n\tbrowser: BrowserLike,\n\tpath: string,\n\tevent: MouseEvent | KeyboardEvent,\n\toptions: {\n\t\tcancelPendingSelectedItemUnselect: () => void\n\t\tscheduleSelectedItemUnselect: (path: string) => void\n\t}\n) {\n\tif ('shiftKey' in event && event.shiftKey) {\n\t\toptions.cancelPendingSelectedItemUnselect()\n\t\tbrowser.selectRange(path)\n\t} else if ('metaKey' in event && (event.metaKey || event.ctrlKey)) {\n\t\toptions.cancelPendingSelectedItemUnselect()\n\t\tbrowser.toggleSelection(path)\n\t} else if (browser.selectedPaths.length === 1 && browser.selectedPaths[0] === path) {\n\t\toptions.scheduleSelectedItemUnselect(path)\n\t} else {\n\t\toptions.cancelPendingSelectedItemUnselect()\n\t\tbrowser.selectOnly(path)\n\t}\n}\n\nfunction hasSelectionModifier(event: MouseEvent | KeyboardEvent): boolean {\n\treturn Boolean('shiftKey' in event && (event.shiftKey || event.metaKey || event.ctrlKey))\n}\n\nfunction isKeyboardNavigationKey(key: string) {\n\treturn ['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'End', 'Home'].includes(key)\n}\n\nfunction getNextKeyboardIndex(key: string, currentIndex: number, length: number) {\n\tif (key === 'Home') {\n\t\treturn 0\n\t}\n\tif (key === 'End') {\n\t\treturn length - 1\n\t}\n\tif (key === 'ArrowUp' || key === 'ArrowLeft') {\n\t\treturn Math.max(0, currentIndex - 1)\n\t}\n\treturn Math.min(length - 1, currentIndex + 1)\n}\n\nfunction escapeAttributeSelector(value: string) {\n\tif (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n\t\treturn CSS.escape(value)\n\t}\n\n\treturn value.replace(/[\"\\\\]/g, '\\\\$&')\n}\n\nfunction getDraggedPaths(dataTransfer: DataTransfer) {\n\tconst raw = dataTransfer.getData(FILE_BROWSER_DRAG_MIME)\n\tif (!raw) {\n\t\treturn []\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown\n\t\tif (!Array.isArray(parsed)) {\n\t\t\treturn []\n\t\t}\n\t\treturn parsed.filter((path): path is string => typeof path === 'string').map(normalizeFileBrowserPath)\n\t} catch {\n\t\treturn []\n\t}\n}\n\nfunction getErrorState(error: Error | null) {\n\tif (isAccessDeniedError(error)) {\n\t\treturn {\n\t\t\ttitle: 'Access denied',\n\t\t\tvalue: error?.message ?? 'You do not have access to this folder.'\n\t\t}\n\t}\n\n\treturn {\n\t\ttitle: 'Could not load this folder',\n\t\tvalue: error?.message ?? 'Unknown error'\n\t}\n}\n\nfunction isAccessDeniedError(error: Error | null) {\n\tif (!error) {\n\t\treturn false\n\t}\n\n\tconst metadata = error as Error & {\n\t\tcode?: unknown\n\t\tstatus?: unknown\n\t\tstatusCode?: unknown\n\t}\n\treturn (\n\t\tmetadata.status === 403 ||\n\t\tmetadata.statusCode === 403 ||\n\t\tmetadata.code === 'access_denied' ||\n\t\tmetadata.code === 'forbidden' ||\n\t\tmetadata.code === 'permission_denied'\n\t)\n}\n\nfunction toErrorMessage(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error)\n}\n\nfunction isEditableEventTarget(target: EventTarget | null): boolean {\n\tif (!(target instanceof HTMLElement)) {\n\t\treturn false\n\t}\n\n\treturn target.isContentEditable || ['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName)\n}\n\nfunction formatBytes(bytes: number) {\n\tif (bytes < 1024) {\n\t\treturn `${bytes} B`\n\t}\n\tconst kib = bytes / 1024\n\tif (kib < 1024) {\n\t\treturn `${kib.toFixed(1)} KB`\n\t}\n\treturn `${(kib / 1024).toFixed(1)} MB`\n}\n\nfunction formatItemCount(count: number) {\n\treturn `${count} ${count === 1 ? 'item' : 'items'}`\n}\n\nfunction formatScreenReaderStatus({\n\tcurrentPath,\n\titemCount,\n\tselectedCount,\n\tstatus\n}: {\n\tcurrentPath: string\n\titemCount: number\n\tselectedCount: number\n\tstatus: string\n}) {\n\tconst folderName = currentPath === '/' ? 'Files' : (currentPath.split('/').filter(Boolean).at(-1) ?? 'Files')\n\treturn `${folderName} ${status}. ${itemCount} ${itemCount === 1 ? 'item' : 'items'}. ${selectedCount} selected.`\n}\n\nfunction toolButton(active: boolean) {\n\treturn `inline-flex h-[var(--fb-control-h)] items-center justify-center gap-1 rounded-[calc(var(--fb-radius)-3px)] border px-2 text-[12px] font-medium outline-none focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION} ${\n\t\tactive\n\t\t\t? 'border-[var(--fb-accent)] bg-[var(--fb-accent-soft)] text-[var(--fb-accent)]'\n\t\t\t: 'border-[var(--fb-border)] bg-[var(--fb-surface)] text-[var(--fb-muted)] hover:bg-[var(--fb-bg)]'\n\t}`\n}\n\nfunction commandButton(active: boolean) {\n\treturn `inline-flex h-[var(--fb-control-h)] items-center gap-1.5 rounded-[calc(var(--fb-radius)-3px)] border px-2.5 text-[12px] font-medium outline-none disabled:cursor-not-allowed disabled:opacity-45 focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION} ${\n\t\tactive\n\t\t\t? 'border-[var(--fb-accent)] bg-[var(--fb-accent-soft)] text-[var(--fb-accent)]'\n\t\t\t: 'border-[var(--fb-border)] bg-[var(--fb-surface)] text-[var(--fb-text)] hover:bg-[var(--fb-bg)]'\n\t}`\n}\n\nfunction primaryButton() {\n\treturn `inline-flex h-[var(--fb-control-h)] items-center gap-1.5 rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-accent)] bg-[var(--fb-accent)] px-2.5 text-[12px] font-semibold text-[var(--fb-surface)] outline-none hover:opacity-90 focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`\n}\n\nfunction dangerButton() {\n\treturn `inline-flex h-[var(--fb-control-h)] items-center gap-1.5 rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-danger)] bg-[var(--fb-danger-soft)] px-2.5 text-[12px] font-medium text-[var(--fb-danger)] outline-none hover:bg-[var(--fb-danger-soft)] focus:ring-2 focus:ring-[var(--fb-danger-soft)] ${CONTROL_MOTION}`\n}\n\nfunction selectInput() {\n\treturn `h-[var(--fb-control-h)] rounded-[calc(var(--fb-radius)-3px)] border border-[var(--fb-border)] bg-[var(--fb-surface)] px-2 text-[12px] font-medium text-[var(--fb-text)] outline-none focus:border-[var(--fb-accent)] focus:ring-2 focus:ring-[var(--fb-accent-soft)] ${CONTROL_MOTION}`\n}\n"],"x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],"mappings":"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"}