🚀  Astro — Code Editor 📝


Embed code editors for YAML, Markdown, JS / TS, JSON… Specifically tailored for each language. Powered by the Monaco Editor and helpers.

Keywords:

  • astro
  • astro-component
  • monaco
  • yaml
  • markdown
  • typescript
  • javascript
  • worker
  • ide
  • language-server

🚀  Astro — Code Editor 📝

NPM Downloads ISC License PRs Welcome
Astro TypeScript Prettier EditorConfig ESLint

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>

Changelog

Change Log

All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.

0.1.1 (2023-01-21)

Note: Version bump only for package astro-code-editor

0.1.0 (2023-01-05)

Features

  • init code editor component (3323bb5)
...

Licenses

Package
Author
License
URL
monaco-editor
Microsoft Corporation
MIT
monaco-yaml
Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)
MIT

⚠️  Having an issue? / 🗣   Wanna share feedback or suggestion?

✍️  Open an Issue or a Pull Request   on GitHub -or-   Contact me   on my Website.