{#snippet row(item: FileItem | FolderItem)} {@const kind = isFile(item) ? 'file' : 'folder'} {@const iconName = kind === 'folder' ? 'folder' : iconNameFromClass(iconClassOf(item))} {@const isFav = favoriteIds?.has(item.id) ?? false} {@const ctx = ctxOf(item.id)} {@const ownerId = ownerIdOf(item)} {@const dateVal = dateOf(item)} {@const sizeVal = sizeOf(item)} {@const mimeVal = mimeOf(item)} {@const draggable = isDraggable?.(item) ?? false} {@const dropTarget = isDropTarget?.(item) ?? false}
onitemdragstart(e, item) : undefined} ondragover={dropTarget && onitemdragover ? (e) => onitemdragover(e, item) : undefined} ondragleave={dropTarget && onitemdragleave ? (e) => onitemdragleave(e, item) : undefined} ondrop={dropTarget && onitemdrop ? (e) => onitemdrop(e, item) : undefined} onclick={onopen || selectable ? (e) => { // Selection-first for shift/meta clicks; only "open" fires on a // plain click when the click wasn't consumed by selection. The // handler runs even without `onopen` so ⌘/Ctrl+Click still // toggles the row on selection-only surfaces (no navigation). if (handleRowClick(e, item.id)) return; if (onopen && !openOnDoubleClick) onopen(item); } : undefined} ondblclick={onopen && openOnDoubleClick ? () => onopen(item) : undefined} onkeydown={onopen ? (e) => e.key === 'Enter' && onopen(item) : undefined} oncontextmenu={onContextMenuOverride ? (e) => onContextMenuOverride(e, item) : contextActions?.length ? (e) => openContext(e, item) : undefined} > {#if selectable} {/if}
{#if enableThumbnails && kind === 'file' && mimeVal && canThumbnailClientSide( { id: item.id, name: item.name, mime_type: mimeVal } )} { const img = e.currentTarget as HTMLImageElement; img.style.display = 'none'; if (mimeVal === 'application/pdf') preloadPdf(); void queueThumbnailGenerate( { id: item.id, name: item.name, mime_type: mimeVal }, (dataUrl) => { img.src = dataUrl; img.style.display = ''; } ); }} /> {/if} {#if rowBadge} {@render rowBadge(item, ctx)} {/if} {item.name}
{#if showOwner}
{#if ownerId} {:else} — {/if}
{/if} {#if showPath}
{item.path ?? ''}
{/if} {#if showType}
{item.category ?? ''}
{/if} {#if showSize}
{sizeVal != null ? formatBytes(sizeVal) : '—'}
{/if} {#if showDate}
{#if dateCell}{@render dateCell(item, ctx)}{:else}{formatDate(dateVal)}{/if}
{/if}
{#if sizeVal != null}{formatBytes(sizeVal)}{/if} {#if dateVal != null}{formatDate(dateVal)}{/if}
{#if onfavorite || itemActions || onContextMenuOverride || contextActions?.length}
{#if onfavorite} {/if} {#if itemActions}{@render itemActions(item)}{/if} {#if onContextMenuOverride || contextActions?.length} {/if}
{/if}
{/snippet}

{title}

{#if breadcrumb}
{@render breadcrumb()}
{/if} {#snippet start()}
0 && batchActions} > {#if selectable && selected.size > 0 && batchActions} {t('files.selected_count', { count: selected.size }, '{{count}} selected')}
{@render batchActions(selectedItems)}
{:else if actions} {@render actions()} {/if}
{/snippet} {#snippet end()} {/snippet}
{#if error} {:else if loading && isEmpty} {:else if isEmpty} {:else}
{#if grouped && filesStore.viewMode === 'list'}
{#if listHeaderOverride}{@render listHeaderOverride()}{:else}{@render listHeader()}{/if} {#each sections as section (section.key)}
{section.label} {#if bucketAction} {@render bucketAction(section.key)} {/if}
e.id} {row} /> {/each}
{:else if grouped}
{#each sections as section (section.key)}
{section.label} {#if bucketAction} {@render bucketAction(section.key)} {/if}
e.id} {row} /> {/each}
{:else if filesStore.viewMode === 'list'}
{#if listHeaderOverride}{@render listHeaderOverride()}{:else}{@render listHeader()}{/if} e.id} {row} />
{:else} e.id} {row} /> {/if} {#if hasMore} {/if}
{/if} {#if rubberband} {/if}
{#snippet listHeader()}
{#if selectable}
{/if}
{t('files.col_name', 'Name')}
{#if showOwner}
{t('files.col_owner', 'Owner')}
{/if} {#if showPath}
{pathLabel ?? t('files.col_path', 'Location')}
{/if} {#if showType}
{t('files.col_type', 'Type')}
{/if} {#if showSize}
{t('files.col_size', 'Size')}
{/if} {#if showDate}
{dateLabel ?? t('files.col_modified', 'Date')}
{/if} {#if hasActionCell}
{/if}
{/snippet} {#if ctxOpen && ctxItem && contextActions} {@const visibleActions = contextActions.filter( (a) => a.visible?.(ctxItem!, ctxOf(ctxItem!.id)) !== false )} {/if}