{ if (entry.type !== 'directory') return; if (!writable) return; if (!e.dataTransfer?.types.includes('application/x-terminal-file-move')) return; e.preventDefault(); e.stopPropagation(); dragOverFolder = true; if (!expanded && !expandTimer) { expandTimer = setTimeout(() => { onToggleExpand(directoryPath); expandTimer = null; }, 600); } }} on:dragleave={(e) => { if (entry.type !== 'directory') return; e.stopPropagation(); dragOverFolder = false; clearExpandTimer(); }} on:drop={(e) => { if (entry.type !== 'directory') return; if (!writable) return; const raw = e.dataTransfer?.getData('application/x-terminal-file-move'); if (!raw) return; e.preventDefault(); e.stopPropagation(); dragOverFolder = false; clearExpandTimer(); try { const data = JSON.parse(raw); const paths = data.paths || (data.path ? [data.path] : []); const destFolder = directoryPath; for (const p of paths) { if (p + '/' === destFolder || p === destFolder) continue; onMove(p, destFolder); } } catch {} }} > {#if entry.type === 'directory'}
onToggleExpand(directoryPath)} aria-label={expanded ? $i18n.t('Collapse') : $i18n.t('Expand')} >
{:else}
{/if}
{ if (!canMutate) { e.preventDefault(); return; } const filePath = entryPath.replace(/\/$/, ''); // If dragging a selected item, drag all selected if (selected && selectedPaths.size > 1) { e.dataTransfer?.setData( 'application/x-terminal-file-move', JSON.stringify({ paths: [...selectedPaths] }) ); // Custom drag ghost showing count const ghost = document.createElement('div'); ghost.style.cssText = 'position:fixed;top:-1000px;left:-1000px;display:flex;align-items:center;gap:0.375rem;padding:0.25rem 0.625rem;border-radius:0.5rem;background:#374151;color:#fff;font-size:0.75rem;white-space:nowrap;pointer-events:none;'; ghost.textContent = `${selectedPaths.size} items`; document.body.appendChild(ghost); e.dataTransfer?.setDragImage(ghost, 0, 0); requestAnimationFrame(() => ghost.remove()); } else { e.dataTransfer?.setData( 'application/x-terminal-file-move', JSON.stringify({ path: entry.type === 'directory' ? directoryPath : filePath, name: entry.name }) ); } if (entry.type === 'file') { e.dataTransfer?.setData( 'application/x-terminal-file', JSON.stringify({ path: filePath, name: entry.name, url: terminalUrl, key: terminalKey }) ); } }} on:pointerdown={onPointerDown} on:pointerup={onPointerUp} on:pointercancel={onPointerCancel} on:click={handleClick} on:dblclick|preventDefault|stopPropagation={() => { startRename(); }} > {#if selectionMode || selected}
{#if selected}
{/if}
{/if}
{#if renaming}
{ if (e.key === 'Enter') { e.preventDefault(); submitRename(); } if (e.key === 'Escape') { e.preventDefault(); cancelRename(); } }} on:blur={submitRename} on:click|stopPropagation /> {:else}
{entry.name}
{/if} {#if !writable && !renaming}
Read-only
{/if} {#if entry.type === 'file' && entry.size !== undefined && !renaming} {#if showDate && entry.modified}
{formatRelativeTime(entry.modified)}
{/if}
{formatFileSize(entry.size)}
{:else if entry.type === 'directory' && showDate && entry.modified && !renaming}
{formatRelativeTime(entry.modified)}
{/if}
{ e.stopPropagation(); onOpen(entry); }} >
{entry.type === 'directory' ? $i18n.t('Open Folder') : $i18n.t('Open')}
{#if entry.type === 'directory'}
{ e.stopPropagation(); onToggleExpand(directoryPath); }} >
{expanded ? $i18n.t('Collapse') : $i18n.t('Expand')}
{:else}
{ e.stopPropagation(); onDownload(entryPath); }} >
{$i18n.t('Download')}
{/if}
{ e.stopPropagation(); navigator.clipboard.writeText(entryPath).then(() => { toast.success($i18n.t('Path copied')); }); }} >
{$i18n.t('Copy Path')}
{ e.stopPropagation(); if (!canMutate) return; startRename(); }} >
{$i18n.t('Rename')}
{ e.stopPropagation(); if (!canMutate) return; onDelete(entryPath.replace(/\/$/, ''), entry.name); }} >
{$i18n.t('Delete')}