Skip to content

Commit be57da2

Browse files
authored
Merge pull request #17 from binhtran432k/featur/editor
feat: enhance monaco editor
2 parents f30151a + b705f30 commit be57da2

File tree

4 files changed

+71
-2
lines changed

4 files changed

+71
-2
lines changed

packages/www/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
},
4141
"type": "module",
4242
"dependencies": {
43-
"clsx": "^2.1.1"
43+
"clsx": "^2.1.1",
44+
"monaco-editor": "^0.49.0"
4445
}
4546
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<script>
2+
import { onDestroy, onMount } from 'svelte';
3+
4+
/** @type {HTMLDivElement|undefined} */
5+
let divElement;
6+
/** @type {import('monaco-editor')|undefined} */
7+
let monaco;
8+
/** @type {import('monaco-editor').editor.IStandaloneCodeEditor|undefined} */
9+
let editor;
10+
/** @type {import('monaco-editor').editor.IStandaloneEditorConstructionOptions} */
11+
const editorOptions = {
12+
minimap: { enabled: false },
13+
theme: 'vs-dark',
14+
overviewRulerLanes: 0
15+
};
16+
17+
onMount(async () => {
18+
if (!divElement) {
19+
throw new Error('div element is undefined');
20+
}
21+
monaco = (await import('$lib/utils/monaco')).default;
22+
editor = monaco.editor.create(divElement, editorOptions);
23+
editor.setValue('Hello World');
24+
});
25+
26+
onDestroy(() => {
27+
editor?.dispose();
28+
});
29+
</script>
30+
31+
<div class="flex h-full flex-col">
32+
<div bind:this={divElement} id="editor" class="h-full flex-grow overflow-hidden" />
33+
</div>

packages/www/src/lib/utils/monaco.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import * as monaco from 'monaco-editor';
2+
3+
// Import the workers in a production-safe way.
4+
// This is different than in Monaco's documentation for Vite,
5+
// but avoids a weird error ("Unexpected usage") at runtime
6+
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
7+
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
8+
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
9+
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
10+
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
11+
12+
self.MonacoEnvironment = {
13+
getWorker: function (_, label) {
14+
switch (label) {
15+
case 'json':
16+
return new jsonWorker();
17+
case 'css':
18+
case 'scss':
19+
case 'less':
20+
return new cssWorker();
21+
case 'html':
22+
case 'handlebars':
23+
case 'razor':
24+
return new htmlWorker();
25+
case 'typescript':
26+
case 'javascript':
27+
return new tsWorker();
28+
default:
29+
return new editorWorker();
30+
}
31+
}
32+
};
33+
34+
export default monaco;

packages/www/src/routes/+page.svelte

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<script>
2+
import Editor from '$lib/components/Editor.svelte';
23
import Navbar from '$lib/components/Navbar.svelte';
34
</script>
45

56
<div class="flex h-full flex-col overflow-hidden">
67
<Navbar />
7-
TODO: Add body
8+
<Editor />
89
</div>
910

1011
<style>

0 commit comments

Comments
 (0)