{/* Header */}
{onBack && (
)}
File Manager
{/* Breadcrumb */}
{pathParts.map((part, i) => (
))}
{showNewFolder && (
setNewFolderName(e.target.value)}
onKeyDown={e => {
if (e.key === 'Enter') void handleCreateFolder();
if (e.key === 'Escape') { setShowNewFolder(false); setNewFolderName(''); }
}}
placeholder="New folder name"
className="flex-1 px-2 py-1 text-sm border border-neutral-300 rounded"
autoFocus
/>
)}
{/* Filter + sort bar */}
setFilter(e.target.value)}
placeholder="Filter…"
className="w-full pl-7 pr-6 py-1 text-sm border border-neutral-300 rounded bg-white"
/>
{filter && (
)}
{(['name', 'size', 'date'] as SortKey[]).map(k => (
))}
{/* Selection / clipboard bar */}
{(selCount > 0 || clipboard) && (
{selCount > 0 && (
<>
{selCount} selected
>
)}
{selCount === 0 && clipboard && (
<>
{clipboard.op === 'copy' ? 'Copy' : 'Move'} {clipboard.paths.length} item{clipboard.paths.length !== 1 ? 's' : ''} here?
>
)}
)}
{/* File list */}
{loading && (
Loading…
)}
{!loading && error && (
Failed to load directory
{error}
)}
{!loading && !error && (
<>
{path !== '/' && (
)}
{visible.length > 0 && (
0}
onChange={selectAll}
className="w-4 h-4"
/>
{visible.length} item{visible.length !== 1 ? 's' : ''}{filter ? ' (filtered)' : ''}
)}
{visible.map(entry => (
toggleSelect(entry.path)}
onClick={e => e.stopPropagation()}
className="w-4 h-4 flex-shrink-0"
/>
))}
{visible.length === 0 && entries.length === 0 && (
Empty folder — drop files here to upload
)}
{visible.length === 0 && entries.length > 0 && (
No files match the filter
)}
>
)}
{/* Drag overlay */}
{dragOver && (
)}
{/* Per-entry action menu */}
{/* File viewer overlay */}
{viewEntry && (
{viewEntry.name}
{viewLoading && (
Loading…
)}
{!viewLoading && viewImgUrl && (

)}
{!viewLoading && viewText !== null && (
{viewText}
)}
)}
{/* Mount dialog */}
);
}