s3kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +398 -0
  2. package/dist/adapters/express.cjs +305 -0
  3. package/dist/adapters/express.cjs.map +1 -0
  4. package/dist/adapters/express.d.cts +10 -0
  5. package/dist/adapters/express.d.ts +10 -0
  6. package/dist/adapters/express.js +278 -0
  7. package/dist/adapters/express.js.map +1 -0
  8. package/dist/adapters/fetch.cjs +298 -0
  9. package/dist/adapters/fetch.cjs.map +1 -0
  10. package/dist/adapters/fetch.d.cts +9 -0
  11. package/dist/adapters/fetch.d.ts +9 -0
  12. package/dist/adapters/fetch.js +271 -0
  13. package/dist/adapters/fetch.js.map +1 -0
  14. package/dist/adapters/next.cjs +796 -0
  15. package/dist/adapters/next.cjs.map +1 -0
  16. package/dist/adapters/next.d.cts +28 -0
  17. package/dist/adapters/next.d.ts +28 -0
  18. package/dist/adapters/next.js +775 -0
  19. package/dist/adapters/next.js.map +1 -0
  20. package/dist/client/index.cjs +153 -0
  21. package/dist/client/index.cjs.map +1 -0
  22. package/dist/client/index.d.cts +59 -0
  23. package/dist/client/index.d.ts +59 -0
  24. package/dist/client/index.js +126 -0
  25. package/dist/client/index.js.map +1 -0
  26. package/dist/core/index.cjs +452 -0
  27. package/dist/core/index.cjs.map +1 -0
  28. package/dist/core/index.d.cts +11 -0
  29. package/dist/core/index.d.ts +11 -0
  30. package/dist/core/index.js +430 -0
  31. package/dist/core/index.js.map +1 -0
  32. package/dist/http/index.cjs +270 -0
  33. package/dist/http/index.cjs.map +1 -0
  34. package/dist/http/index.d.cts +49 -0
  35. package/dist/http/index.d.ts +49 -0
  36. package/dist/http/index.js +243 -0
  37. package/dist/http/index.js.map +1 -0
  38. package/dist/index.cjs +808 -0
  39. package/dist/index.cjs.map +1 -0
  40. package/dist/index.d.cts +6 -0
  41. package/dist/index.d.ts +6 -0
  42. package/dist/index.js +784 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/manager-BbmXpgXN.d.ts +29 -0
  45. package/dist/manager-gIjo-t8h.d.cts +29 -0
  46. package/dist/react/index.cjs +4320 -0
  47. package/dist/react/index.cjs.map +1 -0
  48. package/dist/react/index.css +155 -0
  49. package/dist/react/index.css.map +1 -0
  50. package/dist/react/index.d.cts +79 -0
  51. package/dist/react/index.d.ts +79 -0
  52. package/dist/react/index.js +4315 -0
  53. package/dist/react/index.js.map +1 -0
  54. package/dist/types-g2IYvH3O.d.cts +123 -0
  55. package/dist/types-g2IYvH3O.d.ts +123 -0
  56. package/package.json +100 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/react/FileManager.tsx","../../src/client/client.ts","../../src/react/FileManager.module.css","../../src/react/components/Button.tsx","../../src/react/components/Modal.tsx","../../src/react/components/UiIcon.tsx","../../src/react/components/FileIcons.tsx","../../src/react/theme/fileManagerTheme.ts","../../src/react/utils/fileManagerConstants.ts","../../src/react/utils/fileManagerFilters.ts","../../src/react/utils/fileManagerFormat.ts","../../src/react/utils/fileManagerNames.ts","../../src/react/utils/fileManagerPaths.ts","../../src/react/FilePicker.tsx"],"sourcesContent":["export { FileManager } from './FileManager'\nexport type { FileManagerProps } from './types/fileManager'\nexport { FilePicker } from './FilePicker'\nexport type { FilePickerProps } from './FilePicker'\n","'use client'\n\nimport { useEffect, useMemo, useState, useCallback, useRef, CSSProperties } from 'react'\nimport { S3FileManagerClient } from '../client/client'\nimport type { S3Entry, S3SearchOptions } from '../core/types'\nimport {\n Folder,\n House,\n UploadSimple,\n FolderPlus,\n Trash,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n X,\n CaretRight,\n DotsThree,\n DownloadSimple,\n ArrowCounterClockwise,\n PencilSimple,\n Warning,\n MagnifyingGlass,\n CaretUp,\n CaretDown,\n List,\n SquaresFour,\n Copy,\n FileText,\n} from '@phosphor-icons/react'\nimport { ContextMenu } from '@base-ui/react'\nimport { Menu } from '@base-ui/react'\nimport { Dialog } from '@base-ui/react'\nimport fileManagerStyles from './FileManager.module.css'\nimport type { FileManagerProps } from './types/fileManager'\nimport { Button } from './components/Button'\nimport { Modal } from './components/Modal'\nimport { UiIcon } from './components/UiIcon'\nimport { getFileIcon } from './components/FileIcons'\nimport { useTheme } from './theme/fileManagerTheme'\nimport { TRASH_PATH } from './utils/fileManagerConstants'\nimport { buildAllowedExtensions, isImageFileName } from './utils/fileManagerFilters'\nimport { formatBytes, formatDate } from './utils/fileManagerFormat'\nimport { buildUniqueName } from './utils/fileManagerNames'\nimport {\n getParentPath,\n getRelativePathFromFile,\n joinPath,\n normalizeRelativePath,\n} from './utils/fileManagerPaths'\n\n// ─────────────────────────────────────────────────────────\n// Main Component\n// ─────────────────────────────────────────────────────────\n\nexport function FileManager({\n apiUrl,\n fetch: customFetch,\n onFileSelect,\n onSelectionChange,\n onConfirm,\n onNavigate,\n className,\n style,\n theme: themeMode = 'light',\n mode = 'manager',\n selection = 'multiple',\n allowActions,\n confirmLabel = 'Select',\n hideTrash = false,\n filterExtensions,\n filterMimeTypes,\n toolbar,\n viewMode: viewModeProp,\n defaultViewMode = 'grid',\n onViewModeChange,\n labels,\n}: FileManagerProps) {\n const theme = useTheme(themeMode)\n const showSearch = toolbar?.search ?? true\n const showViewSwitcher = toolbar?.viewSwitcher ?? true\n const showSort = toolbar?.sort ?? true\n const showBreadcrumbs = toolbar?.breadcrumbs ?? true\n const labelText = {\n upload: 'Upload',\n newFolder: 'New Folder',\n delete: 'Delete',\n deleteForever: 'Delete Forever',\n restore: 'Restore',\n emptyTrash: 'Empty Trash',\n confirm: confirmLabel,\n searchPlaceholder: 'Search files and folders...',\n ...labels,\n }\n const allowedExtensions = useMemo(\n () => buildAllowedExtensions(filterExtensions, filterMimeTypes),\n [filterExtensions, filterMimeTypes],\n )\n\n const can = {\n upload: mode === 'manager',\n createFolder: mode === 'manager',\n delete: mode === 'manager',\n rename: mode === 'manager',\n move: mode === 'manager',\n copy: mode === 'manager',\n restore: mode === 'manager',\n ...allowActions,\n }\n const [isMobile, setIsMobile] = useState(false)\n const portalContainer = typeof document === 'undefined' ? undefined : document.body\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const mediaQuery = window.matchMedia('(max-width: 720px)')\n const update = () => setIsMobile(mediaQuery.matches)\n update()\n mediaQuery.addEventListener('change', update)\n return () => mediaQuery.removeEventListener('change', update)\n }, [])\n\n const client = useMemo(() => {\n return new S3FileManagerClient({\n apiUrl,\n ...(customFetch ? { fetch: customFetch } : {}),\n })\n }, [apiUrl, customFetch])\n\n // State\n const [view, setView] = useState<'files' | 'trash'>('files')\n const [path, setPath] = useState('')\n const [entries, setEntries] = useState<S3Entry[]>([])\n const [searchResults, setSearchResults] = useState<S3Entry[]>([])\n const [loading, setLoading] = useState(false)\n const [searching, setSearching] = useState(false)\n const [loadingMore, setLoadingMore] = useState(false)\n const [selected, setSelected] = useState<Set<string>>(new Set())\n const [lastSelected, setLastSelected] = useState<S3Entry | null>(null)\n const [hoverRow, setHoverRow] = useState<string | null>(null)\n const [previewData, setPreviewData] = useState<{\n url: string\n entry: S3Entry\n } | null>(null)\n const [previewDisplay, setPreviewDisplay] = useState<{\n url: string\n entry: S3Entry\n } | null>(null)\n const [isPreviewClosing, setIsPreviewClosing] = useState(false)\n const [sidebarWidth, setSidebarWidth] = useState(320)\n const [isResizing, setIsResizing] = useState(false)\n const [inlinePreviews, setInlinePreviews] = useState<Record<string, string>>({})\n const [isSelectionMode, setIsSelectionMode] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [sortBy, setSortBy] = useState<'name' | 'date' | 'size' | 'type'>('name')\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc')\n const [internalViewMode, setInternalViewMode] = useState<'list' | 'grid'>(defaultViewMode)\n\n const viewMode = viewModeProp ?? internalViewMode\n const setViewMode = (next: 'list' | 'grid') => {\n if (!viewModeProp) setInternalViewMode(next)\n onViewModeChange?.(next)\n }\n\n const toolbarControlHeight = 34\n const headerLabelStyle = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 12,\n fontWeight: 600,\n color: theme.textSecondary,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: 0,\n }\n\n // Pagination state\n const [nextCursor, setNextCursor] = useState<string | undefined>(undefined)\n const [searchCursor, setSearchCursor] = useState<string | undefined>(undefined)\n const [hasMore, setHasMore] = useState(false)\n const [searchHasMore, setSearchHasMore] = useState(false)\n\n // Drag and drop state\n const [isDragOver, setIsDragOver] = useState(false)\n const [_dragCounter, setDragCounter] = useState(0)\n\n // Modals & Menu\n const [createFolderOpen, setCreateFolderOpen] = useState(false)\n const [newFolderName, setNewFolderName] = useState('')\n const [deleteOpen, setDeleteOpen] = useState(false)\n const [emptyTrashOpen, setEmptyTrashOpen] = useState(false)\n const [renameOpen, setRenameOpen] = useState(false)\n const [renameName, setRenameName] = useState('')\n const [renameTarget, setRenameTarget] = useState<S3Entry | null>(null)\n const [isRenaming, setIsRenaming] = useState(false)\n const [isDeleting, setIsDeleting] = useState(false)\n const [isEmptyingTrash, setIsEmptyingTrash] = useState(false)\n\n // Upload\n const [uploadItems, setUploadItems] = useState<\n Array<{\n file?: File\n path: string\n name: string\n loaded: number\n total: number\n status: 'uploading' | 'done' | 'error'\n error?: string | undefined\n }>\n >([])\n const [uploadCardOpen, setUploadCardOpen] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const previewPortalRef = useRef<HTMLDivElement>(null)\n const previewPortalContainer = previewPortalRef.current ?? rootRef.current ?? portalContainer\n const downloadUrlCacheRef = useRef<Map<string, string>>(new Map())\n const selectionAnchorRef = useRef<string | null>(null)\n const longPressTimerRef = useRef<number | null>(null)\n const suppressClickRef = useRef(false)\n const dragSelectionBaseRef = useRef<Set<string>>(new Set())\n const lastSelectionSigRef = useRef<string>('')\n const [dragSelect, setDragSelect] = useState<{\n active: boolean\n startX: number\n startY: number\n x: number\n y: number\n additive: boolean\n } | null>(null)\n\n // Keyboard handler for paste + escape\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n\n if (createFolderOpen) {\n setCreateFolderOpen(false)\n setNewFolderName('')\n return\n }\n if (renameOpen) {\n setRenameOpen(false)\n setRenameTarget(null)\n return\n }\n if (deleteOpen) {\n setDeleteOpen(false)\n return\n }\n if (emptyTrashOpen) {\n setEmptyTrashOpen(false)\n return\n }\n\n if (isDragOver) {\n setIsDragOver(false)\n setDragCounter(0)\n return\n }\n\n if (dragSelect) {\n setDragSelect(null)\n return\n }\n\n if (selected.size > 0) {\n setSelected(new Set())\n setLastSelected(null)\n setPreviewData(null)\n return\n }\n\n if (searchQuery.trim()) {\n setSearchQuery('')\n return\n }\n\n if (uploadCardOpen) {\n const hasActiveUploads = uploadItems.some((item) => item.status === 'uploading')\n if (!hasActiveUploads) {\n setUploadCardOpen(false)\n }\n }\n\n return\n }\n\n // Handle Ctrl+V / Cmd+V for paste\n if ((e.ctrlKey || e.metaKey) && e.key === 'v' && view === 'files') {\n // We can't directly access clipboard files in most browsers\n // But we can show a hint to the user\n console.log('Paste detected - use drag and drop or upload button for files')\n }\n },\n [\n view,\n createFolderOpen,\n renameOpen,\n deleteOpen,\n emptyTrashOpen,\n isDragOver,\n dragSelect,\n selected,\n searchQuery,\n uploadCardOpen,\n uploadItems,\n ],\n )\n\n // ─────────────────────────────────────────────────────────\n // Drag and Drop Handlers\n // ─────────────────────────────────────────────────────────\n\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (!can.upload || view !== 'files') return\n\n // Only handle file drops, not other drag operations\n if (e.dataTransfer.types.includes('Files')) {\n setDragCounter((prev) => prev + 1)\n setIsDragOver(true)\n }\n },\n [can.upload, view],\n )\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (!can.upload || view !== 'files') return\n\n setDragCounter((prev) => {\n const newCounter = prev - 1\n if (newCounter <= 0) {\n setIsDragOver(false)\n return 0\n }\n return newCounter\n })\n },\n [can.upload, view],\n )\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (e.dataTransfer.types.includes('Files')) {\n e.dataTransfer.dropEffect = can.upload && view === 'files' ? 'copy' : 'none'\n }\n },\n [can.upload, view],\n )\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n setIsDragOver(false)\n setDragCounter(0)\n\n if (!can.upload || view !== 'files') return\n\n const items = e.dataTransfer.items\n if (items && items.length > 0) {\n const dropped = await getDroppedItems(items)\n if (dropped.length > 0) {\n await onUpload(dropped)\n return\n }\n }\n\n const files = e.dataTransfer.files\n if (files && files.length > 0) {\n await onUpload(files)\n }\n },\n [can.upload, view],\n )\n\n // ─────────────────────────────────────────────────────────\n // Data Fetching\n // ─────────────────────────────────────────────────────────\n\n const refresh = useCallback(\n async (loadMore = false) => {\n if (!loadMore) {\n setLoading(true)\n setSelected(new Set())\n setLastSelected(null)\n setPreviewData(null)\n } else {\n setLoadingMore(true)\n }\n\n try {\n const fetchPath = view === 'trash' ? (path ? joinPath(TRASH_PATH, path) : TRASH_PATH) : path\n const out = await client.list({\n path: fetchPath,\n limit: 100,\n ...(loadMore && nextCursor ? { cursor: nextCursor } : {}),\n })\n\n let items = out.entries\n\n if (allowedExtensions) {\n items = items.filter((entry) => {\n if (entry.type === 'folder') return true\n const ext = entry.name.split('.').pop()?.toLowerCase()\n return ext ? allowedExtensions.has(ext) : false\n })\n }\n\n if (hideTrash) {\n items = items.filter((entry) => entry.path !== `${TRASH_PATH}/`)\n }\n\n if (loadMore) {\n setEntries((prev) => [...prev, ...items])\n } else {\n setEntries(items)\n }\n\n setNextCursor(out.nextCursor)\n setHasMore(!!out.nextCursor)\n } catch (e) {\n console.error(e)\n if (!loadMore) {\n setEntries([])\n }\n } finally {\n setLoading(false)\n setLoadingMore(false)\n }\n },\n [client, path, view, nextCursor, allowedExtensions, hideTrash],\n )\n\n const performSearch = useCallback(\n async (query: string, loadMore = false) => {\n if (!query.trim()) {\n setSearchResults([])\n setSearching(false)\n setSearchCursor(undefined)\n setSearchHasMore(false)\n return\n }\n\n if (!loadMore) {\n setSearching(true)\n setSelected(new Set())\n setLastSelected(null)\n setPreviewData(null)\n } else {\n setLoadingMore(true)\n }\n\n try {\n // Try server-side search first, fallback to client-side if not available\n try {\n const searchOptions: S3SearchOptions = {\n query: query.trim(),\n recursive: true,\n limit: 100,\n ...(loadMore && searchCursor ? { cursor: searchCursor } : {}),\n }\n\n if (view === 'trash') {\n searchOptions.path = TRASH_PATH\n }\n\n const out = await client.search(searchOptions)\n\n let items = out.entries\n // Filter out .trash folder from root in normal view when searching\n if (view === 'files') {\n items = items.filter((e) => {\n if (!e.path.startsWith(TRASH_PATH)) return true\n return e.path === `${TRASH_PATH}/`\n })\n }\n\n if (allowedExtensions) {\n items = items.filter((entry) => {\n if (entry.type === 'folder') return true\n const ext = entry.name.split('.').pop()?.toLowerCase()\n return ext ? allowedExtensions.has(ext) : false\n })\n }\n\n if (hideTrash) {\n items = items.filter((entry) => entry.path !== `${TRASH_PATH}/`)\n }\n\n if (loadMore) {\n setSearchResults((prev) => [...prev, ...items])\n } else {\n setSearchResults(items)\n }\n\n setSearchCursor(out.nextCursor)\n setSearchHasMore(!!out.nextCursor)\n } catch (serverError: any) {\n // If server search fails (404, etc.), fall back to client-side search\n if (\n serverError.message?.includes('404') ||\n serverError.message?.includes('Request failed: 404')\n ) {\n console.log('Server search not available, using client-side search')\n\n // Use current entries for client-side search\n const searchTerm = query.trim().toLowerCase()\n const filtered = entries.filter((entry) =>\n entry.name.toLowerCase().includes(searchTerm),\n )\n\n setSearchResults(filtered)\n setSearchHasMore(false)\n } else {\n throw serverError // Re-throw other errors\n }\n }\n } catch (e) {\n console.error('Search failed:', e)\n if (!loadMore) {\n setSearchResults([])\n }\n } finally {\n setSearching(false)\n setLoadingMore(false)\n }\n },\n [client, view, entries, searchCursor, allowedExtensions, hideTrash],\n )\n\n useEffect(() => {\n // Reset pagination when path or view changes\n setNextCursor(undefined)\n setHasMore(false)\n refresh()\n }, [client, path, view]) // Remove refresh from dependencies to avoid infinite loop\n\n useEffect(() => {\n if (hideTrash && view === 'trash') {\n setView('files')\n setPath('')\n }\n }, [hideTrash, view])\n\n // Debounced search effect\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n performSearch(searchQuery)\n }, 300) // 300ms debounce\n\n return () => clearTimeout(timeoutId)\n }, [searchQuery, view]) // Remove performSearch from dependencies\n\n useEffect(() => {\n onNavigate?.(path)\n }, [path, onNavigate])\n\n useEffect(() => {\n const source = searchQuery.trim() ? searchResults : entries\n const selectedEntries = source.filter((entry) => selected.has(entry.path))\n const sig = selectedEntries\n .map((entry) => entry.path)\n .sort()\n .join('|')\n if (sig === lastSelectionSigRef.current) return\n lastSelectionSigRef.current = sig\n onSelectionChange?.(selectedEntries)\n }, [entries, searchResults, selected, searchQuery, onSelectionChange])\n\n useEffect(() => {\n const source = searchQuery.trim() ? searchResults : entries\n const selectedFiles = source\n .filter((entry) => selected.has(entry.path))\n .filter((entry): entry is Extract<S3Entry, { type: 'file' }> => entry.type === 'file')\n\n const toPrepare = selectedFiles\n .slice(0, 25)\n .map((file) => file.path)\n .filter((p) => !downloadUrlCacheRef.current.has(p))\n\n if (toPrepare.length === 0) return\n\n let cancelled = false\n const run = async () => {\n await Promise.all(\n toPrepare.map(async (p) => {\n try {\n const out = await client.getPreviewUrl({ path: p, inline: false })\n if (cancelled) return\n downloadUrlCacheRef.current.set(p, out.url)\n } catch {\n // Ignore; user can retry\n }\n }),\n )\n }\n\n void run()\n return () => {\n cancelled = true\n }\n }, [client, entries, searchResults, searchQuery, selected])\n\n // Fetch preview\n useEffect(() => {\n if (selected.size === 1 && lastSelected?.type === 'file' && selected.has(lastSelected.path)) {\n const fetchPreview = async () => {\n try {\n const out = await client.getPreviewUrl({\n path: lastSelected.path,\n inline: true,\n })\n setPreviewData({ url: out.url, entry: lastSelected })\n } catch (e) {\n console.error('Failed to load preview', e)\n }\n }\n fetchPreview()\n } else {\n setPreviewData(null)\n }\n }, [selected, lastSelected, client])\n\n useEffect(() => {\n if (previewData) {\n setPreviewDisplay(previewData)\n setIsPreviewClosing(false)\n return\n }\n\n if (!previewDisplay) return\n setIsPreviewClosing(true)\n const timeoutId = window.setTimeout(() => {\n setPreviewDisplay(null)\n setIsPreviewClosing(false)\n }, 200)\n\n return () => window.clearTimeout(timeoutId)\n }, [previewData, previewDisplay])\n\n useEffect(() => {\n const prevent = (e: DragEvent) => {\n e.preventDefault()\n }\n window.addEventListener('dragover', prevent)\n window.addEventListener('drop', prevent)\n return () => {\n window.removeEventListener('dragover', prevent)\n window.removeEventListener('drop', prevent)\n }\n }, [])\n\n useEffect(() => {\n if (selected.size === 0 && isSelectionMode) {\n setIsSelectionMode(false)\n selectionAnchorRef.current = null\n }\n }, [selected, isSelectionMode])\n\n useEffect(() => {\n if (view !== 'files') return\n if (!selected.has(`${TRASH_PATH}/`)) return\n setSelected((prev) => {\n const next = new Set(prev)\n next.delete(`${TRASH_PATH}/`)\n return next\n })\n }, [selected, view])\n\n useEffect(() => {\n if (!dragSelect?.active) return\n\n const handleMove = (e: MouseEvent) => {\n const container = listRef.current\n if (!container) return\n const rect = container.getBoundingClientRect()\n const x = e.clientX - rect.left + container.scrollLeft\n const y = e.clientY - rect.top + container.scrollTop\n setDragSelect((prev) => (prev ? { ...prev, x, y } : prev))\n\n const left = Math.min(dragSelect.startX, x)\n const top = Math.min(dragSelect.startY, y)\n const right = Math.max(dragSelect.startX, x)\n const bottom = Math.max(dragSelect.startY, y)\n\n const elements = Array.from(container.querySelectorAll<HTMLElement>('[data-entry-path]'))\n\n const selectedPaths = new Set<string>()\n for (const el of elements) {\n const pathAttr = el.getAttribute('data-entry-path')\n const selectable = el.getAttribute('data-entry-selectable')\n if (selectable === 'false') continue\n if (!pathAttr) continue\n const elRect = el.getBoundingClientRect()\n const elLeft = elRect.left - rect.left + container.scrollLeft\n const elTop = elRect.top - rect.top + container.scrollTop\n const elRight = elLeft + elRect.width\n const elBottom = elTop + elRect.height\n const intersects = elLeft < right && elRight > left && elTop < bottom && elBottom > top\n if (intersects) selectedPaths.add(pathAttr)\n }\n\n setSelected(() => {\n const base = dragSelect.additive ? new Set(dragSelectionBaseRef.current) : new Set<string>()\n for (const path of selectedPaths) base.add(path)\n return base\n })\n setLastSelected(null)\n setIsSelectionMode(true)\n }\n\n const handleUp = () => {\n setDragSelect(null)\n }\n\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleUp)\n return () => {\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleUp)\n }\n }, [dragSelect])\n\n const updateSidebarWidth = useCallback((clientX: number) => {\n const availableWidth = rootRef.current?.getBoundingClientRect().width ?? window.innerWidth\n const maxWidth = Math.min(520, availableWidth * 0.6)\n const minWidth = Math.min(280, maxWidth)\n const next = window.innerWidth - clientX\n const clamped = Math.max(minWidth, Math.min(maxWidth, next))\n setSidebarWidth(clamped)\n }, [])\n\n useEffect(() => {\n if (!isResizing) return\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault()\n updateSidebarWidth(e.clientX)\n }\n\n const onTouchMove = (e: TouchEvent) => {\n if (!e.touches[0]) return\n e.preventDefault()\n updateSidebarWidth(e.touches[0].clientX)\n }\n\n const onStop = () => setIsResizing(false)\n\n document.addEventListener('mousemove', onMouseMove)\n document.addEventListener('mouseup', onStop)\n document.addEventListener('mouseleave', onStop)\n document.addEventListener('touchmove', onTouchMove, { passive: false })\n document.addEventListener('touchend', onStop)\n document.addEventListener('touchcancel', onStop)\n\n return () => {\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onStop)\n document.removeEventListener('mouseleave', onStop)\n document.removeEventListener('touchmove', onTouchMove)\n document.removeEventListener('touchend', onStop)\n document.removeEventListener('touchcancel', onStop)\n }\n }, [isResizing, updateSidebarWidth])\n\n // ─────────────────────────────────────────────────────────\n // Actions\n // ─────────────────────────────────────────────────────────\n\n function handleNavigate(newPath: string) {\n setPath(newPath)\n }\n\n async function onCreateFolder() {\n if (!can.createFolder || view !== 'files') return\n if (!newFolderName.trim()) return\n const existingNames = new Set(entries.map((entry) => entry.name))\n const uniqueName = buildUniqueName(newFolderName.trim(), existingNames)\n await client.createFolder({ path: joinPath(path, uniqueName) })\n setNewFolderName('')\n setCreateFolderOpen(false)\n refresh()\n }\n\n async function onRename() {\n if (!can.rename || view !== 'files') return\n if (!renameName.trim()) return\n if (isRenaming) return\n const target = renameTarget ?? lastSelected\n if (!target) return\n const oldPath = target.path\n const parent = getParentPath(oldPath)\n const existingNames = new Set(\n entries.filter((entry) => entry.path !== oldPath).map((entry) => entry.name),\n )\n const uniqueName = buildUniqueName(renameName.trim(), existingNames)\n const nextPath = parent ? joinPath(parent, uniqueName) : uniqueName\n const newPath = target.type === 'folder' ? `${nextPath.replace(/\\/+$/, '')}/` : nextPath\n if (newPath === oldPath) {\n setRenameOpen(false)\n setRenameTarget(null)\n return\n }\n\n try {\n setIsRenaming(true)\n await client.move({ fromPath: oldPath, toPath: newPath })\n setRenameOpen(false)\n setRenameTarget(null)\n refresh()\n } catch (e) {\n console.error('Rename failed', e)\n alert('Rename failed')\n } finally {\n setIsRenaming(false)\n }\n }\n\n async function deleteEntries(targets: S3Entry[]) {\n if (!can.delete) return\n if (view === 'files') {\n for (const target of targets) {\n if (target.path.startsWith(TRASH_PATH)) continue\n const dest = joinPath(TRASH_PATH, target.path)\n await client.move({ fromPath: target.path, toPath: dest })\n }\n } else {\n const files = targets.filter((e) => e.type === 'file').map((e) => e.path)\n const folders = targets.filter((e) => e.type === 'folder')\n\n if (files.length > 0) await client.deleteFiles({ paths: files })\n for (const folder of folders) {\n await client.deleteFolder({ path: folder.path, recursive: true })\n }\n }\n }\n\n async function onDelete() {\n if (!can.delete) return\n if (isDeleting) return\n const source = searchQuery.trim() ? searchResults : entries\n const targets = source.filter((e) => selected.has(e.path))\n try {\n setIsDeleting(true)\n await deleteEntries(targets)\n setDeleteOpen(false)\n refresh()\n } catch (e) {\n console.error('Delete failed', e)\n alert('Delete failed')\n } finally {\n setIsDeleting(false)\n }\n }\n\n async function restoreEntries(targets: S3Entry[]) {\n if (!can.restore) return\n for (const target of targets) {\n if (!target.path.startsWith(TRASH_PATH)) continue\n const originalPath = target.path.slice(TRASH_PATH.length + 1)\n if (!originalPath) continue\n await client.move({ fromPath: target.path, toPath: originalPath })\n }\n }\n\n async function onRestore() {\n if (!can.restore) return\n const source = searchQuery.trim() ? searchResults : entries\n const targets = source.filter((e) => selected.has(e.path))\n await restoreEntries(targets)\n refresh()\n }\n\n async function onEmptyTrash() {\n if (!can.restore) return\n if (isEmptyingTrash) return\n try {\n setIsEmptyingTrash(true)\n await client.deleteFolder({ path: TRASH_PATH, recursive: true })\n setEmptyTrashOpen(false)\n refresh()\n } catch (e) {\n console.error('Empty trash failed', e)\n alert('Empty trash failed')\n } finally {\n setIsEmptyingTrash(false)\n }\n }\n\n async function onUpload(files: FileList | Array<{ file: File; path: string }> | null) {\n if (!can.upload || view !== 'files') return\n if (!files || files.length === 0) return\n const baseItems = Array.isArray(files)\n ? files\n : Array.from(files).map((file) => {\n const rel = getRelativePathFromFile(file)\n return {\n file,\n path: joinPath(path, rel ?? file.name),\n }\n })\n\n const existingByFolder = new Map<string, Set<string>>()\n const currentFolderNames = new Set(entries.map((entry) => entry.name))\n existingByFolder.set(path, currentFolderNames)\n\n const items = baseItems.map((item) => {\n const parent = getParentPath(item.path)\n const name = item.path.split('/').pop() ?? item.path\n const existing = existingByFolder.get(parent) ?? new Set<string>()\n const uniqueName = buildUniqueName(name, existing)\n existing.add(uniqueName)\n existingByFolder.set(parent, existing)\n const uniquePath = parent ? joinPath(parent, uniqueName) : uniqueName\n return { ...item, path: uniquePath }\n })\n const initialUploadItems = items.map((item) => ({\n file: item.file,\n path: item.path,\n name: item.path.split('/').pop() ?? item.path,\n loaded: 0,\n total: item.file.size ?? 0,\n status: 'uploading' as const,\n error: undefined,\n }))\n setUploadCardOpen(true)\n setUploadItems(initialUploadItems)\n await client.uploadFiles({\n files: items,\n parallel: 4,\n hooks: {\n onUploadProgress: ({ path: p, loaded, total }) => {\n if (!total) return\n setUploadItems((prev) =>\n prev.map((item) =>\n item.path === p\n ? {\n ...item,\n loaded,\n total: total ?? item.total,\n status: 'uploading',\n error: undefined,\n }\n : item,\n ),\n )\n },\n onUploadComplete: ({ path: p }) =>\n setUploadItems((prev) =>\n prev.map((item) =>\n item.path === p\n ? {\n ...item,\n loaded: item.total,\n status: 'done',\n error: undefined,\n }\n : item,\n ),\n ),\n onUploadError: ({ path: p, error }) =>\n setUploadItems((prev) =>\n prev.map((item) => {\n if (item.path !== p) return item\n const message =\n error instanceof Error ? error.message : error ? String(error) : 'Upload failed'\n return { ...item, status: 'error', error: message }\n }),\n ),\n },\n })\n refresh()\n }\n\n async function retryUpload(item: { file?: File; path: string }) {\n if (!can.upload || view !== 'files') return\n if (!item.file) {\n window.alert('Original file not available. Please re-upload.')\n return\n }\n const file = item.file\n setUploadCardOpen(true)\n setUploadItems((prev) =>\n prev.map((entry) =>\n entry.path === item.path\n ? {\n ...entry,\n loaded: 0,\n total: file.size ?? entry.total,\n status: 'uploading',\n error: undefined,\n }\n : entry,\n ),\n )\n await client.uploadFiles({\n files: [{ file, path: item.path }],\n parallel: 1,\n hooks: {\n onUploadProgress: ({ path: p, loaded, total }) => {\n if (!total) return\n setUploadItems((prev) =>\n prev.map((entry) =>\n entry.path === p\n ? {\n ...entry,\n loaded,\n total: total ?? entry.total,\n status: 'uploading',\n error: undefined,\n }\n : entry,\n ),\n )\n },\n onUploadComplete: ({ path: p }) =>\n setUploadItems((prev) =>\n prev.map((entry) =>\n entry.path === p\n ? {\n ...entry,\n loaded: entry.total,\n status: 'done',\n error: undefined,\n }\n : entry,\n ),\n ),\n onUploadError: ({ path: p, error }) =>\n setUploadItems((prev) =>\n prev.map((entry) => {\n if (entry.path !== p) return entry\n const message =\n error instanceof Error ? error.message : error ? String(error) : 'Upload failed'\n return { ...entry, status: 'error', error: message }\n }),\n ),\n },\n })\n refresh()\n }\n\n function openEntry(entry: S3Entry) {\n if (entry.type === 'folder') {\n let nextPath = entry.path\n if (view === 'trash') {\n nextPath = entry.path.slice(TRASH_PATH.length + 1)\n setPath(nextPath)\n return\n }\n\n if (entry.path.startsWith(TRASH_PATH)) {\n setView('trash')\n const relPath = entry.path.slice(TRASH_PATH.length + 1)\n setPath(relPath)\n return\n }\n\n setPath(nextPath)\n return\n }\n\n setSelected(new Set([entry.path]))\n selectionAnchorRef.current = entry.path\n setIsSelectionMode(true)\n setLastSelected(entry)\n onFileSelect?.(entry)\n }\n\n function selectRange(entries: S3Entry[], startPath: string, endPath: string): Set<string> {\n const startIndex = entries.findIndex((entry) => entry.path === startPath)\n const endIndex = entries.findIndex((entry) => entry.path === endPath)\n if (startIndex === -1 || endIndex === -1) {\n return new Set([endPath])\n }\n const [from, to] = startIndex < endIndex ? [startIndex, endIndex] : [endIndex, startIndex]\n const next = new Set<string>()\n for (let i = from; i <= to; i += 1) {\n next.add(entries[i]!.path)\n }\n return next\n }\n\n function handleEntryClickWithSelection(\n entry: S3Entry,\n index: number,\n entries: S3Entry[],\n e: React.MouseEvent,\n ) {\n const isTrashFolder =\n view === 'files' && entry.type === 'folder' && entry.path === `${TRASH_PATH}/`\n if (isTrashFolder) {\n openEntry(entry)\n return\n }\n\n if (suppressClickRef.current) {\n suppressClickRef.current = false\n return\n }\n\n if (e.shiftKey && selectionAnchorRef.current) {\n if (selection === 'single') {\n setSelected(new Set([entry.path]))\n setLastSelected(null)\n setIsSelectionMode(true)\n return\n }\n const next = selectRange(entries, selectionAnchorRef.current, entry.path)\n setSelected(next)\n setLastSelected(null)\n setIsSelectionMode(true)\n return\n }\n\n if (isSelectionMode || e.metaKey || e.ctrlKey) {\n setSelected((prev) => {\n const next = new Set(prev)\n if (next.has(entry.path)) {\n next.delete(entry.path)\n } else {\n if (selection === 'single') {\n next.clear()\n }\n next.add(entry.path)\n }\n setIsSelectionMode(next.size > 0)\n return next\n })\n selectionAnchorRef.current = entry.path\n setLastSelected(null)\n return\n }\n\n setSelected((prev) => {\n const next = new Set(prev)\n const alreadySelected = next.has(entry.path)\n if (selection === 'single') {\n next.clear()\n if (!alreadySelected) {\n next.add(entry.path)\n }\n } else if (alreadySelected) {\n next.delete(entry.path)\n } else {\n next.add(entry.path)\n }\n setIsSelectionMode(next.size > 0)\n return next\n })\n selectionAnchorRef.current = entry.path\n setLastSelected(null)\n }\n\n function handleLongPressSelect(entry: S3Entry) {\n if (view === 'files' && entry.type === 'folder' && entry.path === `${TRASH_PATH}/`) {\n return\n }\n setIsSelectionMode(true)\n selectionAnchorRef.current = entry.path\n setSelected((prev) => {\n const next = new Set(prev)\n if (selection === 'single') {\n next.clear()\n }\n next.add(entry.path)\n return next\n })\n setLastSelected(null)\n suppressClickRef.current = true\n }\n\n async function bulkDownload(entriesToDownload: S3Entry[]) {\n const files = entriesToDownload.filter((entry) => entry.type === 'file')\n if (files.length === 0) return\n\n const cachedUrls = files\n .map((f) => downloadUrlCacheRef.current.get(f.path))\n .filter((u): u is string => typeof u === 'string')\n\n if (cachedUrls.length !== files.length) {\n if (files.length === 1) {\n try {\n const out = await client.getPreviewUrl({\n path: files[0]!.path,\n inline: false,\n })\n downloadUrlCacheRef.current.set(files[0]!.path, out.url)\n const a = document.createElement('a')\n a.href = out.url\n a.target = '_blank'\n a.rel = 'noopener noreferrer'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n } catch (e) {\n console.error(e)\n }\n return\n }\n\n // Avoid async generation during the click gesture for multi-file downloads.\n // Preparation runs in the background on selection change; ask user to retry.\n window.alert('Preparing download links… please click Download again in a moment.')\n return\n }\n\n if (cachedUrls.length > 20) {\n const ok = window.confirm(\n `Download ${cachedUrls.length} files? Your browser may ask to allow multiple downloads.`,\n )\n if (!ok) return\n }\n\n for (const url of cachedUrls) {\n const a = document.createElement('a')\n a.href = url\n a.target = '_blank'\n a.rel = 'noopener noreferrer'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n }\n }\n\n async function bulkCopy(entriesToCopy: S3Entry[]) {\n if (!can.copy) return\n const dest = window.prompt('Copy to folder path', path || '')\n if (!dest) return\n const baseDest = dest.replace(/\\/+$/, '')\n for (const entry of entriesToCopy) {\n if (entry.path.startsWith(TRASH_PATH)) continue\n const targetName = entry.name || entry.path.split('/').pop() || entry.path\n const toPath =\n entry.type === 'folder'\n ? `${joinPath(baseDest, targetName)}/`\n : joinPath(baseDest, targetName)\n await client.copy({ fromPath: entry.path, toPath })\n }\n refresh()\n }\n\n async function bulkMove(entriesToMove: S3Entry[]) {\n if (!can.move) return\n const dest = window.prompt('Move to folder path', path || '')\n if (!dest) return\n const baseDest = dest.replace(/\\/+$/, '')\n for (const entry of entriesToMove) {\n if (entry.path.startsWith(TRASH_PATH)) continue\n const targetName = entry.name || entry.path.split('/').pop() || entry.path\n const toPath =\n entry.type === 'folder'\n ? `${joinPath(baseDest, targetName)}/`\n : joinPath(baseDest, targetName)\n await client.move({ fromPath: entry.path, toPath })\n }\n refresh()\n }\n\n // ─────────────────────────────────────────────────────────\n // Render\n // ─────────────────────────────────────────────────────────\n\n const breadcrumbs = useMemo(() => {\n const parts = path.split('/').filter(Boolean)\n const crumbs = [{ name: view === 'trash' ? 'Trash' : 'Home', path: '' }]\n let cur = ''\n for (const part of parts) {\n cur = cur ? `${cur}/${part}` : part\n crumbs.push({ name: part, path: cur })\n }\n return crumbs\n }, [path, view])\n\n // Infinite scroll handler\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = e.currentTarget\n const isNearBottom = scrollHeight - scrollTop <= clientHeight + 100 // 100px threshold\n\n if (isNearBottom && !loadingMore && !loading && !searching) {\n const isSearching = searchQuery.trim()\n const hasMoreItems = isSearching ? searchHasMore : hasMore\n\n if (hasMoreItems) {\n if (isSearching) {\n performSearch(searchQuery, true)\n } else {\n refresh(true)\n }\n }\n }\n },\n [loadingMore, loading, searching, searchQuery, searchHasMore, hasMore, performSearch, refresh],\n )\n\n // Get current entries (search results or regular entries)\n const currentEntries = useMemo(() => {\n return searchQuery.trim() ? searchResults : entries\n }, [searchQuery, searchResults, entries])\n\n useEffect(() => {\n let cancelled = false\n const toFetch = currentEntries\n .filter((entry) => entry.type === 'file' && isImageFileName(entry.name))\n .filter((entry) => !inlinePreviews[entry.path])\n .slice(0, 50)\n\n if (toFetch.length === 0) return\n\n const run = async () => {\n for (const entry of toFetch) {\n try {\n const out = await client.getPreviewUrl({\n path: entry.path,\n inline: true,\n })\n if (cancelled) return\n setInlinePreviews((prev) =>\n prev[entry.path] ? prev : { ...prev, [entry.path]: out.url },\n )\n } catch {\n // Ignore preview failures; fall back to icons\n }\n }\n }\n\n void run()\n return () => {\n cancelled = true\n }\n }, [currentEntries, inlinePreviews, client, allowedExtensions])\n\n const showSidebar = previewDisplay !== null\n const showSidebarOnLayout = !isMobile && mode !== 'picker'\n const isSidebarVisible = showSidebarOnLayout && showSidebar\n\n async function getDroppedItems(\n items: DataTransferItemList,\n ): Promise<Array<{ file: File; path: string }>> {\n const entries: any[] = []\n for (const item of Array.from(items)) {\n const entry = (item as any).webkitGetAsEntry?.()\n if (entry) entries.push(entry)\n }\n if (entries.length === 0) return []\n\n const results: Array<{ file: File; path: string }> = []\n\n const readEntries = (reader: any): Promise<any[]> =>\n new Promise((resolve) => {\n reader.readEntries((batch: any[]) => resolve(batch))\n })\n\n const traverse = async (entry: any, prefix: string) => {\n if (entry.isFile) {\n const file = await new Promise<File>((resolve) => entry.file(resolve))\n const rel = normalizeRelativePath(prefix ? `${prefix}/${file.name}` : file.name)\n results.push({ file, path: joinPath(path, rel) })\n return\n }\n\n if (entry.isDirectory) {\n const reader = entry.createReader()\n let batch = await readEntries(reader)\n while (batch.length > 0) {\n for (const child of batch) {\n await traverse(child, prefix ? `${prefix}/${entry.name}` : entry.name)\n }\n batch = await readEntries(reader)\n }\n }\n }\n\n for (const entry of entries) {\n await traverse(entry, '')\n }\n\n return results\n }\n\n return (\n <div\n style={{\n minHeight: isMobile ? 0 : 500,\n maxHeight: isMobile ? '100%' : '100vh',\n ...style,\n ...({\n '--s3kit-bg': theme.bg,\n '--s3kit-bg-secondary': theme.bgSecondary,\n '--s3kit-border': theme.border,\n '--s3kit-text': theme.text,\n '--s3kit-text-secondary': theme.textSecondary,\n '--s3kit-icon-bg': theme.bgSecondary,\n '--s3kit-icon-border': theme.border,\n '--s3kit-icon-radius': '8px',\n } as unknown as CSSProperties),\n }}\n className={`${fileManagerStyles.root}${className ? ` ${className}` : ''}`}\n ref={rootRef}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n >\n {/* Main Content */}\n <div\n className={fileManagerStyles.main}\n style={{\n ...(isDragOver\n ? {\n backgroundColor: theme.bg === '#ffffff' ? '#fafafa' : '#1a1a1a',\n }\n : undefined),\n }}\n >\n {/* Header */}\n <div\n className={fileManagerStyles.header}\n style={{\n padding: isMobile ? '12px 16px' : '16px 24px',\n ...(isMobile ? { gap: 8 } : {}),\n }}\n >\n {/* Left side: Navigation tabs + Breadcrumbs */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n }}\n >\n {/* Navigation Tabs */}\n <div\n className={fileManagerStyles.navTabs}\n style={{ flexWrap: isMobile ? 'wrap' : 'nowrap' }}\n >\n <button\n type=\"button\"\n className={fileManagerStyles.navTab}\n style={{\n backgroundColor: view === 'files' ? theme.selected : 'transparent',\n color: view === 'files' ? theme.text : theme.textSecondary,\n ...(isMobile ? { flex: '1 1 auto', justifyContent: 'center' } : {}),\n }}\n onClick={() => {\n setView('files')\n setPath('')\n setSelected(new Set())\n setLastSelected(null)\n }}\n >\n <UiIcon icon={House} size={16} />\n Home\n </button>\n </div>\n </div>\n\n {/* Action Buttons */}\n <div\n style={{\n display: 'flex',\n gap: 8,\n flexWrap: 'nowrap',\n flexShrink: 0,\n }}\n >\n {view === 'trash' && selected.size === 0 && !hideTrash && can.restore && (\n <Button variant=\"danger\" onClick={() => setEmptyTrashOpen(true)} theme={theme}>\n {labelText.emptyTrash}\n </Button>\n )}\n\n {view === 'trash' && selected.size > 0 && !hideTrash && can.restore && (\n <Button onClick={onRestore} theme={theme}>\n <UiIcon icon={ArrowCounterClockwise} size={16} /> {labelText.restore}\n </Button>\n )}\n\n {selected.size > 0 ? (\n can.delete && (\n <Button variant=\"danger\" onClick={() => setDeleteOpen(true)} theme={theme}>\n <UiIcon icon={Trash} size={16} />{' '}\n {view === 'trash' ? labelText.deleteForever : labelText.delete}\n </Button>\n )\n ) : view === 'files' ? (\n <>\n {can.createFolder && (\n <Button onClick={() => setCreateFolderOpen(true)} theme={theme}>\n <UiIcon icon={FolderPlus} size={16} /> {labelText.newFolder}\n </Button>\n )}\n {can.upload && (\n <Button\n variant=\"primary\"\n onClick={() => fileInputRef.current?.click()}\n theme={theme}\n >\n <UiIcon icon={UploadSimple} size={16} /> {labelText.upload}\n </Button>\n )}\n </>\n ) : null}\n {mode === 'picker' && (\n <Button\n variant=\"primary\"\n onClick={() => {\n const source = searchQuery.trim() ? searchResults : entries\n const selectedEntries = source.filter((entry) => selected.has(entry.path))\n onConfirm?.(selectedEntries)\n }}\n disabled={selected.size === 0}\n theme={theme}\n >\n {labelText.confirm}\n </Button>\n )}\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n style={{ display: 'none' }}\n disabled={!can.upload || view !== 'files'}\n onChange={(e) => onUpload(e.target.files)}\n />\n </div>\n </div>\n\n {/* Breadcrumbs */}\n {showBreadcrumbs && (path || view === 'trash') && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 13,\n padding: isMobile ? '8px 16px' : '10px 24px',\n borderBottom: `1px solid ${theme.border}`,\n overflowX: isMobile ? 'auto' : 'visible',\n whiteSpace: isMobile ? 'nowrap' : 'normal',\n }}\n >\n {breadcrumbs.map((crumb, idx) => (\n <div key={idx} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {idx > 0 && <UiIcon icon={CaretRight} size={12} color={theme.textSecondary} />}\n <button\n type=\"button\"\n onClick={() => handleNavigate(crumb.path)}\n style={{\n background: 'none',\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n fontSize: 13,\n fontWeight: idx === breadcrumbs.length - 1 ? 600 : 400,\n color: idx === breadcrumbs.length - 1 ? theme.text : theme.textSecondary,\n }}\n >\n {crumb.name}\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Search + View Controls */}\n {(showSearch || showSort || (mode !== 'viewer' && showViewSwitcher)) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: showSearch ? 'flex-start' : 'flex-end',\n gap: isMobile ? 8 : 12,\n padding: isMobile ? '10px 16px' : '12px 24px',\n borderBottom: `1px solid ${theme.border}`,\n flexWrap: 'nowrap',\n }}\n >\n {showSearch && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n minWidth: 0,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n minWidth: 0,\n height: toolbarControlHeight,\n padding: '0 10px',\n border: `1px solid ${theme.border}`,\n backgroundColor: theme.bg,\n color: theme.text,\n boxSizing: 'border-box',\n }}\n >\n <UiIcon icon={MagnifyingGlass} size={16} color={theme.textSecondary} />\n <input\n type=\"text\"\n placeholder={labelText.searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{\n flex: 1,\n minWidth: 0,\n height: '100%',\n padding: 0,\n fontSize: 13,\n border: 'none',\n backgroundColor: 'transparent',\n color: theme.text,\n outline: 'none',\n }}\n />\n </div>\n {(searchQuery || searching) && (\n <button\n type=\"button\"\n onClick={() => {\n setSearchQuery('')\n setSearchResults([])\n }}\n disabled={searching}\n style={{\n background: 'none',\n border: 'none',\n cursor: searching ? 'default' : 'pointer',\n width: toolbarControlHeight,\n height: toolbarControlHeight,\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.textSecondary,\n opacity: searching ? 0.5 : 1,\n }}\n >\n <UiIcon icon={X} size={14} />\n </button>\n )}\n </div>\n )}\n\n {(showSort || (mode !== 'viewer' && showViewSwitcher)) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flexShrink: 0,\n }}\n >\n {mode !== 'viewer' && showViewSwitcher && (\n <div\n style={{\n display: 'flex',\n border: `1px solid ${theme.border}`,\n flexShrink: 0,\n height: toolbarControlHeight,\n }}\n >\n <button\n type=\"button\"\n onClick={() => setViewMode('list')}\n style={{\n background: viewMode === 'list' ? theme.selected : 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.text,\n width: toolbarControlHeight,\n height: toolbarControlHeight,\n }}\n title=\"List View\"\n >\n <UiIcon icon={List} size={16} />\n </button>\n <button\n type=\"button\"\n onClick={() => setViewMode('grid')}\n style={{\n background: viewMode === 'grid' ? theme.selected : 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.text,\n width: toolbarControlHeight,\n height: toolbarControlHeight,\n }}\n title=\"Grid View\"\n >\n <UiIcon icon={SquaresFour} size={16} />\n </button>\n </div>\n )}\n {showSort && viewMode === 'grid' && (\n <button\n type=\"button\"\n onClick={() => setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')}\n style={{\n background: theme.bg,\n border: `1px solid ${theme.border}`,\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.text,\n width: toolbarControlHeight,\n height: toolbarControlHeight,\n }}\n title={`Sort ${sortOrder === 'asc' ? 'Descending' : 'Ascending'}`}\n >\n {sortOrder === 'asc' ? (\n <UiIcon icon={ArrowUp} size={16} />\n ) : (\n <UiIcon icon={ArrowDown} size={16} />\n )}\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Search Status */}\n {showSearch && searchQuery.trim() && (\n <div\n style={{\n padding: '8px 24px',\n backgroundColor: theme.bgSecondary,\n borderBottom: `1px solid ${theme.border}`,\n fontSize: 12,\n color: theme.textSecondary,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <UiIcon icon={MagnifyingGlass} size={14} />\n {searching\n ? `Searching for \"${searchQuery}\"...`\n : `Found ${currentEntries.length} result${\n currentEntries.length !== 1 ? 's' : ''\n } for \"${searchQuery}\"`}\n </div>\n {searchHasMore && (\n <div style={{ fontSize: 11, opacity: 0.7 }}>More results available</div>\n )}\n </div>\n )}\n\n {/* File List */}\n <div\n style={{\n flex: 1,\n overflow: 'auto',\n minHeight: 0, // This is important for flex children to shrink properly\n WebkitOverflowScrolling: 'touch',\n position: 'relative',\n }}\n ref={listRef}\n onScroll={handleScroll}\n onMouseDown={(e) => {\n if (isMobile) return\n if (e.button !== 0) return\n const target = e.target as HTMLElement\n if (target.closest('[data-entry-path]')) return\n const container = listRef.current\n if (!container) return\n e.preventDefault()\n const rect = container.getBoundingClientRect()\n const startX = e.clientX - rect.left + container.scrollLeft\n const startY = e.clientY - rect.top + container.scrollTop\n dragSelectionBaseRef.current = new Set(selected)\n setDragSelect({\n active: true,\n startX,\n startY,\n x: startX,\n y: startY,\n additive: e.metaKey || e.ctrlKey,\n })\n }}\n >\n {dragSelect?.active && (\n <div\n style={{\n position: 'absolute',\n left: Math.min(dragSelect.startX, dragSelect.x),\n top: Math.min(dragSelect.startY, dragSelect.y),\n width: Math.abs(dragSelect.x - dragSelect.startX),\n height: Math.abs(dragSelect.y - dragSelect.startY),\n border: `1px solid ${theme.accent}`,\n backgroundColor:\n theme.bg === '#ffffff' ? 'rgba(0,0,0,0.04)' : 'rgba(255,255,255,0.08)',\n pointerEvents: 'none',\n zIndex: 3,\n }}\n />\n )}\n {viewMode === 'list' && (\n <div\n className={fileManagerStyles.tableHeader}\n style={{\n gridTemplateColumns: isMobile ? '1fr 48px' : '1fr 120px 100px 48px',\n padding: isMobile ? '10px 16px' : '10px 24px',\n }}\n >\n {showSort ? (\n <button\n type=\"button\"\n onClick={() => {\n if (sortBy === 'name') {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')\n } else {\n setSortBy('name')\n setSortOrder('asc')\n }\n }}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 12,\n fontWeight: 600,\n color: sortBy === 'name' ? theme.text : theme.textSecondary,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n padding: 0,\n }}\n >\n Name\n {sortBy === 'name' &&\n (sortOrder === 'asc' ? (\n <UiIcon icon={CaretUp} size={12} />\n ) : (\n <UiIcon icon={CaretDown} size={12} />\n ))}\n </button>\n ) : (\n <div style={headerLabelStyle}>Name</div>\n )}\n {!isMobile &&\n (showSort ? (\n <button\n type=\"button\"\n onClick={() => {\n if (sortBy === 'date') {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')\n } else {\n setSortBy('date')\n setSortOrder('desc') // Default to newest first for dates\n }\n }}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 12,\n fontWeight: 600,\n color: sortBy === 'date' ? theme.text : theme.textSecondary,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n padding: 0,\n }}\n >\n Date\n {sortBy === 'date' &&\n (sortOrder === 'asc' ? (\n <UiIcon icon={CaretUp} size={12} />\n ) : (\n <UiIcon icon={CaretDown} size={12} />\n ))}\n </button>\n ) : (\n <div style={headerLabelStyle}>Date</div>\n ))}\n {!isMobile &&\n (showSort ? (\n <button\n type=\"button\"\n onClick={() => {\n if (sortBy === 'size') {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')\n } else {\n setSortBy('size')\n setSortOrder('desc') // Default to largest first for size\n }\n }}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 12,\n fontWeight: 600,\n color: sortBy === 'size' ? theme.text : theme.textSecondary,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n padding: 0,\n }}\n >\n Size\n {sortBy === 'size' &&\n (sortOrder === 'asc' ? (\n <UiIcon icon={CaretUp} size={12} />\n ) : (\n <UiIcon icon={CaretDown} size={12} />\n ))}\n </button>\n ) : (\n <div style={headerLabelStyle}>Size</div>\n ))}\n <div />\n </div>\n )}\n\n {loading || searching ? (\n <div\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.textSecondary,\n }}\n >\n {searching ? 'Searching...' : 'Loading...'}\n </div>\n ) : viewMode === 'grid' ? (\n // Grid View\n <>\n {/*\n\t\t Grid tile layout targets:\n\t\t - consistent gap between icon + label\n\t\t - consistent tile height so content can be visually centered\n\t\t - consistent icon/thumb box size across file/folder items\n\t\t */}\n {(() => {\n const gridTileGap = 10\n const gridTileMinHeight = isMobile ? 120 : 140\n const gridThumbSize = 64\n const gridIconSize = 48\n const gridThumbStyle: CSSProperties = {\n width: gridThumbSize,\n height: gridThumbSize,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }\n\n const renderGridThumb = (entry: S3Entry) => {\n if (entry.type === 'folder') {\n return (\n <UiIcon\n icon={entry.path === `${TRASH_PATH}/` ? Trash : Folder}\n size={gridIconSize}\n weight=\"fill\"\n color={theme.text}\n boxed\n />\n )\n }\n\n const previewUrl = inlinePreviews[entry.path]\n if (previewUrl && isImageFileName(entry.name)) {\n return (\n <img\n src={previewUrl}\n alt={entry.name}\n loading=\"lazy\"\n decoding=\"async\"\n style={{\n width: gridThumbSize,\n height: gridThumbSize,\n objectFit: 'cover',\n borderRadius: 8,\n border: `1px solid ${theme.border}`,\n }}\n />\n )\n }\n\n return getFileIcon(entry.name, gridIconSize)\n }\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: isMobile\n ? 'repeat(auto-fill, minmax(120px, 1fr))'\n : 'repeat(auto-fill, minmax(140px, 1fr))',\n gap: 16,\n padding: isMobile ? 16 : 24,\n }}\n >\n {(() => {\n // Filter and sort entries\n const processEntries = (entries: S3Entry[]) => {\n // No additional filtering needed since search is handled server-side\n let filtered = entries\n\n // Sort entries\n filtered = [...filtered].sort((a, b) => {\n let comparison = 0\n const aIsTrash =\n view === 'files' && a.type === 'folder' && a.path === `${TRASH_PATH}/`\n const bIsTrash =\n view === 'files' && b.type === 'folder' && b.path === `${TRASH_PATH}/`\n if (aIsTrash !== bIsTrash) return aIsTrash ? 1 : -1\n\n // Always put folders first\n if (a.type !== b.type) {\n return a.type === 'folder' ? -1 : 1\n }\n\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name)\n break\n case 'date':\n const aDate =\n a.type === 'file' && a.lastModified\n ? new Date(a.lastModified).getTime()\n : 0\n const bDate =\n b.type === 'file' && b.lastModified\n ? new Date(b.lastModified).getTime()\n : 0\n comparison = aDate - bDate\n break\n case 'size':\n comparison =\n (a.type === 'file' ? a.size || 0 : 0) -\n (b.type === 'file' ? b.size || 0 : 0)\n break\n case 'type':\n const aExt = a.name.split('.').pop()?.toLowerCase() || ''\n const bExt = b.name.split('.').pop()?.toLowerCase() || ''\n comparison = aExt.localeCompare(bExt)\n break\n }\n\n return sortOrder === 'asc' ? comparison : -comparison\n })\n\n return filtered\n }\n\n const filteredEntries = processEntries(currentEntries)\n\n const selectedEntries = filteredEntries.filter((item) =>\n selected.has(item.path),\n )\n\n return filteredEntries.map((entry, index) => {\n const isSelected = selected.has(entry.path)\n\n const isTrashFolder =\n view === 'files' &&\n entry.type === 'folder' &&\n entry.path === `${TRASH_PATH}/`\n const entryLabel = isTrashFolder ? 'Trash' : entry.name\n const isMultiSelected = selectedEntries.length > 1 && isSelected\n const actionEntries = isMultiSelected ? selectedEntries : [entry]\n const hasContextMenuItems =\n (!isMultiSelected && can.rename) ||\n actionEntries.some((item) => item.type === 'file') ||\n (view === 'files' && can.copy) ||\n (isMultiSelected && view === 'files' && can.move) ||\n (isMultiSelected && view === 'trash' && can.restore) ||\n can.delete\n\n if (isTrashFolder) {\n return (\n <div\n key={entry.path}\n data-entry-path={entry.path}\n data-entry-selectable=\"false\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: gridTileGap,\n padding: 16,\n minHeight: gridTileMinHeight,\n backgroundColor: isSelected\n ? theme.selected\n : hoverRow === entry.path\n ? theme.hover\n : theme.bg,\n border: `1px solid ${isSelected ? theme.accent : theme.border}`,\n cursor: 'pointer',\n outline: 'none',\n transition: 'all 0.15s',\n position: 'relative',\n }}\n onClick={(e) =>\n handleEntryClickWithSelection(entry, index, filteredEntries, e)\n }\n onDoubleClick={() => openEntry(entry)}\n onMouseEnter={() => setHoverRow(entry.path)}\n onMouseLeave={() => setHoverRow(null)}\n onTouchStart={() => {\n if (!isMobile) return\n if (longPressTimerRef.current)\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = window.setTimeout(() => {\n handleLongPressSelect(entry)\n }, 350)\n }}\n onTouchMove={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n onTouchEnd={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n >\n <div style={gridThumbStyle}>{renderGridThumb(entry)}</div>\n {/* Name */}\n <div\n style={{\n fontSize: 12,\n fontWeight: 500,\n wordBreak: 'break-word',\n color: theme.text,\n width: '100%',\n }}\n >\n {entryLabel}\n </div>\n </div>\n )\n }\n\n if (!hasContextMenuItems) {\n return (\n <div\n key={entry.path}\n data-entry-path={entry.path}\n data-entry-selectable={isTrashFolder ? 'false' : 'true'}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: gridTileGap,\n padding: 16,\n minHeight: gridTileMinHeight,\n backgroundColor: isSelected\n ? theme.selected\n : hoverRow === entry.path\n ? theme.hover\n : theme.bg,\n border: `1px solid ${isSelected ? theme.accent : theme.border}`,\n cursor: 'pointer',\n outline: 'none',\n transition: 'all 0.15s',\n position: 'relative',\n }}\n onClick={(e) =>\n handleEntryClickWithSelection(entry, index, filteredEntries, e)\n }\n onDoubleClick={() => openEntry(entry)}\n onMouseEnter={() => setHoverRow(entry.path)}\n onMouseLeave={() => setHoverRow(null)}\n onTouchStart={() => {\n if (!isMobile) return\n if (longPressTimerRef.current)\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = window.setTimeout(() => {\n handleLongPressSelect(entry)\n }, 350)\n }}\n onTouchMove={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n onTouchEnd={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n >\n <div style={gridThumbStyle}>{renderGridThumb(entry)}</div>\n <div\n style={{\n fontSize: 12,\n fontWeight: 500,\n wordBreak: 'break-word',\n color: theme.text,\n width: '100%',\n }}\n >\n {entryLabel}\n </div>\n </div>\n )\n }\n\n return (\n <ContextMenu.Root\n key={entry.path}\n onOpenChange={(open) => {\n if (open) {\n if (isTrashFolder) return\n if (!selected.has(entry.path)) {\n setSelected(new Set([entry.path]))\n selectionAnchorRef.current = entry.path\n setLastSelected(null)\n setIsSelectionMode(true)\n }\n }\n }}\n >\n <ContextMenu.Trigger\n data-entry-path={entry.path}\n data-entry-selectable={isTrashFolder ? 'false' : 'true'}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: gridTileGap,\n padding: 16,\n minHeight: gridTileMinHeight,\n backgroundColor: isSelected\n ? theme.selected\n : hoverRow === entry.path\n ? theme.hover\n : theme.bg,\n border: `1px solid ${isSelected ? theme.accent : theme.border}`,\n cursor: 'pointer',\n outline: 'none',\n transition: 'all 0.15s',\n position: 'relative',\n }}\n onClick={(e) =>\n handleEntryClickWithSelection(entry, index, filteredEntries, e)\n }\n onDoubleClick={() => openEntry(entry)}\n onContextMenu={(e) => {\n if (isTrashFolder) {\n e.preventDefault()\n e.stopPropagation()\n }\n }}\n onMouseEnter={() => setHoverRow(entry.path)}\n onMouseLeave={() => setHoverRow(null)}\n onTouchStart={() => {\n if (!isMobile) return\n if (longPressTimerRef.current)\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = window.setTimeout(() => {\n handleLongPressSelect(entry)\n }, 350)\n }}\n onTouchMove={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n onTouchEnd={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n >\n <div style={gridThumbStyle}>{renderGridThumb(entry)}</div>\n\n {/* Name */}\n <div\n style={{\n fontSize: 12,\n fontWeight: 500,\n wordBreak: 'break-word',\n color: theme.text,\n width: '100%',\n }}\n >\n {entryLabel}\n </div>\n </ContextMenu.Trigger>\n\n {/* Context Menu (same as list view) */}\n <ContextMenu.Portal container={portalContainer}>\n <ContextMenu.Positioner style={{ zIndex: 10000 }}>\n <ContextMenu.Popup\n style={{\n zIndex: 10000,\n backgroundColor: theme.bg,\n border: `1px solid ${theme.border}`,\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n padding: 4,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 160,\n outline: 'none',\n }}\n >\n {!isMultiSelected && can.rename && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => {\n setRenameName(entry.name || '')\n setRenameTarget(entry)\n setRenameOpen(true)\n }}\n >\n <UiIcon icon={PencilSimple} size={16} /> Rename\n </ContextMenu.Item>\n )}\n {actionEntries.some((item) => item.type === 'file') && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkDownload(actionEntries)}\n >\n <UiIcon icon={DownloadSimple} size={16} /> Download\n </ContextMenu.Item>\n )}\n {isMultiSelected && view === 'files' && can.move && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkMove(actionEntries)}\n >\n <UiIcon icon={ArrowRight} size={16} /> Move\n </ContextMenu.Item>\n )}\n {view === 'files' && can.copy && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkCopy(actionEntries)}\n >\n <UiIcon icon={Copy} size={16} /> Copy\n </ContextMenu.Item>\n )}\n {isMultiSelected && view === 'trash' && can.restore && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => restoreEntries(actionEntries)}\n >\n <UiIcon icon={ArrowCounterClockwise} size={16} /> Restore\n </ContextMenu.Item>\n )}\n {can.delete && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.danger,\n outline: 'none',\n }}\n onClick={() => {\n setSelected(new Set(actionEntries.map((item) => item.path)))\n setLastSelected(null)\n setIsSelectionMode(true)\n setDeleteOpen(true)\n }}\n >\n <UiIcon icon={Trash} size={16} /> Delete\n </ContextMenu.Item>\n )}\n </ContextMenu.Popup>\n </ContextMenu.Positioner>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n )\n })\n })()}\n </div>\n )\n })()}\n </>\n ) : (\n // List View\n (() => {\n // Filter and sort entries\n const processEntries = (entries: S3Entry[]) => {\n // No additional filtering needed since search is handled server-side\n let filtered = entries\n\n // Sort entries\n filtered = [...filtered].sort((a, b) => {\n let comparison = 0\n const aIsTrash =\n view === 'files' && a.type === 'folder' && a.path === `${TRASH_PATH}/`\n const bIsTrash =\n view === 'files' && b.type === 'folder' && b.path === `${TRASH_PATH}/`\n if (aIsTrash !== bIsTrash) return aIsTrash ? 1 : -1\n\n // Always put folders first\n if (a.type !== b.type) {\n return a.type === 'folder' ? -1 : 1\n }\n\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name)\n break\n case 'date':\n const aDate =\n a.type === 'file' && a.lastModified ? new Date(a.lastModified).getTime() : 0\n const bDate =\n b.type === 'file' && b.lastModified ? new Date(b.lastModified).getTime() : 0\n comparison = aDate - bDate\n break\n case 'size':\n comparison =\n (a.type === 'file' ? a.size || 0 : 0) -\n (b.type === 'file' ? b.size || 0 : 0)\n break\n case 'type':\n const aExt = a.name.split('.').pop()?.toLowerCase() || ''\n const bExt = b.name.split('.').pop()?.toLowerCase() || ''\n comparison = aExt.localeCompare(bExt)\n break\n }\n\n return sortOrder === 'asc' ? comparison : -comparison\n })\n\n return filtered\n }\n\n const filteredEntries = processEntries(currentEntries)\n const selectedEntries = filteredEntries.filter((item) => selected.has(item.path))\n\n return filteredEntries.map((entry, index) => {\n const isSelected = selected.has(entry.path)\n const isHovered = hoverRow === entry.path\n const isTrashFolder =\n view === 'files' && entry.type === 'folder' && entry.path === `${TRASH_PATH}/`\n const entryLabel = isTrashFolder ? 'Trash' : entry.name\n const isMultiSelected = selectedEntries.length > 1 && isSelected\n const actionEntries = isMultiSelected ? selectedEntries : [entry]\n const hasContextMenuItems =\n (!isMultiSelected && can.rename) ||\n actionEntries.some((item) => item.type === 'file') ||\n (view === 'files' && can.copy) ||\n (isMultiSelected && view === 'files' && can.move) ||\n (isMultiSelected && view === 'trash' && can.restore) ||\n can.delete\n\n if (isTrashFolder) {\n return (\n <div\n key={entry.path}\n data-entry-path={entry.path}\n data-entry-selectable=\"false\"\n className={fileManagerStyles.row}\n style={{\n gridTemplateColumns: isMobile ? '1fr 48px' : '1fr 120px 100px 48px',\n padding: isMobile ? '12px 16px' : '12px 24px',\n backgroundColor: isSelected\n ? theme.selected\n : isHovered\n ? theme.hover\n : theme.bg,\n outline: 'none',\n }}\n onClick={(e) => {\n if (e.button !== 0) return\n handleEntryClickWithSelection(entry, index, filteredEntries, e)\n }}\n onDoubleClick={() => openEntry(entry)}\n onMouseEnter={() => setHoverRow(entry.path)}\n onMouseLeave={() => setHoverRow(null)}\n onTouchStart={() => {\n if (!isMobile) return\n if (longPressTimerRef.current)\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = window.setTimeout(() => {\n handleLongPressSelect(entry)\n }, 350)\n }}\n onTouchMove={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n onTouchEnd={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n >\n {/* Name */}\n <div\n style={{\n display: 'flex',\n alignItems: isMobile ? 'flex-start' : 'center',\n gap: 12,\n fontWeight: 500,\n flexDirection: isMobile ? 'column' : 'row',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n }}\n >\n <UiIcon icon={Trash} size={20} weight=\"fill\" color={theme.text} boxed />\n {entryLabel}\n </div>\n {isMobile && (\n <div\n style={{\n fontSize: 11,\n color: theme.textSecondary,\n fontWeight: 400,\n }}\n >\n Folder\n </div>\n )}\n </div>\n\n {/* Date */}\n {!isMobile && <div style={{ color: theme.textSecondary }}>--</div>}\n\n {/* Size */}\n {!isMobile && (\n <div\n style={{\n color: theme.textSecondary,\n fontFamily: 'monospace',\n }}\n >\n --\n </div>\n )}\n\n <div />\n </div>\n )\n }\n\n if (!hasContextMenuItems) {\n return (\n <div\n key={entry.path}\n data-entry-path={entry.path}\n data-entry-selectable={isTrashFolder ? 'false' : 'true'}\n className={fileManagerStyles.row}\n style={{\n gridTemplateColumns: isMobile ? '1fr 48px' : '1fr 120px 100px 48px',\n padding: isMobile ? '12px 16px' : '12px 24px',\n backgroundColor: isSelected\n ? theme.selected\n : isHovered\n ? theme.hover\n : theme.bg,\n outline: 'none',\n }}\n onClick={(e) => {\n if (e.button !== 0) return\n handleEntryClickWithSelection(entry, index, filteredEntries, e)\n }}\n onDoubleClick={() => openEntry(entry)}\n onMouseEnter={() => setHoverRow(entry.path)}\n onMouseLeave={() => setHoverRow(null)}\n onTouchStart={() => {\n if (!isMobile) return\n if (longPressTimerRef.current)\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = window.setTimeout(() => {\n handleLongPressSelect(entry)\n }, 350)\n }}\n onTouchMove={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n onTouchEnd={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: isMobile ? 'flex-start' : 'center',\n gap: 12,\n fontWeight: 500,\n flexDirection: isMobile ? 'column' : 'row',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n }}\n >\n {entry.type === 'folder' ? (\n isTrashFolder ? (\n <UiIcon\n icon={Trash}\n size={20}\n weight=\"fill\"\n color={theme.text}\n boxed\n />\n ) : (\n <UiIcon\n icon={Folder}\n size={20}\n weight=\"fill\"\n color={theme.text}\n boxed\n />\n )\n ) : (\n (() => {\n const previewUrl = inlinePreviews[entry.path]\n if (previewUrl && isImageFileName(entry.name)) {\n return (\n <img\n src={previewUrl}\n alt={entry.name}\n loading=\"lazy\"\n decoding=\"async\"\n style={{\n width: 20,\n height: 20,\n objectFit: 'cover',\n borderRadius: 4,\n border: `1px solid ${theme.border}`,\n }}\n />\n )\n }\n return getFileIcon(entry.name)\n })()\n )}\n {entryLabel}\n </div>\n {isMobile && (\n <div\n style={{\n fontSize: 11,\n color: theme.textSecondary,\n fontWeight: 400,\n }}\n >\n {entry.type === 'file'\n ? `${\n entry.lastModified ? formatDate(entry.lastModified) : '--'\n } | ${formatBytes(entry.size || 0)}`\n : 'Folder'}\n </div>\n )}\n </div>\n\n {!isMobile && (\n <div style={{ color: theme.textSecondary }}>\n {entry.type === 'file' && entry.lastModified\n ? formatDate(entry.lastModified)\n : '--'}\n </div>\n )}\n\n {!isMobile && (\n <div\n style={{\n color: theme.textSecondary,\n fontFamily: 'monospace',\n }}\n >\n {entry.type === 'file' ? formatBytes(entry.size || 0) : '--'}\n </div>\n )}\n\n <div />\n </div>\n )\n }\n\n return (\n <ContextMenu.Root\n key={entry.path}\n onOpenChange={(open) => {\n if (open) {\n if (isTrashFolder) return\n if (!selected.has(entry.path)) {\n setSelected(new Set([entry.path]))\n selectionAnchorRef.current = entry.path\n setLastSelected(null)\n setIsSelectionMode(true)\n }\n }\n }}\n >\n <ContextMenu.Trigger\n data-entry-path={entry.path}\n data-entry-selectable={isTrashFolder ? 'false' : 'true'}\n {...(fileManagerStyles.row ? { className: fileManagerStyles.row } : {})}\n style={{\n gridTemplateColumns: isMobile ? '1fr 48px' : '1fr 120px 100px 48px',\n padding: isMobile ? '12px 16px' : '12px 24px',\n backgroundColor: isSelected\n ? theme.selected\n : isHovered\n ? theme.hover\n : theme.bg,\n outline: 'none',\n }}\n onClick={(e) => {\n if (e.button !== 0) return\n handleEntryClickWithSelection(entry, index, filteredEntries, e)\n }}\n onDoubleClick={() => openEntry(entry)}\n onContextMenu={(e) => {\n if (isTrashFolder) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n e.stopPropagation()\n }}\n onMouseEnter={() => setHoverRow(entry.path)}\n onMouseLeave={() => setHoverRow(null)}\n onTouchStart={() => {\n if (!isMobile) return\n if (longPressTimerRef.current)\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = window.setTimeout(() => {\n handleLongPressSelect(entry)\n }, 350)\n }}\n onTouchMove={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n onTouchEnd={() => {\n if (longPressTimerRef.current) {\n window.clearTimeout(longPressTimerRef.current)\n longPressTimerRef.current = null\n }\n }}\n >\n {/* Name */}\n <div\n style={{\n display: 'flex',\n alignItems: isMobile ? 'flex-start' : 'center',\n gap: 12,\n fontWeight: 500,\n flexDirection: isMobile ? 'column' : 'row',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n }}\n >\n {entry.type === 'folder' ? (\n isTrashFolder ? (\n <UiIcon\n icon={Trash}\n size={20}\n weight=\"fill\"\n color={theme.text}\n boxed\n />\n ) : (\n <UiIcon\n icon={Folder}\n size={20}\n weight=\"fill\"\n color={theme.text}\n boxed\n />\n )\n ) : (\n (() => {\n const previewUrl = inlinePreviews[entry.path]\n if (previewUrl && isImageFileName(entry.name)) {\n return (\n <img\n src={previewUrl}\n alt={entry.name}\n loading=\"lazy\"\n decoding=\"async\"\n style={{\n width: 20,\n height: 20,\n objectFit: 'cover',\n borderRadius: 4,\n border: `1px solid ${theme.border}`,\n }}\n />\n )\n }\n return getFileIcon(entry.name)\n })()\n )}\n {entryLabel}\n </div>\n {isMobile && (\n <div\n style={{\n fontSize: 11,\n color: theme.textSecondary,\n fontWeight: 400,\n }}\n >\n {entry.type === 'file'\n ? `${\n entry.lastModified ? formatDate(entry.lastModified) : '--'\n } | ${formatBytes(entry.size || 0)}`\n : 'Folder'}\n </div>\n )}\n </div>\n\n {/* Date */}\n {!isMobile && (\n <div style={{ color: theme.textSecondary }}>\n {entry.type === 'file' && entry.lastModified\n ? formatDate(entry.lastModified)\n : '--'}\n </div>\n )}\n\n {/* Size */}\n {!isMobile && (\n <div\n style={{\n color: theme.textSecondary,\n fontFamily: 'monospace',\n }}\n >\n {entry.type === 'file' ? formatBytes(entry.size || 0) : '--'}\n </div>\n )}\n\n {/* Action Menu */}\n <div\n onClick={(e) => {\n e.stopPropagation()\n e.preventDefault()\n }}\n >\n <Menu.Root>\n <Menu.Trigger\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 4,\n display: 'flex',\n opacity: isMobile ? 1 : isHovered ? 1 : 0,\n transition: 'opacity 0.2s',\n outline: 'none',\n }}\n >\n <UiIcon icon={DotsThree} size={24} color={theme.textSecondary} />\n </Menu.Trigger>\n <Menu.Portal container={portalContainer}>\n <Menu.Positioner\n side=\"bottom\"\n align=\"end\"\n sideOffset={5}\n style={{ zIndex: 10000 }}\n >\n <Menu.Popup\n style={{\n zIndex: 10000,\n backgroundColor: theme.bg,\n border: `1px solid ${theme.border}`,\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n padding: 4,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 160,\n outline: 'none',\n }}\n >\n {!isMultiSelected && can.rename && (\n <Menu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => {\n setRenameName(entry.name || '')\n setRenameTarget(entry)\n setRenameOpen(true)\n }}\n >\n <UiIcon icon={PencilSimple} size={16} /> Rename\n </Menu.Item>\n )}\n {actionEntries.some((item) => item.type === 'file') && (\n <Menu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkDownload(actionEntries)}\n >\n <UiIcon icon={DownloadSimple} size={16} /> Download\n </Menu.Item>\n )}\n {isMultiSelected && view === 'files' && can.move && (\n <Menu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkMove(actionEntries)}\n >\n <UiIcon icon={ArrowRight} size={16} /> Move\n </Menu.Item>\n )}\n {view === 'files' && can.copy && (\n <Menu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkCopy(actionEntries)}\n >\n <UiIcon icon={Copy} size={16} /> Copy\n </Menu.Item>\n )}\n {isMultiSelected && view === 'trash' && can.restore && (\n <Menu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => restoreEntries(actionEntries)}\n >\n <UiIcon icon={ArrowCounterClockwise} size={16} /> Restore\n </Menu.Item>\n )}\n {can.delete && (\n <Menu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.danger,\n outline: 'none',\n }}\n onClick={() => {\n setSelected(new Set(actionEntries.map((item) => item.path)))\n setLastSelected(null)\n setIsSelectionMode(true)\n setDeleteOpen(true)\n }}\n >\n <UiIcon icon={Trash} size={16} /> Delete\n </Menu.Item>\n )}\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n </div>\n </ContextMenu.Trigger>\n\n <ContextMenu.Portal container={portalContainer}>\n <ContextMenu.Positioner style={{ zIndex: 10000 }}>\n <ContextMenu.Popup\n style={{\n zIndex: 10000,\n backgroundColor: theme.bg,\n border: `1px solid ${theme.border}`,\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n padding: 4,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 160,\n outline: 'none',\n }}\n >\n {!isMultiSelected && can.rename && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => {\n setRenameName(entry.name || '')\n setRenameTarget(entry)\n setRenameOpen(true)\n }}\n >\n <UiIcon icon={PencilSimple} size={16} /> Rename\n </ContextMenu.Item>\n )}\n {actionEntries.some((item) => item.type === 'file') && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkDownload(actionEntries)}\n >\n <UiIcon icon={DownloadSimple} size={16} /> Download\n </ContextMenu.Item>\n )}\n {isMultiSelected && view === 'files' && can.move && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkMove(actionEntries)}\n >\n <UiIcon icon={ArrowRight} size={16} /> Move\n </ContextMenu.Item>\n )}\n {view === 'files' && can.copy && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => bulkCopy(actionEntries)}\n >\n <UiIcon icon={Copy} size={16} /> Copy\n </ContextMenu.Item>\n )}\n {isMultiSelected && view === 'trash' && can.restore && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.text,\n outline: 'none',\n }}\n onClick={() => restoreEntries(actionEntries)}\n >\n <UiIcon icon={ArrowCounterClockwise} size={16} /> Restore\n </ContextMenu.Item>\n )}\n {can.delete && (\n <ContextMenu.Item\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 12px',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n fontSize: 13,\n textAlign: 'left',\n color: theme.danger,\n outline: 'none',\n }}\n onClick={() => {\n setSelected(new Set(actionEntries.map((item) => item.path)))\n setLastSelected(null)\n setIsSelectionMode(true)\n setDeleteOpen(true)\n }}\n >\n <UiIcon icon={Trash} size={16} /> Delete\n </ContextMenu.Item>\n )}\n </ContextMenu.Popup>\n </ContextMenu.Positioner>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n )\n })\n })()\n )}\n\n {/* Load More Button */}\n {(() => {\n const isSearching = searchQuery.trim()\n const hasMoreItems = isSearching ? searchHasMore : hasMore\n\n if (loadingMore) {\n return (\n <div\n style={{\n padding: '20px 24px',\n textAlign: 'center',\n borderTop: `1px solid ${theme.border}`,\n color: theme.textSecondary,\n fontSize: 13,\n }}\n >\n Loading more...\n </div>\n )\n }\n\n if (hasMoreItems && currentEntries.length > 0) {\n return (\n <div\n style={{\n padding: '20px 24px',\n textAlign: 'center',\n borderTop: `1px solid ${theme.border}`,\n }}\n >\n <Button\n onClick={() => {\n if (isSearching) {\n performSearch(searchQuery, true)\n } else {\n refresh(true)\n }\n }}\n disabled={loadingMore}\n style={{\n minWidth: 120,\n opacity: loadingMore ? 0.6 : 1,\n }}\n theme={theme}\n >\n Load More\n </Button>\n </div>\n )\n }\n return null\n })()}\n\n {/* Empty States */}\n {(() => {\n if (currentEntries.length === 0 && !loading && !searching) {\n return (\n <div\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.textSecondary,\n }}\n >\n {searchQuery.trim() ? (\n `No results found for \"${searchQuery}\"`\n ) : view === 'trash' ? (\n 'Trash is empty'\n ) : (\n <div>\n <div style={{ marginBottom: 16 }}>No files found</div>\n {can.upload && view === 'files' && (\n <div\n style={{\n fontSize: 12,\n opacity: 0.7,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n }}\n >\n <UiIcon icon={UploadSimple} size={16} />\n Drag and drop files here or click Upload\n </div>\n )}\n </div>\n )}\n </div>\n )\n }\n return null\n })()}\n </div>\n </div>\n\n {/* Right Details Sidebar */}\n {showSidebarOnLayout && previewDisplay && (\n <Dialog.Root\n open={!!previewDisplay}\n onOpenChange={(open) => {\n if (!open) {\n setSelected(new Set())\n setLastSelected(null)\n }\n }}\n >\n <Dialog.Portal container={previewPortalContainer}>\n <Dialog.Backdrop\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(0,0,0,0.04)',\n zIndex: 9,\n pointerEvents: 'auto',\n }}\n />\n <Dialog.Popup\n {...(fileManagerStyles.sidebarRight\n ? { className: fileManagerStyles.sidebarRight }\n : {})}\n style={{\n backgroundColor: theme.bg,\n borderLeft: isSidebarVisible ? `1px solid ${theme.border}` : 'none',\n animation: isPreviewClosing\n ? 'tokoPreviewSlideOut 200ms ease-in'\n : 'tokoPreviewSlideIn 200ms ease-out',\n opacity: isSidebarVisible ? 1 : 0,\n pointerEvents: isPreviewClosing ? 'none' : isSidebarVisible ? 'auto' : 'none',\n width: sidebarWidth,\n ...(isSidebarVisible\n ? {\n boxShadow: '0 0 0 1px rgba(0,0,0,0.03), -8px 0 24px rgba(0,0,0,0.08)',\n }\n : {}),\n }}\n >\n {isSidebarVisible && (\n <div\n onMouseDown={(e) => {\n e.preventDefault()\n setIsResizing(true)\n updateSidebarWidth(e.clientX)\n }}\n onTouchStart={(e) => {\n const touch = e.touches[0]\n if (!touch) return\n setIsResizing(true)\n updateSidebarWidth(touch.clientX)\n }}\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: 8,\n cursor: 'col-resize',\n zIndex: 2,\n background: isResizing ? 'rgba(0,0,0,0.06)' : 'transparent',\n }}\n aria-hidden\n >\n <div\n style={{\n position: 'absolute',\n left: 3,\n top: 0,\n bottom: 0,\n width: 2,\n backgroundColor: isResizing ? theme.textSecondary : theme.border,\n opacity: 0.4,\n }}\n />\n </div>\n )}\n <Dialog.Close\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 3,\n background: theme.bg,\n border: `1px solid ${theme.border}`,\n borderRadius: 4,\n padding: 4,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: theme.textSecondary,\n }}\n aria-label=\"Close preview\"\n title=\"Close preview\"\n >\n <UiIcon icon={X} size={16} />\n </Dialog.Close>\n <div className={fileManagerStyles.previewBox}>\n {['jpg', 'png', 'gif', 'jpeg', 'webp'].some((ext) =>\n previewDisplay.entry.path.toLowerCase().endsWith(ext),\n ) ? (\n <img\n src={previewDisplay.url}\n alt=\"preview\"\n style={{\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n }}\n />\n ) : (\n <UiIcon icon={FileText} size={64} weight=\"thin\" color={theme.textSecondary} />\n )}\n </div>\n\n <div className={fileManagerStyles.metadata} style={{ color: theme.text }}>\n <h3\n style={{\n margin: '0 0 20px',\n fontSize: 16,\n fontWeight: 600,\n color: theme.text,\n }}\n >\n {previewDisplay.entry.name}\n </h3>\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: 20,\n }}\n >\n <div className={fileManagerStyles.metaItem}>\n <div className={fileManagerStyles.metaLabel}>Type</div>\n <div className={fileManagerStyles.metaValue}>\n {previewDisplay.entry.name.split('.').pop()?.toUpperCase() || 'FILE'}\n </div>\n </div>\n <div className={fileManagerStyles.metaItem}>\n <div className={fileManagerStyles.metaLabel}>Size</div>\n <div className={fileManagerStyles.metaValue}>\n {previewDisplay.entry.type === 'file'\n ? formatBytes(previewDisplay.entry.size || 0)\n : '0 B'}\n </div>\n </div>\n </div>\n\n <div className={fileManagerStyles.metaItem}>\n <div className={fileManagerStyles.metaLabel}>Location</div>\n <div className={fileManagerStyles.metaValue}>\n {getParentPath(previewDisplay.entry.path) || '/'}\n </div>\n </div>\n\n <div className={fileManagerStyles.metaItem}>\n <div className={fileManagerStyles.metaLabel}>Modified</div>\n <div className={fileManagerStyles.metaValue}>\n {previewDisplay.entry.type === 'file' && previewDisplay.entry.lastModified\n ? new Date(previewDisplay.entry.lastModified).toLocaleString()\n : '--'}\n </div>\n </div>\n\n <div\n style={{\n marginTop: 20,\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n }}\n >\n {view === 'files' ? (\n <>\n <Button\n style={{ width: '100%', justifyContent: 'center' }}\n theme={theme}\n onClick={async () => {\n try {\n const out = await client.getPreviewUrl({\n path: previewDisplay.entry.path,\n inline: false,\n })\n const link = document.createElement('a')\n link.href = out.url\n link.download = previewDisplay.entry.name\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n } catch (e) {\n console.error(e)\n }\n }}\n >\n <UiIcon icon={DownloadSimple} size={16} /> Download\n </Button>\n {can.delete && (\n <Button\n variant=\"danger\"\n onClick={() => {\n setSelected(new Set([previewDisplay.entry.path]))\n setLastSelected(previewDisplay.entry)\n setDeleteOpen(true)\n }}\n style={{ width: '100%', justifyContent: 'center' }}\n theme={theme}\n >\n <UiIcon icon={Trash} size={16} /> Delete\n </Button>\n )}\n </>\n ) : (\n <Button\n onClick={onRestore}\n style={{ width: '100%', justifyContent: 'center' }}\n theme={theme}\n >\n <UiIcon icon={ArrowCounterClockwise} size={16} /> Restore\n </Button>\n )}\n </div>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )}\n\n {/* Create Folder Modal */}\n <Modal\n open={createFolderOpen}\n onClose={() => setCreateFolderOpen(false)}\n title=\"New Folder\"\n theme={theme}\n {...(portalContainer ? { portalContainer } : {})}\n >\n <input\n type=\"text\"\n placeholder=\"Name\"\n value={newFolderName}\n onChange={(e) => setNewFolderName(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && onCreateFolder()}\n style={{\n width: '100%',\n padding: '10px',\n fontSize: 14,\n border: `1px solid ${theme.border}`,\n outline: 'none',\n backgroundColor: theme.bg,\n color: theme.text,\n }}\n autoFocus\n />\n <div\n style={{\n marginTop: 20,\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 10,\n }}\n >\n <Button onClick={() => setCreateFolderOpen(false)} theme={theme}>\n Cancel\n </Button>\n <Button variant=\"primary\" onClick={onCreateFolder} theme={theme}>\n Create Folder\n </Button>\n </div>\n </Modal>\n\n {/* Rename Modal */}\n <Modal\n open={renameOpen}\n onClose={() => {\n if (isRenaming) return\n setRenameOpen(false)\n setRenameTarget(null)\n }}\n title=\"Rename\"\n theme={theme}\n {...(portalContainer ? { portalContainer } : {})}\n closeDisabled={isRenaming}\n >\n <input\n type=\"text\"\n placeholder=\"Name\"\n value={renameName}\n onChange={(e) => setRenameName(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && onRename()}\n style={{\n width: '100%',\n padding: '10px',\n fontSize: 14,\n border: `1px solid ${theme.border}`,\n outline: 'none',\n backgroundColor: theme.bg,\n color: theme.text,\n }}\n disabled={isRenaming}\n autoFocus\n />\n <div\n style={{\n marginTop: 20,\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 10,\n }}\n >\n <Button onClick={() => setRenameOpen(false)} theme={theme} disabled={isRenaming}>\n Cancel\n </Button>\n <Button variant=\"primary\" onClick={onRename} theme={theme} disabled={isRenaming}>\n {isRenaming ? (\n <>\n <span className={fileManagerStyles.spinner} />\n Renaming...\n </>\n ) : (\n 'Rename'\n )}\n </Button>\n </div>\n </Modal>\n\n {/* Delete Modal */}\n <Modal\n open={deleteOpen}\n onClose={() => setDeleteOpen(false)}\n title={view === 'trash' ? 'Delete Forever' : 'Delete items'}\n theme={theme}\n {...(portalContainer ? { portalContainer } : {})}\n closeDisabled={isDeleting}\n >\n <p style={{ margin: '0 0 20px', color: theme.textSecondary }}>\n Are you sure you want to {view === 'trash' ? 'permanently' : ''} delete {selected.size}{' '}\n item{selected.size > 1 ? 's' : ''}?{view === 'files' && ' (Items will be moved to Trash)'}\n </p>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 10 }}>\n <Button onClick={() => setDeleteOpen(false)} theme={theme} disabled={isDeleting}>\n Cancel\n </Button>\n <Button variant=\"danger\" onClick={onDelete} theme={theme} disabled={isDeleting}>\n {isDeleting ? (\n <>\n <span className={fileManagerStyles.spinner} />\n Deleting...\n </>\n ) : (\n 'Delete'\n )}\n </Button>\n </div>\n </Modal>\n\n {/* Empty Trash Modal */}\n <Modal\n open={emptyTrashOpen}\n onClose={() => setEmptyTrashOpen(false)}\n title=\"Empty Trash\"\n theme={theme}\n {...(portalContainer ? { portalContainer } : {})}\n closeDisabled={isEmptyingTrash}\n >\n <p style={{ margin: '0 0 20px', color: theme.textSecondary }}>\n Are you sure you want to empty the trash? All items will be permanently deleted.\n </p>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 10 }}>\n <Button onClick={() => setEmptyTrashOpen(false)} theme={theme} disabled={isEmptyingTrash}>\n Cancel\n </Button>\n <Button variant=\"danger\" onClick={onEmptyTrash} theme={theme} disabled={isEmptyingTrash}>\n {isEmptyingTrash ? (\n <>\n <span className={fileManagerStyles.spinner} />\n Emptying...\n </>\n ) : (\n 'Empty Trash'\n )}\n </Button>\n </div>\n </Modal>\n\n {/* Drag and Drop Overlay */}\n {isDragOver && view === 'files' && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor:\n theme.bg === '#ffffff' ? 'rgba(0, 0, 0, 0.05)' : 'rgba(255, 255, 255, 0.05)',\n backdropFilter: 'blur(2px)',\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `2px dashed ${theme.accent}`,\n margin: 4,\n animation: 'fadeIn 0.2s ease-in-out',\n }}\n >\n <div\n style={{\n textAlign: 'center',\n padding: 40,\n backgroundColor: theme.bg,\n border: `1px solid ${theme.border}`,\n color: theme.text,\n fontSize: 16,\n fontWeight: 500,\n transform: 'scale(1.02)',\n transition: 'transform 0.2s ease',\n }}\n >\n <UiIcon icon={UploadSimple} size={48} boxStyle={{ marginBottom: 16, opacity: 0.7 }} />\n <div>Drop files here to upload</div>\n <div style={{ fontSize: 13, color: theme.textSecondary, marginTop: 8 }}>\n Files will be uploaded to {path || 'root directory'}\n </div>\n </div>\n </div>\n )}\n\n {/* Upload Status Floating Card */}\n {uploadCardOpen &&\n (() => {\n const totalItems = uploadItems.length\n const activeItems = uploadItems.filter((item) => item.status === 'uploading')\n const completedItems = uploadItems.filter((item) => item.status === 'done')\n const failedItems = uploadItems.filter((item) => item.status === 'error')\n const totalBytes = uploadItems.reduce((acc, item) => acc + (item.total || 0), 0)\n const loadedBytes = uploadItems.reduce((acc, item) => acc + (item.loaded || 0), 0)\n const totalPct = totalBytes > 0 ? Math.round((loadedBytes / totalBytes) * 100) : 0\n const hasActiveUploads = activeItems.length > 0\n\n return (\n <div\n style={{\n position: 'absolute',\n right: 16,\n bottom: 16,\n width: 340,\n maxWidth: 'calc(100% - 32px)',\n backgroundColor: theme.bg,\n border: `1px solid ${theme.border}`,\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n padding: 14,\n zIndex: 1200,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 10,\n }}\n >\n <div style={{ fontSize: 12, fontWeight: 600 }}>\n {hasActiveUploads\n ? `Uploading ${completedItems.length}/${totalItems}`\n : 'Uploads complete'}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <div style={{ fontSize: 12, color: theme.textSecondary }}>\n {totalItems} file{totalItems !== 1 ? 's' : ''} • {totalPct}%\n </div>\n <button\n type=\"button\"\n onClick={() => setUploadCardOpen(false)}\n disabled={hasActiveUploads}\n style={{\n background: 'none',\n border: 'none',\n cursor: hasActiveUploads ? 'not-allowed' : 'pointer',\n padding: 2,\n display: 'flex',\n alignItems: 'center',\n color: theme.textSecondary,\n opacity: hasActiveUploads ? 0.5 : 1,\n }}\n title={hasActiveUploads ? 'Uploads in progress' : 'Close'}\n >\n <UiIcon icon={X} size={14} />\n </button>\n </div>\n </div>\n {totalItems > 1 && (\n <div\n style={{\n height: 6,\n backgroundColor: theme.bgSecondary,\n borderRadius: 999,\n overflow: 'hidden',\n marginBottom: 10,\n }}\n >\n <div\n style={{\n height: '100%',\n width: `${totalPct}%`,\n backgroundColor: theme.accent,\n transition: 'width 120ms linear',\n }}\n />\n </div>\n )}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n maxHeight: 220,\n overflow: 'auto',\n }}\n >\n {uploadItems.map((item) => {\n const pct = item.total ? Math.round((item.loaded / item.total) * 100) : 0\n const statusColor =\n item.status === 'error'\n ? theme.danger\n : item.status === 'done'\n ? theme.text\n : theme.textSecondary\n return (\n <div\n key={item.path}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n gap: 10,\n }}\n >\n <div\n style={{\n flex: 1,\n fontSize: 12,\n color: theme.textSecondary,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {item.name}\n </div>\n <div style={{ fontSize: 11, color: theme.textSecondary }}>\n {formatBytes(item.loaded)}\n {item.total ? ` / ${formatBytes(item.total)}` : ''}\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n justifyContent: 'flex-end',\n minWidth: 90,\n }}\n >\n <div\n style={{\n fontSize: 12,\n color: statusColor,\n minWidth: 42,\n textAlign: 'right',\n }}\n >\n {item.status === 'error' ? 'Error' : `${pct}%`}\n </div>\n {item.status === 'error' && item.file && (\n <button\n type=\"button\"\n onClick={() => retryUpload(item)}\n style={{\n background: theme.bg,\n border: `1px solid ${theme.border}`,\n color: theme.text,\n fontSize: 11,\n padding: '4px 8px',\n cursor: 'pointer',\n }}\n >\n Retry\n </button>\n )}\n </div>\n </div>\n <div\n style={{\n width: '100%',\n height: 6,\n backgroundColor: theme.bgSecondary,\n borderRadius: 999,\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n height: '100%',\n width: `${item.status === 'error' ? 100 : pct}%`,\n backgroundColor: item.status === 'error' ? theme.danger : theme.accent,\n transition: 'width 120ms linear',\n }}\n />\n </div>\n {item.status === 'error' && item.error && (\n <div style={{ fontSize: 11, color: theme.danger }}>{item.error}</div>\n )}\n </div>\n )\n })}\n {failedItems.length > 0 && (\n <div style={{ fontSize: 11, color: theme.danger }}>\n {failedItems.length} upload\n {failedItems.length !== 1 ? 's' : ''} failed\n </div>\n )}\n </div>\n </div>\n )\n })()}\n\n {/* Drag Overlay for Trash (Not Allowed) */}\n {isDragOver && view === 'trash' && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor:\n theme.bg === '#ffffff' ? 'rgba(220, 38, 38, 0.1)' : 'rgba(239, 68, 68, 0.1)',\n backdropFilter: 'blur(2px)',\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `2px dashed ${theme.danger}`,\n margin: 4,\n }}\n >\n <div\n style={{\n textAlign: 'center',\n padding: 40,\n backgroundColor: theme.bg,\n border: `1px solid ${theme.border}`,\n color: theme.danger,\n fontSize: 16,\n fontWeight: 500,\n }}\n >\n <UiIcon icon={Warning} size={48} boxStyle={{ marginBottom: 16, opacity: 0.7 }} />\n <div>Cannot upload to trash</div>\n <div style={{ fontSize: 13, color: theme.textSecondary, marginTop: 8 }}>\n Switch to files view to upload\n </div>\n </div>\n </div>\n )}\n <div ref={previewPortalRef} className={fileManagerStyles.previewPortal} />\n </div>\n )\n}\n","import type {\n S3CopyOptions,\n S3CreateFolderOptions,\n S3DeleteFilesOptions,\n S3DeleteFolderOptions,\n S3GetPreviewUrlOptions,\n S3ListOptions,\n S3MoveOptions,\n S3PrepareUploadsOptions,\n S3PreparedUpload,\n S3SearchOptions,\n} from '../core/types'\n\nimport type {\n S3FileManagerClientHooks,\n S3FileManagerClientOptions,\n S3FileManagerClientListResult,\n S3FileManagerClientSearchResult,\n S3FileManagerClientPreviewResult,\n} from './types'\n\nfunction normalizeBasePath(basePath?: string): string {\n if (!basePath) return ''\n if (basePath === '/') return ''\n return basePath.startsWith('/')\n ? basePath.replace(/\\/+$/, '')\n : `/${basePath.replace(/\\/+$/, '')}`\n}\n\nfunction normalizeApiRootFromParts(baseUrl: string, basePath?: string): string {\n const b = baseUrl.replace(/\\/+$/, '')\n const p = normalizeBasePath(basePath)\n return p ? `${b}${p}` : b\n}\n\nasync function fetchJson<T>(f: typeof fetch, url: string, body: unknown): Promise<T> {\n const res = await f(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new Error(text || `Request failed: ${res.status}`)\n }\n\n if (res.status === 204) return undefined as T\n return (await res.json()) as T\n}\n\nfunction uploadWithXhr(\n upload: S3PreparedUpload,\n file: File,\n hooks?: S3FileManagerClientHooks,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open(upload.method, upload.url)\n\n for (const [k, v] of Object.entries(upload.headers ?? {})) {\n xhr.setRequestHeader(k, v)\n }\n\n xhr.upload.onprogress = (evt) => {\n hooks?.onUploadProgress?.({\n path: upload.path,\n loaded: evt.loaded,\n total: evt.total,\n })\n }\n\n xhr.onload = async () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n await hooks?.onUploadComplete?.({ path: upload.path })\n resolve()\n return\n }\n\n const responseText = xhr.responseText ? ` - ${xhr.responseText.slice(0, 200)}` : ''\n const error = new Error(`Upload failed: ${xhr.status}${responseText}`)\n await hooks?.onUploadError?.({ path: upload.path, error })\n reject(error)\n }\n\n xhr.onerror = async () => {\n const error = new Error('Upload failed: network error')\n await hooks?.onUploadError?.({ path: upload.path, error })\n reject(error)\n }\n\n xhr.send(file)\n })\n}\n\nexport class S3FileManagerClient {\n private readonly apiRoot: string\n private readonly f: typeof fetch\n\n constructor(options: S3FileManagerClientOptions) {\n this.apiRoot =\n 'apiUrl' in options\n ? options.apiUrl.replace(/\\/+$/, '')\n : normalizeApiRootFromParts(options.baseUrl, options.basePath)\n this.f = options.fetch ?? fetch\n }\n\n private endpoint(path: string): string {\n const p = path.startsWith('/') ? path : `/${path}`\n return `${this.apiRoot}${p}`\n }\n\n list(options: S3ListOptions): Promise<S3FileManagerClientListResult> {\n return fetchJson(this.f, this.endpoint('/list'), options)\n }\n\n search(options: S3SearchOptions): Promise<S3FileManagerClientSearchResult> {\n return fetchJson(this.f, this.endpoint('/search'), options)\n }\n\n createFolder(options: S3CreateFolderOptions): Promise<void> {\n return fetchJson(this.f, this.endpoint('/folder/create'), options)\n }\n\n deleteFolder(options: S3DeleteFolderOptions): Promise<void> {\n return fetchJson(this.f, this.endpoint('/folder/delete'), options)\n }\n\n deleteFiles(options: S3DeleteFilesOptions): Promise<void> {\n return fetchJson(this.f, this.endpoint('/files/delete'), options)\n }\n\n copy(options: S3CopyOptions): Promise<void> {\n return fetchJson(this.f, this.endpoint('/files/copy'), options)\n }\n\n move(options: S3MoveOptions): Promise<void> {\n return fetchJson(this.f, this.endpoint('/files/move'), options)\n }\n\n prepareUploads(options: S3PrepareUploadsOptions): Promise<S3PreparedUpload[]> {\n return fetchJson(this.f, this.endpoint('/upload/prepare'), options)\n }\n\n getPreviewUrl(options: S3GetPreviewUrlOptions): Promise<S3FileManagerClientPreviewResult> {\n return fetchJson(this.f, this.endpoint('/preview'), options)\n }\n\n async uploadFiles(args: {\n files: Array<{ file: File; path: string; contentType?: string }>\n expiresInSeconds?: number\n hooks?: S3FileManagerClientHooks\n parallel?: number\n }): Promise<void> {\n const prepare: S3PrepareUploadsOptions = {\n items: args.files.map((f) => ({\n path: f.path,\n contentType: f.contentType ?? f.file.type,\n })),\n ...(args.expiresInSeconds !== undefined ? { expiresInSeconds: args.expiresInSeconds } : {}),\n }\n\n const uploads = await this.prepareUploads(prepare)\n\n const byPath = new Map(uploads.map((u) => [u.path, u] as const))\n\n const tasks = args.files.map(({ file, path }) => {\n const upload = byPath.get(path)\n if (!upload) throw new Error(`Missing presigned upload for: ${path}`)\n return () => uploadWithXhr(upload, file, args.hooks)\n })\n\n const parallel = Math.max(1, args.parallel ?? 4)\n let i = 0\n\n const runWorker = async () => {\n while (true) {\n const idx = i++\n if (idx >= tasks.length) return\n await tasks[idx]!()\n }\n }\n\n await Promise.all(Array.from({ length: Math.min(parallel, tasks.length) }, runWorker))\n }\n}\n",".root {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(0, 1fr);\n height: 100%;\n font-family:\n 'Geist',\n 'Inter',\n -apple-system,\n sans-serif;\n font-size: 13px;\n color: var(--s3kit-text);\n background-color: var(--s3kit-bg);\n border: 1px solid var(--s3kit-border);\n overflow: hidden;\n position: relative;\n}\n\n.main {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n height: 100%;\n background-color: var(--s3kit-bg);\n transition: all 0.2s ease;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid var(--s3kit-border);\n flex-direction: row;\n flex-wrap: nowrap;\n}\n\n.navTabs {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 16px;\n}\n\n.navTab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.15s;\n border: none;\n background: none;\n}\n\n.tableHeader {\n display: grid;\n border-bottom: 1px solid var(--s3kit-border);\n background-color: var(--s3kit-bg);\n font-size: 12px;\n font-weight: 600;\n color: var(--s3kit-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n position: sticky;\n top: 0;\n z-index: 5;\n}\n\n.row {\n display: grid;\n align-items: center;\n border-bottom: 1px solid var(--s3kit-border);\n cursor: pointer;\n}\n\n.sidebarRight {\n background-color: var(--s3kit-bg);\n padding: 0;\n display: flex;\n flex-direction: column;\n will-change: transform, opacity;\n overflow: hidden;\n overflow-y: auto;\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 10;\n}\n\n.previewPortal {\n position: absolute;\n inset: 0;\n z-index: 9;\n pointer-events: none;\n}\n\n.previewBox {\n width: 100%;\n aspect-ratio: 1 / 1;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--s3kit-bg-secondary);\n border-bottom: 1px solid var(--s3kit-border);\n padding: 20px;\n}\n\n.metadata {\n padding: 24px;\n}\n\n.metaItem {\n margin-bottom: 16px;\n}\n\n.metaLabel {\n font-size: 11px;\n color: var(--s3kit-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 4px;\n}\n\n.metaValue {\n font-size: 13px;\n color: var(--s3kit-text);\n word-break: break-all;\n}\n\n@keyframes tokoPreviewSlideIn {\n from {\n opacity: 0;\n transform: translateX(12px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes tokoPreviewSlideOut {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(12px);\n }\n}\n\n.spinner {\n width: 12px;\n height: 12px;\n border: 2px solid var(--s3kit-text-secondary);\n border-top-color: var(--s3kit-accent, var(--s3kit-text));\n border-radius: 50%;\n animation: tokoSpin 0.8s linear infinite;\n display: inline-block;\n}\n\n@keyframes tokoSpin {\n to {\n transform: rotate(360deg);\n }\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport { Button as BaseButton } from '@base-ui/react'\nimport type { FileManagerTheme } from '../theme/fileManagerTheme'\n\nexport function Button({\n children,\n variant = 'secondary',\n onClick,\n style,\n theme,\n disabled = false,\n}: {\n children: ReactNode\n variant?: 'primary' | 'secondary' | 'danger'\n onClick?: () => void\n style?: CSSProperties\n theme: FileManagerTheme\n disabled?: boolean\n}) {\n const baseStyle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 16px',\n border: '1px solid transparent',\n cursor: disabled ? 'not-allowed' : 'pointer',\n fontSize: 13,\n fontWeight: 500,\n transition: 'all 0.15s',\n opacity: disabled ? 0.6 : 1,\n ...style,\n }\n\n const variants = {\n primary: {\n backgroundColor: theme.accent,\n color: theme.bg,\n borderColor: theme.accent,\n },\n secondary: {\n backgroundColor: theme.bg,\n color: theme.text,\n borderColor: theme.border,\n },\n danger: {\n backgroundColor: theme.bg,\n color: theme.danger,\n borderColor: theme.danger,\n },\n }\n\n return (\n <BaseButton\n type=\"button\"\n style={{ ...baseStyle, ...variants[variant] }}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n >\n {children}\n </BaseButton>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Dialog } from '@base-ui/react'\nimport type { FileManagerTheme } from '../theme/fileManagerTheme'\nimport { UiIcon } from './UiIcon'\nimport { X } from '@phosphor-icons/react'\n\nexport function Modal({\n open,\n onClose,\n title,\n children,\n theme,\n portalContainer,\n closeDisabled = false,\n}: {\n open: boolean\n onClose: () => void\n title: string\n children: ReactNode\n theme: FileManagerTheme\n portalContainer?: HTMLElement\n closeDisabled?: boolean\n}) {\n return (\n <Dialog.Root\n open={open}\n onOpenChange={(open) => {\n if (!open && !closeDisabled) onClose()\n }}\n >\n <Dialog.Portal container={portalContainer}>\n <Dialog.Backdrop\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 100,\n backgroundColor: theme.bg === '#ffffff' ? 'rgba(255,255,255,0.8)' : 'rgba(0,0,0,0.8)',\n backdropFilter: 'blur(2px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n />\n <Dialog.Popup\n style={{\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 101,\n width: '100%',\n maxWidth: 400,\n backgroundColor: theme.bg,\n border: `1px solid ${theme.border}`,\n boxShadow: '0 10px 40px rgba(0,0,0,0.1)',\n outline: 'none',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 20px',\n borderBottom: `1px solid ${theme.border}`,\n }}\n >\n <Dialog.Title\n style={{\n margin: 0,\n fontSize: 13,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: theme.text,\n }}\n >\n {title}\n </Dialog.Title>\n <Dialog.Close\n disabled={closeDisabled}\n style={{\n background: 'none',\n border: 'none',\n cursor: closeDisabled ? 'not-allowed' : 'pointer',\n padding: 4,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.text,\n opacity: closeDisabled ? 0.5 : 1,\n }}\n >\n <UiIcon icon={X} size={18} />\n </Dialog.Close>\n </div>\n <div style={{ padding: 24 }}>{children}</div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import type { ComponentType, CSSProperties } from 'react'\n\nexport type PhosphorIcon = ComponentType<{\n size?: number\n weight?: any\n color?: string\n style?: CSSProperties\n}>\n\nexport function UiIcon(props: {\n icon: PhosphorIcon\n size: number\n weight?: any\n color?: string\n boxed?: boolean\n boxStyle?: CSSProperties\n iconStyle?: CSSProperties\n}) {\n const { icon: Icon, size, weight, color, boxed = false, boxStyle, iconStyle } = props\n const iconProps: {\n size: number\n weight?: any\n color?: string\n style: CSSProperties\n } = {\n size,\n style: { display: 'block', ...iconStyle },\n ...(weight !== undefined ? { weight } : {}),\n ...(color !== undefined ? { color } : {}),\n }\n return (\n <span\n style={{\n width: size,\n height: size,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n lineHeight: 0,\n verticalAlign: 'middle',\n ...(boxed\n ? {\n backgroundColor: 'var(--s3kit-icon-bg, transparent)',\n border: '1px solid var(--s3kit-icon-border, transparent)',\n borderRadius: 'var(--s3kit-icon-radius, 8px)',\n boxSizing: 'border-box',\n }\n : {}),\n ...boxStyle,\n }}\n >\n <Icon {...iconProps} />\n </span>\n )\n}\n","import { Code, File, FileText, FilmStrip, Image, MusicNote } from '@phosphor-icons/react'\nimport { UiIcon } from './UiIcon'\n\nexport function getFileIcon(filename: string, size = 20) {\n const ext = filename.split('.').pop()?.toLowerCase()\n const weight = 'light' as const\n\n if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'].includes(ext || '')) {\n return <UiIcon icon={Image} size={size} weight={weight} boxed />\n }\n if (['mp4', 'webm', 'mov'].includes(ext || '')) {\n return <UiIcon icon={FilmStrip} size={size} weight={weight} boxed />\n }\n if (['mp3', 'wav', 'ogg'].includes(ext || '')) {\n return <UiIcon icon={MusicNote} size={size} weight={weight} boxed />\n }\n if (['js', 'ts', 'jsx', 'tsx', 'json', 'html', 'css'].includes(ext || '')) {\n return <UiIcon icon={Code} size={size} weight={weight} boxed />\n }\n if (['pdf', 'txt', 'md', 'doc', 'docx'].includes(ext || '')) {\n return <UiIcon icon={FileText} size={size} weight={weight} boxed />\n }\n\n return <UiIcon icon={File} size={size} weight={weight} boxed />\n}\n","import { useEffect, useState } from 'react'\n\nexport type FileManagerTheme = {\n bg: string\n bgSecondary: string\n text: string\n textSecondary: string\n border: string\n accent: string\n hover: string\n selected: string\n danger: string\n}\n\nexport const lightTheme: FileManagerTheme = {\n bg: '#ffffff',\n bgSecondary: '#fafafa',\n text: '#111111',\n textSecondary: '#666666',\n border: '#eaeaea',\n accent: '#000000',\n hover: '#f4f4f4',\n selected: '#eeeeee',\n danger: '#d32f2f',\n}\n\nexport const darkTheme: FileManagerTheme = {\n bg: '#0a0a0a',\n bgSecondary: '#1a1a1a',\n text: '#ffffff',\n textSecondary: '#a1a1aa',\n border: '#27272a',\n accent: '#ffffff',\n hover: '#18181b',\n selected: '#27272a',\n danger: '#ef4444',\n}\n\nexport function useTheme(themeMode: 'light' | 'dark' | 'system' = 'light') {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light')\n\n useEffect(() => {\n if (themeMode === 'system') {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n setSystemTheme(mediaQuery.matches ? 'dark' : 'light')\n\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemTheme(e.matches ? 'dark' : 'light')\n }\n\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }\n }, [themeMode])\n\n const activeTheme = themeMode === 'system' ? systemTheme : themeMode\n return activeTheme === 'dark' ? darkTheme : lightTheme\n}\n","export const TRASH_PATH = '.trash'\n","const MIME_EXTENSION_MAP: Record<string, string[]> = {\n 'image/jpeg': ['jpg', 'jpeg'],\n 'image/png': ['png'],\n 'image/gif': ['gif'],\n 'image/webp': ['webp'],\n 'image/svg+xml': ['svg'],\n 'image/heic': ['heic'],\n 'image/heif': ['heif'],\n 'image/avif': ['avif'],\n 'application/pdf': ['pdf'],\n 'text/plain': ['txt'],\n 'text/markdown': ['md'],\n 'text/csv': ['csv'],\n 'application/json': ['json'],\n 'application/zip': ['zip'],\n 'application/x-zip-compressed': ['zip'],\n 'audio/mpeg': ['mp3'],\n 'audio/wav': ['wav'],\n 'audio/ogg': ['ogg'],\n 'video/mp4': ['mp4'],\n 'video/webm': ['webm'],\n 'video/quicktime': ['mov'],\n}\n\nexport function buildAllowedExtensions(\n extensions?: string[],\n mimeTypes?: string[],\n): Set<string> | null {\n const allowed = new Set<string>()\n if (extensions) {\n for (const ext of extensions) {\n const trimmed = ext.replace(/^\\./, '').toLowerCase()\n if (trimmed) allowed.add(trimmed)\n }\n }\n if (mimeTypes) {\n for (const type of mimeTypes) {\n const exts = MIME_EXTENSION_MAP[type.toLowerCase()] ?? []\n for (const ext of exts) allowed.add(ext)\n }\n }\n return allowed.size > 0 ? allowed : null\n}\n\nexport function isImageFileName(filename: string): boolean {\n const ext = filename.split('.').pop()?.toLowerCase()\n return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'].includes(ext || '')\n}\n","export function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]\n}\n\nexport function formatDate(date: string | Date): string {\n const d = new Date(date)\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })\n}\n","function splitName(name: string): { base: string; ext: string } {\n const idx = name.lastIndexOf('.')\n if (idx <= 0) return { base: name, ext: '' }\n return { base: name.slice(0, idx), ext: name.slice(idx) }\n}\n\nexport function buildUniqueName(name: string, existing: Set<string>): string {\n if (!existing.has(name)) return name\n const { base, ext } = splitName(name)\n let i = 1\n while (true) {\n const candidate = `${base}_copy_${i}${ext}`\n if (!existing.has(candidate)) return candidate\n i += 1\n }\n}\n","export function joinPath(folder: string, name: string): string {\n const f = folder.replace(/\\/+$/, '')\n if (!f) return name\n return `${f}/${name}`\n}\n\nexport function normalizeRelativePath(path: string): string {\n return path.replace(/^\\/+/, '').replace(/\\\\/g, '/')\n}\n\nexport function getRelativePathFromFile(file: File): string | null {\n const rel = (file as File & { webkitRelativePath?: string }).webkitRelativePath\n if (!rel) return null\n return normalizeRelativePath(rel)\n}\n\nexport function getParentPath(path: string): string {\n const p = path.replace(/\\/+$/, '')\n const parts = p.split('/').filter(Boolean)\n parts.pop()\n return parts.join('/')\n}\n","import { FileManager } from './FileManager'\nimport type { FileManagerProps } from './types/fileManager'\n\nexport interface FilePickerProps extends Omit<FileManagerProps, 'mode' | 'selection'> {\n selection?: 'single' | 'multiple'\n}\n\nexport function FilePicker({\n selection = 'single',\n allowActions,\n confirmLabel = 'Select',\n ...props\n}: FilePickerProps) {\n return (\n <FileManager\n {...props}\n mode=\"picker\"\n selection={selection}\n confirmLabel={confirmLabel}\n allowActions={{\n upload: true,\n createFolder: true,\n delete: false,\n rename: false,\n move: false,\n copy: false,\n restore: false,\n ...allowActions,\n }}\n />\n )\n}\n"],"mappings":"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","names":["import_react","import_react","BaseButton","import_react","import_jsx_runtime","import_react","import_jsx_runtime","open","import_react","import_jsx_runtime","import_react","import_jsx_runtime","path","entries","import_jsx_runtime"]}