@json-render/react-email 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/{chunk-MPWIHNXF.mjs → chunk-IYFNURUA.mjs} +12 -3
- package/dist/chunk-IYFNURUA.mjs.map +1 -0
- package/dist/{chunk-3YN5NZJ7.mjs → chunk-MXVUJWKL.mjs} +5 -3
- package/dist/chunk-MXVUJWKL.mjs.map +1 -0
- package/dist/index.js +29 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -10
- package/dist/index.mjs.map +1 -1
- package/dist/render.js +9 -2
- package/dist/render.js.map +1 -1
- package/dist/render.mjs +1 -1
- package/dist/server.d.mts +10 -1
- package/dist/server.d.ts +10 -1
- package/dist/server.js +4 -2
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +1 -1
- package/package.json +2 -2
- package/dist/chunk-3YN5NZJ7.mjs.map +0 -1
- package/dist/chunk-MPWIHNXF.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -128,6 +128,8 @@ Both accept an optional second argument with:
|
|
|
128
128
|
- `includeStandard` — Include built-in standard components (default: `true`)
|
|
129
129
|
- `state` — Initial state for `$state` / `$cond` dynamic prop resolution
|
|
130
130
|
|
|
131
|
+
Nested lists can set `repeat.statePath` to `{ "$item": "field" }` to iterate an array on the enclosing repeat item.
|
|
132
|
+
|
|
131
133
|
## Server-Safe Import
|
|
132
134
|
|
|
133
135
|
Import schema and catalog definitions without pulling in React or `@react-email/components`:
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { render } from "@react-email/render";
|
|
3
3
|
import {
|
|
4
4
|
resolveElementProps,
|
|
5
|
+
resolveRepeatItemStatePath,
|
|
6
|
+
resolveRepeatStatePath,
|
|
5
7
|
evaluateVisibility,
|
|
6
8
|
getByPath
|
|
7
9
|
} from "@json-render/core";
|
|
@@ -180,12 +182,19 @@ function renderElement(elementKey, spec, registry, stateModel, repeatItem, repea
|
|
|
180
182
|
const Component = registry[resolvedElement.type];
|
|
181
183
|
if (!Component) return null;
|
|
182
184
|
if (resolvedElement.repeat) {
|
|
183
|
-
const items = getByPath(stateModel, resolvedElement.repeat.statePath) ?? [];
|
|
184
185
|
const repeat = resolvedElement.repeat;
|
|
186
|
+
const statePath = resolveRepeatStatePath(repeat.statePath, repeatBasePath);
|
|
187
|
+
if (statePath === void 0) {
|
|
188
|
+
console.warn(
|
|
189
|
+
"[json-render/react-email] $item in repeat.statePath used outside of a repeat scope"
|
|
190
|
+
);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const items = getByPath(stateModel, statePath) ?? [];
|
|
185
194
|
const fragments = items.map((item, index) => {
|
|
186
195
|
const repeatKey = repeat.key;
|
|
187
196
|
const key = repeatKey && typeof item === "object" && item !== null ? String(item[repeatKey] ?? index) : String(index);
|
|
188
|
-
const childPath =
|
|
197
|
+
const childPath = resolveRepeatItemStatePath(statePath, index);
|
|
189
198
|
const children2 = resolvedElement.children?.map(
|
|
190
199
|
(childKey) => renderElement(
|
|
191
200
|
childKey,
|
|
@@ -250,4 +259,4 @@ export {
|
|
|
250
259
|
renderToHtml,
|
|
251
260
|
renderToPlainText
|
|
252
261
|
};
|
|
253
|
-
//# sourceMappingURL=chunk-
|
|
262
|
+
//# sourceMappingURL=chunk-IYFNURUA.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/render.tsx","../src/components/standard.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"@react-email/render\";\nimport type { Spec, UIElement } from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveRepeatItemStatePath,\n resolveRepeatStatePath,\n evaluateVisibility,\n getByPath,\n type PropResolutionContext,\n} from \"@json-render/core\";\nimport { standardComponents } from \"./components/standard\";\n\n// Re-export the standard components for use in custom registries\nexport { standardComponents };\n\nexport type RenderComponentRegistry = Record<string, React.ComponentType<any>>;\n\nexport interface RenderOptions {\n registry?: RenderComponentRegistry;\n includeStandard?: boolean;\n state?: Record<string, unknown>;\n}\n\nconst noopEmit = () => {};\n\nfunction renderElement(\n elementKey: string,\n spec: Spec,\n registry: RenderComponentRegistry,\n stateModel: Record<string, unknown>,\n repeatItem?: unknown,\n repeatIndex?: number,\n repeatBasePath?: string,\n): React.ReactElement | null {\n const element = spec.elements[elementKey];\n if (!element) return null;\n\n const ctx: PropResolutionContext = {\n stateModel,\n repeatItem,\n repeatIndex,\n repeatBasePath,\n };\n\n if (element.visible !== undefined) {\n if (!evaluateVisibility(element.visible, ctx)) {\n return null;\n }\n }\n\n const resolvedProps = resolveElementProps(\n element.props as Record<string, unknown>,\n ctx,\n );\n const resolvedElement: UIElement = { ...element, props: resolvedProps };\n\n const Component = registry[resolvedElement.type];\n if (!Component) return null;\n\n if (resolvedElement.repeat) {\n const repeat = resolvedElement.repeat;\n const statePath = resolveRepeatStatePath(repeat.statePath, repeatBasePath);\n if (statePath === undefined) {\n console.warn(\n \"[json-render/react-email] $item in repeat.statePath used outside of a repeat scope\",\n );\n return null;\n }\n\n const items =\n (getByPath(stateModel, statePath) as unknown[] | undefined) ?? [];\n\n const fragments = items.map((item, index) => {\n const repeatKey = repeat.key;\n const key =\n repeatKey && typeof item === \"object\" && item !== null\n ? String((item as Record<string, unknown>)[repeatKey] ?? index)\n : String(index);\n\n const childPath = resolveRepeatItemStatePath(statePath, index);\n const children = resolvedElement.children?.map((childKey) =>\n renderElement(\n childKey,\n spec,\n registry,\n stateModel,\n item,\n index,\n childPath,\n ),\n );\n\n return (\n <Component key={key} element={resolvedElement} emit={noopEmit}>\n {children}\n </Component>\n );\n });\n\n return <>{fragments}</>;\n }\n\n const children = resolvedElement.children?.map((childKey) =>\n renderElement(\n childKey,\n spec,\n registry,\n stateModel,\n repeatItem,\n repeatIndex,\n repeatBasePath,\n ),\n );\n\n return (\n <Component key={elementKey} element={resolvedElement} emit={noopEmit}>\n {children && children.length > 0 ? children : undefined}\n </Component>\n );\n}\n\nfunction buildDocument(\n spec: Spec,\n options: RenderOptions = {},\n): React.ReactElement {\n const {\n registry: customRegistry,\n includeStandard = true,\n state = {},\n } = options;\n\n const mergedState: Record<string, unknown> = {\n ...spec.state,\n ...state,\n };\n\n const registry: RenderComponentRegistry = {\n ...(includeStandard ? standardComponents : {}),\n ...customRegistry,\n };\n\n const root = renderElement(spec.root, spec, registry, mergedState);\n if (!root) {\n console.warn(\n `[json-render/react-email] Root element \"${spec.root}\" not found in spec.elements`,\n );\n }\n return root ?? <></>;\n}\n\n/**\n * Render a json-render spec to an HTML email string.\n *\n * This is a standalone server-side function that resolves the spec tree\n * without React hooks or contexts, making it safe to import in Next.js\n * route handlers and other server-only environments.\n */\nexport async function renderToHtml(\n spec: Spec,\n options?: RenderOptions,\n): Promise<string> {\n const document = buildDocument(spec, options);\n return render(document);\n}\n\n/**\n * Render a json-render spec to a plain text email string.\n */\nexport async function renderToPlainText(\n spec: Spec,\n options?: RenderOptions,\n): Promise<string> {\n const document = buildDocument(spec, options);\n return render(document, { plainText: true });\n}\n","import React from \"react\";\nimport {\n Html as EmailHtml,\n Head as EmailHead,\n Body as EmailBody,\n Container as EmailContainer,\n Section as EmailSection,\n Row as EmailRow,\n Column as EmailColumn,\n Heading as EmailHeading,\n Text as EmailText,\n Link as EmailLink,\n Button as EmailButton,\n Img as EmailImg,\n Hr as EmailHr,\n Preview as EmailPreview,\n Markdown as EmailMarkdown,\n} from \"@react-email/components\";\nimport type { ComponentRenderProps } from \"../renderer\";\nimport type { ComponentRegistry } from \"../renderer\";\nimport type { StandardComponentProps } from \"../catalog\";\n\n// =============================================================================\n// Document Structure\n// =============================================================================\n\nfunction HtmlComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Html\">>) {\n const p = element.props;\n\n return (\n <EmailHtml lang={p.lang ?? undefined} dir={p.dir ?? undefined}>\n {children}\n </EmailHtml>\n );\n}\n\nfunction HeadComponent({\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Head\">>) {\n return <EmailHead>{children}</EmailHead>;\n}\n\nfunction BodyComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Body\">>) {\n const p = element.props;\n\n return <EmailBody style={p.style ?? undefined}>{children}</EmailBody>;\n}\n\nfunction ContainerComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Container\">>) {\n const p = element.props;\n\n return (\n <EmailContainer style={p.style ?? undefined}>{children}</EmailContainer>\n );\n}\n\nfunction SectionComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Section\">>) {\n const p = element.props;\n\n return <EmailSection style={p.style ?? undefined}>{children}</EmailSection>;\n}\n\nfunction RowComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Row\">>) {\n const p = element.props;\n\n return <EmailRow style={p.style ?? undefined}>{children}</EmailRow>;\n}\n\nfunction ColumnComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Column\">>) {\n const p = element.props;\n\n return <EmailColumn style={p.style ?? undefined}>{children}</EmailColumn>;\n}\n\n// =============================================================================\n// Content Components\n// =============================================================================\n\nfunction HeadingComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Heading\">>) {\n const p = element.props;\n\n return (\n <EmailHeading as={p.as ?? \"h2\"} style={p.style ?? undefined}>\n {p.text}\n </EmailHeading>\n );\n}\n\nfunction TextComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Text\">>) {\n const p = element.props;\n\n return <EmailText style={p.style ?? undefined}>{p.text}</EmailText>;\n}\n\nfunction LinkComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Link\">>) {\n const p = element.props;\n\n return (\n <EmailLink href={p.href} style={p.style ?? undefined}>\n {p.text}\n </EmailLink>\n );\n}\n\nfunction ButtonComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Button\">>) {\n const p = element.props;\n\n return (\n <EmailButton href={p.href} style={p.style ?? undefined}>\n {p.text}\n </EmailButton>\n );\n}\n\nfunction ImageComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Image\">>) {\n const p = element.props;\n\n return (\n <EmailImg\n src={p.src}\n alt={p.alt ?? undefined}\n width={p.width ?? undefined}\n height={p.height ?? undefined}\n style={p.style ?? undefined}\n />\n );\n}\n\nfunction HrComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Hr\">>) {\n const p = element.props;\n\n return <EmailHr style={p.style ?? undefined} />;\n}\n\n// =============================================================================\n// Utility Components\n// =============================================================================\n\nfunction PreviewComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Preview\">>) {\n const p = element.props;\n\n return <EmailPreview>{p.text}</EmailPreview>;\n}\n\nfunction MarkdownComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Markdown\">>) {\n const p = element.props;\n\n return (\n <EmailMarkdown\n markdownContainerStyles={p.markdownContainerStyles ?? undefined}\n markdownCustomStyles={p.markdownCustomStyles ?? undefined}\n >\n {p.content}\n </EmailMarkdown>\n );\n}\n\n// =============================================================================\n// Registry\n// =============================================================================\n\nexport const standardComponents: ComponentRegistry = {\n Html: HtmlComponent,\n Head: HeadComponent,\n Body: BodyComponent,\n Container: ContainerComponent,\n Section: SectionComponent,\n Row: RowComponent,\n Column: ColumnComponent,\n Heading: HeadingComponent,\n Text: TextComponent,\n Link: LinkComponent,\n Button: ButtonComponent,\n Image: ImageComponent,\n Hr: HrComponent,\n Preview: PreviewComponent,\n Markdown: MarkdownComponent,\n};\n"],"mappings":"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","names":["jsx","children","jsx"]}
|
|
@@ -9,7 +9,8 @@ var schema = defineSchema(
|
|
|
9
9
|
type: s.ref("catalog.components"),
|
|
10
10
|
props: s.propsOf("catalog.components"),
|
|
11
11
|
children: s.array(s.string()),
|
|
12
|
-
visible: s.any()
|
|
12
|
+
visible: { ...s.any(), ...s.optional() },
|
|
13
|
+
repeat: { ...s.any(), ...s.optional() }
|
|
13
14
|
})
|
|
14
15
|
)
|
|
15
16
|
}),
|
|
@@ -33,7 +34,8 @@ var schema = defineSchema(
|
|
|
33
34
|
"Use Preview to set the preview text shown in email client inboxes before opening.",
|
|
34
35
|
"Use Heading (h1-h6) and Text for all text content. Raw strings are not supported.",
|
|
35
36
|
"Button renders as a link styled as a button. Always provide both text and href.",
|
|
36
|
-
"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist."
|
|
37
|
+
"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist.",
|
|
38
|
+
'REQUIRED FIELDS: Every element MUST include a "children" array. Leaf elements (text, badges, inputs, images) use an empty array: "children": []. Omitting "children" fails validation.'
|
|
37
39
|
]
|
|
38
40
|
}
|
|
39
41
|
);
|
|
@@ -41,4 +43,4 @@ var schema = defineSchema(
|
|
|
41
43
|
export {
|
|
42
44
|
schema
|
|
43
45
|
};
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
46
|
+
//# sourceMappingURL=chunk-MXVUJWKL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts"],"sourcesContent":["import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/react-email\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas\n *\n * Reuses the same { root, elements } spec format as the React and React Native renderers.\n */\nexport const schema = defineSchema(\n (s) => ({\n spec: s.object({\n root: s.string(),\n elements: s.record(\n s.object({\n type: s.ref(\"catalog.components\"),\n props: s.propsOf(\"catalog.components\"),\n children: s.array(s.string()),\n visible: { ...s.any(), ...s.optional() },\n repeat: { ...s.any(), ...s.optional() },\n }),\n ),\n }),\n\n catalog: s.object({\n components: s.map({\n props: s.zod(),\n slots: s.array(s.string()),\n description: s.string(),\n example: s.any(),\n }),\n }),\n }),\n {\n defaultRules: [\n \"The root element MUST be an Html component. Its children MUST include Head and Body components.\",\n \"Body should contain a Container component to constrain width (typically 600px max for email clients).\",\n \"All styles MUST be inline. Email clients strip <style> tags, so every component that accepts a style prop should use it for visual customization.\",\n \"Image src must be a fully qualified URL (absolute, not relative). For placeholder images use https://picsum.photos/{width}/{height}?random={n}.\",\n \"Emails are static documents. There are no interactive actions or form inputs.\",\n \"Use Section, Row, and Column for layout. These map to table-based email structures for maximum compatibility.\",\n \"Use Preview to set the preview text shown in email client inboxes before opening.\",\n \"Use Heading (h1-h6) and Text for all text content. Raw strings are not supported.\",\n \"Button renders as a link styled as a button. Always provide both text and href.\",\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist.\",\n 'REQUIRED FIELDS: Every element MUST include a \"children\" array. Leaf elements (text, badges, inputs, images) use an empty array: \"children\": []. Omitting \"children\" fails validation.',\n ],\n },\n);\n\nexport type ReactEmailSchema = typeof schema;\n\nexport type ReactEmailSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n"],"mappings":";AAAA,SAAS,oBAAoB;AAWtB,IAAM,SAAS;AAAA,EACpB,CAAC,OAAO;AAAA,IACN,MAAM,EAAE,OAAO;AAAA,MACb,MAAM,EAAE,OAAO;AAAA,MACf,UAAU,EAAE;AAAA,QACV,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,IAAI,oBAAoB;AAAA,UAChC,OAAO,EAAE,QAAQ,oBAAoB;AAAA,UACrC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,UAC5B,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,SAAS,EAAE;AAAA,UACvC,QAAQ,EAAE,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,SAAS,EAAE;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IAED,SAAS,EAAE,OAAO;AAAA,MAChB,YAAY,EAAE,IAAI;AAAA,QAChB,OAAO,EAAE,IAAI;AAAA,QACb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,QACzB,aAAa,EAAE,OAAO;AAAA,QACtB,SAAS,EAAE,IAAI;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA;AAAA,IACE,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -69,7 +69,8 @@ var schema = (0, import_core.defineSchema)(
|
|
|
69
69
|
type: s.ref("catalog.components"),
|
|
70
70
|
props: s.propsOf("catalog.components"),
|
|
71
71
|
children: s.array(s.string()),
|
|
72
|
-
visible: s.any()
|
|
72
|
+
visible: { ...s.any(), ...s.optional() },
|
|
73
|
+
repeat: { ...s.any(), ...s.optional() }
|
|
73
74
|
})
|
|
74
75
|
)
|
|
75
76
|
}),
|
|
@@ -93,7 +94,8 @@ var schema = (0, import_core.defineSchema)(
|
|
|
93
94
|
"Use Preview to set the preview text shown in email client inboxes before opening.",
|
|
94
95
|
"Use Heading (h1-h6) and Text for all text content. Raw strings are not supported.",
|
|
95
96
|
"Button renders as a link styled as a button. Always provide both text and href.",
|
|
96
|
-
"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist."
|
|
97
|
+
"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist.",
|
|
98
|
+
'REQUIRED FIELDS: Every element MUST include a "children" array. Leaf elements (text, badges, inputs, images) use an empty array: "children": []. Omitting "children" fails validation.'
|
|
97
99
|
]
|
|
98
100
|
}
|
|
99
101
|
);
|
|
@@ -326,9 +328,8 @@ function ActionProvider({
|
|
|
326
328
|
handler,
|
|
327
329
|
setState: set,
|
|
328
330
|
navigate,
|
|
329
|
-
executeAction: async (
|
|
330
|
-
|
|
331
|
-
await execute(subBinding);
|
|
331
|
+
executeAction: async (binding2) => {
|
|
332
|
+
await execute(binding2);
|
|
332
333
|
}
|
|
333
334
|
});
|
|
334
335
|
} finally {
|
|
@@ -347,9 +348,8 @@ function ActionProvider({
|
|
|
347
348
|
handler,
|
|
348
349
|
setState: set,
|
|
349
350
|
navigate,
|
|
350
|
-
executeAction: async (
|
|
351
|
-
|
|
352
|
-
await execute(subBinding);
|
|
351
|
+
executeAction: async (binding2) => {
|
|
352
|
+
await execute(binding2);
|
|
353
353
|
}
|
|
354
354
|
});
|
|
355
355
|
} finally {
|
|
@@ -864,8 +864,18 @@ function RepeatChildren({
|
|
|
864
864
|
fallback
|
|
865
865
|
}) {
|
|
866
866
|
const { state } = useStateStore();
|
|
867
|
+
const parentScope = useRepeatScope();
|
|
867
868
|
const repeat = element.repeat;
|
|
868
|
-
const statePath =
|
|
869
|
+
const statePath = (0, import_core6.resolveRepeatStatePath)(
|
|
870
|
+
repeat.statePath,
|
|
871
|
+
parentScope?.basePath
|
|
872
|
+
);
|
|
873
|
+
if (statePath === void 0) {
|
|
874
|
+
console.warn(
|
|
875
|
+
"[json-render/react-email] $item in repeat.statePath used outside of a repeat scope"
|
|
876
|
+
);
|
|
877
|
+
return null;
|
|
878
|
+
}
|
|
869
879
|
const items = (0, import_core6.getByPath)(state, statePath) ?? [];
|
|
870
880
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_jsx_runtime7.Fragment, { children: items.map((itemValue, index) => {
|
|
871
881
|
const key = repeat.key && typeof itemValue === "object" && itemValue !== null ? String(
|
|
@@ -876,7 +886,7 @@ function RepeatChildren({
|
|
|
876
886
|
{
|
|
877
887
|
item: itemValue,
|
|
878
888
|
index,
|
|
879
|
-
basePath:
|
|
889
|
+
basePath: (0, import_core6.resolveRepeatItemStatePath)(statePath, index),
|
|
880
890
|
children: element.children?.map((childKey) => {
|
|
881
891
|
const childElement = spec.elements[childKey];
|
|
882
892
|
if (!childElement) {
|
|
@@ -1028,12 +1038,19 @@ function renderElement(elementKey, spec, registry, stateModel, repeatItem, repea
|
|
|
1028
1038
|
const Component = registry[resolvedElement.type];
|
|
1029
1039
|
if (!Component) return null;
|
|
1030
1040
|
if (resolvedElement.repeat) {
|
|
1031
|
-
const items = (0, import_core7.getByPath)(stateModel, resolvedElement.repeat.statePath) ?? [];
|
|
1032
1041
|
const repeat = resolvedElement.repeat;
|
|
1042
|
+
const statePath = (0, import_core7.resolveRepeatStatePath)(repeat.statePath, repeatBasePath);
|
|
1043
|
+
if (statePath === void 0) {
|
|
1044
|
+
console.warn(
|
|
1045
|
+
"[json-render/react-email] $item in repeat.statePath used outside of a repeat scope"
|
|
1046
|
+
);
|
|
1047
|
+
return null;
|
|
1048
|
+
}
|
|
1049
|
+
const items = (0, import_core7.getByPath)(stateModel, statePath) ?? [];
|
|
1033
1050
|
const fragments = items.map((item, index) => {
|
|
1034
1051
|
const repeatKey = repeat.key;
|
|
1035
1052
|
const key = repeatKey && typeof item === "object" && item !== null ? String(item[repeatKey] ?? index) : String(index);
|
|
1036
|
-
const childPath =
|
|
1053
|
+
const childPath = (0, import_core7.resolveRepeatItemStatePath)(statePath, index);
|
|
1037
1054
|
const children2 = resolvedElement.children?.map(
|
|
1038
1055
|
(childKey) => renderElement(
|
|
1039
1056
|
childKey,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/schema.ts","../src/contexts/state.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/renderer.tsx","../src/components/standard.tsx","../src/render.tsx","../src/catalog.ts"],"sourcesContent":["// Schema\nexport { schema, type ReactEmailSchema, type ReactEmailSpec } from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec } from \"@json-render/core\";\n\n// Catalog-aware types\nexport type {\n SetState,\n StateModel,\n ComponentContext,\n ComponentFn,\n Components,\n} from \"./catalog-types\";\n\n// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./contexts/repeat-scope\";\n\n// Renderer\nexport {\n defineRegistry,\n type DefineRegistryResult,\n createRenderer,\n type CreateRendererProps,\n type ComponentMap,\n Renderer,\n JSONUIProvider,\n type ComponentRenderProps,\n type ComponentRenderer,\n type ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n\n// Standard components\nexport { standardComponents } from \"./components\";\n\n// Server-side render functions\nexport { renderToHtml, renderToPlainText, type RenderOptions } from \"./render\";\n\n// Catalog definitions\nexport {\n standardComponentDefinitions,\n type StandardComponentDefinitions,\n type StandardComponentProps,\n} from \"./catalog\";\n","import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/react-email\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas\n *\n * Reuses the same { root, elements } spec format as the React and React Native renderers.\n */\nexport const schema = defineSchema(\n (s) => ({\n spec: s.object({\n root: s.string(),\n elements: s.record(\n s.object({\n type: s.ref(\"catalog.components\"),\n props: s.propsOf(\"catalog.components\"),\n children: s.array(s.string()),\n visible: s.any(),\n }),\n ),\n }),\n\n catalog: s.object({\n components: s.map({\n props: s.zod(),\n slots: s.array(s.string()),\n description: s.string(),\n example: s.any(),\n }),\n }),\n }),\n {\n defaultRules: [\n \"The root element MUST be an Html component. Its children MUST include Head and Body components.\",\n \"Body should contain a Container component to constrain width (typically 600px max for email clients).\",\n \"All styles MUST be inline. Email clients strip <style> tags, so every component that accepts a style prop should use it for visual customization.\",\n \"Image src must be a fully qualified URL (absolute, not relative). For placeholder images use https://picsum.photos/{width}/{height}?random={n}.\",\n \"Emails are static documents. There are no interactive actions or form inputs.\",\n \"Use Section, Row, and Column for layout. These map to table-based email structures for maximum compatibility.\",\n \"Use Preview to set the preview text shown in email client inboxes before opening.\",\n \"Use Heading (h1-h6) and Text for all text content. Raw strings are not supported.\",\n \"Button renders as a link styled as a button. Always provide both text and href.\",\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist.\",\n ],\n },\n);\n\nexport type ReactEmailSchema = typeof schema;\n\nexport type ReactEmailSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { getByPath, setByPath, type StateModel } from \"@json-render/core\";\n\nexport interface StateContextValue {\n state: StateModel;\n get: (path: string) => unknown;\n set: (path: string, value: unknown) => void;\n update: (updates: Record<string, unknown>) => void;\n}\n\nconst StateContext = createContext<StateContextValue | null>(null);\n\nexport interface StateProviderProps {\n initialState?: StateModel;\n onStateChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\nexport function StateProvider({\n initialState = {},\n onStateChange,\n children,\n}: StateProviderProps) {\n const [state, setStateInternal] = useState<StateModel>(initialState);\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const initialStateJsonRef = useRef<string>(JSON.stringify(initialState));\n\n useEffect(() => {\n const newJson = JSON.stringify(initialState);\n if (newJson !== initialStateJsonRef.current) {\n initialStateJsonRef.current = newJson;\n if (initialState && Object.keys(initialState).length > 0) {\n setStateInternal((prev) => ({ ...prev, ...initialState }));\n }\n }\n }, [initialState]);\n\n const get = useCallback(\n (path: string) => getByPath(stateRef.current, path),\n [],\n );\n\n const set = useCallback(\n (path: string, value: unknown) => {\n setStateInternal((prev) => {\n const next = { ...prev };\n setByPath(next, path, value);\n return next;\n });\n onStateChange?.(path, value);\n },\n [onStateChange],\n );\n\n const update = useCallback(\n (updates: Record<string, unknown>) => {\n const entries = Object.entries(updates);\n setStateInternal((prev) => {\n const next = { ...prev };\n for (const [path, value] of entries) {\n setByPath(next, path, value);\n }\n return next;\n });\n for (const [path, value] of entries) {\n onStateChange?.(path, value);\n }\n },\n [onStateChange],\n );\n\n const value = useMemo<StateContextValue>(\n () => ({ state, get, set, update }),\n [state, get, set, update],\n );\n\n return (\n <StateContext.Provider value={value}>{children}</StateContext.Provider>\n );\n}\n\nexport function useStateStore(): StateContextValue {\n const ctx = useContext(StateContext);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\n\nexport function useStateValue<T>(path: string): T | undefined {\n const { state } = useStateStore();\n return getByPath(state, path) as T | undefined;\n}\n\nexport function useStateBinding<T>(\n path: string,\n): [T | undefined, (value: T) => void] {\n const { state, set } = useStateStore();\n const value = getByPath(state, path) as T | undefined;\n const setValue = useCallback(\n (newValue: T) => set(path, newValue),\n [path, set],\n );\n return [value, setValue];\n}\n","import React, {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface VisibilityContextValue {\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n ctx: CoreVisibilityContext;\n}\n\nconst VisibilityContext = createContext<VisibilityContextValue | null>(null);\n\nexport interface VisibilityProviderProps {\n children: ReactNode;\n}\n\nexport function VisibilityProvider({ children }: VisibilityProviderProps) {\n const { state } = useStateStore();\n\n const ctx: CoreVisibilityContext = useMemo(\n () => ({ stateModel: state }),\n [state],\n );\n\n const isVisible = useMemo(\n () => (condition: VisibilityCondition | undefined) =>\n evaluateVisibility(condition, ctx),\n [ctx],\n );\n\n const value = useMemo<VisibilityContextValue>(\n () => ({ isVisible, ctx }),\n [isVisible, ctx],\n );\n\n return (\n <VisibilityContext.Provider value={value}>\n {children}\n </VisibilityContext.Provider>\n );\n}\n\nexport function useVisibility(): VisibilityContextValue {\n const ctx = useContext(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): boolean {\n const { isVisible } = useVisibility();\n return isVisible(condition);\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n resolveAction,\n executeAction,\n type ActionBinding,\n type ActionHandler,\n type ActionConfirm,\n type ResolvedAction,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nfunction generateUniqueId(): string {\n return crypto.randomUUID();\n}\n\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n if (value === \"$id\") {\n return generateUniqueId();\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state as string);\n }\n\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\nexport interface ActionContextValue {\n handlers: Record<string, ActionHandler>;\n loadingActions: Set<string>;\n pendingConfirmation: PendingConfirmation | null;\n execute: (binding: ActionBinding) => Promise<void>;\n confirm: () => void;\n cancel: () => void;\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\nexport interface ActionProviderProps {\n handlers?: Record<string, ActionHandler>;\n navigate?: (path: string) => void;\n children: ReactNode;\n}\n\nexport function ActionProvider({\n handlers: initialHandlers = {},\n navigate,\n children,\n}: ActionProviderProps) {\n const { state, get, set } = useStateStore();\n const [handlers, setHandlers] =\n useState<Record<string, ActionHandler>>(initialHandlers);\n const [loadingActions, setLoadingActions] = useState<Set<string>>(new Set());\n const [pendingConfirmation, setPendingConfirmation] =\n useState<PendingConfirmation | null>(null);\n\n const registerHandler = useCallback(\n (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n },\n [],\n );\n\n const execute = useCallback(\n async (binding: ActionBinding) => {\n const resolved = resolveAction(binding, state);\n\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params.clearStatePath as\n | string\n | undefined;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const index = resolved.params.index as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n const handler = handlers[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (name) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (name) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n },\n [state, handlers, get, set, navigate],\n );\n\n const confirm = useCallback(() => {\n pendingConfirmation?.resolve();\n }, [pendingConfirmation]);\n\n const cancel = useCallback(() => {\n pendingConfirmation?.reject();\n }, [pendingConfirmation]);\n\n const value = useMemo<ActionContextValue>(\n () => ({\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n }),\n [\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n ],\n );\n\n return (\n <ActionContext.Provider value={value}>{children}</ActionContext.Provider>\n );\n}\n\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const { execute, loadingActions } = useActions();\n const isLoading = loadingActions.has(binding.action);\n\n const executeAction = useCallback(() => execute(binding), [execute, binding]);\n\n return { execute: executeAction, isLoading };\n}\n\nexport interface ConfirmDialogProps {\n confirm: ActionConfirm;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * No-op confirm dialog for email context. Emails are non-interactive,\n * so confirmations are not rendered.\n */\nexport function ConfirmDialog(_props: ConfirmDialogProps) {\n return null;\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\nexport interface ValidationContextValue {\n customFunctions: Record<string, ValidationFunction>;\n fieldStates: Record<string, FieldValidationState>;\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n touch: (path: string) => void;\n clear: (path: string) => void;\n validateAll: () => boolean;\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\nexport interface ValidationProviderProps {\n customFunctions?: Record<string, ValidationFunction>;\n children: ReactNode;\n}\n\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (\n typeof va === \"object\" &&\n va !== null &&\n typeof vb === \"object\" &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>).$state;\n const sb = (vb as Record<string, unknown>).$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n if (a.validateOn !== b.validateOn) return false;\n\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\nexport function ValidationProvider({\n customFunctions = {},\n children,\n}: ValidationProviderProps) {\n const { state } = useStateStore();\n const [fieldStates, setFieldStates] = useState<\n Record<string, FieldValidationState>\n >({});\n const [fieldConfigs, setFieldConfigs] = useState<\n Record<string, ValidationConfig>\n >({});\n\n const registerField = useCallback(\n (path: string, config: ValidationConfig) => {\n setFieldConfigs((prev) => {\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return { ...prev, [path]: config };\n });\n },\n [],\n );\n\n const validate = useCallback(\n (path: string, config: ValidationConfig): ValidationResult => {\n const segments = path.split(\"/\").filter(Boolean);\n let value: unknown = state;\n for (const seg of segments) {\n if (value != null && typeof value === \"object\") {\n value = (value as Record<string, unknown>)[seg];\n } else {\n value = undefined;\n break;\n }\n }\n const result = runValidation(config, {\n value,\n stateModel: state,\n customFunctions,\n });\n\n setFieldStates((prev) => ({\n ...prev,\n [path]: {\n touched: prev[path]?.touched ?? true,\n validated: true,\n result,\n },\n }));\n\n return result;\n },\n [state, customFunctions],\n );\n\n const touch = useCallback((path: string) => {\n setFieldStates((prev) => ({\n ...prev,\n [path]: {\n ...prev[path],\n touched: true,\n validated: prev[path]?.validated ?? false,\n result: prev[path]?.result ?? null,\n },\n }));\n }, []);\n\n const clear = useCallback((path: string) => {\n setFieldStates((prev) => {\n const { [path]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const validateAll = useCallback(() => {\n let allValid = true;\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n }, [fieldConfigs, validate]);\n\n const value = useMemo<ValidationContextValue>(\n () => ({\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n }),\n [\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n ],\n );\n\n return (\n <ValidationContext.Provider value={value}>\n {children}\n </ValidationContext.Provider>\n );\n}\n\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: FieldValidationState;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: string[];\n isValid: boolean;\n} {\n const {\n fieldStates,\n validate: validateField,\n touch: touchField,\n clear: clearField,\n registerField,\n } = useValidation();\n\n React.useEffect(() => {\n if (config) {\n registerField(path, config);\n }\n }, [path, config, registerField]);\n\n const state = fieldStates[path] ?? {\n touched: false,\n validated: false,\n result: null,\n };\n\n const validate = useCallback(\n () => validateField(path, config ?? { checks: [] }),\n [path, config, validateField],\n );\n\n const touch = useCallback(() => touchField(path), [path, touchField]);\n const clear = useCallback(() => clearField(path), [path, clearField]);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors: state.result?.errors ?? [],\n isValid: state.result?.valid ?? true,\n };\n}\n","import React, { createContext, useContext, type ReactNode } from \"react\";\n\nexport interface RepeatScopeValue {\n item: unknown;\n index: number;\n basePath: string;\n}\n\nconst RepeatScopeContext = createContext<RepeatScopeValue | null>(null);\n\nexport function RepeatScopeProvider({\n item,\n index,\n basePath,\n children,\n}: RepeatScopeValue & { children: ReactNode }) {\n return (\n <RepeatScopeContext.Provider value={{ item, index, basePath }}>\n {children}\n </RepeatScopeContext.Provider>\n );\n}\n\nexport function useRepeatScope(): RepeatScopeValue | null {\n return useContext(RepeatScopeContext);\n}\n","import React, {\n type ComponentType,\n type ErrorInfo,\n type ReactNode,\n useCallback,\n useMemo,\n} from \"react\";\nimport type {\n UIElement,\n Spec,\n ActionBinding,\n Catalog,\n SchemaDefinition,\n} from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveBindings,\n resolveActionParam,\n evaluateVisibility,\n getByPath,\n type PropResolutionContext,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport type { Components, SetState, StateModel } from \"./catalog-types\";\nimport { useIsVisible, useVisibility } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useStateStore } from \"./contexts/state\";\nimport { StateProvider } from \"./contexts/state\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { standardComponents } from \"./components/standard\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n element: UIElement<string, P>;\n children?: ReactNode;\n emit: (event: string) => void;\n bindings?: Record<string, string>;\n loading?: boolean;\n}\n\nexport type ComponentRenderer<P = Record<string, unknown>> = ComponentType<\n ComponentRenderProps<P>\n>;\n\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\nexport interface RendererProps {\n spec: Spec | null;\n registry?: ComponentRegistry;\n includeStandard?: boolean;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\n// =============================================================================\n// ElementErrorBoundary\n// =============================================================================\n\ninterface ElementErrorBoundaryProps {\n elementType: string;\n children: ReactNode;\n}\n\ninterface ElementErrorBoundaryState {\n hasError: boolean;\n}\n\nclass ElementErrorBoundary extends React.Component<\n ElementErrorBoundaryProps,\n ElementErrorBoundaryState\n> {\n constructor(props: ElementErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ElementErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\n `[json-render/react-email] Rendering error in <${this.props.elementType}>:`,\n error,\n info.componentStack,\n );\n }\n\n render() {\n if (this.state.hasError) {\n return null;\n }\n return this.props.children;\n }\n}\n\n// =============================================================================\n// ElementRenderer\n// =============================================================================\n\ninterface ElementRendererProps {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\nconst ElementRenderer = React.memo(function ElementRenderer({\n element,\n spec,\n registry,\n loading,\n fallback,\n}: ElementRendererProps) {\n const repeatScope = useRepeatScope();\n const { ctx } = useVisibility();\n const { execute } = useActions();\n\n const fullCtx: PropResolutionContext = useMemo(\n () =>\n repeatScope\n ? {\n ...ctx,\n repeatItem: repeatScope.item,\n repeatIndex: repeatScope.index,\n repeatBasePath: repeatScope.basePath,\n }\n : ctx,\n [ctx, repeatScope],\n );\n\n const isVisible =\n element.visible === undefined\n ? true\n : evaluateVisibility(element.visible, fullCtx);\n\n const onBindings = element.on;\n const emit = useCallback(\n (eventName: string) => {\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n execute(b);\n continue;\n }\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, fullCtx);\n }\n execute({ ...b, params: resolved });\n }\n },\n [onBindings, execute, fullCtx],\n );\n\n if (!isVisible) {\n return null;\n }\n\n const rawProps = element.props as Record<string, unknown>;\n const elementBindings = resolveBindings(rawProps, fullCtx);\n const resolvedProps = resolveElementProps(rawProps, fullCtx);\n\n const resolvedElement =\n resolvedProps !== element.props\n ? { ...element, props: resolvedProps }\n : element;\n\n const Component = registry[resolvedElement.type] ?? fallback;\n\n if (!Component) {\n console.warn(\n `[json-render/react-email] No renderer for component type: ${resolvedElement.type}`,\n );\n return null;\n }\n\n const children = resolvedElement.repeat ? (\n <RepeatChildren\n element={resolvedElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n ) : (\n resolvedElement.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n if (!loading) {\n console.warn(\n `[json-render/react-email] Missing element \"${childKey}\" referenced as child of \"${resolvedElement.type}\".`,\n );\n }\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n })\n );\n\n return (\n <ElementErrorBoundary elementType={resolvedElement.type}>\n <Component\n element={resolvedElement}\n emit={emit}\n bindings={elementBindings}\n loading={loading}\n >\n {children}\n </Component>\n </ElementErrorBoundary>\n );\n});\n\n// =============================================================================\n// RepeatChildren\n// =============================================================================\n\nfunction RepeatChildren({\n element,\n spec,\n registry,\n loading,\n fallback,\n}: {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}) {\n const { state } = useStateStore();\n const repeat = element.repeat!;\n const statePath = repeat.statePath;\n\n const items = (getByPath(state, statePath) as unknown[] | undefined) ?? [];\n\n return (\n <>\n {items.map((itemValue, index) => {\n const key =\n repeat.key && typeof itemValue === \"object\" && itemValue !== null\n ? String(\n (itemValue as Record<string, unknown>)[repeat.key] ?? index,\n )\n : String(index);\n\n return (\n <RepeatScopeProvider\n key={key}\n item={itemValue}\n index={index}\n basePath={`${statePath}/${index}`}\n >\n {element.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n if (!loading) {\n console.warn(\n `[json-render/react-email] Missing element \"${childKey}\" referenced as child of \"${element.type}\" (repeat).`,\n );\n }\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n })}\n </RepeatScopeProvider>\n );\n })}\n </>\n );\n}\n\n// =============================================================================\n// Renderer\n// =============================================================================\n\nexport function Renderer({\n spec,\n registry: customRegistry,\n includeStandard = true,\n loading,\n fallback,\n}: RendererProps) {\n const registry: ComponentRegistry = useMemo(\n () => ({\n ...(includeStandard ? standardComponents : {}),\n ...customRegistry,\n }),\n [customRegistry, includeStandard],\n );\n\n if (!spec || !spec.root) {\n return null;\n }\n\n const rootElement = spec.elements[spec.root];\n if (!rootElement) {\n return null;\n }\n\n return (\n <ElementRenderer\n element={rootElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n}\n\n// =============================================================================\n// JSONUIProvider\n// =============================================================================\n\nexport interface JSONUIProviderProps {\n initialState?: Record<string, unknown>;\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n navigate?: (path: string) => void;\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n onStateChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\nexport function JSONUIProvider({\n initialState,\n handlers,\n navigate,\n validationFunctions,\n onStateChange,\n children,\n}: JSONUIProviderProps) {\n return (\n <StateProvider initialState={initialState} onStateChange={onStateChange}>\n <VisibilityProvider>\n <ActionProvider handlers={handlers} navigate={navigate}>\n <ValidationProvider customFunctions={validationFunctions}>\n {children}\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\n// =============================================================================\n// defineRegistry\n// =============================================================================\n\nexport interface DefineRegistryResult {\n registry: ComponentRegistry;\n}\n\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: React.ReactNode;\n emit: (event: string) => void;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => React.ReactNode;\n\nexport function defineRegistry<C extends Catalog>(\n _catalog: C,\n options: {\n components?: Components<C>;\n },\n): DefineRegistryResult {\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = ({\n element,\n children,\n emit,\n bindings,\n loading,\n }: ComponentRenderProps) => {\n return (componentFn as DefineRegistryComponentFn)({\n props: element.props,\n children,\n emit,\n bindings,\n loading,\n });\n };\n }\n }\n\n return { registry };\n}\n\n// =============================================================================\n// createRenderer\n// =============================================================================\n\nexport interface CreateRendererProps {\n spec: Spec | null;\n state?: Record<string, unknown>;\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n onStateChange?: (path: string, value: unknown) => void;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: ComponentType<\n ComponentRenderProps<\n TComponents[K][\"props\"] extends { _output: infer O }\n ? O\n : Record<string, unknown>\n >\n >;\n};\n\nexport function createRenderer<\n TDef extends SchemaDefinition,\n TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n catalog: Catalog<TDef, TCatalog>,\n components: ComponentMap<TCatalog[\"components\"]>,\n): ComponentType<CreateRendererProps> {\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n return function CatalogRenderer({\n spec,\n state,\n onAction,\n onStateChange,\n loading,\n fallback,\n }: CreateRendererProps) {\n const actionHandlers = onAction\n ? new Proxy(\n {} as Record<\n string,\n (params: Record<string, unknown>) => void | Promise<void>\n >,\n {\n get: (_target, prop: string) => {\n return (params: Record<string, unknown>) =>\n onAction(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return (\n <StateProvider initialState={state} onStateChange={onStateChange}>\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers}>\n <ValidationProvider>\n <Renderer\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n };\n}\n","import React from \"react\";\nimport {\n Html as EmailHtml,\n Head as EmailHead,\n Body as EmailBody,\n Container as EmailContainer,\n Section as EmailSection,\n Row as EmailRow,\n Column as EmailColumn,\n Heading as EmailHeading,\n Text as EmailText,\n Link as EmailLink,\n Button as EmailButton,\n Img as EmailImg,\n Hr as EmailHr,\n Preview as EmailPreview,\n Markdown as EmailMarkdown,\n} from \"@react-email/components\";\nimport type { ComponentRenderProps } from \"../renderer\";\nimport type { ComponentRegistry } from \"../renderer\";\nimport type { StandardComponentProps } from \"../catalog\";\n\n// =============================================================================\n// Document Structure\n// =============================================================================\n\nfunction HtmlComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Html\">>) {\n const p = element.props;\n\n return (\n <EmailHtml lang={p.lang ?? undefined} dir={p.dir ?? undefined}>\n {children}\n </EmailHtml>\n );\n}\n\nfunction HeadComponent({\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Head\">>) {\n return <EmailHead>{children}</EmailHead>;\n}\n\nfunction BodyComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Body\">>) {\n const p = element.props;\n\n return <EmailBody style={p.style ?? undefined}>{children}</EmailBody>;\n}\n\nfunction ContainerComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Container\">>) {\n const p = element.props;\n\n return (\n <EmailContainer style={p.style ?? undefined}>{children}</EmailContainer>\n );\n}\n\nfunction SectionComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Section\">>) {\n const p = element.props;\n\n return <EmailSection style={p.style ?? undefined}>{children}</EmailSection>;\n}\n\nfunction RowComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Row\">>) {\n const p = element.props;\n\n return <EmailRow style={p.style ?? undefined}>{children}</EmailRow>;\n}\n\nfunction ColumnComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Column\">>) {\n const p = element.props;\n\n return <EmailColumn style={p.style ?? undefined}>{children}</EmailColumn>;\n}\n\n// =============================================================================\n// Content Components\n// =============================================================================\n\nfunction HeadingComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Heading\">>) {\n const p = element.props;\n\n return (\n <EmailHeading as={p.as ?? \"h2\"} style={p.style ?? undefined}>\n {p.text}\n </EmailHeading>\n );\n}\n\nfunction TextComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Text\">>) {\n const p = element.props;\n\n return <EmailText style={p.style ?? undefined}>{p.text}</EmailText>;\n}\n\nfunction LinkComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Link\">>) {\n const p = element.props;\n\n return (\n <EmailLink href={p.href} style={p.style ?? undefined}>\n {p.text}\n </EmailLink>\n );\n}\n\nfunction ButtonComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Button\">>) {\n const p = element.props;\n\n return (\n <EmailButton href={p.href} style={p.style ?? undefined}>\n {p.text}\n </EmailButton>\n );\n}\n\nfunction ImageComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Image\">>) {\n const p = element.props;\n\n return (\n <EmailImg\n src={p.src}\n alt={p.alt ?? undefined}\n width={p.width ?? undefined}\n height={p.height ?? undefined}\n style={p.style ?? undefined}\n />\n );\n}\n\nfunction HrComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Hr\">>) {\n const p = element.props;\n\n return <EmailHr style={p.style ?? undefined} />;\n}\n\n// =============================================================================\n// Utility Components\n// =============================================================================\n\nfunction PreviewComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Preview\">>) {\n const p = element.props;\n\n return <EmailPreview>{p.text}</EmailPreview>;\n}\n\nfunction MarkdownComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Markdown\">>) {\n const p = element.props;\n\n return (\n <EmailMarkdown\n markdownContainerStyles={p.markdownContainerStyles ?? undefined}\n markdownCustomStyles={p.markdownCustomStyles ?? undefined}\n >\n {p.content}\n </EmailMarkdown>\n );\n}\n\n// =============================================================================\n// Registry\n// =============================================================================\n\nexport const standardComponents: ComponentRegistry = {\n Html: HtmlComponent,\n Head: HeadComponent,\n Body: BodyComponent,\n Container: ContainerComponent,\n Section: SectionComponent,\n Row: RowComponent,\n Column: ColumnComponent,\n Heading: HeadingComponent,\n Text: TextComponent,\n Link: LinkComponent,\n Button: ButtonComponent,\n Image: ImageComponent,\n Hr: HrComponent,\n Preview: PreviewComponent,\n Markdown: MarkdownComponent,\n};\n","import React from \"react\";\nimport { render } from \"@react-email/render\";\nimport type { Spec, UIElement } from \"@json-render/core\";\nimport {\n resolveElementProps,\n evaluateVisibility,\n getByPath,\n type PropResolutionContext,\n} from \"@json-render/core\";\nimport { standardComponents } from \"./components/standard\";\n\n// Re-export the standard components for use in custom registries\nexport { standardComponents };\n\nexport type RenderComponentRegistry = Record<string, React.ComponentType<any>>;\n\nexport interface RenderOptions {\n registry?: RenderComponentRegistry;\n includeStandard?: boolean;\n state?: Record<string, unknown>;\n}\n\nconst noopEmit = () => {};\n\nfunction renderElement(\n elementKey: string,\n spec: Spec,\n registry: RenderComponentRegistry,\n stateModel: Record<string, unknown>,\n repeatItem?: unknown,\n repeatIndex?: number,\n repeatBasePath?: string,\n): React.ReactElement | null {\n const element = spec.elements[elementKey];\n if (!element) return null;\n\n const ctx: PropResolutionContext = {\n stateModel,\n repeatItem,\n repeatIndex,\n repeatBasePath,\n };\n\n if (element.visible !== undefined) {\n if (!evaluateVisibility(element.visible, ctx)) {\n return null;\n }\n }\n\n const resolvedProps = resolveElementProps(\n element.props as Record<string, unknown>,\n ctx,\n );\n const resolvedElement: UIElement = { ...element, props: resolvedProps };\n\n const Component = registry[resolvedElement.type];\n if (!Component) return null;\n\n if (resolvedElement.repeat) {\n const items =\n (getByPath(stateModel, resolvedElement.repeat.statePath) as\n | unknown[]\n | undefined) ?? [];\n\n const repeat = resolvedElement.repeat!;\n const fragments = items.map((item, index) => {\n const repeatKey = repeat.key;\n const key =\n repeatKey && typeof item === \"object\" && item !== null\n ? String((item as Record<string, unknown>)[repeatKey] ?? index)\n : String(index);\n\n const childPath = `${repeat.statePath}/${index}`;\n const children = resolvedElement.children?.map((childKey) =>\n renderElement(\n childKey,\n spec,\n registry,\n stateModel,\n item,\n index,\n childPath,\n ),\n );\n\n return (\n <Component key={key} element={resolvedElement} emit={noopEmit}>\n {children}\n </Component>\n );\n });\n\n return <>{fragments}</>;\n }\n\n const children = resolvedElement.children?.map((childKey) =>\n renderElement(\n childKey,\n spec,\n registry,\n stateModel,\n repeatItem,\n repeatIndex,\n repeatBasePath,\n ),\n );\n\n return (\n <Component key={elementKey} element={resolvedElement} emit={noopEmit}>\n {children && children.length > 0 ? children : undefined}\n </Component>\n );\n}\n\nfunction buildDocument(\n spec: Spec,\n options: RenderOptions = {},\n): React.ReactElement {\n const {\n registry: customRegistry,\n includeStandard = true,\n state = {},\n } = options;\n\n const mergedState: Record<string, unknown> = {\n ...spec.state,\n ...state,\n };\n\n const registry: RenderComponentRegistry = {\n ...(includeStandard ? standardComponents : {}),\n ...customRegistry,\n };\n\n const root = renderElement(spec.root, spec, registry, mergedState);\n if (!root) {\n console.warn(\n `[json-render/react-email] Root element \"${spec.root}\" not found in spec.elements`,\n );\n }\n return root ?? <></>;\n}\n\n/**\n * Render a json-render spec to an HTML email string.\n *\n * This is a standalone server-side function that resolves the spec tree\n * without React hooks or contexts, making it safe to import in Next.js\n * route handlers and other server-only environments.\n */\nexport async function renderToHtml(\n spec: Spec,\n options?: RenderOptions,\n): Promise<string> {\n const document = buildDocument(spec, options);\n return render(document);\n}\n\n/**\n * Render a json-render spec to a plain text email string.\n */\nexport async function renderToPlainText(\n spec: Spec,\n options?: RenderOptions,\n): Promise<string> {\n const document = buildDocument(spec, options);\n return render(document, { plainText: true });\n}\n","import { z } from \"zod\";\n\nconst styleSchema = z.record(z.string(), z.any()).nullable();\n\n/**\n * Standard component definitions for React Email catalogs.\n *\n * These define the available email components with their Zod prop schemas.\n * All components render using @react-email/components primitives.\n */\nexport const standardComponentDefinitions = {\n // ==========================================================================\n // Document Structure\n // ==========================================================================\n\n Html: {\n props: z.object({\n lang: z.string().nullable(),\n dir: z.enum([\"ltr\", \"rtl\"]).nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Top-level HTML email wrapper. Must be the root element. Children should include Head and Body.\",\n example: { lang: \"en\", dir: \"ltr\" },\n },\n\n Head: {\n props: z.object({}),\n slots: [\"default\"],\n description:\n \"Email head section. Place inside Html. Can contain metadata but typically left empty.\",\n example: {},\n },\n\n Body: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Email body wrapper. Place inside Html after Head. Contains all visible email content.\",\n example: { style: { backgroundColor: \"#f6f9fc\" } },\n },\n\n Container: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Constrains content width for email clients. Place inside Body. Typically max-width 600px.\",\n example: {\n style: {\n maxWidth: \"600px\",\n margin: \"0 auto\",\n padding: \"20px 0 48px\",\n },\n },\n },\n\n Section: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Groups related content. Renders as a table-based section for email compatibility.\",\n example: { style: { padding: \"24px\", backgroundColor: \"#ffffff\" } },\n },\n\n Row: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Horizontal layout row. Use inside Section for multi-column layouts.\",\n example: { style: {} },\n },\n\n Column: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Column within a Row. Set width via style for proportional layouts.\",\n example: { style: { width: \"50%\" } },\n },\n\n // ==========================================================================\n // Content Components\n // ==========================================================================\n\n Heading: {\n props: z.object({\n text: z.string(),\n as: z.enum([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"]).nullable(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Heading text at various levels. h1 is largest, h6 is smallest.\",\n example: { text: \"Welcome!\", as: \"h1\" },\n },\n\n Text: {\n props: z.object({\n text: z.string(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Body text paragraph. Use style for font size, color, weight, and alignment.\",\n example: { text: \"Thank you for signing up.\" },\n },\n\n Link: {\n props: z.object({\n text: z.string(),\n href: z.string(),\n style: styleSchema,\n }),\n slots: [],\n description: \"Hyperlink with visible text and a URL.\",\n example: {\n text: \"Visit our website\",\n href: \"https://example.com\",\n style: { color: \"#2563eb\" },\n },\n },\n\n Button: {\n props: z.object({\n text: z.string(),\n href: z.string(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Call-to-action button rendered as a link styled as a button. Provide text and href.\",\n example: {\n text: \"Get Started\",\n href: \"https://example.com\",\n style: {\n backgroundColor: \"#5F51E8\",\n borderRadius: \"3px\",\n color: \"#fff\",\n padding: \"12px 20px\",\n },\n },\n },\n\n Image: {\n props: z.object({\n src: z.string(),\n alt: z.string().nullable(),\n width: z.number().nullable(),\n height: z.number().nullable(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Image from a URL. src must be a fully qualified URL. Specify width and height for consistent rendering.\",\n example: {\n src: \"https://picsum.photos/400/200?random=1\",\n alt: \"Hero image\",\n width: 400,\n height: 200,\n },\n },\n\n Hr: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [],\n description: \"Horizontal rule separator between content sections.\",\n example: {\n style: { borderColor: \"#e6ebf1\", margin: \"20px 0\" },\n },\n },\n\n // ==========================================================================\n // Utility Components\n // ==========================================================================\n\n Preview: {\n props: z.object({\n text: z.string(),\n }),\n slots: [],\n description:\n \"Preview text shown in email client inboxes before the email is opened. Place inside Html.\",\n example: { text: \"You have a new message from Acme Corp\" },\n },\n\n Markdown: {\n props: z.object({\n content: z.string(),\n markdownContainerStyles: styleSchema,\n markdownCustomStyles: z.record(z.string(), z.any()).nullable(),\n }),\n slots: [],\n description:\n \"Renders markdown content as email-safe HTML. Supports headings, paragraphs, lists, links, bold, italic, and code.\",\n example: {\n content: \"# Hello\\n\\nThis is **bold** and *italic* text.\",\n },\n },\n};\n\nexport type StandardComponentDefinitions = typeof standardComponentDefinitions;\n\nexport type StandardComponentProps<\n K extends keyof StandardComponentDefinitions,\n> = StandardComponentDefinitions[K][\"props\"] extends { _output: infer O }\n ? O\n : z.output<StandardComponentDefinitions[K][\"props\"]>;\n"],"mappings":"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","names":["import_core","value","import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","value","executeAction","import_react","import_core","import_jsx_runtime","value","React","import_react","import_jsx_runtime","import_react","import_core","import_jsx_runtime","EmailHtml","EmailHead","EmailBody","EmailContainer","EmailSection","EmailRow","EmailColumn","EmailHeading","EmailText","EmailLink","EmailButton","EmailImg","EmailHr","EmailPreview","EmailMarkdown","import_jsx_runtime","React","ElementRenderer","import_core","import_jsx_runtime","children"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schema.ts","../src/contexts/state.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/renderer.tsx","../src/components/standard.tsx","../src/render.tsx","../src/catalog.ts"],"sourcesContent":["// Schema\nexport { schema, type ReactEmailSchema, type ReactEmailSpec } from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec } from \"@json-render/core\";\n\n// Catalog-aware types\nexport type {\n SetState,\n StateModel,\n ComponentContext,\n ComponentFn,\n Components,\n} from \"./catalog-types\";\n\n// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./contexts/repeat-scope\";\n\n// Renderer\nexport {\n defineRegistry,\n type DefineRegistryResult,\n createRenderer,\n type CreateRendererProps,\n type ComponentMap,\n Renderer,\n JSONUIProvider,\n type ComponentRenderProps,\n type ComponentRenderer,\n type ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n\n// Standard components\nexport { standardComponents } from \"./components\";\n\n// Server-side render functions\nexport { renderToHtml, renderToPlainText, type RenderOptions } from \"./render\";\n\n// Catalog definitions\nexport {\n standardComponentDefinitions,\n type StandardComponentDefinitions,\n type StandardComponentProps,\n} from \"./catalog\";\n","import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/react-email\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas\n *\n * Reuses the same { root, elements } spec format as the React and React Native renderers.\n */\nexport const schema = defineSchema(\n (s) => ({\n spec: s.object({\n root: s.string(),\n elements: s.record(\n s.object({\n type: s.ref(\"catalog.components\"),\n props: s.propsOf(\"catalog.components\"),\n children: s.array(s.string()),\n visible: { ...s.any(), ...s.optional() },\n repeat: { ...s.any(), ...s.optional() },\n }),\n ),\n }),\n\n catalog: s.object({\n components: s.map({\n props: s.zod(),\n slots: s.array(s.string()),\n description: s.string(),\n example: s.any(),\n }),\n }),\n }),\n {\n defaultRules: [\n \"The root element MUST be an Html component. Its children MUST include Head and Body components.\",\n \"Body should contain a Container component to constrain width (typically 600px max for email clients).\",\n \"All styles MUST be inline. Email clients strip <style> tags, so every component that accepts a style prop should use it for visual customization.\",\n \"Image src must be a fully qualified URL (absolute, not relative). For placeholder images use https://picsum.photos/{width}/{height}?random={n}.\",\n \"Emails are static documents. There are no interactive actions or form inputs.\",\n \"Use Section, Row, and Column for layout. These map to table-based email structures for maximum compatibility.\",\n \"Use Preview to set the preview text shown in email client inboxes before opening.\",\n \"Use Heading (h1-h6) and Text for all text content. Raw strings are not supported.\",\n \"Button renders as a link styled as a button. Always provide both text and href.\",\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist.\",\n 'REQUIRED FIELDS: Every element MUST include a \"children\" array. Leaf elements (text, badges, inputs, images) use an empty array: \"children\": []. Omitting \"children\" fails validation.',\n ],\n },\n);\n\nexport type ReactEmailSchema = typeof schema;\n\nexport type ReactEmailSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { getByPath, setByPath, type StateModel } from \"@json-render/core\";\n\nexport interface StateContextValue {\n state: StateModel;\n get: (path: string) => unknown;\n set: (path: string, value: unknown) => void;\n update: (updates: Record<string, unknown>) => void;\n}\n\nconst StateContext = createContext<StateContextValue | null>(null);\n\nexport interface StateProviderProps {\n initialState?: StateModel;\n onStateChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\nexport function StateProvider({\n initialState = {},\n onStateChange,\n children,\n}: StateProviderProps) {\n const [state, setStateInternal] = useState<StateModel>(initialState);\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const initialStateJsonRef = useRef<string>(JSON.stringify(initialState));\n\n useEffect(() => {\n const newJson = JSON.stringify(initialState);\n if (newJson !== initialStateJsonRef.current) {\n initialStateJsonRef.current = newJson;\n if (initialState && Object.keys(initialState).length > 0) {\n setStateInternal((prev) => ({ ...prev, ...initialState }));\n }\n }\n }, [initialState]);\n\n const get = useCallback(\n (path: string) => getByPath(stateRef.current, path),\n [],\n );\n\n const set = useCallback(\n (path: string, value: unknown) => {\n setStateInternal((prev) => {\n const next = { ...prev };\n setByPath(next, path, value);\n return next;\n });\n onStateChange?.(path, value);\n },\n [onStateChange],\n );\n\n const update = useCallback(\n (updates: Record<string, unknown>) => {\n const entries = Object.entries(updates);\n setStateInternal((prev) => {\n const next = { ...prev };\n for (const [path, value] of entries) {\n setByPath(next, path, value);\n }\n return next;\n });\n for (const [path, value] of entries) {\n onStateChange?.(path, value);\n }\n },\n [onStateChange],\n );\n\n const value = useMemo<StateContextValue>(\n () => ({ state, get, set, update }),\n [state, get, set, update],\n );\n\n return (\n <StateContext.Provider value={value}>{children}</StateContext.Provider>\n );\n}\n\nexport function useStateStore(): StateContextValue {\n const ctx = useContext(StateContext);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\n\nexport function useStateValue<T>(path: string): T | undefined {\n const { state } = useStateStore();\n return getByPath(state, path) as T | undefined;\n}\n\nexport function useStateBinding<T>(\n path: string,\n): [T | undefined, (value: T) => void] {\n const { state, set } = useStateStore();\n const value = getByPath(state, path) as T | undefined;\n const setValue = useCallback(\n (newValue: T) => set(path, newValue),\n [path, set],\n );\n return [value, setValue];\n}\n","import React, {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface VisibilityContextValue {\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n ctx: CoreVisibilityContext;\n}\n\nconst VisibilityContext = createContext<VisibilityContextValue | null>(null);\n\nexport interface VisibilityProviderProps {\n children: ReactNode;\n}\n\nexport function VisibilityProvider({ children }: VisibilityProviderProps) {\n const { state } = useStateStore();\n\n const ctx: CoreVisibilityContext = useMemo(\n () => ({ stateModel: state }),\n [state],\n );\n\n const isVisible = useMemo(\n () => (condition: VisibilityCondition | undefined) =>\n evaluateVisibility(condition, ctx),\n [ctx],\n );\n\n const value = useMemo<VisibilityContextValue>(\n () => ({ isVisible, ctx }),\n [isVisible, ctx],\n );\n\n return (\n <VisibilityContext.Provider value={value}>\n {children}\n </VisibilityContext.Provider>\n );\n}\n\nexport function useVisibility(): VisibilityContextValue {\n const ctx = useContext(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): boolean {\n const { isVisible } = useVisibility();\n return isVisible(condition);\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n resolveAction,\n executeAction,\n type ActionBinding,\n type ActionHandler,\n type ActionConfirm,\n type ResolvedAction,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nfunction generateUniqueId(): string {\n return crypto.randomUUID();\n}\n\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n if (value === \"$id\") {\n return generateUniqueId();\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state as string);\n }\n\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\nexport interface ActionContextValue {\n handlers: Record<string, ActionHandler>;\n loadingActions: Set<string>;\n pendingConfirmation: PendingConfirmation | null;\n execute: (binding: ActionBinding) => Promise<void>;\n confirm: () => void;\n cancel: () => void;\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\nexport interface ActionProviderProps {\n handlers?: Record<string, ActionHandler>;\n navigate?: (path: string) => void;\n children: ReactNode;\n}\n\nexport function ActionProvider({\n handlers: initialHandlers = {},\n navigate,\n children,\n}: ActionProviderProps) {\n const { state, get, set } = useStateStore();\n const [handlers, setHandlers] =\n useState<Record<string, ActionHandler>>(initialHandlers);\n const [loadingActions, setLoadingActions] = useState<Set<string>>(new Set());\n const [pendingConfirmation, setPendingConfirmation] =\n useState<PendingConfirmation | null>(null);\n\n const registerHandler = useCallback(\n (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n },\n [],\n );\n\n const execute = useCallback(\n async (binding: ActionBinding) => {\n const resolved = resolveAction(binding, state);\n\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params.clearStatePath as\n | string\n | undefined;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const index = resolved.params.index as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n const handler = handlers[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n },\n [state, handlers, get, set, navigate],\n );\n\n const confirm = useCallback(() => {\n pendingConfirmation?.resolve();\n }, [pendingConfirmation]);\n\n const cancel = useCallback(() => {\n pendingConfirmation?.reject();\n }, [pendingConfirmation]);\n\n const value = useMemo<ActionContextValue>(\n () => ({\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n }),\n [\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n ],\n );\n\n return (\n <ActionContext.Provider value={value}>{children}</ActionContext.Provider>\n );\n}\n\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const { execute, loadingActions } = useActions();\n const isLoading = loadingActions.has(binding.action);\n\n const executeAction = useCallback(() => execute(binding), [execute, binding]);\n\n return { execute: executeAction, isLoading };\n}\n\nexport interface ConfirmDialogProps {\n confirm: ActionConfirm;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * No-op confirm dialog for email context. Emails are non-interactive,\n * so confirmations are not rendered.\n */\nexport function ConfirmDialog(_props: ConfirmDialogProps) {\n return null;\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\nexport interface ValidationContextValue {\n customFunctions: Record<string, ValidationFunction>;\n fieldStates: Record<string, FieldValidationState>;\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n touch: (path: string) => void;\n clear: (path: string) => void;\n validateAll: () => boolean;\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\nexport interface ValidationProviderProps {\n customFunctions?: Record<string, ValidationFunction>;\n children: ReactNode;\n}\n\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (\n typeof va === \"object\" &&\n va !== null &&\n typeof vb === \"object\" &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>).$state;\n const sb = (vb as Record<string, unknown>).$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n if (a.validateOn !== b.validateOn) return false;\n\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\nexport function ValidationProvider({\n customFunctions = {},\n children,\n}: ValidationProviderProps) {\n const { state } = useStateStore();\n const [fieldStates, setFieldStates] = useState<\n Record<string, FieldValidationState>\n >({});\n const [fieldConfigs, setFieldConfigs] = useState<\n Record<string, ValidationConfig>\n >({});\n\n const registerField = useCallback(\n (path: string, config: ValidationConfig) => {\n setFieldConfigs((prev) => {\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return { ...prev, [path]: config };\n });\n },\n [],\n );\n\n const validate = useCallback(\n (path: string, config: ValidationConfig): ValidationResult => {\n const segments = path.split(\"/\").filter(Boolean);\n let value: unknown = state;\n for (const seg of segments) {\n if (value != null && typeof value === \"object\") {\n value = (value as Record<string, unknown>)[seg];\n } else {\n value = undefined;\n break;\n }\n }\n const result = runValidation(config, {\n value,\n stateModel: state,\n customFunctions,\n });\n\n setFieldStates((prev) => ({\n ...prev,\n [path]: {\n touched: prev[path]?.touched ?? true,\n validated: true,\n result,\n },\n }));\n\n return result;\n },\n [state, customFunctions],\n );\n\n const touch = useCallback((path: string) => {\n setFieldStates((prev) => ({\n ...prev,\n [path]: {\n ...prev[path],\n touched: true,\n validated: prev[path]?.validated ?? false,\n result: prev[path]?.result ?? null,\n },\n }));\n }, []);\n\n const clear = useCallback((path: string) => {\n setFieldStates((prev) => {\n const { [path]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const validateAll = useCallback(() => {\n let allValid = true;\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n }, [fieldConfigs, validate]);\n\n const value = useMemo<ValidationContextValue>(\n () => ({\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n }),\n [\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n ],\n );\n\n return (\n <ValidationContext.Provider value={value}>\n {children}\n </ValidationContext.Provider>\n );\n}\n\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: FieldValidationState;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: string[];\n isValid: boolean;\n} {\n const {\n fieldStates,\n validate: validateField,\n touch: touchField,\n clear: clearField,\n registerField,\n } = useValidation();\n\n React.useEffect(() => {\n if (config) {\n registerField(path, config);\n }\n }, [path, config, registerField]);\n\n const state = fieldStates[path] ?? {\n touched: false,\n validated: false,\n result: null,\n };\n\n const validate = useCallback(\n () => validateField(path, config ?? { checks: [] }),\n [path, config, validateField],\n );\n\n const touch = useCallback(() => touchField(path), [path, touchField]);\n const clear = useCallback(() => clearField(path), [path, clearField]);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors: state.result?.errors ?? [],\n isValid: state.result?.valid ?? true,\n };\n}\n","import React, { createContext, useContext, type ReactNode } from \"react\";\n\nexport interface RepeatScopeValue {\n item: unknown;\n index: number;\n basePath: string;\n}\n\nconst RepeatScopeContext = createContext<RepeatScopeValue | null>(null);\n\nexport function RepeatScopeProvider({\n item,\n index,\n basePath,\n children,\n}: RepeatScopeValue & { children: ReactNode }) {\n return (\n <RepeatScopeContext.Provider value={{ item, index, basePath }}>\n {children}\n </RepeatScopeContext.Provider>\n );\n}\n\nexport function useRepeatScope(): RepeatScopeValue | null {\n return useContext(RepeatScopeContext);\n}\n","import React, {\n type ComponentType,\n type ErrorInfo,\n type ReactNode,\n useCallback,\n useMemo,\n} from \"react\";\nimport type {\n UIElement,\n Spec,\n ActionBinding,\n Catalog,\n SchemaDefinition,\n} from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveBindings,\n resolveActionParam,\n resolveRepeatItemStatePath,\n resolveRepeatStatePath,\n evaluateVisibility,\n getByPath,\n type PropResolutionContext,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport type { Components, SetState, StateModel } from \"./catalog-types\";\nimport { useIsVisible, useVisibility } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useStateStore } from \"./contexts/state\";\nimport { StateProvider } from \"./contexts/state\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { standardComponents } from \"./components/standard\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n element: UIElement<string, P>;\n children?: ReactNode;\n emit: (event: string) => void;\n bindings?: Record<string, string>;\n loading?: boolean;\n}\n\nexport type ComponentRenderer<P = Record<string, unknown>> = ComponentType<\n ComponentRenderProps<P>\n>;\n\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\nexport interface RendererProps {\n spec: Spec | null;\n registry?: ComponentRegistry;\n includeStandard?: boolean;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\n// =============================================================================\n// ElementErrorBoundary\n// =============================================================================\n\ninterface ElementErrorBoundaryProps {\n elementType: string;\n children: ReactNode;\n}\n\ninterface ElementErrorBoundaryState {\n hasError: boolean;\n}\n\nclass ElementErrorBoundary extends React.Component<\n ElementErrorBoundaryProps,\n ElementErrorBoundaryState\n> {\n constructor(props: ElementErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ElementErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\n `[json-render/react-email] Rendering error in <${this.props.elementType}>:`,\n error,\n info.componentStack,\n );\n }\n\n render() {\n if (this.state.hasError) {\n return null;\n }\n return this.props.children;\n }\n}\n\n// =============================================================================\n// ElementRenderer\n// =============================================================================\n\ninterface ElementRendererProps {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\nconst ElementRenderer = React.memo(function ElementRenderer({\n element,\n spec,\n registry,\n loading,\n fallback,\n}: ElementRendererProps) {\n const repeatScope = useRepeatScope();\n const { ctx } = useVisibility();\n const { execute } = useActions();\n\n const fullCtx: PropResolutionContext = useMemo(\n () =>\n repeatScope\n ? {\n ...ctx,\n repeatItem: repeatScope.item,\n repeatIndex: repeatScope.index,\n repeatBasePath: repeatScope.basePath,\n }\n : ctx,\n [ctx, repeatScope],\n );\n\n const isVisible =\n element.visible === undefined\n ? true\n : evaluateVisibility(element.visible, fullCtx);\n\n const onBindings = element.on;\n const emit = useCallback(\n (eventName: string) => {\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n execute(b);\n continue;\n }\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, fullCtx);\n }\n execute({ ...b, params: resolved });\n }\n },\n [onBindings, execute, fullCtx],\n );\n\n if (!isVisible) {\n return null;\n }\n\n const rawProps = element.props as Record<string, unknown>;\n const elementBindings = resolveBindings(rawProps, fullCtx);\n const resolvedProps = resolveElementProps(rawProps, fullCtx);\n\n const resolvedElement =\n resolvedProps !== element.props\n ? { ...element, props: resolvedProps }\n : element;\n\n const Component = registry[resolvedElement.type] ?? fallback;\n\n if (!Component) {\n console.warn(\n `[json-render/react-email] No renderer for component type: ${resolvedElement.type}`,\n );\n return null;\n }\n\n const children = resolvedElement.repeat ? (\n <RepeatChildren\n element={resolvedElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n ) : (\n resolvedElement.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n if (!loading) {\n console.warn(\n `[json-render/react-email] Missing element \"${childKey}\" referenced as child of \"${resolvedElement.type}\".`,\n );\n }\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n })\n );\n\n return (\n <ElementErrorBoundary elementType={resolvedElement.type}>\n <Component\n element={resolvedElement}\n emit={emit}\n bindings={elementBindings}\n loading={loading}\n >\n {children}\n </Component>\n </ElementErrorBoundary>\n );\n});\n\n// =============================================================================\n// RepeatChildren\n// =============================================================================\n\nfunction RepeatChildren({\n element,\n spec,\n registry,\n loading,\n fallback,\n}: {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}) {\n const { state } = useStateStore();\n const parentScope = useRepeatScope();\n const repeat = element.repeat!;\n const statePath = resolveRepeatStatePath(\n repeat.statePath,\n parentScope?.basePath,\n );\n if (statePath === undefined) {\n console.warn(\n \"[json-render/react-email] $item in repeat.statePath used outside of a repeat scope\",\n );\n return null;\n }\n\n const items = (getByPath(state, statePath) as unknown[] | undefined) ?? [];\n\n return (\n <>\n {items.map((itemValue, index) => {\n const key =\n repeat.key && typeof itemValue === \"object\" && itemValue !== null\n ? String(\n (itemValue as Record<string, unknown>)[repeat.key] ?? index,\n )\n : String(index);\n\n return (\n <RepeatScopeProvider\n key={key}\n item={itemValue}\n index={index}\n basePath={resolveRepeatItemStatePath(statePath, index)}\n >\n {element.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n if (!loading) {\n console.warn(\n `[json-render/react-email] Missing element \"${childKey}\" referenced as child of \"${element.type}\" (repeat).`,\n );\n }\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n })}\n </RepeatScopeProvider>\n );\n })}\n </>\n );\n}\n\n// =============================================================================\n// Renderer\n// =============================================================================\n\nexport function Renderer({\n spec,\n registry: customRegistry,\n includeStandard = true,\n loading,\n fallback,\n}: RendererProps) {\n const registry: ComponentRegistry = useMemo(\n () => ({\n ...(includeStandard ? standardComponents : {}),\n ...customRegistry,\n }),\n [customRegistry, includeStandard],\n );\n\n if (!spec || !spec.root) {\n return null;\n }\n\n const rootElement = spec.elements[spec.root];\n if (!rootElement) {\n return null;\n }\n\n return (\n <ElementRenderer\n element={rootElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n}\n\n// =============================================================================\n// JSONUIProvider\n// =============================================================================\n\nexport interface JSONUIProviderProps {\n initialState?: Record<string, unknown>;\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n navigate?: (path: string) => void;\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n onStateChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\nexport function JSONUIProvider({\n initialState,\n handlers,\n navigate,\n validationFunctions,\n onStateChange,\n children,\n}: JSONUIProviderProps) {\n return (\n <StateProvider initialState={initialState} onStateChange={onStateChange}>\n <VisibilityProvider>\n <ActionProvider handlers={handlers} navigate={navigate}>\n <ValidationProvider customFunctions={validationFunctions}>\n {children}\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\n// =============================================================================\n// defineRegistry\n// =============================================================================\n\nexport interface DefineRegistryResult {\n registry: ComponentRegistry;\n}\n\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: React.ReactNode;\n emit: (event: string) => void;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => React.ReactNode;\n\nexport function defineRegistry<C extends Catalog>(\n _catalog: C,\n options: {\n components?: Components<C>;\n },\n): DefineRegistryResult {\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = ({\n element,\n children,\n emit,\n bindings,\n loading,\n }: ComponentRenderProps) => {\n return (componentFn as DefineRegistryComponentFn)({\n props: element.props,\n children,\n emit,\n bindings,\n loading,\n });\n };\n }\n }\n\n return { registry };\n}\n\n// =============================================================================\n// createRenderer\n// =============================================================================\n\nexport interface CreateRendererProps {\n spec: Spec | null;\n state?: Record<string, unknown>;\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n onStateChange?: (path: string, value: unknown) => void;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: ComponentType<\n ComponentRenderProps<\n TComponents[K][\"props\"] extends { _output: infer O }\n ? O\n : Record<string, unknown>\n >\n >;\n};\n\nexport function createRenderer<\n TDef extends SchemaDefinition,\n TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n catalog: Catalog<TDef, TCatalog>,\n components: ComponentMap<TCatalog[\"components\"]>,\n): ComponentType<CreateRendererProps> {\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n return function CatalogRenderer({\n spec,\n state,\n onAction,\n onStateChange,\n loading,\n fallback,\n }: CreateRendererProps) {\n const actionHandlers = onAction\n ? new Proxy(\n {} as Record<\n string,\n (params: Record<string, unknown>) => void | Promise<void>\n >,\n {\n get: (_target, prop: string) => {\n return (params: Record<string, unknown>) =>\n onAction(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return (\n <StateProvider initialState={state} onStateChange={onStateChange}>\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers}>\n <ValidationProvider>\n <Renderer\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n };\n}\n","import React from \"react\";\nimport {\n Html as EmailHtml,\n Head as EmailHead,\n Body as EmailBody,\n Container as EmailContainer,\n Section as EmailSection,\n Row as EmailRow,\n Column as EmailColumn,\n Heading as EmailHeading,\n Text as EmailText,\n Link as EmailLink,\n Button as EmailButton,\n Img as EmailImg,\n Hr as EmailHr,\n Preview as EmailPreview,\n Markdown as EmailMarkdown,\n} from \"@react-email/components\";\nimport type { ComponentRenderProps } from \"../renderer\";\nimport type { ComponentRegistry } from \"../renderer\";\nimport type { StandardComponentProps } from \"../catalog\";\n\n// =============================================================================\n// Document Structure\n// =============================================================================\n\nfunction HtmlComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Html\">>) {\n const p = element.props;\n\n return (\n <EmailHtml lang={p.lang ?? undefined} dir={p.dir ?? undefined}>\n {children}\n </EmailHtml>\n );\n}\n\nfunction HeadComponent({\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Head\">>) {\n return <EmailHead>{children}</EmailHead>;\n}\n\nfunction BodyComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Body\">>) {\n const p = element.props;\n\n return <EmailBody style={p.style ?? undefined}>{children}</EmailBody>;\n}\n\nfunction ContainerComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Container\">>) {\n const p = element.props;\n\n return (\n <EmailContainer style={p.style ?? undefined}>{children}</EmailContainer>\n );\n}\n\nfunction SectionComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Section\">>) {\n const p = element.props;\n\n return <EmailSection style={p.style ?? undefined}>{children}</EmailSection>;\n}\n\nfunction RowComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Row\">>) {\n const p = element.props;\n\n return <EmailRow style={p.style ?? undefined}>{children}</EmailRow>;\n}\n\nfunction ColumnComponent({\n element,\n children,\n}: ComponentRenderProps<StandardComponentProps<\"Column\">>) {\n const p = element.props;\n\n return <EmailColumn style={p.style ?? undefined}>{children}</EmailColumn>;\n}\n\n// =============================================================================\n// Content Components\n// =============================================================================\n\nfunction HeadingComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Heading\">>) {\n const p = element.props;\n\n return (\n <EmailHeading as={p.as ?? \"h2\"} style={p.style ?? undefined}>\n {p.text}\n </EmailHeading>\n );\n}\n\nfunction TextComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Text\">>) {\n const p = element.props;\n\n return <EmailText style={p.style ?? undefined}>{p.text}</EmailText>;\n}\n\nfunction LinkComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Link\">>) {\n const p = element.props;\n\n return (\n <EmailLink href={p.href} style={p.style ?? undefined}>\n {p.text}\n </EmailLink>\n );\n}\n\nfunction ButtonComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Button\">>) {\n const p = element.props;\n\n return (\n <EmailButton href={p.href} style={p.style ?? undefined}>\n {p.text}\n </EmailButton>\n );\n}\n\nfunction ImageComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Image\">>) {\n const p = element.props;\n\n return (\n <EmailImg\n src={p.src}\n alt={p.alt ?? undefined}\n width={p.width ?? undefined}\n height={p.height ?? undefined}\n style={p.style ?? undefined}\n />\n );\n}\n\nfunction HrComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Hr\">>) {\n const p = element.props;\n\n return <EmailHr style={p.style ?? undefined} />;\n}\n\n// =============================================================================\n// Utility Components\n// =============================================================================\n\nfunction PreviewComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Preview\">>) {\n const p = element.props;\n\n return <EmailPreview>{p.text}</EmailPreview>;\n}\n\nfunction MarkdownComponent({\n element,\n}: ComponentRenderProps<StandardComponentProps<\"Markdown\">>) {\n const p = element.props;\n\n return (\n <EmailMarkdown\n markdownContainerStyles={p.markdownContainerStyles ?? undefined}\n markdownCustomStyles={p.markdownCustomStyles ?? undefined}\n >\n {p.content}\n </EmailMarkdown>\n );\n}\n\n// =============================================================================\n// Registry\n// =============================================================================\n\nexport const standardComponents: ComponentRegistry = {\n Html: HtmlComponent,\n Head: HeadComponent,\n Body: BodyComponent,\n Container: ContainerComponent,\n Section: SectionComponent,\n Row: RowComponent,\n Column: ColumnComponent,\n Heading: HeadingComponent,\n Text: TextComponent,\n Link: LinkComponent,\n Button: ButtonComponent,\n Image: ImageComponent,\n Hr: HrComponent,\n Preview: PreviewComponent,\n Markdown: MarkdownComponent,\n};\n","import React from \"react\";\nimport { render } from \"@react-email/render\";\nimport type { Spec, UIElement } from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveRepeatItemStatePath,\n resolveRepeatStatePath,\n evaluateVisibility,\n getByPath,\n type PropResolutionContext,\n} from \"@json-render/core\";\nimport { standardComponents } from \"./components/standard\";\n\n// Re-export the standard components for use in custom registries\nexport { standardComponents };\n\nexport type RenderComponentRegistry = Record<string, React.ComponentType<any>>;\n\nexport interface RenderOptions {\n registry?: RenderComponentRegistry;\n includeStandard?: boolean;\n state?: Record<string, unknown>;\n}\n\nconst noopEmit = () => {};\n\nfunction renderElement(\n elementKey: string,\n spec: Spec,\n registry: RenderComponentRegistry,\n stateModel: Record<string, unknown>,\n repeatItem?: unknown,\n repeatIndex?: number,\n repeatBasePath?: string,\n): React.ReactElement | null {\n const element = spec.elements[elementKey];\n if (!element) return null;\n\n const ctx: PropResolutionContext = {\n stateModel,\n repeatItem,\n repeatIndex,\n repeatBasePath,\n };\n\n if (element.visible !== undefined) {\n if (!evaluateVisibility(element.visible, ctx)) {\n return null;\n }\n }\n\n const resolvedProps = resolveElementProps(\n element.props as Record<string, unknown>,\n ctx,\n );\n const resolvedElement: UIElement = { ...element, props: resolvedProps };\n\n const Component = registry[resolvedElement.type];\n if (!Component) return null;\n\n if (resolvedElement.repeat) {\n const repeat = resolvedElement.repeat;\n const statePath = resolveRepeatStatePath(repeat.statePath, repeatBasePath);\n if (statePath === undefined) {\n console.warn(\n \"[json-render/react-email] $item in repeat.statePath used outside of a repeat scope\",\n );\n return null;\n }\n\n const items =\n (getByPath(stateModel, statePath) as unknown[] | undefined) ?? [];\n\n const fragments = items.map((item, index) => {\n const repeatKey = repeat.key;\n const key =\n repeatKey && typeof item === \"object\" && item !== null\n ? String((item as Record<string, unknown>)[repeatKey] ?? index)\n : String(index);\n\n const childPath = resolveRepeatItemStatePath(statePath, index);\n const children = resolvedElement.children?.map((childKey) =>\n renderElement(\n childKey,\n spec,\n registry,\n stateModel,\n item,\n index,\n childPath,\n ),\n );\n\n return (\n <Component key={key} element={resolvedElement} emit={noopEmit}>\n {children}\n </Component>\n );\n });\n\n return <>{fragments}</>;\n }\n\n const children = resolvedElement.children?.map((childKey) =>\n renderElement(\n childKey,\n spec,\n registry,\n stateModel,\n repeatItem,\n repeatIndex,\n repeatBasePath,\n ),\n );\n\n return (\n <Component key={elementKey} element={resolvedElement} emit={noopEmit}>\n {children && children.length > 0 ? children : undefined}\n </Component>\n );\n}\n\nfunction buildDocument(\n spec: Spec,\n options: RenderOptions = {},\n): React.ReactElement {\n const {\n registry: customRegistry,\n includeStandard = true,\n state = {},\n } = options;\n\n const mergedState: Record<string, unknown> = {\n ...spec.state,\n ...state,\n };\n\n const registry: RenderComponentRegistry = {\n ...(includeStandard ? standardComponents : {}),\n ...customRegistry,\n };\n\n const root = renderElement(spec.root, spec, registry, mergedState);\n if (!root) {\n console.warn(\n `[json-render/react-email] Root element \"${spec.root}\" not found in spec.elements`,\n );\n }\n return root ?? <></>;\n}\n\n/**\n * Render a json-render spec to an HTML email string.\n *\n * This is a standalone server-side function that resolves the spec tree\n * without React hooks or contexts, making it safe to import in Next.js\n * route handlers and other server-only environments.\n */\nexport async function renderToHtml(\n spec: Spec,\n options?: RenderOptions,\n): Promise<string> {\n const document = buildDocument(spec, options);\n return render(document);\n}\n\n/**\n * Render a json-render spec to a plain text email string.\n */\nexport async function renderToPlainText(\n spec: Spec,\n options?: RenderOptions,\n): Promise<string> {\n const document = buildDocument(spec, options);\n return render(document, { plainText: true });\n}\n","import { z } from \"zod\";\n\nconst styleSchema = z.record(z.string(), z.any()).nullable();\n\n/**\n * Standard component definitions for React Email catalogs.\n *\n * These define the available email components with their Zod prop schemas.\n * All components render using @react-email/components primitives.\n */\nexport const standardComponentDefinitions = {\n // ==========================================================================\n // Document Structure\n // ==========================================================================\n\n Html: {\n props: z.object({\n lang: z.string().nullable(),\n dir: z.enum([\"ltr\", \"rtl\"]).nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Top-level HTML email wrapper. Must be the root element. Children should include Head and Body.\",\n example: { lang: \"en\", dir: \"ltr\" },\n },\n\n Head: {\n props: z.object({}),\n slots: [\"default\"],\n description:\n \"Email head section. Place inside Html. Can contain metadata but typically left empty.\",\n example: {},\n },\n\n Body: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Email body wrapper. Place inside Html after Head. Contains all visible email content.\",\n example: { style: { backgroundColor: \"#f6f9fc\" } },\n },\n\n Container: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Constrains content width for email clients. Place inside Body. Typically max-width 600px.\",\n example: {\n style: {\n maxWidth: \"600px\",\n margin: \"0 auto\",\n padding: \"20px 0 48px\",\n },\n },\n },\n\n Section: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Groups related content. Renders as a table-based section for email compatibility.\",\n example: { style: { padding: \"24px\", backgroundColor: \"#ffffff\" } },\n },\n\n Row: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Horizontal layout row. Use inside Section for multi-column layouts.\",\n example: { style: {} },\n },\n\n Column: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [\"default\"],\n description:\n \"Column within a Row. Set width via style for proportional layouts.\",\n example: { style: { width: \"50%\" } },\n },\n\n // ==========================================================================\n // Content Components\n // ==========================================================================\n\n Heading: {\n props: z.object({\n text: z.string(),\n as: z.enum([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"]).nullable(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Heading text at various levels. h1 is largest, h6 is smallest.\",\n example: { text: \"Welcome!\", as: \"h1\" },\n },\n\n Text: {\n props: z.object({\n text: z.string(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Body text paragraph. Use style for font size, color, weight, and alignment.\",\n example: { text: \"Thank you for signing up.\" },\n },\n\n Link: {\n props: z.object({\n text: z.string(),\n href: z.string(),\n style: styleSchema,\n }),\n slots: [],\n description: \"Hyperlink with visible text and a URL.\",\n example: {\n text: \"Visit our website\",\n href: \"https://example.com\",\n style: { color: \"#2563eb\" },\n },\n },\n\n Button: {\n props: z.object({\n text: z.string(),\n href: z.string(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Call-to-action button rendered as a link styled as a button. Provide text and href.\",\n example: {\n text: \"Get Started\",\n href: \"https://example.com\",\n style: {\n backgroundColor: \"#5F51E8\",\n borderRadius: \"3px\",\n color: \"#fff\",\n padding: \"12px 20px\",\n },\n },\n },\n\n Image: {\n props: z.object({\n src: z.string(),\n alt: z.string().nullable(),\n width: z.number().nullable(),\n height: z.number().nullable(),\n style: styleSchema,\n }),\n slots: [],\n description:\n \"Image from a URL. src must be a fully qualified URL. Specify width and height for consistent rendering.\",\n example: {\n src: \"https://picsum.photos/400/200?random=1\",\n alt: \"Hero image\",\n width: 400,\n height: 200,\n },\n },\n\n Hr: {\n props: z.object({\n style: styleSchema,\n }),\n slots: [],\n description: \"Horizontal rule separator between content sections.\",\n example: {\n style: { borderColor: \"#e6ebf1\", margin: \"20px 0\" },\n },\n },\n\n // ==========================================================================\n // Utility Components\n // ==========================================================================\n\n Preview: {\n props: z.object({\n text: z.string(),\n }),\n slots: [],\n description:\n \"Preview text shown in email client inboxes before the email is opened. Place inside Html.\",\n example: { text: \"You have a new message from Acme Corp\" },\n },\n\n Markdown: {\n props: z.object({\n content: z.string(),\n markdownContainerStyles: styleSchema,\n markdownCustomStyles: z.record(z.string(), z.any()).nullable(),\n }),\n slots: [],\n description:\n \"Renders markdown content as email-safe HTML. Supports headings, paragraphs, lists, links, bold, italic, and code.\",\n example: {\n content: \"# Hello\\n\\nThis is **bold** and *italic* text.\",\n },\n },\n};\n\nexport type StandardComponentDefinitions = typeof standardComponentDefinitions;\n\nexport type StandardComponentProps<\n K extends keyof StandardComponentDefinitions,\n> = StandardComponentDefinitions[K][\"props\"] extends { _output: infer O }\n ? O\n : z.output<StandardComponentDefinitions[K][\"props\"]>;\n"],"mappings":"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","names":["import_core","value","import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","value","binding","executeAction","import_react","import_core","import_jsx_runtime","value","React","import_react","import_jsx_runtime","import_react","import_core","import_jsx_runtime","EmailHtml","EmailHead","EmailBody","EmailContainer","EmailSection","EmailRow","EmailColumn","EmailHeading","EmailText","EmailLink","EmailButton","EmailImg","EmailHr","EmailPreview","EmailMarkdown","import_jsx_runtime","React","ElementRenderer","import_core","import_jsx_runtime","children"]}
|