A production-ready email builder with the extensibility, theming, and backend control that real apps need.
No Pinia, no global plugin install, no directive registration. Every instance owns its own state, so you can mount multiple independent editors on a single page.
defineBlock() pairs a Vue render component, an inspector schema, and an email-safe HTML exporter. Pass them via :blocks or register at runtime with api.registerBlock().
Compose inspector panels from text, number, slider, color, select, align, spacing, border, font, link, image, background, list, and toggle controls.
A 28-token --cvee-* system, per-instance light/dark via the theme prop, and overrides that survive even hostile host CSS (e.g. WordPress admin).
colorMode of 'light' | 'dark' | 'auto' (auto follows the OS), two-way via v-model:colorMode, plus a built-in theme toggle in the top bar.
Insert {{ merge-tag chips in text, heading, and button blocks. Read/write the registry via the API; export keeps {{{name}}} tokens or bakes in fallbacks.
The same rich-text engine exported on its own — fixed or bubble toolbar, optional variables — with no additional package to install.
storage="none" hands persistence to you. Wire onLoad / onSave / onImageUpload and listen to change / export. The design is plain JSON — store it in one column.
Table-based HTML with inlined styles, Outlook (MSO) conditional comments, and mobile media queries. Columns stack on small screens.
Show/hide actions, rename labels, swap the logo via #header-brand, push buttons via #header-actions, or replace the whole bar with #header.
Export email-safe HTML, download or import design JSON, and get a debounced change event (~300ms) for autosave.
Editor styles are marked !important so a host page can't break the layout; tokens flow to portaled UI and pierce a Shadow DOM boundary.