π Astro β Code Editor π
Embed code editors for YAML, Markdown, JS / TS, JSONβ¦
Specifically tailored for each language.
Powered by the Monaco Editor + curated languages helpers.
Goal is to simplify configuration in nicely wrapped, type-safe Astro components, with easy access to created instances, browser side, thanks to Custom Elements.
Warning
π§ Work-in-progress.
π¦ Installation
pnpm i astro-code-editor
Supported languages
Because each language can have their set of settings and externally loaded libraries (like language servers, snippets, typingsβ¦), choice has been made to separate them instead of providing a one-size-fit-all editor.
YAML
Using monaco-yaml
with YAML language server under the hood.
Monaco YAML live demo / Repository.
Features advanced JSON schema validation / auto-completion, far superior to remark-lint-frontmatter-schema
(however this one has the advantage of working in VS Code etc.).
Accepts Markdown input value with front matter automatic extraction.
See the component interface.
Markdown
Soonβ¦
JS / TS
Soonβ¦
JSON
Soonβ¦
π Usage
YAML editor
Full working example:
---
// E.g. `src/pages/editor-demos.astro`
import YAMLEditor from 'astro-code-editor/YAMLEditor.astro';
import Layout from '../layouts/Bare.astro';
/* Remote schema URI β Example: JSON Schema core meta schema */
const coreMetaSchemaUrl = 'http://json-schema.org/draft-07/schema#';
/* βORβ from your Astro `public` folder */
const mySchema = '/schemas/my-schema.yaml';
/* You can use Markdown with frontmatter as source too, not only pure YAML */
const initialValue = `---
title: Hello
description: World
---
# Hello
`;
---
<Layout>
<header><h1>Demos page!</h1></header>
<main>
<editor-demos>
<section>
<YAMLEditor
data-yaml-demo-editor
schemaUrlRef={coreMetaSchemaUrl}
value={initialValue}
extractMarkdownFrontmatter
/>
<hr />
<button data-clear>Clear text</button>
</section>
<section>β¦</section>
</editor-demos>
<hr />
<section><em>That's a wrap!</em></section>
</main>
<footer>Β© {new Date().getFullYear()}</footer>
</Layout>
<script>
// Use YAMLEditor Custom Elem. class definition, for type discrimination below
import YAMLEditor from 'astro-code-editor/YAMLEditor.client.js';
// Create a Custom Element for housing our demos (totally optional)
class EditorDemos extends HTMLElement {
connectedCallback() {
const clearButtonElement = this.querySelector('[data-clear]');
if (!(clearButtonElement instanceof HTMLButtonElement)) return;
// Assert the createdMonaco editor + model
const editor = this.querySelector('[data-yaml-demo-editor]');
if (!(editor instanceof YAMLEditor)) return;
const model = editor?.model;
if (!model) return;
// Current instance model methods are now auto-completed in your IDE
// `model: editor.ITextModel`
clearButtonElement.addEventListener('click', () => {
model.setValue(`# CLEARED! ${new Date().toLocaleString()}`);
});
}
}
customElements.define('editor-demos', EditorDemos);
</script>
<style lang="scss">
editor-demos {
display: block;
width: 100%;
& > section {
max-width: 60vw;
margin: 0 auto;
}
// Editors styles
// /!\ Don't forget to set editor dimensions /!\
[data-yaml-demo-editor] {
width: 800px;
height: 600px;
}
}
// Other page stylesβ¦
header {
text-align: center;
padding-bottom: 4rem;
}
footer {
padding-top: 4rem;
text-align: center;
}
main {
width: 100%;
}
</style>