English
Quick Start
1. Install packages
bash
npm install @templatical/editor @templatical/rendererbash
pnpm add @templatical/editor @templatical/rendererbash
yarn add @templatical/editor @templatical/rendererbash
bun add @templatical/editor @templatical/renderer2. Mount the editor
Paste this into an HTML file and open it. No bundler. Framework and package-manager mounts live on Installation. Pin a version for production — CDN.
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Templatical Editor</title>
<link
rel="stylesheet"
href="https://unpkg.com/@templatical/editor/dist/cdn/editor.css"
/>
<style>
body { margin: 0; }
#editor { height: 100vh; }
</style>
</head>
<body>
<div id="editor"></div>
<script type="module">
import { init } from "https://unpkg.com/@templatical/editor/dist/cdn/editor.js";
const editor = await init({
container: "#editor",
});
const json = editor.getContent();
const mjml = await editor.toMjml();
</script>
</body>
</html>Store json so users can edit later. Compile mjml on the server — toMjml() does not produce HTML.
3. Compile MJML to HTML
On the server, compile the MJML you just posted with any MJML library — Node, PHP, Python, Ruby, and others. How Rendering Works lists them. The Node package is mjml:
bash
npm install mjmlbash
pnpm add mjmlbash
yarn add mjmlbash
bun add mjmlts
import mjml2html from "mjml";
const { html } = mjml2html(mjml);
// html is ready to sendFrom a saved JSON file, without mounting the editor (also needs mjml):
bash
npx -y @templatical/template-tools render template.json --format html -o email.htmlbash
pnpm dlx @templatical/template-tools render template.json --format html -o email.htmlbash
yarn dlx @templatical/template-tools render template.json --format html -o email.htmlbash
bunx @templatical/template-tools render template.json --format html -o email.htmlSee Template Tools.
Shadow DOM by default
The editor mounts inside a Shadow DOM, so host page CSS cannot cascade into editor elements. Use a <div> — or any shadow-host-eligible element — as the container; elements like <table>, <form>, or <input> cannot host a shadow root.
Pass shadowDom: false to opt out if you need an unusual container, target editor internals from document.querySelector, or support Firefox <101 / Safari <16.4. See the Shadow DOM guide for the full trade-off list and theming via :host.
Next steps
- Starting points — embed, backend, prompt, or JSON → HTML.
- Embedding — container rules, stacking, and what breaks host CSS isolation.
- Connect your backend — save, versions, comments, saved blocks, media, test email, render.
- Template Tools — validate, render, import, and live-preview from a CLI or script.
- How Rendering Works — JSON → MJML → HTML, and what to store.