diff --git a/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte b/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte index 346f2381ac..6db54545e2 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte @@ -5,6 +5,8 @@ import { Repl } from '@sveltejs/repl'; import { mapbox_setup } from '../../../../../config.js'; import { page } from '$app/state'; + import { decode_and_decompress_text } from '../gzip.js'; + import type { File } from 'editor'; let { data } = $props(); @@ -25,10 +27,40 @@ }); } + // TODO make this munging unnecessary + function munge(data: any): File { + const basename = `${data.name}.${data.type}`; + + return { + type: 'file', + name: basename, + basename, + contents: data.source, + text: true + }; + } + + async function set_files() { + const hash = location.hash.slice(1); + + if (!hash) { + repl?.set({ + files: data.gist.components.map(munge) + }); + + return; + } + + try { + const recovered = JSON.parse(await decode_and_decompress_text(hash)); + repl.set({ files: recovered.files }); + } catch { + alert(`Couldn't load the code from the URL. Make sure you copied the link correctly.`); + } + } + afterNavigate(() => { - repl?.set({ - files: data.gist.components - }); + set_files(); }); const relaxed = $derived(data.gist.relaxed || (data.user && data.user.id === data.gist.owner)); @@ -51,7 +83,7 @@ can_escape injectedJS={mapbox_setup} previewTheme={theme.current} - embedded + embedded={page.url.searchParams.has('output-only') ? 'output-only' : true} /> {/if} diff --git a/packages/repl/src/lib/Output/Output.svelte b/packages/repl/src/lib/Output/Output.svelte index 9d29e4c73a..008511c753 100644 --- a/packages/repl/src/lib/Output/Output.svelte +++ b/packages/repl/src/lib/Output/Output.svelte @@ -12,7 +12,7 @@ interface Props { status: string | null; runtimeError?: Error | null; - embedded?: boolean; + embedded?: boolean | 'output-only'; relaxed?: boolean; can_escape?: boolean; injectedJS: string; @@ -182,16 +182,18 @@ }); -