Skip to content

Troubleshooting ​

Match the symptom to the row before changing anything. Several of these look like a broken build and throw nothing. Container and stacking detail: Embedding.

SymptomCauseWhat to do
No Issues tab or lint badges@templatical/quality is missing or was left out.Add @templatical/quality to your dependencies. If it is present, check lint.disabled and per-tool settings.
Editor renders in a fallback font, or has no layout with shadowDom: false@templatical/editor/style.css was not imported. It loads the editor's Geist font, and with shadowDom: false it is the editor's only stylesheet. The default shadow mount carries its own copy of the editor's CSS. The exports map resolves that subpath to dist/style.css.Import the stylesheet next to init(). Do not install tailwindcss as a peer — it is compiled into that file.
Dialogs clipped, painted under host chrome, or a drag ghost that driftsAn ancestor of the container is a containing block for position: fixed: transform, filter, backdrop-filter, perspective, will-change, contain, isolation, opacity below 1, or a positioned element with z-index.Remove that property from ancestors, or mount outside that stacking context.
Sidebar last items / footer clip, no scrollThe container has no definite height. The editor fills its parent; without one it uses a small anti-collapse floor and chrome still assumes real height.Give the container a real height (100% of a sized parent, or a px/vh value).
Cmd/Ctrl+S and Cmd/Ctrl+Z stay intercepted after leaving the editor's page, or a remounted editor ignores them until clickedinit() is async. A component that unmounts while init() is pending, on a route change or a conditional render, runs its cleanup before the instance exists. The call still mounts its editor, into the removed container, and a cleanup that unmounts only the stored editor never reaches it: its document keydown listener stays registered and takes the shortcuts until a click lands in another editor. In 0.44.0 and earlier, React StrictMode's development re-run does the same.Unmount an instance that resolves after the cleanup ran, as the framework snippets in Installation do.
toHtml() throws / toMjml() asks for a packageThe SDK ships no MJML compiler. toMjml() lazy-imports @templatical/renderer. HTML is any MJML library, render.compileMjml, or template-tools render --format html.Install the renderer peer for MJML. Compile HTML on the server. How Rendering Works.
require('@templatical/editor') failsESM only. No main, no CJS, no UMD.Use import. A CJS-only app needs a bundler that can consume ESM.
Theming tokens vanish after all: initial on the containerInheritance crosses the shadow boundary. Resetting the container wipes --tpl-user-*, which is the theming surface, and can break the height chain.Do not reset the container. The editor already neutralizes host typography at its own root.

The Agent Skill's diagnose mode walks the same table against an existing init() call.