File size: 2,683 Bytes
bc27e65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<script lang="ts">

	import fileSaver from 'file-saver';

	const { saveAs } = fileSaver;



	import { toast } from 'svelte-sonner';



	import panzoom, { type PanZoom } from 'panzoom';

	import DOMPurify from 'dompurify';



	import { onMount, getContext } from 'svelte';

	const i18n = getContext('i18n');



	import { copyToClipboard } from '$lib/utils';



	import DocumentDuplicate from '../icons/DocumentDuplicate.svelte';

	import Tooltip from './Tooltip.svelte';

	import Clipboard from '../icons/Clipboard.svelte';

	import Reset from '../icons/Reset.svelte';

	import ArrowDownTray from '../icons/ArrowDownTray.svelte';



	export let className = '';

	export let svg = '';

	export let content = '';



	let instance: PanZoom;



	let sceneParentElement: HTMLElement;

	let sceneElement: HTMLElement;



	$: if (sceneElement) {

		instance = panzoom(sceneElement, {

			bounds: true,

			boundsPadding: 0.1,



			zoomSpeed: 0.065

		});

	}

	const resetPanZoomViewport = () => {

		instance.moveTo(0, 0);

		instance.zoomAbs(0, 0, 1);

		console.log(instance.getTransform());

	};



	const downloadAsSVG = () => {

		const svgBlob = new Blob([svg], { type: 'image/svg+xml' });

		saveAs(svgBlob, `diagram.svg`);

	};

</script>

<div bind:this={sceneParentElement} class="relative {className}">
	<div bind:this={sceneElement} class="flex h-full max-h-full justify-center items-center">
		{@html svg}
	</div>

	{#if content}
		<div class=" absolute top-1 right-1">
			<div class="flex gap-1">
				<Tooltip content={$i18n.t('Download as SVG')}>
					<button

						class="p-1.5 rounded-lg border border-gray-100 dark:border-none dark:bg-gray-850 hover:bg-gray-50 dark:hover:bg-gray-800 transition"

						on:click={() => {
							downloadAsSVG();
						}}
					>
						<ArrowDownTray className=" size-4" />
					</button>
				</Tooltip>

				<Tooltip content={$i18n.t('Reset view')}>
					<button

						class="p-1.5 rounded-lg border border-gray-100 dark:border-none dark:bg-gray-850 hover:bg-gray-50 dark:hover:bg-gray-800 transition"

						on:click={() => {
							resetPanZoomViewport();
						}}
					>
						<Reset className=" size-4" />
					</button>
				</Tooltip>

				<Tooltip content={$i18n.t('Copy to clipboard')}>
					<button

						class="p-1.5 rounded-lg border border-gray-100 dark:border-none dark:bg-gray-850 hover:bg-gray-50 dark:hover:bg-gray-800 transition"

						on:click={() => {
							copyToClipboard(content);
							toast.success($i18n.t('Copied to clipboard'));
						}}
					>
						<Clipboard className=" size-4" strokeWidth="1.5" />
					</button>
				</Tooltip>
			</div>
		</div>
	{/if}
</div>