Conversation
too many issues with remote content, just use your os' screenshotting functionality...
use caniemail data directly, drop outdated caniemail package, improve signal to noise in results
data-embed also still works
use <style raw> to have the contents skip our tailwind pipeline
choose which clients or completely turn it off
rough approximation of how email clients auto-invert colors for their "dark mode"
ctrl+b was firing twice, so there was no value changed in fact
derive mso width from tailwind utilities or inline css
derive mso width from tailwind utilities or inline css
make it also work with just tailwind utilities or inline css width on wrappers
`let counter = 0` in `<script setup>` is compiled into the component's setup function, so it reset on every instance. Container/Section/Column/Overlap all minted `c1`/`s1`/`co1`/`o1` for every render, causing marker IDs to collide. Two `<Container>`s on a page resolved to the same MSO width, etc. Move the counter into a shared `nextId(prefix)` helper in utils.ts where it lives at true module scope.
Co-authored-by: Copilot <copilot@github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Maizzle 6
Holy crap it's finally here! Tailwind CSS 4, Vue templating, Vite plugin and lots more 🥳
Maizzle 6 is a complete framework rewrite. It uses Vite for the build system and dev server, and it can even be used as a Vite plugin in your existing
vite.config.js. We've moved to using Vue for templating: not only do you get a much better DX when coding emails, but the vast Vue ecosystem means you can do a lot more things, and LLMs will now be better at using Maizzle.Given the above, this version is not backwards-compatible with Maizzle 5.
Highlights
Upgrade guide: SOON
Getting started
Scaffold a new project:
When prompted, select the Default starter.
Or use it as a Vite plugin in an existing project:
Laravel
Maizzle 6 detects Laravel projects and auto-configures itself.
Components
Maizzle 6 ships with a generous set of built-in Vue components that you can use without importing.
Skeleton
<Html><Head><Body><Layout><Tailwind>Layout
<Container><Section><Row><Column><Overlap><Spacer><Hr>Use Tailwind utilities directly on any of these. Widths, padding and Outlook fallbacks are computed for you:
You can opt out of Outlook fallback markup with
:outlook-fallback="false"on any of these (cascades to nested components).Content
<Heading><Text><Link><Button><Img><Font><Preheader><Markdown><CodeBlock>and<CodeInline><QrCode>Conditional / utility
<Outlook>and<NotOutlook><NoWidows><OutlookBg><Vml><WithUrl><Raw>Plaintext
Dedicated plaintext components, plus
usePlaintext(options)composable for per-template configuration.Composables
Available inside any
<script setup>:defineConfig()useDoctype()usePlaintext()usePreheader()useBaseUrl()— seturl.baseper templateuseUrlQuery()— seturl.queryper templateuseTransformers()— toggle the transformer pipeline per template (booleans or granular object)useCurrentTemplate()useEvent()— register events from inside.vueand.mdtemplatesDev UI
Completely revamped local dev experience.
Test emails
A Test tab at the bottom of the UI sends actual test emails via Nodemailer. Configure
server.email, or leave it unset to fall back to Ethereal for preview links.Checks (Compatibility + Linter)
Compatibility and linter unified into a single Checks tab. Define which clients to check against, or disable entirely:
Jump-to-editor 🔥
Click any error/warning to open the component or template in your default editor, cursor at the exact line.
Dark mode emulator
Toggle from the command dialog to approximate how email clients auto-invert your colors.
Command palette
Ctrl/Cmd + K(or/) to openapp/welcome→ap w)welcome app==app welcome)Device viewport
Width × height indicators are number inputs — type or scroll to change values. Click
×to reset.QR code
maizzle serve --hostprints a QR code for the network URL, scan from your phone instantly.Misc
Configuration
CSS
css.inlinedefaults totruecss.purgedefaults totruecss.shorthanddefaults totruehtml.formatdefaults totrue<style raw>skips Tailwind/Lightning CSS compilation<style embed>skips inliningBuild API
The programmatic
build()API now takes config directly:Markdown layouts
.mdtemplates are wrapped in a built-inMarkdownLayoutautomatically. Choose a different layout via frontmatter:Set
layout: falseto opt out.Other
maizzle preparepostinstall script generates.maizzle/*.d.tsso your editor knows about composables and components before the dev server startsvue.pluginsaccepts a factory form<br>→<br />based on doctype)#fff→#ffffff)AI / Skills
Bundled Maizzle skill for LLMs, plus:
Requirements
Maizzle 6 requires Node.js 22+
Full diff: v5.5.0...v6.0.0