diff --git a/src/lib/components/chat/FileNav.svelte b/src/lib/components/chat/FileNav.svelte index 29ec88501..e92ceba1d 100644 --- a/src/lib/components/chat/FileNav.svelte +++ b/src/lib/components/chat/FileNav.svelte @@ -28,6 +28,12 @@ import Tooltip from '../common/Tooltip.svelte'; import PDFViewer from '../common/PDFViewer.svelte'; import ConfirmDialog from '../common/ConfirmDialog.svelte'; + import Reset from '../icons/Reset.svelte'; + + import panzoom, { type PanZoom } from 'panzoom'; + + let pzInstance: PanZoom | null = null; + let imageSceneElement: HTMLElement | null = null; const i18n = getContext('i18n'); @@ -86,6 +92,10 @@ const clearFilePreview = () => { fileContent = null; + if (pzInstance) { + pzInstance.dispose(); + pzInstance = null; + } if (fileImageUrl) { URL.revokeObjectURL(fileImageUrl); fileImageUrl = null; @@ -93,6 +103,22 @@ filePdfData = null; }; + const initImagePanzoom = (node: HTMLElement) => { + imageSceneElement = node; + pzInstance = panzoom(node, { + bounds: true, + boundsPadding: 0.1, + zoomSpeed: 0.065 + }); + }; + + const resetImageView = () => { + if (pzInstance) { + pzInstance.moveTo(0, 0); + pzInstance.zoomAbs(0, 0, 1); + } + }; + const loadDir = async (path: string) => { if (!configured) return; loading = true; @@ -253,6 +279,7 @@ }); onDestroy(() => { + pzInstance?.dispose(); if (fileImageUrl) URL.revokeObjectURL(fileImageUrl); }); @@ -334,7 +361,7 @@ / {selectedFile.split('/').pop()} @@ -413,38 +440,54 @@ -