Skip to content

Commit 9d0f7d7

Browse files
authored
fix(repl): update broken embed repl to work like regular one, remove obsolete ReplWidget.svelte (#10180)
1 parent d9fcc87 commit 9d0f7d7

File tree

8 files changed

+152
-142
lines changed

8 files changed

+152
-142
lines changed

sites/svelte.dev/src/lib/components/ReplWidget.svelte

Lines changed: 0 additions & 95 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { error } from '@sveltejs/kit';
2+
3+
export async function load({ fetch, params, url }) {
4+
const res = await fetch(`/repl/api/${params.id}.json`);
5+
6+
if (!res.ok) {
7+
throw error(res.status);
8+
}
9+
10+
const gist = await res.json();
11+
12+
return {
13+
gist,
14+
version: url.searchParams.get('version') || '4'
15+
};
16+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<script>
2+
import { browser } from '$app/environment';
3+
import { afterNavigate } from '$app/navigation';
4+
import { theme } from '@sveltejs/site-kit/stores';
5+
import Repl from '@sveltejs/repl';
6+
import { mapbox_setup } from '../../../../../config.js';
7+
import { onMount } from 'svelte';
8+
9+
export let data;
10+
11+
let version = data.version;
12+
13+
/** @type {import('@sveltejs/repl').default} */
14+
let repl;
15+
16+
function update_query_string(version) {
17+
const params = [];
18+
19+
if (version !== 'latest') params.push(`version=${version}`);
20+
21+
const url =
22+
params.length > 0
23+
? `/repl/${data.gist.id}/embed?${params.join('&')}`
24+
: `/repl/${data.gist.id}/embed`;
25+
26+
history.replaceState({}, 'x', url);
27+
}
28+
29+
$: if (typeof history !== 'undefined') update_query_string(version);
30+
31+
onMount(() => {
32+
if (data.version !== 'local') {
33+
fetch(`https://unpkg.com/svelte@${data.version || '4'}/package.json`)
34+
.then((r) => r.json())
35+
.then((pkg) => {
36+
version = pkg.version;
37+
});
38+
}
39+
});
40+
41+
afterNavigate(() => {
42+
repl?.set({
43+
files: data.gist.components
44+
});
45+
});
46+
47+
$: svelteUrl =
48+
browser && version === 'local'
49+
? `${location.origin}/repl/local`
50+
: `https://unpkg.com/svelte@${version}`;
51+
52+
$: relaxed = data.gist.relaxed || (data.user && data.user.id === data.gist.owner);
53+
</script>
54+
55+
<svelte:head>
56+
<title>{data.gist.name} • REPL • Svelte</title>
57+
58+
<meta name="twitter:title" content="{data.gist.name} • REPL • Svelte" />
59+
<meta name="twitter:description" content="Cybernetically enhanced web apps" />
60+
<meta name="Description" content="Interactive Svelte playground" />
61+
</svelte:head>
62+
63+
<div class="repl-outer">
64+
{#if browser}
65+
<Repl
66+
bind:this={repl}
67+
{svelteUrl}
68+
{relaxed}
69+
injectedJS={mapbox_setup}
70+
showModified
71+
showAst
72+
previewTheme={$theme.current}
73+
embedded
74+
/>
75+
{/if}
76+
</div>
77+
78+
<style>
79+
.repl-outer {
80+
position: fixed;
81+
top: 0;
82+
left: 0;
83+
width: 100%;
84+
height: 100%;
85+
background-color: var(--sk-back-1);
86+
overflow: hidden;
87+
box-sizing: border-box;
88+
--pane-controls-h: 4.2rem;
89+
display: flex;
90+
flex-direction: column;
91+
}
92+
</style>

sites/svelte.dev/src/routes/(authed)/repl/embed/+page.js

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { redirect } from '@sveltejs/kit';
2+
3+
export function load({ url }) {
4+
if (!url.searchParams.has('gist')) {
5+
throw redirect(301, '/repl/hello-world/embed');
6+
} else {
7+
const searchParamsWithoutGist = new URLSearchParams(url.searchParams);
8+
searchParamsWithoutGist.delete('gist');
9+
throw redirect(
10+
301,
11+
`/repl/${url.searchParams.get('gist')}/embed?${searchParamsWithoutGist.toString()}`
12+
);
13+
}
14+
}

sites/svelte.dev/src/routes/(authed)/repl/embed/+page.svelte

Lines changed: 0 additions & 36 deletions
This file was deleted.

sites/svelte.dev/src/routes/+layout.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@
3333
</svelte:head>
3434
3535
<div style:display={$page.url.pathname !== '/docs' ? 'contents' : 'none'}>
36-
<Shell nav_visible={$page.url.pathname !== '/repl/embed'} bind:snapshot={shell_snapshot}>
36+
<Shell
37+
nav_visible={$page.route.id !== '/(authed)/repl/[id]/embed'}
38+
bind:snapshot={shell_snapshot}
39+
>
3740
<Nav slot="top-nav" title={data.nav_title} links={data.nav_links}>
3841
<svelte:fragment slot="home-large">
3942
<strong>svelte</strong>.dev

sites/svelte.dev/src/routes/_components/Example.svelte

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,38 @@
11
<script>
22
import IntersectionObserver from '$lib/components/IntersectionObserver.svelte';
3-
import ReplWidget from '$lib/components/ReplWidget.svelte';
3+
import { process_example } from '$lib/utils/examples';
4+
import Repl from '@sveltejs/repl';
5+
import { theme } from '@sveltejs/site-kit/stores';
46
57
export let id;
8+
9+
/** @type {import('@sveltejs/repl').default} */
10+
let repl;
11+
12+
$: {
13+
if (repl) {
14+
fetch(`/examples/api/${id}.json`)
15+
.then((r) => r.json())
16+
.then((data) => process_example(data.files))
17+
.then((files) => {
18+
repl.set({
19+
files
20+
});
21+
});
22+
}
23+
}
624
</script>
725

826
<div class="repl-container">
927
<IntersectionObserver once let:intersecting top={400}>
1028
{#if intersecting}
11-
<ReplWidget example={id} />
29+
<Repl
30+
bind:this={repl}
31+
svelteUrl="https://unpkg.com/svelte@4"
32+
relaxed
33+
showAst
34+
previewTheme={$theme.current}
35+
/>
1236
{/if}
1337
</IntersectionObserver>
1438
</div>

0 commit comments

Comments
 (0)