From fcb93f3155bfe00c134e10337cd84838602a15f1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 17 May 2025 00:27:20 +0400 Subject: [PATCH] feat: artifacts download button --- src/lib/components/chat/Artifacts.svelte | 29 +++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/lib/components/chat/Artifacts.svelte b/src/lib/components/chat/Artifacts.svelte index 180ed7277..4dafea55e 100644 --- a/src/lib/components/chat/Artifacts.svelte +++ b/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 @@ -
+
-
+
+ + + + {#if contents[selectedContentIdx].type === 'iframe'}