react-email

por vercel

Renderizador de React Email para json-render que convierte especificaciones JSON en correos electrónicos HTML o de texto plano usando @react-email/components y @react-email/render. Úsalo cuando…

npx skills add https://github.com/vercel-labs/json-render --skill react-email

@json-render/react-email

React Email renderer that converts JSON specs into HTML or plain-text email output.

Quick Start

import { renderToHtml } from "@json-render/react-email";
import { schema, standardComponentDefinitions } from "@json-render/react-email";
import { defineCatalog } from "@json-render/core";

const catalog = defineCatalog(schema, {
  components: standardComponentDefinitions,
});

const spec = {
  root: "html-1",
  elements: {
    "html-1": { type: "Html", props: { lang: "en", dir: "ltr" }, children: ["head-1", "body-1"] },
    "head-1": { type: "Head", props: {}, children: [] },
    "body-1": {
      type: "Body",
      props: { style: { backgroundColor: "#f6f9fc" } },
      children: ["container-1"],
    },
    "container-1": {
      type: "Container",
      props: { style: { maxWidth: "600px", margin: "0 auto", padding: "20px" } },
      children: ["heading-1", "text-1"],
    },
    "heading-1": { type: "Heading", props: { text: "Welcome" }, children: [] },
    "text-1": { type: "Text", props: { text: "Thanks for signing up." }, children: [] },
  },
};

const html = await renderToHtml(spec);

Spec Structure (Element Tree)

Same flat element tree as @json-render/react: root key plus elements map. Root must be Html; children of Html should be Head and Body. Use Container (e.g. max-width 600px) inside Body for client-safe layout.

Creating a Catalog and Registry

import { defineCatalog } from "@json-render/core";
import { schema, defineRegistry, renderToHtml } from "@json-render/react-email";
import { standardComponentDefinitions } from "@json-render/react-email/catalog";
import { Container, Heading, Text } from "@react-email/components";
import { z } from "zod";

const catalog = defineCatalog(schema, {
  components: {
    ...standardComponentDefinitions,
    Alert: {
      props: z.object({
        message: z.string(),
        variant: z.enum(["info", "success", "warning"]).nullable(),
      }),
      slots: [],
      description: "A highlighted message block",
    },
  },
  actions: {},
});

const { registry } = defineRegistry(catalog, {
  components: {
    Alert: ({ props }) => (
      <Container style={{ padding: 16, backgroundColor: "#eff6ff", borderRadius: 8 }}>
        <Text style={{ margin: 0 }}>{props.message}</Text>
      </Container>
    ),
  },
});

const html = await renderToHtml(spec, { registry });

Server-Side Render APIs

FunctionPurpose
renderToHtml(spec, options?)Render spec to HTML email string
renderToPlainText(spec, options?)Render spec to plain-text email string

RenderOptions: registry, includeStandard (default true), state (for $state / $cond).

Visibility and State

Supports visible conditions, $state, $cond, repeat (repeat.statePath), nested repeat paths with { "$item": "field" }, and the same expression syntax as @json-render/react. Use state in RenderOptions when rendering server-side so expressions resolve.

Server-Safe Import

Import schema and catalog without React or @react-email/components:

import { schema, standardComponentDefinitions } from "@json-render/react-email/server";

Key Exports

ExportPurpose
defineRegistryCreate type-safe component registry from catalog
RendererRender spec in browser (e.g. preview); use with JSONUIProvider for state/actions
createRendererStandalone renderer component with state/actions/validation
renderToHtmlServer: spec to HTML string
renderToPlainTextServer: spec to plain-text string
schemaEmail element schema
standardComponentsPre-built component implementations
standardComponentDefinitionsCatalog definitions (Zod props)

Sub-path Exports

PathPurpose
@json-render/react-emailFull package
@json-render/react-email/serverSchema and catalog only (no React)
@json-render/react-email/catalogStandard component definitions and types
@json-render/react-email/renderRender functions only

Standard Components

All components accept a style prop (object) for inline styles. Use inline styles for email client compatibility; avoid external CSS.

Document structure

ComponentDescription
HtmlRoot wrapper (lang, dir). Children: Head, Body.
HeadEmail head section.
BodyBody wrapper; use style for background.

Layout

ComponentDescription
ContainerConstrain width (e.g. max-width 600px).
SectionGroup content; table-based for compatibility.
RowHorizontal row.
ColumnColumn in a Row; set width via style.

Content

ComponentDescription
HeadingHeading text (as: h1–h6).
TextBody text.
LinkHyperlink (text, href).
ButtonCTA link styled as button (text, href).
ImageImage from URL (src, alt, width, height).
HrHorizontal rule.

Utility

ComponentDescription
PreviewInbox preview text (inside Html).
MarkdownMarkdown content as email-safe HTML.

Email Best Practices

  • Keep width constrained (e.g. Container max-width 600px).
  • Use inline styles or React Email's style props; many clients strip <style> blocks.
  • Prefer table-based layout (Section, Row, Column) for broad client support.
  • Use absolute URLs for images; many clients block relative or cid: references in some contexts.
  • Test in multiple clients (Gmail, Outlook, Apple Mail); use a preview tool or Litmus-like service when possible.

Más skills de vercel

vercel
vercel
API REST de Vercel emulada para desarrollo y pruebas locales. Úsala cuando el usuario necesite interactuar con endpoints de la API de Vercel localmente, probar integraciones de Vercel,…
cron-jobs
vercel
Configuración y mejores prácticas de Vercel Cron Jobs. Úsalo al agregar, editar o depurar tareas programadas en vercel.json.
codegen
vercel
Utilidades de generación de código para json-render. Úselo al generar código a partir de especificaciones de UI, crear exportadores de código personalizados, recorrer especificaciones o serializar propiedades para…
next-best-practice
vercel
Prácticas recomendadas de Next.js: convenciones de archivos, límites de RSC, patrones de datos, APIs asíncronas, metadatos, manejo de errores, manejadores de rutas, optimización de imágenes/fuentes,…
benchmark-sandbox
vercel
Ejecuta escenarios de evaluación de vercel-plugin en Vercel Sandboxes en lugar de paneles locales de WezTerm. Aprovisiona microVMs efímeras con Claude Code y el plugin preinstalado,…
write-guide
vercel
Producir una guía técnica que enseñe un caso de uso del mundo real mediante ejemplos progresivos. Los conceptos se introducen solo cuando el lector los necesita.
benchmark-testing
vercel
Crear y lanzar proyectos de prueba de benchmark para ejercitar la inyección de habilidades de vercel-plugin en escenarios realistas. Configura directorios aislados, instala el…
ai-gateway
vercel
Guía experta de Vercel AI Gateway. Úselo al configurar el enrutamiento de modelos, la conmutación por error de proveedores, el seguimiento de costos o la gestión de múltiples proveedores de IA a través de un...