Переглянути джерело

enh: mermaid copy content button

Timothy J. Baek 7 місяців тому
батько
коміт
63d297756a

+ 1 - 1
src/lib/components/chat/Artifacts.svelte

@@ -191,7 +191,7 @@
 					showArtifacts.set(false);
 				}}
 			>
-				<ArrowLeft className="size-3.5" />
+				<ArrowLeft className="size-3.5  text-gray-900 dark:text-white" />
 			</button>
 		</div>
 

+ 1 - 0
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -302,6 +302,7 @@ __builtins__.input = input`);
 				<SvgPanZoom
 					className=" border border-gray-50 dark:border-gray-850 rounded-lg max-h-fit overflow-hidden"
 					svg={mermaidHtml}
+					content={_token.text}
 				/>
 			{:else}
 				<pre class="mermaid">{code}</pre>

+ 26 - 2
src/lib/components/common/SVGPanZoom.svelte

@@ -1,11 +1,19 @@
 <script lang="ts">
-	import { onMount } from 'svelte';
+	import { onMount, getContext } from 'svelte';
+	const i18n = getContext('i18n');
+
 	import panzoom from 'panzoom';
 
 	import DOMPurify from 'dompurify';
+	import DocumentDuplicate from '../icons/DocumentDuplicate.svelte';
+	import { copyToClipboard } from '$lib/utils';
+	import { toast } from 'svelte-sonner';
+	import Tooltip from './Tooltip.svelte';
+	import Clipboard from '../icons/Clipboard.svelte';
 
 	export let className = '';
 	export let svg = '';
+	export let content = '';
 
 	let instance;
 
@@ -22,8 +30,24 @@
 	}
 </script>
 
-<div bind:this={sceneParentElement} class={className}>
+<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">
+			<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>
+	{/if}
 </div>