diff --git a/src/lib/components/chat/FileNav.svelte b/src/lib/components/chat/FileNav.svelte
index 144beccf4..77445bd02 100644
--- a/src/lib/components/chat/FileNav.svelte
+++ b/src/lib/components/chat/FileNav.svelte
@@ -20,7 +20,10 @@
} from '$lib/apis/terminal';
import Folder from '../icons/Folder.svelte';
import Document from '../icons/Document.svelte';
+ import PenAlt from '../icons/PenAlt.svelte';
+ import Reset from '../icons/Reset.svelte';
import Spinner from '../common/Spinner.svelte';
+ import Tooltip from '../common/Tooltip.svelte';
import ConfirmDialog from '../common/ConfirmDialog.svelte';
import FileNavToolbar from './FileNav/FileNavToolbar.svelte';
@@ -45,6 +48,19 @@
let fileLoading = false;
let filePreviewRef: FilePreview;
+ // ── File preview toolbar state (bound from FilePreview) ─────────────
+ let editing = false;
+ let showRaw = false;
+ let saving = false;
+
+ const MD_EXTS = new Set(['md', 'markdown', 'mdx']);
+ const CSV_EXTS = new Set(['csv', 'tsv']);
+ const getFileExt = (path: string | null) => path?.split('.').pop()?.toLowerCase() ?? '';
+
+ $: isMarkdown = MD_EXTS.has(getFileExt(selectedFile));
+ $: isCsv = CSV_EXTS.has(getFileExt(selectedFile));
+ $: isTextFile = fileContent !== null && fileImageUrl === null && filePdfData === null;
+
// ── Upload / folder creation ─────────────────────────────────────────
let isDragOver = false;
let uploading = false;
@@ -428,19 +444,108 @@
onNewFolder={startNewFolder}
onNewFile={startNewFile}
onUploadFiles={handleUploadFiles}
- />
+ >
+ {#if fileImageUrl !== null}
+
+
+
+ {/if}
+ {#if (isMarkdown || isCsv) && fileContent !== null}
+
+
+
+ {/if}
+ {#if isTextFile}
+ {#if editing}
+
+
+
+
+
+
+ {:else}
+
+
+
+ {/if}
+ {/if}
+
+
+
+
{#if selectedFile !== null}
downloadFile(selectedFile)}
onSave={async (content) => {
const terminal = selectedTerminal;
if (!terminal || !selectedFile) return;
diff --git a/src/lib/components/chat/FileNav/FileNavToolbar.svelte b/src/lib/components/chat/FileNav/FileNavToolbar.svelte
index 8b3b8de24..db5b3732a 100644
--- a/src/lib/components/chat/FileNav/FileNavToolbar.svelte
+++ b/src/lib/components/chat/FileNav/FileNavToolbar.svelte
@@ -127,5 +127,7 @@
uploadInput.value = '';
}}
/>
+ {:else}
+
{/if}
diff --git a/src/lib/components/chat/FileNav/FilePreview.svelte b/src/lib/components/chat/FileNav/FilePreview.svelte
index 5489aa3bc..a28bde13e 100644
--- a/src/lib/components/chat/FileNav/FilePreview.svelte
+++ b/src/lib/components/chat/FileNav/FilePreview.svelte
@@ -5,9 +5,6 @@
import DOMPurify from 'dompurify';
import Spinner from '../../common/Spinner.svelte';
import PDFViewer from '../../common/PDFViewer.svelte';
- import Tooltip from '../../common/Tooltip.svelte';
- import Reset from '../../icons/Reset.svelte';
- import PenAlt from '../../icons/PenAlt.svelte';
const i18n = getContext('i18n');
@@ -17,12 +14,11 @@
export let filePdfData: ArrayBuffer | null = null;
export let fileContent: string | null = null;
- export let onDownload: () => void = () => {};
export let onSave: ((content: string) => Promise) | null = null;
- let editing = false;
+ export let editing = false;
let editContent = '';
- let saving = false;
+ export let saving = false;
// Reset edit state when switching files
$: selectedFile, resetEdit();
@@ -33,13 +29,13 @@
saving = false;
};
- const startEdit = () => {
+ export const startEdit = () => {
editContent = fileContent ?? '';
editing = true;
showRaw = true;
};
- const saveEdit = async () => {
+ export const saveEdit = async () => {
if (!onSave) return;
saving = true;
await onSave(editContent);
@@ -47,7 +43,7 @@
editing = false;
};
- const cancelEdit = () => {
+ export const cancelEdit = () => {
editing = false;
editContent = '';
};
@@ -109,7 +105,7 @@
$: csvHeader = csvRows.length > 0 ? csvRows[0] : [];
$: csvBody = csvRows.length > 1 ? csvRows.slice(1) : [];
- let showRaw = false;
+ export let showRaw = false;
$: selectedFile, (showRaw = false); // reset to preview mode when switching files
let pzInstance: PanZoom | null = null;
@@ -122,7 +118,7 @@
});
};
- const resetImageView = () => {
+ export const resetImageView = () => {
if (pzInstance) {
pzInstance.moveTo(0, 0);
pzInstance.zoomAbs(0, 0, 1);
@@ -146,135 +142,6 @@
? 'overflow-hidden'
: 'overflow-y-auto'} min-h-0 relative h-full"
>
-
-
- {#if fileImageUrl !== null}
-
-
-
- {/if}
- {#if (isMarkdown || isCsv) && fileContent !== null}
-
-
-
- {/if}
- {#if isTextFile && onSave}
- {#if editing}
-
-
-
-
-
-
- {:else}
-
-
-
- {/if}
- {/if}
-
-
-
{#if fileLoading}