e.stopPropagation()}
style={{ ["--accent" as any]: accentColor }}
>
{/* Header */}
{title || "Assets"}
/{scope}/{slug}{activeBucket.path ? `/${activeBucket.path}` : ""}
{/* Bucket tabs (drop targets while dragging) */}
{buckets.map((b) => {
const Icon = b.icon;
const isActive = activeBucketId === b.id;
const isDropTarget = overBucketId === b.id;
return (
);
})}
{/* Bucket helper */}
{activeBucket.description}
{moveBusy && Moving…}
{/* Toolbar — switches to bulk-action mode when items are selected */}
{hasSelection ? (
<>
{otherBuckets.length > 0 && (
Move to:
{otherBuckets.map((b) => (
))}
)}
>
) : (
<>
setSearchQuery(e.target.value)}
placeholder="Search files…"
className="w-full bg-black/40 border border-white/10 text-white text-xs rounded-lg pl-9 pr-3 py-2 outline-none focus:border-white/30"
/>
{ handleFiles(e.target.files); e.target.value = ""; }}
/>
>
)}
{/* Items area */}
{ e.preventDefault(); if (!dragPayloadRef.current) setIsDragOverDropZone(true); }}
onDragOver={(e) => e.preventDefault()}
onDragLeave={() => setIsDragOverDropZone(false)}
onDrop={(e) => {
e.preventDefault();
setIsDragOverDropZone(false);
if (e.dataTransfer.files.length > 0) handleFiles(e.dataTransfer.files);
}}
className={`flex-1 overflow-y-auto px-6 py-4 transition-colors ${
isDragOverDropZone ? "bg-[var(--accent)]/5 border-2 border-dashed border-[var(--accent)]/30" : ""
}`}
>
{uploadProgress && (
{uploadProgress}
)}
{isLoading ? (
Loading…
) : error ? (
{error}
) : filtered.length === 0 ? (
{searchQuery ? <>No files match "{searchQuery}".> : (
No files in {activeBucket.label} yet.
Drop a file here or click Upload. Drag a file from another tab to move it in.
)}
) : viewMode === "grid" ? (
{
if (hasSelection || e.shiftKey || e.metaKey || e.ctrlKey) toggleSelect(item.path, e);
else handlePick(item);
}}
onToggleSelect={(item, e) => toggleSelect(item.path, e)}
onStartRename={(item) => setRenaming({ path: item.path, value: item.name })}
onChangeRename={(value) => setRenaming((r) => r ? { ...r, value } : r)}
onSubmitRename={submitRename}
onCancelRename={() => setRenaming(null)}
onCopy={copyPath}
onDelete={(item) => deleteFiles([item.path])}
onDragStart={onItemDragStart}
hint={(name: string) => bucketHint(activeBucket, name)}
/>
) : (
{
if (hasSelection || e.shiftKey || e.metaKey || e.ctrlKey) toggleSelect(item.path, e);
else handlePick(item);
}}
onToggleSelect={(item, e) => toggleSelect(item.path, e)}
onStartRename={(item) => setRenaming({ path: item.path, value: item.name })}
onChangeRename={(value) => setRenaming((r) => r ? { ...r, value } : r)}
onSubmitRename={submitRename}
onCancelRename={() => setRenaming(null)}
onCopy={copyPath}
onDelete={(item) => deleteFiles([item.path])}
onDragStart={onItemDragStart}
hint={(name: string) => bucketHint(activeBucket, name)}
/>
)}
{/* Footer hint */}
Click open
⇧Click select range
⌘Click add to selection
2× click rename
Drag onto another tab to move