Skip to content

feat: maizzle 6#1708

Open
cossssmin wants to merge 392 commits into
masterfrom
next
Open

feat: maizzle 6#1708
cossssmin wants to merge 392 commits into
masterfrom
next

Conversation

@cossssmin
Copy link
Copy Markdown
Member

@cossssmin cossssmin commented Apr 4, 2026

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

  • Vite build system and dev server
  • Maizzle as a Vite plugin
  • Vue templating with SFCs
  • Tailwind CSS 4
  • Revamped dev UI
  • 30+ built-in components
  • Composables for per-template configuration
  • AI skills for LLMs

Upgrade guide: SOON

Getting started

Scaffold a new project:

npx maizzle new

Or use it as a Vite plugin in an existing project:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import tailwindcss from '@tailwindcss/vite'
import { maizzle } from '@maizzle/framework'

export default defineConfig({
  plugins: [
    vue(),
    tailwindcss(),
    maizzle({
      root: 'resources/js/emails',
      output: {
        path: 'resources/views/emails',
        extension: 'blade.php',
      },
      static: {
        source: ['resources/js/emails/images'],
      },
    }),
  ],
})

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:

<template>
  <Container class="max-w-xl">
    <Section>
      <Row>
        <Column>1</Column>
        <Column>2</Column>
      </Row>
    </Section>
  </Container>
</template>

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() — set url.base per template
  • useUrlQuery() — set url.query per template
  • useTransformers() — toggle the transformer pipeline per template (booleans or granular object)
  • useCurrentTemplate()
  • useEvent() — register events from inside .vue and .md templates

Dev 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:

export default defineConfig({
  server: {
    checks: {
      clients: ['outlook', 'gmail'],
    },
  },
})

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 open
  • Email search matches parent directory names (app/welcomeap w)
  • Order-independent token search (welcome app == app welcome)
  • Result count in footer
  • Quick links to docs, Can I Email, copy code, etc.

Device viewport

Width × height indicators are number inputs — type or scroll to change values. Click × to reset.

QR code

maizzle serve --host prints a QR code for the network URL, scan from your phone instantly.

Misc

  • Auto-imports new components added while the dev server is running
  • Source previews prefetched in the background (instant tab switching)
  • Custom scrollbars, polished resizables, touch drag support, mobile menu

Configuration

CSS

  • css.inline defaults to true
  • css.purge defaults to true
  • css.shorthand defaults to true
  • html.format defaults to true
  • <style raw> skips Tailwind/Lightning CSS compilation
  • <style embed> skips inlining

Build API

The programmatic build() API now takes config directly:

await build({ css: { inline: true } })
await build('./my.config.ts')
await build() // loads maizzle.config.ts from cwd

Markdown layouts

.md templates are wrapped in a built-in MarkdownLayout automatically. Choose a different layout via frontmatter:

---
layout: Layout
title: Welcome
---

# Hello!

Set layout: false to opt out.

Other

  • maizzle prepare postinstall script generates .maizzle/*.d.ts so your editor knows about composables and components before the dev server starts
  • vue.plugins accepts a factory form
  • Liquid-like filters via attributes
  • Auto self-closing tags (<br><br /> based on doctype)
  • Six-hex color transformer (#fff#ffffff)
  • AMP4Email support

AI / Skills

Bundled Maizzle skill for LLMs, plus:

  • Skill for converting React Email components to Maizzle
  • Skill for converting MJML to Maizzle
  • V5 → V6 migration reference

Requirements

Maizzle 6 requires Node.js 22+


Full diff: v5.5.0...v6.0.0

@cossssmin cossssmin changed the title feat: add tailwindcss v4 support feat: maizzle 6 Apr 4, 2026
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
cossssmin added 30 commits May 13, 2026 20:01
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant