diff --git a/site/package-lock.json b/site/package-lock.json
index c1b5331056..419e01e253 100644
--- a/site/package-lock.json
+++ b/site/package-lock.json
@@ -1139,6 +1139,30 @@
"resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz",
"integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw=="
},
+ "@sveltejs/svelte-repl": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@sveltejs/svelte-repl/-/svelte-repl-0.0.2.tgz",
+ "integrity": "sha512-g2vBAZJ3e9Oy6FG5FLUhRQ7muRslNtyzgros/AzgkNTsWUKSuLQMnE8hOFx5w+wSLMHLrNqKPVc7m18Wk746Gw==",
+ "dev": true,
+ "requires": {
+ "codemirror": "^5.45.0",
+ "yootils": "0.0.15"
+ },
+ "dependencies": {
+ "codemirror": {
+ "version": "5.45.0",
+ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.45.0.tgz",
+ "integrity": "sha512-c19j644usCE8gQaXa0jqn2B/HN9MnB2u6qPIrrhrMkB+QAP42y8G4QnTwuwbVSoUS1jEl7JU9HZMGhCDL0nsAw==",
+ "dev": true
+ },
+ "yootils": {
+ "version": "0.0.15",
+ "resolved": "https://registry.npmjs.org/yootils/-/yootils-0.0.15.tgz",
+ "integrity": "sha512-GvGLuJ7XHJPGEUQ52vh8fh+vPjfikuGcu7yBswfrsNsHqnAoytOVuSb69eM0j8wQIjMz0U3kY3YsfwMhJgfG9w==",
+ "dev": true
+ }
+ }
+ },
"@types/estree": {
"version": "0.0.39",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
diff --git a/site/package.json b/site/package.json
index f4bc842c29..157408ad55 100644
--- a/site/package.json
+++ b/site/package.json
@@ -39,6 +39,7 @@
"@babel/plugin-transform-runtime": "^7.2.0",
"@babel/preset-env": "^7.3.1",
"@babel/runtime": "^7.3.1",
+ "@sveltejs/svelte-repl": "0.0.2",
"chokidar": "^2.1.2",
"degit": "^2.1.3",
"eslint-plugin-svelte3": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#semver:*",
diff --git a/site/src/components/Repl/Bundler.js b/site/src/components/Repl/Bundler.js
deleted file mode 100644
index ddde546e7f..0000000000
--- a/site/src/components/Repl/Bundler.js
+++ /dev/null
@@ -1,44 +0,0 @@
-const workers = new Map();
-
-let uid = 1;
-
-export default class Bundler {
- constructor(version) {
- if (!workers.has(version)) {
- const worker = new Worker('/workers/bundler.js');
- worker.postMessage({ type: 'init', version });
- workers.set(version, worker);
- }
-
- this.worker = workers.get(version);
-
- this.handlers = new Map();
-
- this.worker.addEventListener('message', event => {
- const handler = this.handlers.get(event.data.id);
-
- if (handler) { // if no handler, was meant for a different REPL
- handler(event.data);
- this.handlers.delete(event.data.id);
- }
- });
- }
-
- bundle(components) {
- return new Promise(fulfil => {
- const id = uid++;
-
- this.handlers.set(id, fulfil);
-
- this.worker.postMessage({
- id,
- type: 'bundle',
- components
- });
- });
- }
-
- destroy() {
- this.worker.terminate();
- }
-}
\ No newline at end of file
diff --git a/site/src/components/Repl/CodeMirror.svelte b/site/src/components/Repl/CodeMirror.svelte
deleted file mode 100644
index a1a92fe344..0000000000
--- a/site/src/components/Repl/CodeMirror.svelte
+++ /dev/null
@@ -1,273 +0,0 @@
-
-
-
-
-
-
-
-
-
- {#if !CodeMirror}
-
{code}
-
-
- loading editor...
-
- {/if}
-
\ No newline at end of file
diff --git a/site/src/components/Repl/Input/ComponentSelector.svelte b/site/src/components/Repl/Input/ComponentSelector.svelte
deleted file mode 100644
index 6c30c34eba..0000000000
--- a/site/src/components/Repl/Input/ComponentSelector.svelte
+++ /dev/null
@@ -1,233 +0,0 @@
-
-
-
-
-
- {#if $components.length}
-
- {#each $components as component}
-
- {/each}
-
-
-
-
-
- {/if}
-
diff --git a/site/src/components/Repl/Input/ModuleEditor.svelte b/site/src/components/Repl/Input/ModuleEditor.svelte
deleted file mode 100644
index bf1716e373..0000000000
--- a/site/src/components/Repl/Input/ModuleEditor.svelte
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- {#if $bundle}
- {#if $bundle.error}
-
- {:else if $bundle.warnings.length > 0}
- {#each $bundle.warnings as warning}
-
- {/each}
- {/if}
- {/if}
-
-
\ No newline at end of file
diff --git a/site/src/components/Repl/InputOutputToggle.svelte b/site/src/components/Repl/InputOutputToggle.svelte
deleted file mode 100644
index abafd90359..0000000000
--- a/site/src/components/Repl/InputOutputToggle.svelte
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
- input
-
- output
-
\ No newline at end of file
diff --git a/site/src/components/Repl/Message.svelte b/site/src/components/Repl/Message.svelte
deleted file mode 100644
index 6a9183dfb3..0000000000
--- a/site/src/components/Repl/Message.svelte
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
-
-
- {#if details}
-
{message(details)}
- {:else}
-
- {/if}
-
\ No newline at end of file
diff --git a/site/src/components/Repl/Output/Compiler.js b/site/src/components/Repl/Output/Compiler.js
deleted file mode 100644
index 7ffb8b6bbc..0000000000
--- a/site/src/components/Repl/Output/Compiler.js
+++ /dev/null
@@ -1,49 +0,0 @@
-const workers = new Map();
-
-let uid = 1;
-
-export default class Compiler {
- constructor(version) {
- if (!workers.has(version)) {
- const worker = new Worker('/workers/compiler.js');
- worker.postMessage({ type: 'init', version });
- workers.set(version, worker);
- }
-
- this.worker = workers.get(version);
-
- this.handlers = new Map();
-
- this.worker.addEventListener('message', event => {
- const handler = this.handlers.get(event.data.id);
-
- if (handler) { // if no handler, was meant for a different REPL
- handler(event.data.result);
- this.handlers.delete(event.data.id);
- }
- });
- }
-
- compile(component, options) {
- return new Promise(fulfil => {
- const id = uid++;
-
- this.handlers.set(id, fulfil);
-
- this.worker.postMessage({
- id,
- type: 'compile',
- source: component.source,
- options: Object.assign({
- name: component.name,
- filename: `${component.name}.svelte`
- }, options),
- entry: component.name === 'App'
- });
- });
- }
-
- destroy() {
- this.worker.terminate();
- }
-}
\ No newline at end of file
diff --git a/site/src/components/Repl/Output/CompilerOptions.svelte b/site/src/components/Repl/Output/CompilerOptions.svelte
deleted file mode 100644
index 75f7301aa7..0000000000
--- a/site/src/components/Repl/Output/CompilerOptions.svelte
+++ /dev/null
@@ -1,146 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/site/src/components/Repl/Output/ReplProxy.js b/site/src/components/Repl/Output/ReplProxy.js
deleted file mode 100644
index 7ae140a8a7..0000000000
--- a/site/src/components/Repl/Output/ReplProxy.js
+++ /dev/null
@@ -1,75 +0,0 @@
-let uid = 1;
-
-export default class ReplProxy {
- constructor(iframe, handlers) {
- this.iframe = iframe;
- this.handlers = handlers;
-
- this.pending_cmds = new Map();
-
- this.handle_event = e => this.handle_repl_message(e);
- window.addEventListener('message', this.handle_event, false);
- }
-
- destroy() {
- window.removeEventListener('message', this.handle_event);
- }
-
- iframe_command(action, args) {
- return new Promise((resolve, reject) => {
- const cmd_id = uid++;
-
- this.pending_cmds.set(cmd_id, { resolve, reject });
-
- this.iframe.contentWindow.postMessage({ action, cmd_id, args }, '*');
- });
- }
-
- handle_command_message(cmd_data) {
- let action = cmd_data.action;
- let id = cmd_data.cmd_id;
- let handler = this.pending_cmds.get(id);
-
- if (handler) {
- this.pending_cmds.delete(id);
- if (action === 'cmd_error') {
- let { message, stack } = cmd_data;
- let e = new Error(message);
- e.stack = stack;
- handler.reject(e)
- }
-
- if (action === 'cmd_ok') {
- handler.resolve(cmd_data.args)
- }
- } else {
- console.error('command not found', id, cmd_data, [...this.pending_cmds.keys()]);
- }
- }
-
- handle_repl_message(event) {
- if (event.source !== this.iframe.contentWindow) return;
-
- const { action, args } = event.data;
-
- if (action === 'cmd_error' || action === 'cmd_ok') {
- this.handle_command_message(event.data);
- }
-
- if (action === 'fetch_progress') {
- this.handlers.on_fetch_progress(args.remaining)
- }
- }
-
- eval(script) {
- return this.iframe_command('eval', { script });
- }
-
- handle_links() {
- return this.iframe_command('catch_clicks', {});
- }
-
- fetch_imports(imports, import_map) {
- return this.iframe_command('fetch_imports', { imports, import_map })
- }
-}
\ No newline at end of file
diff --git a/site/src/components/Repl/Output/Viewer.svelte b/site/src/components/Repl/Output/Viewer.svelte
deleted file mode 100644
index 9e1997b39c..0000000000
--- a/site/src/components/Repl/Output/Viewer.svelte
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-
-
-
-
-
-
- {#if error}
-
- {:else if !$bundle}
- loading Svelte compiler...
- {:else if pending_imports}
- loading {pending_imports} {pending_imports === 1 ? 'dependency' : 'dependencies'} from
- https://bundle.run
- {/if}
-
-
\ No newline at end of file
diff --git a/site/src/components/Repl/Output/getLocationFromStack.js b/site/src/components/Repl/Output/getLocationFromStack.js
deleted file mode 100644
index 3d10fdee98..0000000000
--- a/site/src/components/Repl/Output/getLocationFromStack.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { decode } from 'sourcemap-codec';
-
-export default function getLocationFromStack(stack, map) {
- if (!stack) return;
- const last = stack.split('\n')[1];
- const match = /:(\d+):(\d+)\)$/.exec(last);
-
- if (!match) return null;
-
- const line = +match[1];
- const column = +match[2];
-
- return trace({ line, column }, map);
-}
-
-function trace(loc, map) {
- const mappings = decode(map.mappings);
- const segments = mappings[loc.line - 1];
-
- for (let i = 0; i < segments.length; i += 1) {
- const segment = segments[i];
- if (segment[0] === loc.column) {
- const [, sourceIndex, line, column] = segment;
- const source = map.sources[sourceIndex].slice(2);
-
- return { source, line: line + 1, column };
- }
- }
-
- return null;
-}
diff --git a/site/src/components/Repl/Output/index.svelte b/site/src/components/Repl/Output/index.svelte
deleted file mode 100644
index 2fd1cec8bb..0000000000
--- a/site/src/components/Repl/Output/index.svelte
+++ /dev/null
@@ -1,166 +0,0 @@
-
-
-
-
-
- Result
-
- JS output
-
- CSS output
-
-
-
-
-
-
-
-
-
- {#if embedded}
-
- {:else}
-
-
-
-
-
-
-
- {/if}
-
-
-
-
-
-
\ No newline at end of file
diff --git a/site/src/components/Repl/ReplWidget.svelte b/site/src/components/Repl/ReplWidget.svelte
index d8f3509dc5..e6cbd21537 100644
--- a/site/src/components/Repl/ReplWidget.svelte
+++ b/site/src/components/Repl/ReplWidget.svelte
@@ -1,7 +1,7 @@
-
-
-
-
-
-
-
-
-
-
- {#if !fixed}
-
- {/if}
-
-
-{#if dragging}
-
-{/if}
\ No newline at end of file
diff --git a/site/src/components/Repl/_codemirror.js b/site/src/components/Repl/_codemirror.js
deleted file mode 100644
index 1619ab760c..0000000000
--- a/site/src/components/Repl/_codemirror.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const CodeMirror = require('codemirror');
-require('./codemirror.css');
-require('codemirror/mode/javascript/javascript.js');
-require('codemirror/mode/shell/shell.js');
-require('codemirror/mode/handlebars/handlebars.js');
-require('codemirror/mode/htmlmixed/htmlmixed.js');
-require('codemirror/mode/xml/xml.js');
-require('codemirror/mode/css/css.js');
-
-module.exports = CodeMirror;
diff --git a/site/src/components/Repl/codemirror.css b/site/src/components/Repl/codemirror.css
deleted file mode 100644
index e573122457..0000000000
--- a/site/src/components/Repl/codemirror.css
+++ /dev/null
@@ -1,350 +0,0 @@
-/* BASICS */
-
-.CodeMirror {
- /* copied colors over from prism */
- --background: var(--back-light);
- --base: hsl(45, 7%, 45%);
- --comment: hsl(210, 25%, 60%);
- --keyword: hsl(204, 58%, 45%);
- --function: hsl(19, 67%, 45%);
- --string: hsl(41, 37%, 45%);
- --number: hsl(102, 27%, 50%);
- --tags: var(--function);
- --important: var(--string);
-
- /* Set height, width, borders, and global font properties here */
- /* see prism.css */
- height: 300px;
- direction: ltr;
-}
-
-/* PADDING */
-
-.CodeMirror-lines {
- padding: 4px 0; /* Vertical padding around content */
-}
-.CodeMirror pre {
- padding: 0 4px; /* Horizontal padding of content */
-}
-
-.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
- background-color: white; /* The little square between H and V scrollbars */
-}
-
-/* GUTTER */
-
-.CodeMirror-gutters {
- border-right: 1px solid #ddd;
- background-color: var(--back-light);
- white-space: nowrap;
-}
-.CodeMirror-linenumber {
- padding: 0 3px 0 5px;
- min-width: 20px;
- text-align: right;
- color: var(--comment);
- white-space: nowrap;
- opacity: .6;
-}
-
-.CodeMirror-guttermarker { color: black; }
-.CodeMirror-guttermarker-subtle { color: #999; }
-
-/* CURSOR */
-
-.CodeMirror-cursor {
- border-left: 1px solid black;
- border-right: none;
- width: 0;
-}
-/* Shown when moving in bi-directional text */
-.CodeMirror div.CodeMirror-secondarycursor {
- border-left: 1px solid silver;
-}
-.cm-fat-cursor .CodeMirror-cursor {
- width: auto;
- border: 0 !important;
- background: #7e7;
-}
-.cm-fat-cursor div.CodeMirror-cursors {
- z-index: 1;
-}
-.cm-fat-cursor-mark {
- background-color: rgba(20, 255, 20, .5);
- -webkit-animation: blink 1.06s steps(1) infinite;
- -moz-animation: blink 1.06s steps(1) infinite;
- animation: blink 1.06s steps(1) infinite;
-}
-.cm-animate-fat-cursor {
- width: auto;
- border: 0;
- -webkit-animation: blink 1.06s steps(1) infinite;
- -moz-animation: blink 1.06s steps(1) infinite;
- animation: blink 1.06s steps(1) infinite;
- background-color: #7e7;
-}
-@-moz-keyframes blink {
- 0% {}
- 50% { background-color: transparent; }
- 100% {}
-}
-@-webkit-keyframes blink {
- 0% {}
- 50% { background-color: transparent; }
- 100% {}
-}
-@keyframes blink {
- 0% {}
- 50% { background-color: transparent; }
- 100% {}
-}
-
-.cm-tab { display: inline-block; text-decoration: inherit; }
-
-.CodeMirror-rulers {
- position: absolute;
- left: 0; right: 0; top: -50px; bottom: -20px;
- overflow: hidden;
-}
-.CodeMirror-ruler {
- border-left: 1px solid #ccc;
- top: 0; bottom: 0;
- position: absolute;
-}
-
-/* DEFAULT THEME */
-.cm-s-default .cm-header {color: blue}
-.cm-s-default .cm-quote {color: #090}
-.cm-negative {color: #d44}
-.cm-positive {color: #292}
-.cm-header, .cm-strong {font-weight: bold}
-.cm-em {font-style: italic}
-.cm-link {text-decoration: underline}
-.cm-strikethrough {text-decoration: line-through}
-
-.cm-s-default .cm-atom,
-.cm-s-default .cm-def,
-.cm-s-default .cm-property,
-.cm-s-default .cm-variable-2,
-.cm-s-default .cm-variable-3,
-.cm-s-default .cm-punctuation {color: var(--base)}
-.cm-s-default .cm-hr,
-.cm-s-default .cm-comment {color: var(--comment)}
-.cm-s-default .cm-attribute,
-.cm-s-default .cm-keyword {color: var(--keyword)}
-.cm-s-default .cm-variable,
-.cm-s-default .cm-bracket,
-.cm-s-default .cm-tag {color: var(--tags)}
-.cm-s-default .cm-number {color: var(--number)}
-.cm-s-default .cm-string {color: var(--string)}
-
-.cm-s-default .cm-string-2 {color: #f50}
-.cm-s-default .cm-type {color: #085}
-.cm-s-default .cm-meta {color: #555}
-.cm-s-default .cm-qualifier {color: #555}
-.cm-s-default .cm-builtin {color: #30a}
-.cm-s-default .cm-link {color: var(--flash)}
-.cm-s-default .cm-error {color: #ff008c}
-.cm-invalidchar {color: #ff008c}
-
-.CodeMirror-composing { border-bottom: 2px solid; }
-
-/* Default styles for common addons */
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
-.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
-.CodeMirror-activeline-background {background: #e8f2ff;}
-
-/* STOP */
-
-/* The rest of this file contains styles related to the mechanics of
- the editor. You probably shouldn't touch them. */
-
-.CodeMirror {
- position: relative;
- overflow: hidden;
- background: white;
-}
-
-.CodeMirror-scroll {
- overflow: scroll !important; /* Things will break if this is overridden */
- /* 30px is the magic margin used to hide the element's real scrollbars */
- /* See overflow: hidden in .CodeMirror */
- margin-bottom: -30px; margin-right: -30px;
- padding-bottom: 30px;
- height: 100%;
- outline: none; /* Prevent dragging from highlighting the element */
- position: relative;
-}
-.CodeMirror-sizer {
- position: relative;
- border-right: 30px solid transparent;
-}
-
-/* The fake, visible scrollbars. Used to force redraw during scrolling
- before actual scrolling happens, thus preventing shaking and
- flickering artifacts. */
-.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
- position: absolute;
- z-index: 6;
- display: none;
-}
-.CodeMirror-vscrollbar {
- right: 0; top: 0;
- overflow-x: hidden;
- overflow-y: scroll;
-}
-.CodeMirror-hscrollbar {
- bottom: 0; left: 0;
- overflow-y: hidden;
- overflow-x: scroll;
-}
-.CodeMirror-scrollbar-filler {
- right: 0; bottom: 0;
-}
-.CodeMirror-gutter-filler {
- left: 0; bottom: 0;
-}
-
-.CodeMirror-gutters {
- position: absolute; left: 0; top: 0;
- min-height: 100%;
- z-index: 3;
-}
-.CodeMirror-gutter {
- white-space: normal;
- height: 100%;
- display: inline-block;
- vertical-align: top;
- margin-bottom: -30px;
-}
-.CodeMirror-gutter-wrapper {
- position: absolute;
- z-index: 4;
- background: none !important;
- border: none !important;
-}
-.CodeMirror-gutter-background {
- position: absolute;
- top: 0; bottom: 0;
- z-index: 4;
-}
-.CodeMirror-gutter-elt {
- position: absolute;
- cursor: default;
- z-index: 4;
-}
-.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
-.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
-
-.CodeMirror-lines {
- cursor: text;
- min-height: 1px; /* prevents collapsing before first draw */
-}
-.CodeMirror pre {
- /* Reset some styles that the rest of the page might have set */
- -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
- border-width: 0;
- background: transparent;
- font-family: inherit;
- font-size: inherit;
- margin: 0;
- white-space: pre;
- word-wrap: normal;
- line-height: inherit;
- color: inherit;
- z-index: 2;
- position: relative;
- overflow: visible;
- -webkit-tap-highlight-color: transparent;
- -webkit-font-variant-ligatures: contextual;
- font-variant-ligatures: contextual;
-}
-.CodeMirror-wrap pre {
- word-wrap: break-word;
- white-space: pre-wrap;
- word-break: normal;
-}
-
-.CodeMirror-linebackground {
- position: absolute;
- left: 0; right: 0; top: 0; bottom: 0;
- z-index: 0;
-}
-
-.CodeMirror-linewidget {
- position: relative;
- z-index: 2;
- padding: .1px; /* Force widget margins to stay inside of the container */
-}
-
-.CodeMirror-rtl pre { direction: rtl; }
-
-.CodeMirror-code {
- outline: none;
-}
-
-/* Force content-box sizing for the elements where we expect it */
-.CodeMirror-scroll,
-.CodeMirror-sizer,
-.CodeMirror-gutter,
-.CodeMirror-gutters,
-.CodeMirror-linenumber {
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-.CodeMirror-measure {
- position: absolute;
- width: 100%;
- height: 0;
- overflow: hidden;
- visibility: hidden;
-}
-
-.CodeMirror-cursor {
- position: absolute;
- pointer-events: none;
-}
-.CodeMirror-measure pre { position: static; }
-
-div.CodeMirror-cursors {
- visibility: hidden;
- position: relative;
- z-index: 3;
-}
-div.CodeMirror-dragcursors {
- visibility: visible;
-}
-
-.CodeMirror-focused div.CodeMirror-cursors {
- visibility: visible;
-}
-
-.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
-.CodeMirror-crosshair { cursor: crosshair; }
-.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
-.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
-
-.cm-searching {
- background-color: #ffa;
- background-color: rgba(255, 255, 0, .4);
-}
-
-/* Used to force a border model for a node */
-.cm-force-border { padding-right: .1px; }
-
-@media print {
- /* Hide the cursor when printing */
- .CodeMirror div.CodeMirror-cursors {
- visibility: hidden;
- }
-}
-
-/* See issue #2901 */
-.cm-tab-wrap-hack:after { content: ''; }
-
-/* Help users use markselection to safely style text background */
-span.CodeMirror-selectedtext { background: none; }
diff --git a/site/src/components/Repl/index.svelte b/site/src/components/Repl/index.svelte
deleted file mode 100644
index 40d4f90be4..0000000000
--- a/site/src/components/Repl/index.svelte
+++ /dev/null
@@ -1,232 +0,0 @@
-
-
-
-
-
-
-
diff --git a/site/src/routes/tutorial/[slug]/index.svelte b/site/src/routes/tutorial/[slug]/index.svelte
index df99958d37..d64e3b9b21 100644
--- a/site/src/routes/tutorial/[slug]/index.svelte
+++ b/site/src/routes/tutorial/[slug]/index.svelte
@@ -16,7 +16,7 @@