json-render-react-email by b-open-io/prompts
npx skills add https://github.com/b-open-io/prompts --skill json-render-react-email将 JSON 规范转换为 HTML 或纯文本邮件输出的 React Email 渲染器。
import { 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/react 相同的扁平元素树:包含 键和 映射。根元素必须是 ; 的子元素应为 和 。在 内部使用 (例如最大宽度 600px)以实现客户端安全的布局。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
rootelementsHtmlHtmlHeadBodyBodyContainerimport { 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 });
| 函数 | 用途 |
|---|---|
renderToHtml(spec, options?) | 将规范渲染为 HTML 邮件字符串 |
renderToPlainText(spec, options?) | 将规范渲染为纯文本邮件字符串 |
RenderOptions: registry, includeStandard (默认 true), state (用于 $state / $cond)。
支持 visible 条件、$state、$cond、重复 (repeat.statePath) 以及与 @json-render/react 相同的表达式语法。在服务端渲染时,在 RenderOptions 中使用 state 以便解析表达式。
无需 React 或 @react-email/components 即可导入 schema 和 catalog:
import { schema, standardComponentDefinitions } from "@json-render/react-email/server";
| 导出项 | 用途 |
|---|---|
defineRegistry | 从目录创建类型安全的组件注册表 |
Renderer | 在浏览器中渲染规范(例如预览);与 JSONUIProvider 一起使用以处理状态/操作 |
createRenderer | 具有状态/操作/验证功能的独立渲染器组件 |
renderToHtml | 服务端:将规范转换为 HTML 字符串 |
renderToPlainText | 服务端:将规范转换为纯文本字符串 |
schema | 邮件元素模式 |
standardComponents | 预构建的组件实现 |
standardComponentDefinitions | 目录定义(Zod 属性) |
| 路径 | 用途 |
|---|---|
@json-render/react-email | 完整包 |
@json-render/react-email/server | 仅包含模式和目录(无 React) |
@json-render/react-email/catalog | 标准组件定义和类型 |
@json-render/react-email/render | 仅包含渲染函数 |
所有组件都接受 style 属性(对象)用于内联样式。为了邮件客户端兼容性,请使用内联样式;避免使用外部 CSS。
| 组件 | 描述 |
|---|---|
Html | 根包装器(lang, dir)。子元素:Head, Body。 |
Head | 邮件头部区域。 |
Body | 正文包装器;使用 style 设置背景。 |
| 组件 | 描述 |
|---|---|
Container | 限制宽度(例如 max-width 600px)。 |
Section | 内容分组;基于表格以实现兼容性。 |
Row | 水平行。 |
Column | Row 中的列;通过 style 设置宽度。 |
| 组件 | 描述 |
|---|---|
Heading | 标题文本(as: h1–h6)。 |
Text | 正文文本。 |
Link | 超链接(text, href)。 |
Button | 样式化为按钮的 CTA 链接(text, href)。 |
Image | 来自 URL 的图片(src, alt, width, height)。 |
Hr | 水平分隔线。 |
| 组件 | 描述 |
|---|---|
Preview | 收件箱预览文本(位于 Html 内部)。 |
Markdown | 作为邮件安全 HTML 的 Markdown 内容。 |
<style> 块。每周安装量
1
代码仓库
GitHub 星标数
8
首次出现
1 天前
安全审计
安装于
windsurf1
amp1
cline1
opencode1
cursor1
kimi-cli1
React Email renderer that converts JSON specs into HTML or plain-text email output.
import { 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);
Same flat element tree as @json-render/react: root key plus elements map. Root must be Html; children of Html should be Head and Body. Use Container (e.g. max-width 600px) inside Body for client-safe layout.
import { 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 |
|---|---|
renderToHtml(spec, options?) | Render spec to HTML email string |
renderToPlainText(spec, options?) | Render spec to plain-text email string |
RenderOptions: registry, includeStandard (default true), state (for $state / $cond).
Supports visible conditions, $state, $cond, repeat (repeat.statePath), and the same expression syntax as @json-render/react. Use state in RenderOptions when rendering server-side so expressions resolve.
Import schema and catalog without React or @react-email/components:
import { schema, standardComponentDefinitions } from "@json-render/react-email/server";
| Export | Purpose |
|---|---|
defineRegistry | Create type-safe component registry from catalog |
Renderer | Render spec in browser (e.g. preview); use with JSONUIProvider for state/actions |
createRenderer | Standalone renderer component with state/actions/validation |
renderToHtml | Server: spec to HTML string |
renderToPlainText | Server: spec to plain-text string |
| Path | Purpose |
|---|---|
@json-render/react-email | Full package |
@json-render/react-email/server | Schema and catalog only (no React) |
@json-render/react-email/catalog | Standard component definitions and types |
@json-render/react-email/render | Render functions only |
All components accept a style prop (object) for inline styles. Use inline styles for email client compatibility; avoid external CSS.
| Component | Description |
|---|---|
Html | Root wrapper (lang, dir). Children: Head, Body. |
Head | Email head section. |
Body | Body wrapper; use style for background. |
| Component | Description |
|---|---|
Container | Constrain width (e.g. max-width 600px). |
Section | Group content; table-based for compatibility. |
Row | Horizontal row. |
Column | Column in a Row; set width via style. |
| Component | Description |
|---|---|
Heading | Heading text (as: h1–h6). |
Text | Body text. |
Link | Hyperlink (text, href). |
Button | CTA link styled as button (text, href). |
Image | Image from URL (src, alt, width, height). |
Hr | Horizontal rule. |
| Component | Description |
|---|---|
Preview | Inbox preview text (inside Html). |
Markdown | Markdown content as email-safe HTML. |
<style> blocks.Weekly Installs
1
Repository
GitHub Stars
8
First Seen
1 day ago
Security Audits
Gen Agent Trust HubPassSocketFailSnykPass
Installed on
windsurf1
amp1
cline1
opencode1
cursor1
kimi-cli1
agent-browser 浏览器自动化工具 - Vercel Labs 命令行网页操作与测试
147,400 周安装
schema| Email element schema |
standardComponents | Pre-built component implementations |
standardComponentDefinitions | Catalog definitions (Zod props) |