← All packages

@lacspace/email-builder

v1.0.0Mail Kit0 deps

Block-based email template builder: a JSON document of blocks (header, text, image, button, divider, spacer, columns, social, footer, html, quote, list, table) renders to bulletproof table-based responsive email HTML for Outlook desktop, Gmail, Apple Mail and mobile. Inline styles, MSO conditional wrapper, VML buttons, ghost-table columns that stack on mobile, hidden preheader, optional dark mode, brand theming, safe rich-text sanitizer, {{mail-merge}} variables passed through untouched, plain-text alternative, WCAG contrast and Gmail-clipping warnings, a validator, a block schema for editor forms and 9 starter templates. Zero dependencies, isomorphic.

npm i @lacspace/email-builder

Usage

email-builder.ts
import { render, validate, defaultBrand, type Brand } from "@lacspace/email-builder";

const brand: Brand = {
  ...defaultBrand,
  name: "Acme",
  logoUrl: "https://cdn.acme.test/logo.png",
  colors: { primary: "#0f766e", text: "#1f2937", muted: "#6b7280", background: "#f3f4f6", surface: "#ffffff" },
  address: "1 Main Street, Springfield",
};

const doc = {
  brand,
  preheader: "Your invoice {{invoiceNumber}} is ready",
  blocks: [
    { id: "h", type: "header", props: {} },
    { id: "t", type: "text", props: { variant: "h1", content: "Hi {{firstName|there}}" } },
    { id: "p", type: "text", props: { content: "<p>Your invoice is ready. <b>Thank you</b> for your business.</p>" } },
    { id: "b", type: "button", props: { text: "View invoice", url: "{{invoiceUrl}}" } },
    { id: "f", type: "footer", props: {} },
  ],
} as const;

const check = validate(doc);           // { ok, errors: [{ blockId, message }] }
const { html, text, warnings, size } = render(doc, { darkMode: "auto" });

Exports 22

ALLOWED_TAGSDEFAULT_FONTDEFAULT_WIDTHSIZE_WARN_BYTESVAR_REblockSchemablockToTextcontrastRatiodefaultBranddocToTextescapeAttrescapeHtmlhtmlToTextisColorisSafeUrlluminanceparseColorrendersanitizeRichTextstarterTemplatestoHexvalidate

Keywords

emailemail-builderemail-templatehtml-emailresponsive-emailoutlook

More in Mail Kit

@lacspace/email-templates

Compose bulletproof, responsive, dark-mode HTML emails from simple blocks, plus 13 ready-made transactional templates (OTP, verify, password-reset, magic-link, receipt, order, shipping, invitation, digest, announcement). Ships plaintext generation, preheaders and {{var}} i18n interpolation. Zero-dependency, isomorphic.

@lacspace/email-validate

Smart, network-free email validation — RFC-5322 syntax (incl. quoted local parts & IP-literal domains), disposable/temp-mail & role-account detection, free-provider flags, Gmail normalization and 'did you mean?' typo suggestions. Zero-dependency, isomorphic.

@lacspace/email-verify

Best-effort email deliverability for Node — syntax + disposable/role, MX lookup with priority ranking, an optional SMTP RCPT probe (no mail sent), catch-all detection, a 0-100 confidence score, and de-duped batch verification. All DNS/SMTP injectable; zero npm dependencies.

@lacspace/mailer

A tiny zero-dependency SMTP client for Node — send email over raw net/tls with STARTTLS & AUTH, plus a fluent MIME builder (inline images, attachments, alternatives), RFC 5322 address + RFC 2047 helpers, batch send with retry, and no-network test transports. Provider presets (Hostinger, Gmail, Outlook, Zoho…) make setup one line.

@lacspace/imap

Zero-dependency IMAP4rev1 client for Node (RFC 3501 + IDLE, MOVE, UIDPLUS, CONDSTORE, SPECIAL-USE, LIST-EXTENDED, LITERAL+, SASL-IR, QUOTA, ID). Implicit TLS and STARTTLS with verification on, LOGIN / PLAIN / XOAUTH2 / OAUTHBEARER, streaming byte-accurate parser, async-iterable FETCH, envelopes with RFC 2047 decoding, BODYSTRUCTURE trees shared with @lacspace/mime, modified UTF-7 mailbox names, special-use detection (incl. Gmail XLIST and localised names), IDLE with NOOP fallback. Works with Hostinger (Dovecot), Gmail, Outlook/Exchange, GoDaddy.

@lacspace/mime

Isomorphic RFC 5322 / RFC 2045-2049 MIME parser and builder for webmail. parseMime() turns raw mail (string or bytes) into from/to/cc/subject/date/text/html/attachments/inline cid images/priority/List-Unsubscribe one-click and the part tree; handles nested multipart (mixed, alternative, related, report, signed), message/rfc822 forwards, base64 and quoted-printable (tolerant), RFC 2047 encoded words (split multibyte, adjacent whitespace), RFC 2231 parameters, 30+ charsets and malformed input without ever throwing. parseBodyStructure() parses IMAP BODYSTRUCTURE (literals, extension data) into the same tree with IMAP partIds, plus findTextParts / listAttachments / decodePart for lazy fetching. buildMime() writes CRLF messages with encoded-word headers, QP/base64 bodies, mixed/alternative/related nesting, Message-ID generation and header-injection guards; replyHeaders() / forwardSubject() for threading. Pairs with @lacspace/imap and @lacspace/mailer. Zero dependencies; Node 18+, edge runtimes and browsers.