Loading...
Loading...
React Email renderer for json-render that turns JSON specs into HTML or plain-text emails using @react-email/components and @react-email/render. Use when working with @json-render/react-email, building transactional or marketing emails from JSON, creating email catalogs, rendering AI-generated email specs, or when the user mentions react-email, HTML email, or transactional email.
npx skill4agent add vercel-labs/json-render json-render-react-emailimport { renderToHtml } from "@json-render/react-email";
import { schema, standardComponentDefinitions } from "@json-render/react-email";
import { defineCatalog } from "@json-render/core";
const catalog = defineCatalog(schema, {
components: standardComponentDefinitions,
});
const spec = {
root: "html-1",
elements: {
"html-1": { type: "Html", props: { lang: "en", dir: "ltr" }, children: ["head-1", "body-1"] },
"head-1": { type: "Head", props: {}, children: [] },
"body-1": {
type: "Body",
props: { style: { backgroundColor: "#f6f9fc" } },
children: ["container-1"],
},
"container-1": {
type: "Container",
props: { style: { maxWidth: "600px", margin: "0 auto", padding: "20px" } },
children: ["heading-1", "text-1"],
},
"heading-1": { type: "Heading", props: { text: "Welcome" }, children: [] },
"text-1": { type: "Text", props: { text: "Thanks for signing up." }, children: [] },
},
};
const html = await renderToHtml(spec);@json-render/reactrootelementsHtmlHtmlHeadBodyContainerBodyimport { defineCatalog } from "@json-render/core";
import { schema, defineRegistry, renderToHtml } from "@json-render/react-email";
import { standardComponentDefinitions } from "@json-render/react-email/catalog";
import { Container, Heading, Text } from "@react-email/components";
import { z } from "zod";
const catalog = defineCatalog(schema, {
components: {
...standardComponentDefinitions,
Alert: {
props: z.object({
message: z.string(),
variant: z.enum(["info", "success", "warning"]).nullable(),
}),
slots: [],
description: "A highlighted message block",
},
},
actions: {},
});
const { registry } = defineRegistry(catalog, {
components: {
Alert: ({ props }) => (
<Container style={{ padding: 16, backgroundColor: "#eff6ff", borderRadius: 8 }}>
<Text style={{ margin: 0 }}>{props.message}</Text>
</Container>
),
},
});
const html = await renderToHtml(spec, { registry });| Function | Purpose |
|---|---|
| Render spec to HTML email string |
| Render spec to plain-text email string |
RenderOptionsregistryincludeStandardstate$state$condvisible$state$condrepeat.statePath@json-render/reactstateRenderOptions@react-email/componentsimport { schema, standardComponentDefinitions } from "@json-render/react-email/server";| Export | Purpose |
|---|---|
| Create type-safe component registry from catalog |
| Render spec in browser (e.g. preview); use with |
| Standalone renderer component with state/actions/validation |
| Server: spec to HTML string |
| Server: spec to plain-text string |
| Email element schema |
| Pre-built component implementations |
| Catalog definitions (Zod props) |
| Path | Purpose |
|---|---|
| Full package |
| Schema and catalog only (no React) |
| Standard component definitions and types |
| Render functions only |
style| Component | Description |
|---|---|
| Root wrapper (lang, dir). Children: Head, Body. |
| Email head section. |
| Body wrapper; use |
| Component | Description |
|---|---|
| Constrain width (e.g. max-width 600px). |
| Group content; table-based for compatibility. |
| Horizontal row. |
| Column in a Row; set width via style. |
| Component | Description |
|---|---|
| Heading text (as: h1–h6). |
| Body text. |
| Hyperlink (text, href). |
| CTA link styled as button (text, href). |
| Image from URL (src, alt, width, height). |
| Horizontal rule. |
| Component | Description |
|---|---|
| Inbox preview text (inside Html). |
| Markdown content as email-safe HTML. |
<style>