diff --git a/package.json b/package.json index 9a44508d..837d04af 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,8 @@ "monaco-editor": "0.34.0", "monaco-mermaid": "1.0.6", "pako": "2.0.4", - "random-word-slugs": "0.1.6" + "random-word-slugs": "0.1.6", + "svg-pan-zoom": "^3.6.1" }, "lint-staged": { "*.{ts,svelte,js,css,md,json}": [ diff --git a/src/lib/components/view.svelte b/src/lib/components/view.svelte index a4036093..3579723d 100644 --- a/src/lib/components/view.svelte +++ b/src/lib/components/view.svelte @@ -2,6 +2,7 @@ import { inputStateStore, stateStore } from '$lib/util/state'; import { onMount } from 'svelte'; import mermaid from 'mermaid'; + import panzoom from 'svg-pan-zoom'; let code = ''; let config = ''; @@ -9,7 +10,11 @@ let view: HTMLDivElement; let error = false; let outOfSync = false; + let hide = false; let manualUpdate = true; + let pan: SvgPanZoom.Point; + let zoom: number; + let pzoom: SvgPanZoom.Instance; onMount(() => { stateStore.subscribe((state) => { if (state.error !== undefined) { @@ -35,8 +40,31 @@ mermaid.initialize(Object.assign({}, JSON.parse(state.mermaid))); mermaid.render('graph-div', code, (svgCode) => { if (svgCode.length > 0) { - console.log(svgCode); + let oldPan = pan ? { ...pan } : undefined; + let oldZoom = zoom; + pzoom?.destroy(); + hide = true; container.innerHTML = svgCode; + setTimeout(() => { + pzoom = panzoom('#graph-div', { + onPan: (p) => { + pan = p; + zoom = pzoom.getZoom(); + }, + onZoom: (z) => { + zoom = z; + pan = pzoom.getPan(); + }, + zoomEnabled: true, + panEnabled: true, + controlIconsEnabled: true + }); + if (oldPan !== undefined && oldZoom !== undefined) { + pzoom.zoom(oldZoom); + pzoom.pan(oldPan); + } + hide = false; + }, 0); } }); view.parentElement.scrollTop = scroll; @@ -59,7 +87,7 @@ {/if}