Skip to content

Commit 3311eda

Browse files
authored
Portable editor (#419)
* pass workspace around as prop/context * instantiate workspace inside tutorial page * lint
1 parent c0e9a2e commit 3311eda

File tree

9 files changed

+33
-21
lines changed

9 files changed

+33
-21
lines changed

apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import Output from './Output.svelte';
1010
import { ScreenToggle } from '@sveltejs/site-kit/components';
1111
import Sidebar from './Sidebar.svelte';
12-
import { solution, workspace } from './state.svelte';
12+
import { solution, Workspace } from './state.svelte';
1313
import { create_directories } from './utils';
1414
import { needs_webcontainers, text_files } from './shared';
1515
import OutputRollup from './OutputRollup.svelte';
@@ -24,6 +24,8 @@
2424
2525
let { data }: Props = $props();
2626
27+
const workspace = new Workspace();
28+
2729
let path = data.exercise.path;
2830
let show_editor = $state(false);
2931
let show_filetree = $state(false);
@@ -278,6 +280,7 @@
278280
{:else}
279281
<Filetree
280282
exercise={data.exercise}
283+
{workspace}
281284
on:select={(e) => {
282285
select_file(e.detail.name);
283286
}}
@@ -286,14 +289,15 @@
286289
</section>
287290

288291
<section slot="b" class="editor-container">
289-
<Editor exercise={data.exercise} warnings={adapter_state.warnings} />
292+
<Editor exercise={data.exercise} warnings={adapter_state.warnings} {workspace} />
290293
<ImageViewer selected={workspace.selected_file} />
291294

292295
{#if mobile && show_filetree}
293296
<div class="mobile-filetree">
294297
<Filetree
295298
mobile
296299
exercise={data.exercise}
300+
{workspace}
297301
on:select={(e) => {
298302
navigate_to_file(e.detail.name);
299303
}}
@@ -306,7 +310,7 @@
306310

307311
<section slot="b" class="preview">
308312
{#if needs_webcontainers($page.data.exercise)}
309-
<Output exercise={data.exercise} {paused} />
313+
<Output exercise={data.exercise} {paused} {workspace} />
310314
{:else}
311315
<OutputRollup />
312316
{/if}

apps/svelte.dev/src/routes/tutorial/[...slug]/Editor.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import { svelteTheme } from '@sveltejs/repl/theme';
1414
import { basicSetup } from 'codemirror';
1515
import { onMount, tick } from 'svelte';
16-
import { workspace } from './state.svelte';
16+
import { Workspace } from './state.svelte';
1717
import { autocomplete_for_svelte } from '@sveltejs/site-kit/codemirror';
1818
import type { Diagnostic } from '@codemirror/lint';
1919
import type { Exercise, Stub } from '$lib/tutorial';
@@ -23,9 +23,10 @@
2323
interface Props {
2424
exercise: Exercise;
2525
warnings: Record<string, Warning[]>;
26+
workspace: Workspace;
2627
}
2728
28-
let { exercise, warnings }: Props = $props();
29+
let { exercise, warnings, workspace }: Props = $props();
2930
3031
let container = $state() as HTMLDivElement;
3132

apps/svelte.dev/src/routes/tutorial/[...slug]/Loading.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<script lang="ts">
2-
import { load_webcontainer, reset } from './adapter.svelte';
3-
import { workspace } from './state.svelte';
2+
import { load_webcontainer } from './adapter.svelte';
43
54
interface Props {
65
initial: boolean;
76
error?: Error | null;
87
progress: number;
98
status: string;
9+
onreset?: () => void;
1010
}
1111
12-
let { initial, error = null, progress, status }: Props = $props();
12+
let { initial, error = null, progress, status, onreset }: Props = $props();
1313
</script>
1414

1515
<div class="loading">
@@ -69,7 +69,7 @@
6969
onclick={async () => {
7070
error = null;
7171
load_webcontainer(true);
72-
await reset(workspace.files);
72+
onreset?.();
7373
}}>clicking here</button
7474
>.
7575
</p>

apps/svelte.dev/src/routes/tutorial/[...slug]/Output.svelte

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@
99
import { onMount } from 'svelte';
1010
import Chrome from './Chrome.svelte';
1111
import Loading from './Loading.svelte';
12-
import { adapter_state, subscribe } from './adapter.svelte';
12+
import { adapter_state, subscribe, reset } from './adapter.svelte';
1313
import type { Exercise } from '$lib/tutorial';
14+
import type { Workspace } from './state.svelte';
1415
1516
interface Props {
1617
exercise: Exercise;
1718
paused: boolean;
19+
workspace: Workspace;
1820
}
1921
20-
let { exercise, paused }: Props = $props();
22+
let { exercise, paused, workspace }: Props = $props();
2123
2224
let iframe = $state() as HTMLIFrameElement;
2325
let loading = $state(true);
@@ -146,6 +148,9 @@
146148
error={adapter_state.error}
147149
progress={adapter_state.progress.value}
148150
status={adapter_state.progress.text}
151+
onreset={() => {
152+
reset(workspace.files);
153+
}}
149154
/>
150155
{/if}
151156

apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/File.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import * as context from './context.js';
33
import Item from './Item.svelte';
44
import file_icon from '$lib/icons/file.svg';
5-
import { solution, workspace } from '../state.svelte';
5+
import { solution } from '../state.svelte';
66
import type { FileStub, MenuItem } from '$lib/tutorial';
77
88
interface Props {
@@ -12,7 +12,7 @@
1212
1313
let { file, depth }: Props = $props();
1414
15-
const { rename, remove, select } = context.get();
15+
const { rename, remove, select, workspace } = context.get();
1616
1717
let renaming = $state(false);
1818

apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/Filetree.svelte

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@
44
import Folder from './Folder.svelte';
55
import * as context from './context.js';
66
import Modal from '$lib/components/Modal.svelte';
7-
import { solution, workspace } from '../state.svelte';
7+
import { solution, Workspace } from '../state.svelte';
88
import { create_directories } from '../utils';
99
import { afterNavigate } from '$app/navigation';
1010
import type { Exercise, Stub } from '$lib/tutorial';
1111
1212
interface Props {
1313
exercise: Exercise;
1414
mobile?: boolean;
15+
workspace: Workspace;
1516
}
1617
17-
let { exercise, mobile = false }: Props = $props();
18+
let { exercise, mobile = false, workspace }: Props = $props();
1819
1920
const dispatch = createEventDispatcher();
2021
@@ -136,7 +137,9 @@
136137
137138
select: (name) => {
138139
dispatch('select', { name });
139-
}
140+
},
141+
142+
workspace
140143
});
141144
142145
function is_deleted(file: Stub) {

apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/Folder.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import Item from './Item.svelte';
77
import folder_closed from '$lib/icons/folder.svg';
88
import folder_open from '$lib/icons/folder-open.svg';
9-
import { solution, workspace } from '../state.svelte';
9+
import { solution } from '../state.svelte';
1010
import type { DirectoryStub, FileStub, MenuItem, Stub } from '$lib/tutorial';
1111
1212
interface Props {
@@ -20,7 +20,7 @@
2020
2121
let renaming = $state(false);
2222
23-
const { collapsed, rename, add, remove } = context.get();
23+
const { collapsed, rename, add, remove, workspace } = context.get();
2424
2525
let segments = $derived(get_depth(prefix));
2626

apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/context.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { setContext, getContext } from 'svelte';
77
* rename: (stub: import('$lib/tutorial').Stub, name: string) => Promise<void>;
88
* remove: (stub: import('$lib/tutorial').Stub) => Promise<void>;
99
* select: (name: string) => void;
10+
* workspace: import('../state.svelte').Workspace
1011
* }} FileTreeContext
1112
*/
1213

apps/svelte.dev/src/routes/tutorial/[...slug]/state.svelte.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { writable } from 'svelte/store';
22
import * as adapter from './adapter.svelte';
33
import type { FileStub, Stub } from '$lib/tutorial';
44

5-
class Workspace {
5+
export class Workspace {
66
files = $state.raw<Stub[]>([]);
77
creating = $state.raw<{ parent: string; type: 'file' | 'directory' } | null>(null);
88
selected_name = $state<string | null>(null);
@@ -40,7 +40,5 @@ class Workspace {
4040
}
4141
}
4242

43-
export const workspace = new Workspace();
44-
4543
// this is separate to the workspace
4644
export const solution = writable({} as Record<string, Stub>);

0 commit comments

Comments
 (0)