Ver Fonte

feat: artifacts download button

Timothy Jaeryang Baek há 4 meses atrás
pai
commit
fcb93f3155
1 ficheiros alterados com 26 adições e 3 exclusões
  1. 26 3
      src/lib/components/chat/Artifacts.svelte

+ 26 - 3
src/lib/components/chat/Artifacts.svelte

@@ -5,12 +5,14 @@
 	const dispatch = createEventDispatcher();
 
 	import { artifactCode, chatId, settings, showArtifacts, showControls } from '$lib/stores';
-	import XMark from '../icons/XMark.svelte';
 	import { copyToClipboard, createMessagesList } from '$lib/utils';
+
+	import XMark from '../icons/XMark.svelte';
 	import ArrowsPointingOut from '../icons/ArrowsPointingOut.svelte';
 	import Tooltip from '../common/Tooltip.svelte';
 	import SvgPanZoom from '../common/SVGPanZoom.svelte';
 	import ArrowLeft from '../icons/ArrowLeft.svelte';
+	import ArrowDownTray from '../icons/ArrowDownTray.svelte';
 
 	export let overlay = false;
 	export let history;
@@ -180,6 +182,18 @@
 		}
 	};
 
+	const downloadArtifact = () => {
+		const blob = new Blob([contents[selectedContentIdx].content], { type: 'text/html' });
+		const url = URL.createObjectURL(blob);
+		const a = document.createElement('a');
+		a.href = url;
+		a.download = `artifact-${$chatId}-${selectedContentIdx}.html`;
+		document.body.appendChild(a);
+		a.click();
+		document.body.removeChild(a);
+		URL.revokeObjectURL(url);
+	};
+
 	onMount(() => {
 		artifactCode.subscribe((value) => {
 			if (contents) {
@@ -205,7 +219,7 @@
 					<ArrowLeft className="size-3.5  text-gray-900 dark:text-white" />
 				</button>
 
-				<div class="flex-1 flex items-center justify-between">
+				<div class="flex-1 flex items-center justify-between pr-1">
 					<div class="flex items-center space-x-2">
 						<div class="flex items-center gap-0.5 self-center min-w-fit" dir="ltr">
 							<button
@@ -259,7 +273,7 @@
 						</div>
 					</div>
 
-					<div class="flex items-center gap-1">
+					<div class="flex items-center gap-1.5">
 						<button
 							class="copy-code-button bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5"
 							on:click={() => {
@@ -272,6 +286,15 @@
 							}}>{copied ? $i18n.t('Copied') : $i18n.t('Copy')}</button
 						>
 
+						<Tooltip content={$i18n.t('Download')}>
+							<button
+								class=" bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md p-0.5"
+								on:click={downloadArtifact}
+							>
+								<ArrowDownTray className="size-3.5" />
+							</button>
+						</Tooltip>
+
 						{#if contents[selectedContentIdx].type === 'iframe'}
 							<Tooltip content={$i18n.t('Open in full screen')}>
 								<button