Theme it, register your own blocks and inspector panels, and delegate every save and upload to your backend — all in one self-contained component.
npm i vue-mail-editorDrag a block from the rail, click to edit, tweak it in the inspector. No video, no mockup — the actual component embedded in this page.
A complete email-building experience that stays out of your app's way.
No Pinia, no global setup, no directive registration. Mount several independent editor instances on one page.
Register your own blocks with a render component, an inspector schema, and an email-safe HTML exporter.
Per-instance light/dark tokens via props or --cvee-* CSS variables. Multiple themes coexist on one page.
storage="none" hands persistence to you — onLoad / onSave / onImageUpload plus change & export events.
Table-based HTML with inlined styles, Outlook (MSO) conditionals, and mobile media queries.
Show/hide actions, rename labels, swap the logo, push your own buttons, or replace the bar entirely.
Responsive column layouts that stack on mobile, plus a full set of content blocks — and you can register your own.
Install the package, drop in the component, and bind a v-model. That's a working email editor — drag, drop, style, and export.
npm i vue-mail-editor<script setup lang="ts">
import { ref } from 'vue'
import { EmailEditor } from 'vue-mail-editor'
import 'vue-mail-editor/style.css'
import type { Design } from 'vue-mail-editor'
const design = ref<Design>()
</script>
<template>
<div style="height: 100vh">
<EmailEditor v-model="design" />
</div>
</template>Theming, merge variables, and a standalone editor — all in the same package.
A 28-token --cvee-* system with per-instance light/dark. Override from your app and survive hostile host CSS.
Type {{ to insert merge-tag chips. Read & write the registry via the API and resolve tokens or fallbacks on export.
The same rich-text engine, exported separately — a lightweight editor with no extra package to install.
Grab the API from @ready or a template ref and wire up custom toolbars, autosave, or server rendering.
getDesign()loadDesign(design)newDesign()exportHtml(mode?)getVariables()setVariables(vars)save()export()undo()redo()registerBlock(def)selectBody()Open source, MIT licensed, and Vue 3 native. Install it and you're building.