Conversation
add background-position prop, improve dx
increase coverage
wrap in article div with font size
the default, opinionated maizzle layout
renders a <p> tag with default spacing and typography
correct double inline css font-size order
passthrough all juice options
land classes on article div
normalize with Preheader component
Adds `aspect`, `position`, `size`, and `outlookFallback` props to the Img component. When `aspect` is set (or a Tailwind `aspect-*` class is detected), Img renders a padding-bottom + background-image wrapper with role="img" plus a VML `<v:rect>` for Outlook. `size` maps to VML `aspect` (cover → atleast, contain → atmost).
The post-process pass added a space after every `:` and `;`, which broke
URLs in inline style values (`url('https://...')` → `url('https: //...')`)
and forced visual consistency with Juice's spaced output that email
clients don't care about. Dropped the colon/semicolon rewriting and the
trailing-semicolon ensure; kept `preferUnitlessValues` (0px → 0) and
gated its walk on the option being enabled.
The Shiki theme background only landed on the `<pre>`, leaving the td's mso-padding-alt-4 area to show through as white in Outlook — visible as a white frame around dark themes.
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:
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