@hyper-elements/react 0.3.0 → 0.3.1
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/GUIDE.md +47 -28
- package/README.md +24 -5
- package/REFERENCE.md +487 -485
- package/dist/builder.cjs +795 -206
- package/dist/builder.cjs.map +1 -1
- package/dist/builder.js +795 -206
- package/dist/builder.js.map +1 -1
- package/dist/image.cjs +1 -1
- package/dist/image.cjs.map +1 -1
- package/dist/image.js +1 -1
- package/dist/image.js.map +1 -1
- package/dist/inspect.cjs +3601 -0
- package/dist/inspect.cjs.map +1 -0
- package/dist/inspect.d.cts +472 -0
- package/dist/inspect.d.ts +472 -0
- package/dist/inspect.js +3572 -0
- package/dist/inspect.js.map +1 -0
- package/dist/pdf.cjs +54 -9
- package/dist/pdf.cjs.map +1 -1
- package/dist/pdf.js +54 -9
- package/dist/pdf.js.map +1 -1
- package/dist/primitives.cjs +738 -142
- package/dist/primitives.cjs.map +1 -1
- package/dist/primitives.d.cts +558 -158
- package/dist/primitives.d.ts +558 -158
- package/dist/primitives.js +736 -143
- package/dist/primitives.js.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/model.ts","../../core/src/diagnostics.ts","../../core/src/email-clients.ts","../../core/src/kinds.ts","../../core/src/define.ts","../../core/src/conditions.ts","../../core/src/styles.ts","../../core/src/composites.ts","../../core/src/layouts.ts","../../core/src/roots.ts","../../core/src/document.ts","../../core/src/canvas.ts","../../core/src/components.ts","../../core/src/registry.ts","../../core/src/normalize.ts","../../core/src/describe.ts","../../core/src/declared.ts","../../core/src/expand.ts","../../core/src/resolve.ts","../../core/src/writers/email/context.ts","../../core/src/writers/email/layout.tsx","../../core/src/writers/shared/estimate.ts","../../core/src/writers/shared/support.ts","../../core/src/writers/email/support.ts","../../core/src/writers/shared/paged.ts","../../core/src/writers/page/index.tsx","../../core/src/writers/index.ts","../src/utils/collect.ts","../src/utils/server-renderer.ts","../src/utils/render-scope.ts","../src/primitives/collect.tsx","../src/inspect/index.ts"],"names":["same","length","a","read","side","shape","kind","size","text","link","item","WRITTEN","box","h","isObject","rule","given","within","raw","lineHeight","border","items","line","frame","clamp","open","isNode","gapOf","fallback","OUTLOOK_ONLY","resolved","SHARED","frames","NODE_KEYS","describeComponents","describeComponent","React"],"mappings":"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","file":"inspect.js","sourcesContent":["/**\n * The template tree: what a template's JSX is collected into inside one\n * render, and what layout and every writer read. Internal, never public; plain\n * data (no functions, no React elements).\n */\n\nexport type Json = string | number | boolean | null | Json[] | { [key: string]: Json };\n\nexport interface ElementsDocument {\n root: Node;\n}\n\nexport interface Node {\n /** Only when the author gives one; unique in the template, and written to the HTML as is. */\n id?: string;\n /** A defined component: \"Email\", \"Row\", \"Heading\", … */\n type: string;\n /** Meaning: href, src, alt, level. */\n props?: Record<string, Json>;\n /** Appearance, in the value kinds the component's definition gives. */\n style?: Record<string, Json>;\n /** Style overrides on phones (Email and Page). */\n mobile?: Record<string, Json>;\n /** Style while the pointer is over it, where the definition allows. */\n hover?: Record<string, Json>;\n hidden?: { mobile?: boolean; desktop?: boolean };\n children?: Child[];\n}\n\n/** A string is text, where the parent takes text. */\nexport type Child = Node | string;\n\nexport function isNode(child: Child): child is Node {\n return typeof child === \"object\" && child !== null;\n}\n","/**\n * What validation, resolution and conversion found: one list, each entry\n * naming the node (by id where it has one) and the path to the value.\n */\n\nimport type { EmailClient } from \"./email-clients\";\n\nexport type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n /** Stable, for tools to match on: \"prop/unknown\", \"layout/overflow\", … */\n code: string;\n severity: Severity;\n message: string;\n /** Where in the input: `root.children[1].style.padding`. */\n path: string;\n /** The node's id, once it has one. */\n nodeId?: string;\n /** The email clients it's about; absent: every email, never left out by `emailClients`. */\n clients?: EmailClient[];\n /** What to change. */\n fix?: string;\n /** Where to see it: for a problem known from caniemail's tables, its page there. */\n see?: string;\n}\n\n/** What an email client problem adds to a diagnostic. */\nexport interface ClientFields {\n clients?: readonly EmailClient[];\n fix?: string;\n see?: string;\n}\n\nexport class Diagnostics {\n readonly list: Diagnostic[] = [];\n\n add(code: string, severity: Severity, message: string, path: string, nodeId?: string, extra: ClientFields = {}): void {\n const d: Diagnostic = { code, severity, message, path };\n if (nodeId !== undefined) d.nodeId = nodeId;\n if (extra.clients) d.clients = [...extra.clients];\n if (extra.fix) d.fix = extra.fix;\n if (extra.see) d.see = extra.see;\n this.list.push(d);\n }\n\n error(code: string, message: string, path: string, nodeId?: string): void {\n this.add(code, \"error\", message, path, nodeId);\n }\n\n warning(code: string, message: string, path: string, nodeId?: string, extra?: ClientFields): void {\n this.add(code, \"warning\", message, path, nodeId, extra);\n }\n\n get hasErrors(): boolean {\n return this.list.some((d) => d.severity === \"error\");\n }\n}\n\nexport function hasErrors(diagnostics: readonly Diagnostic[]): boolean {\n return diagnostics.some((d) => d.severity === \"error\");\n}\n\n/** One line per diagnostic, for error messages and logs: with the email clients it's about, what to change and how to see it, where it says. */\nexport function formatDiagnostics(diagnostics: readonly Diagnostic[]): string {\n return diagnostics\n .map((d) => `${d.severity} ${d.code} at ${d.path}: ${d.message}${d.clients ? ` [${d.clients.join(\", \")}]` : \"\"}${d.fix ? ` Fix: ${d.fix}` : \"\"}${d.see ? ` See: ${d.see}` : \"\"}`)\n .join(\"\\n\");\n}\n\n/** Thrown where a template with errors can't be rendered (`validate()` lists the problems without throwing). */\nexport class ElementsError extends Error {\n readonly diagnostics: Diagnostic[];\n\n constructor(diagnostics: Diagnostic[]) {\n const errors = diagnostics.filter((d) => d.severity === \"error\");\n super(`[Elements] The template has ${errors.length} error${errors.length === 1 ? \"\" : \"s\"}:\\n${formatDiagnostics(errors)}`);\n this.name = \"ElementsError\";\n this.diagnostics = diagnostics;\n }\n}\n","/**\n * The email clients Elements checks an Email for. Four were captured showing Elements 0.3.0 emails they weren't tuned\n * on (unlayer/email-renderer), which says how closely each is measured; what's known of the rest is from caniemail's\n * tables (caniemail.com, MIT), which test the CSS and HTML each client keeps. Either way a problem is said at its own\n * severity; only one Elements assumes, unchecked, is a note.\n */\nimport type { Diagnostic } from \"./diagnostics\";\n\nexport type EmailClient =\n | \"outlook\"\n | \"outlook-com\"\n | \"outlook-mac\"\n | \"outlook-app\"\n | \"gmail\"\n | \"gmail-app\"\n | \"gmail-app-other\"\n | \"apple-mail\"\n | \"yahoo\"\n | \"aol\"\n | \"samsung-email\"\n | \"thunderbird\"\n | \"protonmail\"\n | \"fastmail\"\n | \"hey\"\n | \"gmx\"\n | \"web-de\"\n | \"orange\"\n | \"sfr\"\n | \"laposte\"\n | \"free-fr\"\n | \"t-online-de\"\n | \"mail-ru\"\n | \"ionos\"\n | \"wp-pl\"\n | \"rainloop\";\n\nexport interface EmailClientMeasurement {\n /** The Elements version whose emails were captured. */\n elements: string;\n /** The client captured. */\n against: string;\n /** When (an ISO date). */\n captured: string;\n /** Of the words in emails it wasn't tuned on, the share a model of the client draws within 4px of the client. */\n wordsWithin4px: number;\n /** Of neighbouring word pairs, the share on the same line, or on different lines, in both. */\n lineBreaks: number;\n}\n\nexport interface EmailClientInfo {\n name: string;\n /** The widths it shows an email at, where it's been measured. */\n widths: { desktop?: number; phone?: number };\n /** Whether its dark mode was measured. */\n dark: boolean;\n /** Whether its model is an approximation (words placed within 4px well short of all of them). */\n approximate: boolean;\n /** Its captures; null where what's known of it is caniemail's. */\n measured: EmailClientMeasurement | null;\n}\n\nconst captured = (against: string, wordsWithin4px: number, lineBreaks: number): EmailClientMeasurement => ({ elements: \"0.3.0\", against, captured: \"2026-11-08\", wordsWithin4px, lineBreaks });\n\n/** A client known from caniemail's tables, not captured. */\nconst tables = (name: string): EmailClientInfo => ({ name, widths: {}, dark: false, approximate: true, measured: null });\n\nexport const EMAIL_CLIENTS: Readonly<Record<EmailClient, EmailClientInfo>> = {\n outlook: { name: \"Classic Outlook\", widths: { desktop: 820 }, dark: false, approximate: true, measured: captured(\"Outlook 16.0.20527 for Windows, 96 DPI\", 0.85, 0.983) },\n \"outlook-com\": { name: \"Outlook.com and new Outlook\", widths: { desktop: 820 }, dark: false, approximate: false, measured: captured(\"Outlook on the web\", 1, 1) },\n \"outlook-mac\": tables(\"Outlook for Mac\"),\n \"outlook-app\": tables(\"Outlook app (iOS and Android)\"),\n gmail: { name: \"Gmail\", widths: { desktop: 820 }, dark: false, approximate: false, measured: captured(\"Gmail on the web\", 1, 1) },\n \"gmail-app\": { name: \"Gmail app\", widths: { phone: 375 }, dark: false, approximate: true, measured: null },\n \"gmail-app-other\": { name: \"Gmail app, another account\", widths: { phone: 375 }, dark: false, approximate: true, measured: null },\n \"apple-mail\": { name: \"Apple Mail\", widths: { desktop: 820 }, dark: true, approximate: false, measured: captured(\"Mail 16 on macOS 26\", 0.999, 0.999) },\n yahoo: tables(\"Yahoo Mail\"),\n aol: tables(\"AOL Mail\"),\n \"samsung-email\": tables(\"Samsung Email\"),\n thunderbird: tables(\"Thunderbird\"),\n protonmail: tables(\"Proton Mail\"),\n fastmail: tables(\"Fastmail\"),\n hey: tables(\"HEY\"),\n gmx: tables(\"GMX\"),\n \"web-de\": tables(\"WEB.DE\"),\n orange: tables(\"Orange\"),\n sfr: tables(\"SFR\"),\n laposte: tables(\"La Poste\"),\n \"free-fr\": tables(\"Free\"),\n \"t-online-de\": tables(\"T-Online\"),\n \"mail-ru\": tables(\"Mail.ru\"),\n ionos: tables(\"IONOS (1&1)\"),\n \"wp-pl\": tables(\"WP Poczta\"),\n rainloop: tables(\"RainLoop\"),\n};\n\n/**\n * What's checked when no clients are named: the ones most email is read in (the four captured, the Gmail and Outlook\n * apps, Outlook for Mac, Yahoo, AOL and Samsung Email). The others only when named.\n */\nexport const DEFAULT_EMAIL_CLIENTS: readonly EmailClient[] = [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail\", \"gmail-app\", \"gmail-app-other\", \"apple-mail\", \"yahoo\", \"aol\", \"samsung-email\"];\n\n/** caniemail's page about a feature (its slug, as in the page's address). */\nexport const caniemail = (feature: string): string => `https://www.caniemail.com/features/${feature}/`;\n\n/** Throws on what isn't a list of email clients (an option given wrong, not a template's problem). */\nexport function checkEmailClients(clients: unknown): void {\n if (clients === undefined) return;\n const unknown = Array.isArray(clients) ? clients.filter((c) => !Object.prototype.hasOwnProperty.call(EMAIL_CLIENTS, c as string)) : [clients];\n if (unknown.length) throw new TypeError(`[Elements] emailClients takes a list of ${Object.keys(EMAIL_CLIENTS).join(\", \")}, not ${unknown.map((c) => JSON.stringify(c)).join(\", \")}`);\n}\n\n/**\n * The diagnostics for the email clients asked for: one about some clients is kept where they meet the selection, with\n * its clients narrowed to them; one about none in particular is always kept. Diagnostics equal in code, path, severity\n * and message are one, with the clients of both.\n */\nexport function forEmailClients(diagnostics: readonly Diagnostic[], selection: readonly EmailClient[] = DEFAULT_EMAIL_CLIENTS): Diagnostic[] {\n const out: Diagnostic[] = [];\n const seen = new Map<string, Diagnostic>();\n for (const d of diagnostics) {\n if (!d.clients) {\n out.push(d);\n continue;\n }\n const clients = d.clients.filter((c) => selection.includes(c));\n if (!clients.length) continue;\n const key = JSON.stringify([d.code, d.path, d.severity, d.message]);\n const same = seen.get(key);\n if (same) same.clients = [...new Set([...same.clients!, ...clients])];\n else {\n const kept = { ...d, clients };\n seen.set(key, kept);\n out.push(kept);\n }\n }\n return out;\n}\n","/**\n * Value kinds: what a prop or style property accepts, what it's normalized to,\n * the editor that edits it, and a JSON Schema of its values (for property\n * discovery). Component definitions are made of these, so types, validation\n * and editors come from one place.\n */\nimport type { Json } from \"./model\";\n\nexport type JsonSchema = { [key: string]: unknown };\n\n/** Conceptual editors, mapped by each editor (the builder, others) to its own widgets. */\nexport type EditorKind =\n | \"color\"\n | \"length\"\n | \"insets\"\n | \"border\"\n | \"radius\"\n | \"choice\"\n | \"fontFamily\"\n | \"fontFaces\"\n | \"items\"\n | \"fontWeight\"\n | \"lineHeight\"\n | \"image\"\n | \"link\"\n | \"text\"\n | \"number\"\n | \"toggle\";\n\nexport type Parsed<T> = { ok: true; value: T } | { ok: false; message: string };\n\nexport interface Kind<In = unknown, Out extends Json = Json> {\n readonly name: string;\n readonly editor: EditorKind;\n /** What it accepts, in words (for messages and descriptions). */\n readonly accepts: string;\n parse(input: unknown): Parsed<Out>;\n /** Whether a value it parsed sets nothing (`breakpoints={{}}`): the prop is then left out, as if not given. */\n empty?(value: Out): boolean;\n jsonSchema(): JsonSchema;\n /** Type only: what it accepts as input. */\n readonly __in?: In;\n}\n\nexport type InputOf<K> = K extends Kind<infer I, Json> ? I : never;\nexport type OutputOf<K> = K extends Kind<unknown, infer O> ? O : never;\n\nconst ok = <T>(value: T): Parsed<T> => ({ ok: true, value });\nconst fail = (message: string): Parsed<never> => ({ ok: false, message });\nconst show = (input: unknown): string => {\n try {\n return typeof input === \"string\" ? JSON.stringify(input) : typeof input === \"function\" ? \"a function\" : JSON.stringify(input) ?? String(input);\n } catch {\n return String(input);\n }\n};\nconst isObject = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nfunction kind<In, Out extends Json>(spec: Omit<Kind<In, Out>, \"__in\">): Kind<In, Out> {\n return spec;\n}\n\n// ─── Numbers and lengths ────────────────────────────────────────────────────\n\nconst NUMBER = \"-?(?:\\\\d+(?:\\\\.\\\\d*)?|\\\\.\\\\d+)\";\n\nexport type LengthUnit = \"px\" | \"%\" | \"pt\" | \"mm\" | \"in\";\n/** A length in px: a number, or a string with px. */\nexport type Px = number | `${number}px`;\nexport type LengthInput<U extends LengthUnit> = number | `${number}${U}`;\n/** px as a number, any other unit as a string (\"50%\", \"12pt\"). */\nexport type Length = number | string;\n\nconst LENGTH = new RegExp(`^(${NUMBER})(px|%|pt|mm|in)?$`);\n\n/** A length's value and unit, from a number (px) or a string (\"12px\", \"50%\", \"12\" as px). */\nexport function readLength(input: unknown): { value: number; unit: LengthUnit } | undefined {\n if (typeof input === \"number\") return Number.isFinite(input) ? { value: input, unit: \"px\" } : undefined;\n if (typeof input !== \"string\") return undefined;\n const match = LENGTH.exec(input.trim());\n return match ? { value: Number(match[1]), unit: (match[2] as LengthUnit | undefined) ?? \"px\" } : undefined;\n}\n\nfunction px(input: unknown, min: number, what: string): Parsed<number> {\n const length = readLength(input);\n if (!length || length.unit !== \"px\") return fail(`${what} must be a number of px or a px string (\"8px\"), not ${show(input)}`);\n if (length.value < min) return fail(`${what} can't be less than ${min}, not ${show(input)}`);\n return ok(length.value);\n}\n\n/** A length as a document holds it: px as a number, other units as a string. */\nexport type LengthOf<U extends LengthUnit> = number | `${number}${Exclude<U, \"px\">}`;\n\nexport function length<const U extends LengthUnit = \"px\">(\n units: readonly U[] = [\"px\"] as unknown as readonly U[],\n options: { min?: number } = {}\n): Kind<LengthInput<U>, LengthOf<U>> {\n const min = options.min ?? 0;\n const accepts = `a length (${units.map((u) => (u === \"px\" ? \"a number of px\" : u)).join(\", \")})`;\n return kind<LengthInput<U>, LengthOf<U>>({\n name: \"length\",\n editor: \"length\",\n accepts,\n parse(input) {\n const parsed = readLength(input);\n if (!parsed) return fail(`expected ${accepts}, not ${show(input)}`);\n if (!units.includes(parsed.unit as U)) return fail(`${parsed.unit} isn't accepted here; expected ${accepts}`);\n if (parsed.value < min) return fail(`can't be less than ${min}, not ${show(input)}`);\n return ok((parsed.unit === \"px\" ? parsed.value : `${parsed.value}${parsed.unit}`) as LengthOf<U>);\n },\n jsonSchema: () => ({\n anyOf: [\n ...(units.includes(\"px\" as U) ? [{ type: \"number\", minimum: min }] : []),\n { type: \"string\", pattern: `^${NUMBER}(${units.map((u) => (u === \"%\" ? \"%\" : u)).join(\"|\")})${units.includes(\"px\" as U) ? \"?\" : \"\"}$` },\n ],\n }),\n });\n}\n\nexport function number(options: { min?: number; max?: number; integer?: boolean } = {}): Kind<number, number> {\n const { min = -Infinity, max = Infinity, integer = false } = options;\n const accepts = `${integer ? \"an integer\" : \"a number\"}${Number.isFinite(min) ? ` from ${min}` : \"\"}${Number.isFinite(max) ? ` to ${max}` : \"\"}`;\n return kind({\n name: \"number\",\n editor: \"number\",\n accepts,\n parse(input) {\n if (typeof input !== \"number\" || !Number.isFinite(input) || (integer && !Number.isInteger(input)) || input < min || input > max) {\n return fail(`expected ${accepts}, not ${show(input)}`);\n }\n return ok(input);\n },\n jsonSchema: () => ({\n type: integer ? \"integer\" : \"number\",\n ...(Number.isFinite(min) ? { minimum: min } : {}),\n ...(Number.isFinite(max) ? { maximum: max } : {}),\n }),\n });\n}\n\n/** A share of a Row's free width (a grow factor), or \"none\" to take its own size. */\nexport function flex(): Kind<number | \"none\", number | \"none\"> {\n return kind({\n name: \"flex\",\n editor: \"number\",\n accepts: 'a share of the free width (0 or more), or \"none\"',\n parse: (input) =>\n input === \"none\" || (typeof input === \"number\" && Number.isFinite(input) && input >= 0)\n ? ok(input)\n : fail(`expected a share of the free width (0 or more) or \"none\", not ${show(input)}`),\n jsonSchema: () => ({ anyOf: [{ type: \"number\", minimum: 0 }, { const: \"none\" }] }),\n });\n}\n\n// ─── Insets, borders, corners ───────────────────────────────────────────────\n\nexport type InsetsInput =\n | Px\n | string\n | [Px, Px]\n | [Px, Px, Px]\n | [Px, Px, Px, Px]\n | { top?: Px; right?: Px; bottom?: Px; left?: Px };\nexport type Insets = { top: number; right: number; bottom: number; left: number };\n\nconst SIDES = [\"top\", \"right\", \"bottom\", \"left\"] as const;\n\n/** CSS's 1-to-4 value order: top, right, bottom, left. */\nfunction fourSides<T>(values: T[]): [T, T, T, T] {\n const [a, b = a, c = a, d = b] = values;\n return [a, b, c, d];\n}\n\nexport function insets(): Kind<InsetsInput, Insets> {\n const accepts = 'px for all sides, \"8px 16px\" (1 to 4 values), [v, h] or [t, r, b, l], or { top, right, bottom, left }';\n const read = (values: unknown[]): Parsed<Insets> => {\n if (values.length < 1 || values.length > 4) return fail(`expected ${accepts}`);\n const out: number[] = [];\n for (const value of values) {\n const side = px(value, 0, \"each side\");\n if (!side.ok) return side;\n out.push(side.value);\n }\n const [top, right, bottom, left] = fourSides(out);\n return ok({ top, right, bottom, left });\n };\n return kind({\n name: \"insets\",\n editor: \"insets\",\n accepts,\n parse(input) {\n if (typeof input === \"number\") return read([input]);\n if (typeof input === \"string\") return read(input.trim().split(/\\s+/));\n if (Array.isArray(input)) return read(input);\n if (isObject(input)) {\n const extra = Object.keys(input).find((key) => !(SIDES as readonly string[]).includes(key));\n if (extra) return fail(`\"${extra}\" isn't a side; expected top, right, bottom or left`);\n const out = { top: 0, right: 0, bottom: 0, left: 0 };\n for (const side of SIDES) {\n if (input[side] === undefined) continue;\n const value = px(input[side], 0, side);\n if (!value.ok) return value;\n out[side] = value.value;\n }\n return ok(out);\n }\n return fail(`expected ${accepts}, not ${show(input)}`);\n },\n jsonSchema: () => {\n const side = { anyOf: [{ type: \"number\", minimum: 0 }, { type: \"string\", pattern: `^${NUMBER}(px)?$` }] };\n return {\n anyOf: [\n side.anyOf[0],\n { type: \"string\" },\n { type: \"array\", items: side, minItems: 1, maxItems: 4 },\n { type: \"object\", properties: Object.fromEntries(SIDES.map((s) => [s, side])), additionalProperties: false },\n ],\n };\n },\n });\n}\n\nexport type BorderStyle = \"solid\" | \"dashed\" | \"dotted\" | \"none\";\nexport type BorderSideInput = { width?: Px; style?: BorderStyle; color?: string };\nexport type BorderInput =\n | string\n | BorderSideInput\n | { top?: BorderSideInput | string; right?: BorderSideInput | string; bottom?: BorderSideInput | string; left?: BorderSideInput | string };\nexport type BorderSide = { width: number; style: BorderStyle; color: string };\nexport type Border = { top?: BorderSide; right?: BorderSide; bottom?: BorderSide; left?: BorderSide };\n\nconst BORDER_STYLES: readonly BorderStyle[] = [\"solid\", \"dashed\", \"dotted\", \"none\"];\n\nfunction borderSide(input: unknown): Parsed<BorderSide> {\n const out: BorderSide = { width: 1, style: \"solid\", color: \"#000000\" };\n if (typeof input === \"string\") {\n for (const token of input.match(/rgba?\\([^)]*\\)|\\S+/g) ?? []) {\n if (readLength(token)) {\n const width = px(token, 0, \"a border's width\");\n if (!width.ok) return width;\n out.width = width.value;\n } else if ((BORDER_STYLES as readonly string[]).includes(token)) {\n out.style = token as BorderStyle;\n } else {\n const c = parseColor(token);\n if (!c.ok) return fail(`\"${token}\" in ${show(input)} isn't a width, a style (${BORDER_STYLES.join(\", \")}) or a color`);\n out.color = c.value;\n }\n }\n return ok(out);\n }\n if (!isObject(input)) return fail(`expected \"1px solid #ccc\" or { width, style, color }, not ${show(input)}`);\n const extra = Object.keys(input).find((key) => ![\"width\", \"style\", \"color\"].includes(key));\n if (extra) return fail(`\"${extra}\" isn't part of a border side; expected width, style or color`);\n if (input.width !== undefined) {\n const width = px(input.width, 0, \"a border's width\");\n if (!width.ok) return width;\n out.width = width.value;\n }\n if (input.style !== undefined) {\n if (!(BORDER_STYLES as readonly unknown[]).includes(input.style)) return fail(`a border's style is one of ${BORDER_STYLES.join(\", \")}, not ${show(input.style)}`);\n out.style = input.style as BorderStyle;\n }\n if (input.color !== undefined) {\n const c = parseColor(input.color);\n if (!c.ok) return c;\n out.color = c.value;\n }\n return ok(out);\n}\n\n/** One line, as a border side: `\"1px solid #eee\"` or `{ width, style, color }` (a table's line between rows). */\nexport function line(): Kind<string | BorderSideInput, BorderSide> {\n return kind<string | BorderSideInput, BorderSide>({\n name: \"line\",\n editor: \"border\",\n accepts: '\"1px solid #ccc\" or { width, style, color }',\n parse: (input) => borderSide(input),\n jsonSchema: () => ({\n anyOf: [\n { type: \"string\" },\n {\n type: \"object\",\n properties: { width: { anyOf: [{ type: \"number\", minimum: 0 }, { type: \"string\" }] }, style: { enum: [...BORDER_STYLES] }, color: { type: \"string\" } },\n additionalProperties: false,\n },\n ],\n }),\n });\n}\n\nexport function border(): Kind<BorderInput, Border> {\n return kind({\n name: \"border\",\n editor: \"border\",\n accepts: '\"1px solid #ccc\", { width, style, color } for all sides, or { top, right, bottom, left } with one of those each',\n parse(input) {\n const perSide = isObject(input) && Object.keys(input).some((key) => (SIDES as readonly string[]).includes(key));\n if (!perSide) {\n const side = borderSide(input);\n return side.ok ? ok({ top: side.value, right: side.value, bottom: side.value, left: side.value }) : side;\n }\n const out: Border = {};\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (!(SIDES as readonly string[]).includes(key)) return fail(`\"${key}\" isn't a side; expected top, right, bottom or left`);\n const side = borderSide(value);\n if (!side.ok) return fail(`${key}: ${side.message}`);\n out[key as (typeof SIDES)[number]] = side.value;\n }\n return ok(out);\n },\n jsonSchema: () => {\n const side = {\n anyOf: [\n { type: \"string\" },\n {\n type: \"object\",\n properties: { width: { anyOf: [{ type: \"number\", minimum: 0 }, { type: \"string\" }] }, style: { enum: [...BORDER_STYLES] }, color: { type: \"string\" } },\n additionalProperties: false,\n },\n ],\n };\n return { anyOf: [...side.anyOf, { type: \"object\", properties: Object.fromEntries(SIDES.map((s) => [s, side])), additionalProperties: false }] };\n },\n });\n}\n\nexport type RadiusInput = Px | [Px, Px, Px, Px] | { topLeft?: Px; topRight?: Px; bottomRight?: Px; bottomLeft?: Px };\nexport type Corners = { topLeft: number; topRight: number; bottomRight: number; bottomLeft: number };\nexport type Radius = number | Corners;\n\nconst CORNERS = [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"] as const;\n\nexport function radius(): Kind<RadiusInput, Radius> {\n const accepts = \"px for every corner, [topLeft, topRight, bottomRight, bottomLeft], or { topLeft, topRight, bottomRight, bottomLeft }\";\n return kind<RadiusInput, Radius>({\n name: \"radius\",\n editor: \"radius\",\n accepts,\n parse(input) {\n let values: unknown[];\n if (Array.isArray(input)) {\n if (input.length !== 4) return fail(`expected ${accepts}`);\n values = input;\n } else if (isObject(input)) {\n const extra = Object.keys(input).find((key) => !(CORNERS as readonly string[]).includes(key));\n if (extra) return fail(`\"${extra}\" isn't a corner; expected ${CORNERS.join(\", \")}`);\n values = CORNERS.map((corner) => input[corner] ?? 0);\n } else {\n return px(input, 0, \"a radius\");\n }\n const out: number[] = [];\n for (const value of values) {\n const corner = px(value, 0, \"a corner\");\n if (!corner.ok) return corner;\n out.push(corner.value);\n }\n if (out.every((value) => value === out[0])) return ok(out[0]);\n const [topLeft, topRight, bottomRight, bottomLeft] = out;\n return ok({ topLeft, topRight, bottomRight, bottomLeft });\n },\n jsonSchema: () => {\n const corner = { anyOf: [{ type: \"number\", minimum: 0 }, { type: \"string\", pattern: `^${NUMBER}(px)?$` }] };\n return {\n anyOf: [\n ...corner.anyOf,\n { type: \"array\", items: corner, minItems: 4, maxItems: 4 },\n { type: \"object\", properties: Object.fromEntries(CORNERS.map((c) => [c, corner])), additionalProperties: false },\n ],\n };\n },\n });\n}\n\n// ─── Choices, text, flags ───────────────────────────────────────────────────\n\nexport function enumOf<const V extends readonly (string | number)[]>(values: V): Kind<V[number], V[number]> {\n const accepts = `one of ${values.map((v) => JSON.stringify(v)).join(\", \")}`;\n return kind({\n name: \"enum\",\n editor: \"choice\",\n accepts,\n parse: (input) => ((values as readonly unknown[]).includes(input) ? ok(input as V[number]) : fail(`expected ${accepts}, not ${show(input)}`)),\n jsonSchema: () => ({ enum: [...values] }),\n });\n}\n\n/** Text, at most `maxLength` long; with a `pattern`, text it finds something in (`mismatch` says what's missing). */\nexport function text(options: { maxLength?: number; pattern?: RegExp; mismatch?: string } = {}): Kind<string, string> {\n return kind({\n name: \"text\",\n editor: \"text\",\n accepts: \"text\",\n parse(input) {\n if (typeof input !== \"string\") return fail(`expected text, not ${show(input)}`);\n if (options.maxLength !== undefined && input.length > options.maxLength) return fail(`is longer than ${options.maxLength} characters`);\n if (options.pattern && !options.pattern.test(input)) return fail(options.mismatch ?? `doesn't match ${options.pattern.source}`);\n return ok(input);\n },\n jsonSchema: () => ({ type: \"string\", ...(options.maxLength !== undefined ? { maxLength: options.maxLength } : {}), ...(options.pattern ? { pattern: options.pattern.source } : {}) }),\n });\n}\n\nexport function boolean(): Kind<boolean, boolean> {\n return kind({\n name: \"boolean\",\n editor: \"toggle\",\n accepts: \"true or false\",\n parse: (input) => (typeof input === \"boolean\" ? ok(input) : fail(`expected true or false, not ${show(input)}`)),\n jsonSchema: () => ({ type: \"boolean\" }),\n });\n}\n\n// ─── Colors ─────────────────────────────────────────────────────────────────\n\nconst NAMED_COLORS = new Set(\n (\n \"aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond blue blueviolet brown burlywood \" +\n \"cadetblue chartreuse chocolate coral cornflowerblue cornsilk crimson cyan darkblue darkcyan darkgoldenrod darkgray \" +\n \"darkgreen darkgrey darkkhaki darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen \" +\n \"darkslateblue darkslategray darkslategrey darkturquoise darkviolet deeppink deepskyblue dimgray dimgrey dodgerblue \" +\n \"firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite gold goldenrod gray green greenyellow grey honeydew \" +\n \"hotpink indianred indigo ivory khaki lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan \" +\n \"lightgoldenrodyellow lightgray lightgreen lightgrey lightpink lightsalmon lightseagreen lightskyblue lightslategray \" +\n \"lightslategrey lightsteelblue lightyellow lime limegreen linen magenta maroon mediumaquamarine mediumblue \" +\n \"mediumorchid mediumpurple mediumseagreen mediumslateblue mediumspringgreen mediumturquoise mediumvioletred \" +\n \"midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid \" +\n \"palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum powderblue purple \" +\n \"rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown seagreen seashell sienna silver skyblue \" +\n \"slateblue slategray slategrey snow springgreen steelblue tan teal thistle tomato turquoise violet wheat white \" +\n \"whitesmoke yellow yellowgreen transparent\"\n ).split(\" \")\n);\n\nconst HEX = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst RGB = /^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d*\\.?\\d+%?)\\s*)?\\)$/i;\n\nconst hex2 = (n: number) => n.toString(16).padStart(2, \"0\");\n\n/** A color as \"#rrggbb\", \"rgba(r, g, b, a)\" when it's see-through, or a lowercase CSS name. */\nexport function parseColor(input: unknown): Parsed<string> {\n if (typeof input !== \"string\") return fail(`expected a color (\"#0879a1\", \"rgb(…)\", \"rgba(…)\" or a CSS name), not ${show(input)}`);\n const value = input.trim().toLowerCase();\n const hex = HEX.exec(value);\n if (hex) {\n const digits = hex[1].length <= 4 ? [...hex[1]].map((d) => d + d).join(\"\") : hex[1];\n if (digits.length === 6 || digits.slice(6) === \"ff\") return ok(`#${digits.slice(0, 6)}`);\n const alpha = Math.round((parseInt(digits.slice(6), 16) / 255) * 1000) / 1000;\n return ok(`rgba(${parseInt(digits.slice(0, 2), 16)}, ${parseInt(digits.slice(2, 4), 16)}, ${parseInt(digits.slice(4, 6), 16)}, ${alpha})`);\n }\n const rgb = RGB.exec(value);\n if (rgb) {\n const channels = rgb.slice(1, 4).map(Number);\n if (channels.some((c) => c > 255)) return fail(`a color channel is 0 to 255 in ${show(input)}`);\n let alpha = 1;\n if (rgb[4] !== undefined) {\n alpha = rgb[4].endsWith(\"%\") ? Number(rgb[4].slice(0, -1)) / 100 : Number(rgb[4]);\n if (!(alpha >= 0 && alpha <= 1)) return fail(`a color's alpha is 0 to 1 in ${show(input)}`);\n }\n return ok(alpha === 1 ? `#${channels.map(hex2).join(\"\")}` : `rgba(${channels.join(\", \")}, ${alpha})`);\n }\n if (NAMED_COLORS.has(value)) return ok(value);\n return fail(`expected a color (\"#0879a1\", \"rgb(…)\", \"rgba(…)\" or a CSS name), not ${show(input)}`);\n}\n\nexport function color(): Kind<string, string> {\n return kind({\n name: \"color\",\n editor: \"color\",\n accepts: 'a color (\"#0879a1\", \"rgb(…)\", \"rgba(…)\" or a CSS name)',\n parse: parseColor,\n jsonSchema: () => ({ type: \"string\" }),\n });\n}\n\n// ─── Fonts ──────────────────────────────────────────────────────────────────\n\n/** A font stack, as CSS writes it: \"Inter, Arial, sans-serif\". Web fonts are declared once, in the root's `fonts`. */\nexport type FontFamilyInput = string;\nexport type FontFamily = string;\n\n/** What can't be in a font name or stack: what would end a declaration or a stylesheet. */\nconst FONT_UNSAFE = /[;{}<>\\\\\\n\\r]/;\n\nexport function fontFamily(): Kind<FontFamilyInput, FontFamily> {\n const accepts = 'a font stack, as CSS writes it (\"Inter, Arial, sans-serif\")';\n return kind<FontFamilyInput, FontFamily>({\n name: \"fontFamily\",\n editor: \"fontFamily\",\n accepts,\n parse(input) {\n if (isObject(input) && \"src\" in input) return fail(\"a web font is declared once, in the root's fonts ({ family, src, weight, style }); fontFamily names it in a stack\");\n if (typeof input !== \"string\" || !input.trim() || FONT_UNSAFE.test(input)) return fail(`expected ${accepts}, not ${show(input)}`);\n return ok(input.trim());\n },\n jsonSchema: () => ({ type: \"string\", minLength: 1 }),\n });\n}\n\n/** The families of a font stack, unquoted: \"'Brand Sans', Arial\" is [\"Brand Sans\", \"Arial\"]. */\nexport function fontStack(stack: string): string[] {\n return stack\n .split(\",\")\n .map((family) => family.trim().replace(/^([\"'])(.*)\\1$/, \"$2\"))\n .filter(Boolean);\n}\n\nexport type FontFormat = \"woff2\" | \"woff\" | \"truetype\" | \"opentype\";\nconst FONT_FORMATS: readonly FontFormat[] = [\"woff2\", \"woff\", \"truetype\", \"opentype\"];\n\nexport type FontFaceInput = {\n /** The name text uses for it in a fontFamily stack. */\n family: string;\n /** Its file: an http(s) URL, or a data:font URI. */\n src: string;\n /** The file's format; from its extension where not given. */\n format?: FontFormat;\n /** The weight this file draws (400, \"bold\"), or the range a variable font covers (\"100 900\" or [100, 900]). */\n weight?: FontWeightInput | number | `${number} ${number}` | readonly [number, number];\n style?: \"normal\" | \"italic\";\n};\nexport type FontFace = { family: string; src: string; format?: FontFormat; weight?: number | [number, number]; style?: \"normal\" | \"italic\" };\n\n/** Web fonts: the faces a template loads, each a family's file for a weight and style. */\n/** A list of items, each an object of the given fields, all of them required (a menu's links, a line of icons). */\nexport function items<const F extends Record<string, Kind<any, Json>>>(\n fields: F,\n noun: string\n): Kind<Array<{ [K in keyof F]: InputOf<F[K]> }>, Array<{ [K in keyof F]: OutputOf<F[K]> }>> {\n const names = Object.keys(fields);\n const shape = `{ ${names.join(\", \")} }`;\n const accepts = `a list of ${noun}s, each ${shape}`;\n return kind({\n name: \"items\",\n editor: \"items\",\n accepts,\n parse(input) {\n if (!Array.isArray(input)) return fail(`expected ${accepts}, not ${show(input)}`);\n const out: Array<Record<string, Json>> = [];\n for (const [index, item] of input.entries()) {\n const at = `${noun} ${index + 1}`;\n if (!isObject(item)) return fail(`${at}: expected ${shape}, not ${show(item)}`);\n const extra = Object.keys(item).find((key) => !names.includes(key));\n if (extra) return fail(`${at}: \"${extra}\" isn't one of its fields (${names.join(\", \")})`);\n const value: Record<string, Json> = {};\n for (const name of names) {\n if (item[name] === undefined) return fail(`${at}: ${name} is missing`);\n const parsed = fields[name].parse(item[name]);\n if (!parsed.ok) return fail(`${at}: ${name}: ${parsed.message}`);\n value[name] = parsed.value;\n }\n out.push(value);\n }\n return ok(out as Array<{ [K in keyof F]: OutputOf<F[K]> }>);\n },\n jsonSchema: () => ({\n type: \"array\",\n items: { type: \"object\", required: names, properties: Object.fromEntries(names.map((name) => [name, fields[name].jsonSchema()])), additionalProperties: false },\n }),\n });\n}\n\nexport function fontFaces(): Kind<FontFaceInput[], FontFace[]> {\n const accepts = \"a list of { family, src, format, weight, style }\";\n const face = (input: unknown, index: number): Parsed<FontFace> => {\n const at = `font ${index + 1}`;\n if (!isObject(input)) return fail(`${at}: expected { family, src, format, weight, style }, not ${show(input)}`);\n const extra = Object.keys(input).find((key) => ![\"family\", \"src\", \"format\", \"weight\", \"style\"].includes(key));\n if (extra) return fail(`${at}: \"${extra}\" isn't part of a font; expected family, src, format, weight or style`);\n if (typeof input.family !== \"string\" || !input.family.trim() || FONT_UNSAFE.test(input.family) || input.family.includes(\",\")) {\n return fail(`${at}: family is one font's name (\"Inter\"), not ${show(input.family)}`);\n }\n if (typeof input.src !== \"string\" || !input.src.trim() || unsafeUrl(input.src, /^data:(font|application)\\//)) {\n return fail(`${at}: src is the font file's http(s) URL (or a data:font URI), not ${show(input.src)}`);\n }\n const out: FontFace = { family: input.family.trim(), src: input.src.trim() };\n if (input.format !== undefined) {\n if (!(FONT_FORMATS as readonly unknown[]).includes(input.format)) return fail(`${at}: format is one of ${FONT_FORMATS.join(\", \")}, not ${show(input.format)}`);\n out.format = input.format as FontFormat;\n }\n if (input.weight !== undefined) {\n // A range as written (\"100 900\"), or as parsed ([100, 900]): a font is checked again once it's been read.\n const range = typeof input.weight === \"string\" ? /^\\s*(\\d+)\\s+(\\d+)\\s*$/.exec(input.weight) : Array.isArray(input.weight) && input.weight.length === 2 && input.weight.every(Number.isInteger) ? [null, ...input.weight] : null;\n const weight = input.weight === \"normal\" ? 400 : input.weight === \"bold\" ? 700 : input.weight;\n if (range && Number(range[1]) >= 1 && Number(range[2]) <= 1000 && Number(range[1]) <= Number(range[2])) out.weight = [Number(range[1]), Number(range[2])];\n else if (typeof weight === \"number\" && Number.isInteger(weight) && weight >= 1 && weight <= 1000) out.weight = weight;\n else return fail(`${at}: weight is 1 to 1000, \"normal\", \"bold\", or a range (\"100 900\"), not ${show(input.weight)}`);\n }\n if (input.style !== undefined) {\n if (input.style !== \"normal\" && input.style !== \"italic\") return fail(`${at}: style is \"normal\" or \"italic\", not ${show(input.style)}`);\n out.style = input.style;\n }\n return ok(out);\n };\n return kind<FontFaceInput[], FontFace[]>({\n name: \"fontFaces\",\n editor: \"fontFaces\",\n accepts,\n parse(input) {\n if (!Array.isArray(input)) return fail(`expected ${accepts}, not ${show(input)}`);\n const out: FontFace[] = [];\n for (const [index, item] of input.entries()) {\n const parsed = face(item, index);\n if (!parsed.ok) return parsed;\n out.push(parsed.value);\n }\n return ok(out);\n },\n jsonSchema: () => ({\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"family\", \"src\"],\n properties: {\n family: { type: \"string\", minLength: 1 },\n src: { type: \"string\", minLength: 1 },\n format: { enum: [...FONT_FORMATS] },\n weight: { anyOf: [{ type: \"number\", minimum: 1, maximum: 1000 }, { type: \"string\" }, { type: \"array\", items: { type: \"integer\", minimum: 1, maximum: 1000 }, minItems: 2, maxItems: 2 }] },\n style: { enum: [\"normal\", \"italic\"] },\n },\n additionalProperties: false,\n },\n }),\n });\n}\n\nexport type FontWeightInput = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | \"normal\" | \"bold\";\n\nexport function fontWeight(): Kind<FontWeightInput, number> {\n return kind({\n name: \"fontWeight\",\n editor: \"fontWeight\",\n accepts: '100 to 900 in hundreds, \"normal\" or \"bold\"',\n parse(input) {\n if (input === \"normal\") return ok(400);\n if (input === \"bold\") return ok(700);\n if (typeof input === \"number\" && input >= 100 && input <= 900 && input % 100 === 0) return ok(input);\n return fail(`expected 100 to 900 in hundreds, \"normal\" or \"bold\", not ${show(input)}`);\n },\n jsonSchema: () => ({ anyOf: [{ enum: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, { enum: [\"normal\", \"bold\"] }] }),\n });\n}\n\nexport type LineHeightInput = number | `${number}px` | `${number}%` | \"normal\";\n/** A multiple of the font size (1.5), or a fixed height in px (\"24px\"). */\nexport type LineHeight = number | `${number}px` | \"normal\";\n\nexport function lineHeight(): Kind<LineHeightInput, LineHeight> {\n const accepts = 'a multiple of the font size (1.5), a percentage (\"150%\"), px (\"24px\") or \"normal\" (the font\\'s own)';\n return kind<LineHeightInput, LineHeight>({\n name: \"lineHeight\",\n editor: \"lineHeight\",\n accepts,\n parse(input) {\n if (input === \"normal\") return ok(\"normal\");\n if (typeof input === \"number\") return input > 0 && Number.isFinite(input) ? ok(input) : fail(`expected ${accepts}, not ${show(input)}`);\n const parsed = typeof input === \"string\" && /^\\s*-?[\\d.]+\\s*$/.test(input) ? undefined : readLength(input);\n if (!parsed || parsed.value <= 0 || (parsed.unit !== \"px\" && parsed.unit !== \"%\")) return fail(`expected ${accepts}, not ${show(input)}`);\n return ok(parsed.unit === \"%\" ? Math.round(parsed.value * 1000) / 100000 : (`${parsed.value}px` as const));\n },\n jsonSchema: () => ({ anyOf: [{ type: \"number\", exclusiveMinimum: 0 }, { type: \"string\", pattern: `^${NUMBER}(px|%)$` }, { const: \"normal\" }] }),\n });\n}\n\n// ─── URLs: images and links ─────────────────────────────────────────────────\n\n/**\n * An email service's tag in a URL, as it's written or as Elements 0.2's components kept it from the writers (a mark,\n * `\\uFDD0<n>\\uFDD1`). Its service fills it in later, perhaps with nothing.\n */\nconst SERVICE_TAG = /<%[\\s\\S]*?%>|\\{%[\\s\\S]*?%\\}|\\{\\{[\\s\\S]*?\\}\\}|\\uFDD0\\d+\\uFDD1/g;\n\n/** A URL scheme that runs code or reads local files, after the characters browsers ignore in one, and without what a service fills in. */\nfunction unsafeUrl(url: string, allowedData?: RegExp): boolean {\n // eslint-disable-next-line no-control-regex\n const compact = url.replace(SERVICE_TAG, \"\").replace(/[\\u0000- \\u007f-\\u009f]/g, \"\").toLowerCase();\n if (compact.startsWith(\"data:\")) return !allowedData || !allowedData.test(compact);\n return /^(javascript|vbscript|file):/.test(compact);\n}\n\nexport type AssetInput = string | { src: string; width?: number; height?: number };\n/** A URL, or one with the image's own size in px (used to size it where no width is set). */\nexport type Asset = string | { src: string; width?: number; height?: number };\n\nconst IMAGE_DATA = /^data:image\\/(png|jpeg|jpg|gif|webp|svg\\+xml)[;,]/;\n\nexport function asset(): Kind<AssetInput, Asset> {\n const accepts = \"an image URL (http, https or a data:image URI), or { src, width, height }\";\n return kind<AssetInput, Asset>({\n name: \"asset\",\n editor: \"image\",\n accepts,\n parse(input) {\n const src = typeof input === \"string\" ? input : isObject(input) ? input.src : undefined;\n if (typeof src !== \"string\" || !src.trim()) return fail(`expected ${accepts}, not ${show(input)}`);\n if (unsafeUrl(src, IMAGE_DATA)) return fail(`${show(src)} isn't an image URL Elements will write`);\n if (typeof input === \"string\") return ok(src.trim());\n const extra = Object.keys(input as object).find((key) => ![\"src\", \"width\", \"height\"].includes(key));\n if (extra) return fail(`\"${extra}\" isn't part of an image; expected src, width or height`);\n const out: { src: string; width?: number; height?: number } = { src: src.trim() };\n for (const side of [\"width\", \"height\"] as const) {\n const value = (input as Record<string, unknown>)[side];\n if (value === undefined) continue;\n if (typeof value !== \"number\" || !(value > 0)) return fail(`an image's ${side} is its size in px, not ${show(value)}`);\n out[side] = value;\n }\n return ok(out);\n },\n jsonSchema: () => ({\n anyOf: [\n { type: \"string\", minLength: 1 },\n {\n type: \"object\",\n required: [\"src\"],\n properties: { src: { type: \"string\", minLength: 1 }, width: { type: \"number\", exclusiveMinimum: 0 }, height: { type: \"number\", exclusiveMinimum: 0 } },\n additionalProperties: false,\n },\n ],\n }),\n });\n}\n\nexport type LinkTarget = \"_blank\" | \"_self\";\nexport type LinkInput = string | { href: string; target?: LinkTarget };\nexport type LinkValue = string | { href: string; target?: LinkTarget };\n\n// ─── Videos ─────────────────────────────────────────────────────────────────\n\nexport type VideoProvider = \"youtube\" | \"vimeo\";\nconst YOUTUBE = /^https:\\/\\/(?:www\\.|m\\.)?(?:youtube\\.com\\/(?:watch\\?(?:[^#]*&)?v=|embed\\/|shorts\\/|live\\/)|youtu\\.be\\/)([A-Za-z0-9_-]{6,})/;\nconst VIMEO = /^https:\\/\\/(?:www\\.|player\\.)?vimeo\\.com\\/(?:video\\/)?(\\d+)/;\n\n/**\n * A video's provider and id, and what follows from them without the network: its player's URL, and a YouTube\n * video's thumbnail (a Vimeo video's is only found by asking Vimeo).\n */\nexport function videoParts(url: string): { provider: VideoProvider; id: string; embed: string; thumbnail?: string } | undefined {\n const youtube = YOUTUBE.exec(url);\n if (youtube) return { provider: \"youtube\", id: youtube[1], embed: `https://www.youtube.com/embed/${youtube[1]}`, thumbnail: `https://img.youtube.com/vi/${youtube[1]}/0.jpg` };\n const vimeo = VIMEO.exec(url);\n if (vimeo) return { provider: \"vimeo\", id: vimeo[1], embed: `https://player.vimeo.com/video/${vimeo[1]}` };\n return undefined;\n}\n\nexport function video(): Kind<string, string> {\n const accepts = \"a YouTube or Vimeo video's https link\";\n return kind<string, string>({\n name: \"video\",\n editor: \"link\",\n accepts,\n parse(input) {\n if (typeof input !== \"string\" || !videoParts(input.trim())) return fail(`expected ${accepts}, not ${show(input)}`);\n return ok(input.trim());\n },\n jsonSchema: () => ({ type: \"string\", pattern: \"^https://\" }),\n });\n}\n\nexport function link(): Kind<LinkInput, LinkValue> {\n const accepts = \"a URL (http, https, mailto, tel, a path, or a merge tag) or { href, target }\";\n return kind<LinkInput, LinkValue>({\n name: \"link\",\n editor: \"link\",\n accepts,\n parse(input) {\n const href = typeof input === \"string\" ? input : isObject(input) ? input.href : undefined;\n // A link to nothing is { href: \"\" }, as a template from another format says one has no URL; a string that's empty is a mistake.\n if (typeof href !== \"string\" || (!href.trim() && (typeof input === \"string\" || href !== \"\"))) return fail(`expected ${accepts}, not ${show(input)}`);\n if (unsafeUrl(href)) return fail(`${show(href)} isn't a link Elements will write (scripts, data and local files aren't)`);\n if (typeof input === \"string\") return ok(href.trim());\n const extra = Object.keys(input as object).find((key) => ![\"href\", \"target\"].includes(key));\n if (extra) return fail(`\"${extra}\" isn't part of a link; expected href or target`);\n const target = (input as Record<string, unknown>).target;\n if (target === undefined) return ok(href ? href.trim() : { href });\n if (target !== \"_blank\" && target !== \"_self\") return fail(`a link's target is \"_blank\" or \"_self\", not ${show(target)}`);\n return ok({ href: href.trim(), target });\n },\n jsonSchema: () => ({\n anyOf: [\n { type: \"string\", minLength: 1 },\n { type: \"object\", required: [\"href\"], properties: { href: { type: \"string\" }, target: { enum: [\"_blank\", \"_self\"] } }, additionalProperties: false },\n ],\n }),\n });\n}\n\n/** More attributes for an element, by name (a link's class, a `data-` attribute): not its handlers, which run scripts. */\nexport function attributes(): Kind<Record<string, string>, Record<string, string>> {\n const accepts = \"attributes by name, each a text value (no on… handlers, href or style)\";\n return kind<Record<string, string>, Record<string, string>>({\n name: \"attributes\",\n editor: \"text\",\n accepts,\n parse(input) {\n if (!isObject(input)) return fail(`expected ${accepts}, not ${show(input)}`);\n for (const [name, value] of Object.entries(input)) {\n if (!/^[a-zA-Z_:][\\w:.-]*$/.test(name) || /^(on|href$|style$)/i.test(name) || typeof value !== \"string\") return fail(`${show(name)} isn't an attribute Elements will write, with ${show(value)}`);\n }\n return ok(input as Record<string, string>);\n },\n jsonSchema: () => ({ type: \"object\", additionalProperties: { type: \"string\" } }),\n });\n}\n\n/** The narrowest a phone width may be set to. */\nexport const MIN_PHONE_WIDTH = 240;\n\n/** A Page's breakpoints: `mobile`, the widest window, in px, its phone styles apply to. */\nexport function breakpoints(): Kind<{ mobile?: number }, { mobile?: number } & { [key: string]: Json }> {\n const accepts = `{ mobile }: the phone width in px (from ${MIN_PHONE_WIDTH})`;\n return kind<{ mobile?: number }, { mobile?: number } & { [key: string]: Json }>({\n name: \"breakpoints\",\n editor: \"number\",\n accepts,\n parse(input) {\n if (!isObject(input)) return fail(`expected ${accepts}, not ${show(input)}`);\n const unknown = Object.keys(input).find((key) => key !== \"mobile\");\n if (unknown !== undefined) return fail(`${show(unknown)} isn't a breakpoint a Page has: it has mobile`);\n const { mobile } = input;\n if (mobile === undefined) return ok({});\n if (typeof mobile !== \"number\" || !Number.isInteger(mobile) || mobile < MIN_PHONE_WIDTH) return fail(`mobile is the widest window its phone styles apply to, an integer from ${MIN_PHONE_WIDTH}, not ${show(mobile)}`);\n return ok({ mobile });\n },\n empty: (value) => value.mobile === undefined,\n jsonSchema: () => ({ type: \"object\", properties: { mobile: { type: \"integer\", minimum: MIN_PHONE_WIDTH } }, additionalProperties: false }),\n });\n}\n\n/** A link's href and target, from either form. */\nexport function linkParts(value: LinkValue): { href: string; target?: LinkTarget } {\n return typeof value === \"string\" ? { href: value } : value;\n}\n\n/** An image's URL and own size, from either form. */\nexport function assetParts(value: Asset): { src: string; width?: number; height?: number } {\n return typeof value === \"string\" ? { src: value } : value;\n}\n","/**\n * Component definitions: one per component, the source of its props, styles,\n * children, targets, support in each output and editors. Types, validation,\n * the support pass and property discovery are all read from these.\n */\nimport type { EmailClient } from \"./email-clients\";\nimport type { EditorKind, InputOf, Kind, OutputOf } from \"./kinds\";\nimport type { Json, Node } from \"./model\";\n\n/** What a component is, for the nesting rules: a component belongs to one or more. */\nexport type Category = \"root\" | \"section\" | \"layout\" | \"block\" | \"inline\" | \"shape\";\n\n/** The outputs Elements renders. */\nexport type Target = \"email\" | \"web\" | \"print\" | \"pdf\" | \"image\";\n\nexport const TARGETS: readonly Target[] = [\"email\", \"web\", \"print\", \"pdf\", \"image\"];\n\n/** The roots a template can have: each decides the output (`render()` writes an Email's HTML, a Page's, …). */\nexport type RootName = \"Email\" | \"Page\" | \"Document\" | \"Canvas\";\n\nexport const ROOT_NAMES: readonly RootName[] = [\"Email\", \"Page\", \"Document\", \"Canvas\"];\n\n/** What a style is about, for the guide and `describeComponents()`: the group it's listed in. */\nexport type StyleGroup = \"Layout\" | \"Size\" | \"Position\" | \"Spacing\" | \"Typography\" | \"Background\" | \"Border\" | \"Effects\";\n\nexport const STYLE_GROUPS: readonly StyleGroup[] = [\"Layout\", \"Size\", \"Position\", \"Spacing\", \"Typography\", \"Background\", \"Border\", \"Effects\"];\n\nexport interface PropSpec<K extends Kind<any, any> = Kind<any, any>, R extends boolean = boolean> {\n kind: K;\n required?: R;\n label: string;\n description?: string;\n /**\n * The roots it may be given under (default: every root its component goes in). Under another root it's a\n * `prop/not-supported` error naming these.\n */\n roots?: readonly RootName[];\n /** Used where the prop isn't given (not written into the document). */\n default?: OutputOf<K>;\n /** Editors may change it (default true). */\n editable?: boolean;\n /** How each output shows it: required for every output its component renders to (a test checks). */\n support?: SupportByTarget;\n}\n\n/** A style's or prop's support, by output. */\nexport type SupportByTarget = Partial<Record<Target, Support | readonly Support[]>>;\n\n/**\n * Where what an output shows of a style or prop is known from: captures of\n * real classic Outlook for Windows; caniemail's client tables\n * (caniemail.com); the output's writer itself, which turns it into markup the\n * output shows (checked in Chromium, for email with and without <style>, and\n * against a model of Outlook's layout built from those captures); captures of\n * Gmail, Outlook.com or Apple Mail; CSS written as is, which browsers show as\n * asked; or assumed, not yet checked.\n */\nexport type SupportSource = \"outlook-captures\" | \"gmail-captures\" | \"outlook-com-captures\" | \"apple-mail-captures\" | \"caniemail\" | \"writer\" | \"css\" | \"assumed\";\n\n/**\n * How an output shows a style or prop, or some of its values (`values`, or\n * `when` the value, on a node with such props, is such): as asked (`full`); as asked but in classic\n * Outlook, which shows something else (`outlook`, email only: what it shows);\n * not quite as asked anywhere it's shown (`partial`: what it shows); or not at\n * all (`none`: what it does instead). Read by the support pass every output\n * runs: `outlook` and `partial` are notes, `none` a warning, whether the email\n * clients it names were captured or are from caniemail's tables; one `assumed`\n * is only ever a note.\n */\nexport type Support =\n | { level: \"full\"; source: SupportSource }\n | {\n level: \"outlook\" | \"partial\" | \"none\";\n shows: string;\n values?: readonly Json[];\n when?: (value: Json, node: { props: Record<string, Json> }) => boolean;\n source: SupportSource;\n /** For email, the clients it's about (`outlook`: classic Outlook); absent, every email client. */\n clients?: readonly EmailClient[];\n /** caniemail's feature the clients are from (its slug), checked against its tables (test/caniemail.test.ts). */\n feature?: string;\n /** What to change. */\n fix?: string;\n };\n\nexport interface StyleSpec<K extends Kind<any, any> = Kind<any, any>> {\n kind: K;\n label: string;\n description?: string;\n /** Passed down to children that don't set it (text styles). */\n inherited?: boolean;\n /** May be overridden on phones (`mobile`). */\n mobile?: boolean;\n /**\n * The roots it may be set under (default: every root its component goes in). Under another root it's a\n * `style/not-supported` error naming these, in `style` and in its condition blocks alike.\n */\n roots?: readonly RootName[];\n /** The group it's listed in; default: the group of its name (`STYLE_GROUP_OF`), as a style's name is CSS's. */\n group?: StyleGroup;\n editable?: boolean;\n /** How each output shows it: required for every output its component renders to (a test checks). */\n support?: SupportByTarget;\n}\n\nexport type PropSpecs = Record<string, PropSpec>;\nexport type StyleSpecs = Record<string, StyleSpec>;\n\nexport interface ChildrenRule {\n /** Text (strings) may be children. */\n text?: boolean;\n /** Components of these categories may be children. */\n categories?: readonly Category[];\n /** These types may be children, whatever their category. */\n types?: readonly string[];\n}\n\nexport interface TargetSupport {\n /** What's different in this target, for docs and diagnostics. */\n note?: string;\n}\n\n/** A change to a node: what a composite editor writes. */\nexport interface NodePatch {\n props?: Record<string, Json | undefined>;\n style?: Record<string, Json | undefined>;\n hover?: Record<string, Json | undefined>;\n}\n\n/** An editor that reads and writes several props at once (a button's colors). */\nexport interface CompositeEditor<V = any> {\n /** The conceptual editor (\"buttonColors\"); editors map it to a widget. */\n editor: string;\n /** The paths it reads and writes (\"style.color\", \"hover.backgroundColor\"). */\n covers: readonly string[];\n read(node: Pick<Node, \"props\" | \"style\" | \"hover\">): V;\n write(value: V): NodePatch;\n}\n\nexport type EditorGroup =\n | { title: string; paths: readonly string[] }\n | { title: string; composite: CompositeEditor };\n\n/**\n * A component's definition. `H` is its hover styles' keys: a definition made with `defineComponent()` keeps the list it\n * gives (none: `readonly []`), so the types of its `style.hover` can be exactly those; the default is any of its styles.\n */\nexport interface ComponentDefinition<P extends PropSpecs = PropSpecs, S extends StyleSpecs = StyleSpecs, H extends readonly (keyof S & string)[] = readonly (keyof S & string)[]> {\n type: string;\n label: string;\n description: string;\n categories: readonly Category[];\n props: P;\n style: S;\n /** The component's own style, under what the author sets and over what's inherited (as a browser's defaults are). */\n defaultStyle?: { [K in keyof S]?: OutputOf<S[K][\"kind\"]> };\n /** Default style that depends on a prop's value (a Heading's size on its level), over `defaultStyle`. */\n defaultStyleBy?: { prop: keyof P & string; values: Record<string, { [K in keyof S]?: OutputOf<S[K][\"kind\"]> }> };\n /** Style keys that may be set for `hover`. */\n hover?: H;\n /**\n * Styles a condition takes on this component that an output doesn't show under it, by condition, style and\n * output (a Page root's phone font size): reported when the template is expanded, before a Grid is arranged.\n */\n conditionSupport?: Partial<Record<\"mobile\" | \"hover\", Partial<Record<keyof S & string, SupportByTarget>>>>;\n children: ChildrenRule;\n /**\n * How wide it is where nothing sets its width: `stretch` fills its parent's\n * content width; `shrink` takes its own size (an image's, a button's\n * content).\n */\n sizing: \"stretch\" | \"shrink\" | \"none\";\n /** A root that has a phone width (Email, Page): `mobile` and `hidden` apply under it. */\n responsive?: boolean;\n /**\n * A built-in that lays its children out with other components (a Grid's Rows of Columns): its node as those,\n * before layout. Its children (and their ids) are kept as they are.\n */\n arrange?: (node: Node) => Node;\n /** Where it renders; a target left out is a diagnostic. */\n targets: Partial<Record<Target, TargetSupport>>;\n /**\n * The roots it may go in, of those whose output it renders to (default: every one whose children reach it). Under\n * another such root it's the `notAllowed` error, by default `component/not-supported` naming these; under a root\n * whose output it doesn't render to, it's `target/unsupported`, as for any component.\n */\n roots?: readonly RootName[];\n notAllowed?: { code: string; message: (root: string) => string };\n /** Why a target it doesn't render can't, and what to do instead (in the diagnostic). */\n unsupported?: Partial<Record<Target, string>>;\n editor?: { groups: readonly EditorGroup[] };\n}\n\n/** Keeps the literal types of a definition's props and styles, for the derived TypeScript types. */\nexport function defineComponent<const P extends PropSpecs, const S extends StyleSpecs, const H extends readonly (keyof S & string)[] = readonly []>(\n definition: ComponentDefinition<P, S, H>\n): ComponentDefinition<P, S, H> {\n return definition;\n}\n\n/** A prop of `kind`; the type keeps whether it's required and whether it has a default. */\nexport function prop<K extends Kind<any, any>, const R extends boolean = false, const D extends OutputOf<K> | undefined = undefined>(\n kind: K,\n options: Omit<PropSpec<K, R>, \"kind\" | \"default\"> & { default?: D }\n): PropSpec<K, R> & { default: D } {\n return { kind, ...options } as PropSpec<K, R> & { default: D };\n}\n\n// ─── Types derived from definitions ─────────────────────────────────────────\n\ntype RequiredKeys<P extends PropSpecs> = { [K in keyof P]: Exclude<P[K][\"required\"], undefined> extends true ? K : never }[keyof P];\ntype OptionalKeys<P extends PropSpecs> = Exclude<keyof P, RequiredKeys<P>>;\n\n/** The props a component takes, as authors write them. */\nexport type PropsInput<P extends PropSpecs> = { [K in RequiredKeys<P>]: InputOf<P[K][\"kind\"]> } & {\n [K in OptionalKeys<P>]?: InputOf<P[K][\"kind\"]>;\n};\n\n/** Its style, as authors write it. */\nexport type StyleInput<S extends StyleSpecs> = { [K in keyof S]?: InputOf<S[K][\"kind\"]> };\n\n/** Its style once normalized (in a document). */\nexport type StyleOutput<S extends StyleSpecs> = { [K in keyof S]?: OutputOf<S[K][\"kind\"]> };\n\n/** A node of this component in the template tree, before normalization. */\nexport type NodeInput<D extends ComponentDefinition<any, any>> = D extends ComponentDefinition<infer P, infer S>\n ? {\n type: D[\"type\"];\n id?: string;\n props?: PropsInput<P>;\n style?: StyleInput<S>;\n mobile?: StyleInput<S>;\n hover?: StyleInput<S>;\n hidden?: { mobile?: boolean; desktop?: boolean };\n children?: Array<{ type: string; [key: string]: unknown } | string>;\n }\n : never;\n\nexport type { EditorKind };\n","/**\n * The conditions a component's styles can be set for besides its own: on phones (`mobile`) and while the pointer is\n * over it (`hover`). Each says where it's allowed, which styles it takes, where its rules go in the stylesheet, and\n * how each output shows it, so reading a template, expanding composites, the support diagnostics and the writers all\n * go through this one list. A condition joins it with its support for every output (test/writers/support.test.ts).\n */\nimport type { ComponentDefinition, StyleSpec, Support, SupportByTarget, Target } from \"./define\";\nimport type { Json } from \"./model\";\nimport type { Level, Media } from \"./writers/shared/classes\";\n\nexport type ConditionName = \"mobile\" | \"hover\";\n\n/** The least a node needs for a paged output's message. */\ninterface Named {\n type: string;\n}\n\nexport interface Condition {\n name: ConditionName;\n /** What it's called in messages: \"on phones\", and \"for phones\" for what can be set for it. */\n on: string;\n for: string;\n /** Whether it's allowed under a root; elsewhere it's the `notAllowed` error when a template is read. Undefined: every root. */\n roots?: (root: ComponentDefinition | undefined) => boolean;\n notAllowed?: { code: string; message: string };\n /**\n * Where its rules go in the stylesheet: an existing Media, and for a state its selector and Level; `within`, the\n * selector for a box that draws part of a focusable element inside it (an email Button's cell, around its link).\n */\n sheet: { media: Media; selector: string; within?: string; level?: Level };\n /** Which styles of a component it takes. */\n allows: (spec: StyleSpec, key: string, definition: ComponentDefinition) => boolean;\n /** How each output shows the block itself. */\n support: Partial<Record<Target, Support>>;\n /** Per style, how each output shows it inside this block, where that differs from the style's own declaration. */\n styles?: Record<string, SupportByTarget>;\n /** What a PDF or an image writes for it, where it can reach one. */\n paged?: (node: Named, where: string) => string;\n /** Whether classic Outlook for Windows ever applies it: a style's `outlook` note inside it is skipped where it doesn't. */\n outlookApplies: boolean;\n /** A node hidden here doesn't need its block: the support pass skips it. */\n hiddenKey?: \"mobile\" | \"desktop\";\n}\n\nexport const MOBILE: Condition = {\n name: \"mobile\",\n on: \"on phones\",\n for: \"for phones\",\n roots: (root) => !!root?.responsive,\n notAllowed: { code: \"mobile/not-supported\", message: \"Phone styles are for an Email or a Page, which have a phone width\" },\n sheet: { media: \"phone\", selector: \"&\" },\n allows: (spec) => !!spec.mobile,\n support: { web: { level: \"full\", source: \"writer\" }, email: { level: \"full\", source: \"writer\" } },\n styles: {\n // The email's phone text styles are rules that override a size; \"normal\" isn't one.\n lineHeight: { email: { level: \"none\", values: [\"normal\"], shows: \"the line height it has on desktop\", source: \"writer\" } },\n },\n outlookApplies: false,\n hiddenKey: \"mobile\",\n};\n\nexport const HOVER: Condition = {\n name: \"hover\",\n on: \"on hover\",\n for: \"for hover\",\n // Keyboard focus gets the same styles as the pointer: a link or button reached by Tab shows its hover colors.\n // A box around the link (an email Button's cell, its background) takes them while the link in it has focus.\n sheet: { media: \"all\", selector: \"&:hover,&:focus-visible\", within: \"&:hover,&:focus-within\", level: \"hover\" },\n allows: (_, key, definition) => !!definition.hover?.includes(key),\n support: {\n web: { level: \"full\", source: \"css\" },\n // On type selectors only in Outlook.com and Outlook for Mac (Elements' are classes); the phone apps' results don't\n // matter, as nothing hovers there.\n email: {\n level: \"partial\",\n shows: \"no change (where it shows, keyboard focus gets it too)\",\n source: \"caniemail\",\n feature: \"css-pseudo-class-hover\",\n clients: [\"outlook\", \"outlook-com\", \"outlook-mac\", \"gmx\", \"web-de\", \"sfr\", \"laposte\", \"mail-ru\"],\n },\n },\n paged: (node, where) => `A hover isn't possible in ${where}: nothing points at it. The ${node.type} shows its own colors`,\n outlookApplies: false,\n};\n\n/** In the order a node's blocks are read and reported. */\nexport const CONDITIONS: readonly Condition[] = [MOBILE, HOVER];\n\nexport const CONDITION_NAMES: ReadonlySet<string> = new Set(CONDITIONS.map((condition) => condition.name));\n\n/** A node's block for a condition, if it has one with something in it. */\nexport function blockOf(node: { mobile?: Record<string, Json>; hover?: Record<string, Json> }, condition: Condition): Record<string, Json> | undefined {\n const block = node[condition.name];\n return block && Object.keys(block).length ? block : undefined;\n}\n\n/** Whether a node shows anywhere: hidden on phones and on desktop, it never does. */\nexport function shownAnywhere(node: { hidden?: { mobile?: boolean; desktop?: boolean } }): boolean {\n return !(node.hidden?.mobile && node.hidden?.desktop);\n}\n","/**\n * The style properties components pick from. There are no margins: space\n * between siblings is the parent's `gap`, space inside a box its `padding`,\n * which every target can do (margins aren't reliable in email).\n */\nimport type { Support, StyleGroup, StyleSpec } from \"./define\";\n\n/** Shown as asked, by how the writer writes it. */\nconst writer: Support = { level: \"full\", source: \"writer\" };\n/** Written as CSS, which browsers show as asked. */\nexport const css: Support = { level: \"full\", source: \"css\" };\nimport { border, color, enumOf, flex, fontFamily, fontWeight, insets, length, lineHeight, radius } from \"./kinds\";\n\n/** Inherited from the root down through layouts, as in CSS. */\nexport const textStyle = {\n color: { kind: color(), label: \"Text color\", inherited: true, support: { email: writer, web: css }},\n // A web font in a stack is reported from the root's fonts (whether it loads depends on the client).\n fontFamily: { kind: fontFamily(), label: \"Font\", inherited: true, support: { email: { level: \"full\", source: \"outlook-captures\" }, web: css } },\n // Word rounds sizes to half points (13px is 10pt): a fraction of a px.\n fontSize: { kind: length([\"px\"], { min: 1 }), label: \"Font size\", inherited: true, mobile: true, support: { email: { level: \"full\", source: \"outlook-captures\" }, web: css } },\n fontWeight: {\n kind: fontWeight(),\n label: \"Font weight\",\n inherited: true,\n support: { email: { level: \"outlook\", values: [100, 200, 300, 500], shows: \"normal weight: Word draws only normal and bold (600 and over)\", source: \"caniemail\", feature: \"css-font-weight\" }, web: css },\n },\n fontStyle: { kind: enumOf([\"normal\", \"italic\"]), label: \"Font style\", inherited: true, support: { email: { level: \"full\", source: \"caniemail\" }, web: css } },\n // Written in px with mso-line-height-rule: exactly, which Word keeps (it drops unitless ones).\n lineHeight: { kind: lineHeight(), label: \"Line height\", inherited: true, mobile: true, support: { email: { level: \"full\", source: \"outlook-captures\" }, web: css } },\n letterSpacing: {\n kind: length([\"px\"], { min: -100 }),\n label: \"Letter spacing\",\n inherited: true,\n mobile: true,\n support: { email: { level: \"outlook\", shows: \"normal spacing: Word keeps letter spacing but doesn't draw it\", source: \"outlook-captures\" }, web: css },\n },\n textAlign: { kind: enumOf([\"left\", \"center\", \"right\", \"justify\"]), label: \"Alignment\", inherited: true, mobile: true, support: { email: { level: \"full\", source: \"caniemail\" }, web: css } },\n textTransform: {\n kind: enumOf([\"none\", \"uppercase\", \"lowercase\", \"capitalize\"]),\n label: \"Letter case\",\n inherited: true,\n support: { email: { level: \"outlook\", values: [\"lowercase\"], shows: \"the text as written: Word doesn't lowercase it\", source: \"caniemail\", feature: \"css-text-transform\" }, web: css },\n },\n textDecoration: {\n kind: enumOf([\"none\", \"underline\", \"line-through\"]),\n label: \"Decoration\",\n support: {\n // Removed, so \"none\" leaves a link the client's own underline: said only where a line is asked for.\n email: { level: \"partial\", values: [\"underline\", \"line-through\"], shows: \"no line: the client removes it\", source: \"caniemail\", feature: \"css-text-decoration\", clients: [\"gmail-app-other\", \"protonmail\", \"orange\", \"sfr\"] },\n web: css,\n },\n },\n} satisfies Record<string, StyleSpec>;\n\n/** Text styles for a container, passed down to its text: all but decoration, which is a text element's own (CSS doesn't pass it down). */\nexport const inheritedTextStyle = (({ textDecoration: _, ...rest }) => rest)(textStyle);\n\nexport const boxStyle = {\n // Widths are the resolver's, written as table, cell and image attributes in px (what Word sizes by).\n width: { kind: length([\"px\", \"%\"]), label: \"Width\", mobile: true, support: { email: writer, web: css }},\n minWidth: { kind: length([\"px\", \"%\"]), label: \"Minimum width\", support: { email: writer, web: css }},\n maxWidth: { kind: length([\"px\", \"%\"]), label: \"Maximum width\", mobile: true, support: { email: writer, web: css }},\n height: { kind: length([\"px\"]), label: \"Height\", support: { email: writer, web: css }},\n // Cell padding, which Word keeps (it drops a div's).\n padding: { kind: insets(), label: \"Padding\", mobile: true, support: { email: { level: \"full\", source: \"outlook-captures\" }, web: css } },\n backgroundColor: { kind: color(), label: \"Background color\", support: { email: writer, web: css }},\n border: { kind: border(), label: \"Border\", mobile: true, support: { email: { level: \"full\", source: \"caniemail\" }, web: css } },\n borderRadius: {\n kind: radius(),\n label: \"Corner radius\",\n support: {\n email: [\n { level: \"outlook\", shows: \"square corners\", source: \"caniemail\", feature: \"css-border-radius\" },\n { level: \"partial\", shows: \"square corners\", source: \"caniemail\", feature: \"css-border-radius\", clients: [\"gmx\", \"web-de\", \"orange\"] },\n ],\n web: css,\n },\n },\n overflow: {\n kind: enumOf([\"visible\", \"hidden\"]),\n label: \"Overflow\",\n description: \"Whether content past a set height is cut off.\",\n support: { email: { level: \"outlook\", shows: \"content past the height: Word doesn't cut it off\", values: [\"hidden\"], source: \"caniemail\" }, web: css },\n },\n} satisfies Record<string, StyleSpec>;\n\nexport const layoutStyle = {\n gap: { kind: length([\"px\"]), label: \"Gap\", description: \"Space between children.\", mobile: true, support: { email: writer, web: css }},\n alignItems: {\n kind: enumOf([\"start\", \"center\", \"end\", \"stretch\"]),\n label: \"Align items\",\n description: \"Where children sit across the layout's direction (vertically in a Row, horizontally in a Column), as CSS align-items. Across a Column it places what has its own size (a Button, an Image, an Svg, a box with a width); a block of text fills the width, so its words move with its textAlign.\",\n // A cell's align, and a Row's cells' valign.\n support: { email: writer, web: css },\n },\n justifyContent: {\n kind: enumOf([\"start\", \"center\", \"end\", \"space-between\"]),\n label: \"Justify content\",\n description: \"Where children sit along the layout's direction, as CSS justify-content.\",\n support: { email: writer, web: css },\n },\n} satisfies Record<string, StyleSpec>;\n\n/** On any child, read by the Row it's in. */\nexport const placementStyle = {\n flex: {\n kind: flex(),\n label: \"Share\",\n description: 'In a Row: its share of the width left after children with a width (default 1); \"none\" takes its own size.',\n support: { email: writer, web: css },\n },\n} satisfies Record<string, StyleSpec>;\n\n/** The keys of `group` named, as a group of their own. */\nexport function pick<G extends Record<string, StyleSpec>, const K extends keyof G>(group: G, ...keys: K[]): Pick<G, K> {\n return Object.fromEntries(keys.map((key) => [key, group[key]])) as Pick<G, K>;\n}\n\n/**\n * The group each style is listed in, by its name. A style's name is CSS's (or, for a component's own, says what it\n * draws), and it's in the same group on every component that takes it; a spec's own `group` comes first.\n */\nexport const STYLE_GROUP_OF: Readonly<Record<string, StyleGroup>> = {\n // How children are placed, and how a box sits among its siblings.\n alignItems: \"Layout\",\n justifyContent: \"Layout\",\n justifyItems: \"Layout\",\n alignSelf: \"Layout\",\n verticalAlign: \"Layout\",\n flex: \"Layout\",\n flexWrap: \"Layout\",\n overflow: \"Layout\",\n // A box's size.\n width: \"Size\",\n minWidth: \"Size\",\n maxWidth: \"Size\",\n height: \"Size\",\n boxSizing: \"Size\",\n // Space inside a box and between its children.\n padding: \"Spacing\",\n gap: \"Spacing\",\n rowGap: \"Spacing\",\n indent: \"Spacing\",\n cellPadding: \"Spacing\",\n // Text.\n color: \"Typography\",\n fontFamily: \"Typography\",\n fontSize: \"Typography\",\n fontWeight: \"Typography\",\n fontStyle: \"Typography\",\n lineHeight: \"Typography\",\n letterSpacing: \"Typography\",\n textAlign: \"Typography\",\n textTransform: \"Typography\",\n textDecoration: \"Typography\",\n // What's drawn behind content, and a shape's paint.\n backgroundColor: \"Background\",\n fill: \"Background\",\n // Lines around and between boxes, and a shape's outline.\n border: \"Border\",\n borderTop: \"Border\",\n borderRadius: \"Border\",\n borderCollapse: \"Border\",\n rowBorder: \"Border\",\n separatorColor: \"Border\",\n stroke: \"Border\",\n strokeWidth: \"Border\",\n opacity: \"Effects\",\n};\n\n/** The group a style is listed in: its spec's own, else its name's. */\nexport function styleGroup(key: string, spec: StyleSpec): StyleGroup | undefined {\n return spec.group ?? STYLE_GROUP_OF[key];\n}\n","/**\n * Built-in components made of primitives: today's Social, Menu and Video on the new engine.\n * Each is a component of its own in the template (validated, described, and a block of its own in the builder's\n * design), and is expanded into the primitives it's made of before layout, as a custom component is: the writers\n * draw only primitives, in every output, and nothing in a render needs a browser or the network.\n */\nimport { prop, type ComponentDefinition, type PropSpecs, type StyleSpecs, type SupportByTarget } from \"./define\";\nimport { color, enumOf, insets, items, link, number, text, type LinkValue } from \"./kinds\";\nimport type { Json } from \"./model\";\nimport type { ExpandContext, ExpandProps } from \"./registry\";\nimport { css, layoutStyle, pick, placementStyle, textStyle } from \"./styles\";\n\nconst WRITTEN: SupportByTarget = { email: { level: \"full\", source: \"writer\" }, web: { level: \"full\", source: \"writer\" } };\nconst BY_PARTS: SupportByTarget = { email: { level: \"full\", source: \"writer\" }, web: css as SupportByTarget[\"web\"] };\n\n/** A definition made of primitives: `expand` returns the node it is, from its props and style (defaults applied). */\nfunction defineComposite<const P extends PropSpecs, const S extends StyleSpecs, const H extends readonly (keyof S & string)[] = readonly []>(\n definition: ComponentDefinition<P, S, H> & { expand(props: ExpandProps<P>, context: ExpandContext): unknown }\n): ComponentDefinition<P, S, H> {\n return { ...definition, custom: true } as ComponentDefinition<P, S, H>;\n}\n\n/** Where the social networks' icons are, by style and network: Unlayer's, as today's Social uses them. */\nconst SOCIAL_ICONS = \"https://cdn.tools.unlayer.com/social/icons\";\n\nexport const Social = defineComposite({\n type: \"Social\",\n label: \"Social icons\",\n description: \"Links to social profiles: a line of the networks' icons, each linked to its profile.\",\n categories: [\"block\"],\n props: {\n // Its icon is found by its name's letters and digits (\"LinkedIn\": linkedin.png): a name needs one.\n icons: prop(items({ name: text({ maxLength: 40, pattern: /[A-Za-z0-9]/, mismatch: `has no letter (a to z) or digit, which its icon is found by (\"Instagram\")` }), href: link() }, \"icon\"), {\n support: WRITTEN,\n label: \"Icons\",\n required: true,\n description: 'Each network by name (\"Instagram\", \"LinkedIn\") and the link to its profile.',\n }),\n iconType: prop(enumOf([\"circle\", \"rounded\", \"squared\"]), { support: WRITTEN, label: \"Icon style\", default: \"circle\" }),\n size: prop(number({ min: 1, integer: true }), { support: WRITTEN, label: \"Icon size\", description: \"Each icon's width and height, in px.\", default: 32 }),\n },\n style: {\n gap: { ...layoutStyle.gap, label: \"Space between icons\", support: BY_PARTS },\n justifyContent: { kind: enumOf([\"start\", \"center\", \"end\"]), label: \"Alignment\", description: \"Where the icons sit across the line.\", support: BY_PARTS },\n ...placementStyle,\n },\n defaultStyle: { gap: 5, justifyContent: \"center\" },\n children: {},\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Social icons\", paths: [\"props.icons\", \"props.iconType\", \"props.size\", \"style.gap\", \"style.justifyContent\"] }] },\n expand: ({ icons, iconType, size }, { style }) => ({\n type: \"Row\",\n props: { stackOnMobile: false },\n style: { gap: style.gap, justifyContent: style.justifyContent },\n children: icons.map((icon: { name: string; href: LinkValue }) => ({\n type: \"Link\",\n // Each opens in a new window, as the builder's do, unless it says otherwise.\n props: { href: typeof icon.href === \"string\" ? { href: icon.href, target: \"_blank\" } : icon.href, title: icon.name },\n style: { flex: \"none\" },\n children: [\n {\n type: \"Image\",\n props: { src: `${SOCIAL_ICONS}/${iconType}/${icon.name.toLowerCase().replace(/[^a-z0-9]+/g, \"\")}.png`, alt: icon.name },\n style: { width: size },\n },\n ],\n })),\n }),\n});\n\ntype Sides = { top: number; right: number; bottom: number; left: number };\nconst MENU_TEXT = [\"fontFamily\", \"fontSize\", \"fontWeight\", \"lineHeight\", \"letterSpacing\", \"textTransform\"] as const;\n\nexport const Menu = defineComposite({\n type: \"Menu\",\n label: \"Menu\",\n description: \"A line of links (a site's sections, a footer's), onto more lines where they don't fit, with a separator between them on desktop; or links down a column.\",\n categories: [\"block\"],\n props: {\n items: prop(items({ text: text({ maxLength: 200 }), href: link() }, \"item\"), {\n support: WRITTEN,\n label: \"Items\",\n required: true,\n description: \"Each link's text and where it goes.\",\n }),\n separator: prop(text({ maxLength: 10 }), { support: WRITTEN, label: \"Separator\", description: 'Between the links of a horizontal menu (\"|\", \"·\"), on desktop: phones show none.', default: \"\" }),\n layout: prop(enumOf([\"horizontal\", \"vertical\"]), { support: WRITTEN, label: \"Layout\", default: \"horizontal\" }),\n },\n style: {\n ...pick(textStyle, \"color\", ...MENU_TEXT),\n separatorColor: { kind: color(), label: \"Separator color\", support: BY_PARTS },\n padding: { kind: insets(), label: \"Each link's padding\", description: \"Around each link: its sides are the space between them.\", support: BY_PARTS },\n justifyContent: { kind: enumOf([\"start\", \"center\", \"end\"]), label: \"Alignment\", description: \"Where the links sit.\", support: BY_PARTS },\n ...placementStyle,\n },\n defaultStyle: {\n color: \"#0068A5\",\n fontSize: 14,\n lineHeight: 1.2,\n separatorColor: \"#444444\",\n padding: { top: 5, right: 15, bottom: 5, left: 15 },\n justifyContent: \"center\",\n },\n children: {},\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: {\n groups: [\n { title: \"Menu\", paths: [\"props.items\", \"props.layout\", \"props.separator\", \"style.justifyContent\"] },\n { title: \"Text\", paths: [\"style.color\", \"style.separatorColor\", ...MENU_TEXT.map((key) => `style.${key}`)] },\n { title: \"Spacing\", paths: [\"style.padding\"] },\n ],\n },\n expand: ({ items: links, separator, layout }, { style, responsive }) => {\n const padding = style.padding as Sides;\n const text = Object.fromEntries(MENU_TEXT.filter((key) => style[key] !== undefined).map((key) => [key, style[key]]));\n const link = (item: { text: string; href: LinkValue }) => ({ type: \"Link\", props: { href: item.href }, style: { color: style.color, textDecoration: \"none\" }, children: [item.text] });\n if (layout === \"vertical\") {\n return { type: \"Column\", style: { ...text, gap: padding.top + padding.bottom, padding, alignItems: style.justifyContent }, children: links.map(link) };\n }\n // Each link in its padding, as today's Menu has it: two links are its sides apart, and a separator between them\n // has a link's padding on either side, not twice the space. Separators are left out on phones, where a template\n // has phones (a Document or a Canvas has none); they're as high in the line as the links' words.\n const item = (entry: { text: string; href: LinkValue }) => ({ type: \"Text\", style: { flex: \"none\", padding }, children: [link(entry)] });\n const between = {\n type: \"Text\",\n ...(responsive ? { hidden: { mobile: true } } : {}),\n style: { flex: \"none\", padding: { top: padding.top, right: 0, bottom: padding.bottom, left: 0 }, color: style.separatorColor },\n children: [separator],\n };\n return {\n type: \"Row\",\n props: { stackOnMobile: false },\n // Links that don't fit on one line go onto another, as today's Menu's do.\n style: { ...text, flexWrap: \"wrap\", justifyContent: style.justifyContent },\n children: links.flatMap((entry: { text: string; href: LinkValue }, index: number) => [...(index && separator ? [between] : []), item(entry)]),\n };\n },\n});\n","/**\n * Layouts made of the others. A Grid is a component of its own in the template (validated,\n * described, a block of its own in the builder's design) and, before layout, the Rows of Columns it is: the resolver\n * and every writer lay out only those, so a Grid draws the same in every output with nothing of its own to support.\n */\nimport { defineComponent, prop, type SupportByTarget } from \"./define\";\nimport { boolean, enumOf, number } from \"./kinds\";\nimport type { Json, Node } from \"./model\";\nimport { boxStyle, css, inheritedTextStyle, layoutStyle, pick, placementStyle } from \"./styles\";\n\nconst WRITTEN: SupportByTarget = { email: { level: \"full\", source: \"writer\" }, web: { level: \"full\", source: \"writer\" } };\n\n/** Styles of a Grid that are its box's (the Column it is), not its rows'. */\nconst BOX = [...Object.keys(boxStyle), \"flex\", ...Object.keys(inheritedTextStyle)];\n\nconst only = (style: Record<string, Json> | undefined, keys: readonly string[]) => {\n const out = Object.fromEntries(Object.entries(style ?? {}).filter(([key]) => keys.includes(key)));\n return Object.keys(out).length ? out : undefined;\n};\n\n/** A Grid as the Column of Rows it is: its children `columns` to a Row, each in a cell of equal width (the last Row's empty cells too). */\nfunction arrangeGrid(node: Node): Node {\n const columns = Math.max(1, Math.floor(Number(node.props?.columns ?? 2)));\n const stackOnMobile = node.props?.stackOnMobile !== false;\n const style = node.style ?? {};\n const gap = style.gap;\n const rowGap = style.rowGap ?? gap;\n const children = (node.children ?? []).filter((child): child is Node => typeof child === \"object\" && child !== null);\n const rows: Node[] = [];\n for (let start = 0; start < children.length; start += columns) {\n const cells: Node[] = children.slice(start, start + columns).map((child) => ({ type: \"Column\", children: [child] }));\n // The last Row's empty cells keep its cells as wide as the others; on phones, where the cells stack, they're not\n // drawn (where they stay side by side, they are: the cells keep their widths there too).\n while (cells.length < columns) cells.push({ type: \"Column\", ...(stackOnMobile ? { hidden: { mobile: true } } : {}), children: [] });\n const mobileGap = node.mobile?.gap;\n rows.push({\n type: \"Row\",\n props: { stackOnMobile },\n style: { ...(gap !== undefined ? { gap } : {}), ...(style.alignItems !== undefined ? { alignItems: style.alignItems } : {}) },\n ...(mobileGap !== undefined ? { mobile: { gap: mobileGap } } : {}),\n children: cells,\n });\n }\n const box = only(style, BOX);\n const mobileBox = only(node.mobile, BOX);\n // On phones, where the children stack one under another, the gap is between every two of them, across a row's end\n // too: the rows are its gap apart there, not rowGap.\n const phoneGap = node.mobile?.gap ?? gap ?? 0;\n const mobileRowGap = stackOnMobile ? (phoneGap !== (rowGap ?? 0) ? phoneGap : undefined) : (node.mobile?.rowGap ?? node.mobile?.gap);\n return {\n type: \"Column\",\n ...(node.id ? { id: node.id } : {}),\n style: { ...box, ...(rowGap !== undefined ? { gap: rowGap } : {}) },\n ...(mobileBox || mobileRowGap !== undefined ? { mobile: { ...mobileBox, ...(mobileRowGap !== undefined ? { gap: mobileRowGap } : {}) } } : {}),\n ...(node.hidden ? { hidden: node.hidden } : {}),\n children: rows,\n };\n}\n\nexport const Grid = defineComponent({\n type: \"Grid\",\n label: \"Grid\",\n description: \"Its children in columns of equal width, row after row; on phones, one under another.\",\n categories: [\"layout\", \"block\"],\n props: {\n columns: prop(number({ min: 1, max: 12, integer: true }), { support: WRITTEN, label: \"Columns\", description: \"How many children to a row.\", default: 2 }),\n stackOnMobile: prop(boolean(), { support: WRITTEN, label: \"Stack on phones\", description: \"Its children one under another on phones (in an Email or a Page).\", default: true }),\n },\n style: {\n ...inheritedTextStyle,\n ...boxStyle,\n gap: { ...layoutStyle.gap, description: \"Space between its children, across and down (unless rowGap is set).\" },\n rowGap: { ...layoutStyle.gap, label: \"Row gap\", description: \"Space between its rows (gap by default); on phones, where the children stack, gap is between them.\" },\n alignItems: { ...layoutStyle.alignItems, description: \"Where each child sits in its row's height, as CSS align-items.\" },\n ...placementStyle,\n },\n children: { categories: [\"layout\", \"block\"] },\n sizing: \"stretch\",\n // Stacked on phones, every two of its children are its phone gap apart: there are no rows for a row gap.\n conditionSupport: {\n mobile: {\n rowGap: {\n web: { level: \"none\", when: (_, node) => node.props.stackOnMobile !== false, shows: \"its phone gap between every two children\", source: \"writer\" },\n email: { level: \"none\", when: (_, node) => node.props.stackOnMobile !== false, shows: \"its phone gap between every two children\", source: \"writer\" },\n },\n },\n },\n targets: { email: {}, web: {} },\n editor: {\n groups: [\n { title: \"Grid\", paths: [\"props.columns\", \"props.stackOnMobile\", \"style.gap\", \"style.rowGap\", \"style.alignItems\"] },\n { title: \"Box\", paths: [\"style.backgroundColor\", \"style.padding\", \"style.border\", \"style.borderRadius\", \"style.width\"] },\n ],\n },\n arrange: arrangeGrid,\n});\n\n/**\n * A Layer's children over each other, each in its whole box (as CSS grid places children in one cell): an image with\n * words on it. On a page any children go; an email draws one shape of it, an Image as wide as the Layer with one child\n * over it, the image as the cell's background (which Outlook gets as VML), and reports any other.\n */\nexport const Layer = defineComponent({\n type: \"Layer\",\n label: \"Layer\",\n description: \"Its children over each other, in one box as tall as the tallest: words on an image (a background image, its first child). In an email, an Image with one child over it.\",\n categories: [\"layout\", \"block\"],\n props: {},\n style: {\n ...inheritedTextStyle,\n ...pick(boxStyle, \"width\", \"minWidth\", \"maxWidth\", \"backgroundColor\", \"border\", \"borderRadius\"),\n height: { ...boxStyle.height, description: \"Its height: the image under its children covers it, cut at its sides or its top and bottom.\" },\n alignItems: {\n ...layoutStyle.alignItems,\n description: \"Where its children sit in its height, as CSS align-items.\",\n support: { email: { level: \"partial\", values: [\"stretch\"], shows: \"the child over the image as tall as its content\", source: \"writer\" }, web: css },\n },\n justifyItems: {\n kind: enumOf([\"start\", \"center\", \"end\", \"stretch\"]),\n label: \"Justify items\",\n description: \"Where its children sit across its width, as CSS justify-items: stretched to it by default.\",\n support: { email: { level: \"full\", source: \"writer\" }, web: css },\n },\n ...placementStyle,\n },\n defaultStyle: { alignItems: \"start\", justifyItems: \"stretch\" },\n children: { categories: [\"layout\", \"block\"] },\n sizing: \"stretch\",\n targets: { email: { note: \"An Image as wide as the Layer, with one child over it\" }, web: {} },\n editor: {\n groups: [\n { title: \"Layer\", paths: [\"style.height\", \"style.alignItems\", \"style.justifyItems\"] },\n { title: \"Box\", paths: [\"style.backgroundColor\", \"style.border\", \"style.borderRadius\", \"style.width\"] },\n ],\n },\n});\n","/** What every root (Email, Page, Document) takes: its title, language, direction and fonts, and its own style. */\nimport { prop, type SupportByTarget } from \"./define\";\nimport type { EmailClient } from \"./email-clients\";\nimport { enumOf, fontFaces, text } from \"./kinds\";\nimport { boxStyle, inheritedTextStyle, layoutStyle, pick } from \"./styles\";\n\nconst WRITTEN: SupportByTarget = { email: { level: \"full\", source: \"writer\" }, web: { level: \"full\", source: \"writer\" } };\n\n/** The email clients that load no web font (caniemail's css-at-font-face; Apple Mail, Samsung Email and others do). */\nexport const NO_WEB_FONTS: readonly EmailClient[] = [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail\", \"gmail-app\", \"gmail-app-other\", \"yahoo\", \"aol\", \"protonmail\", \"fastmail\", \"gmx\", \"web-de\", \"orange\", \"sfr\", \"laposte\", \"mail-ru\", \"ionos\"];\n\nexport const ROOT_PROPS = {\n title: prop(text(), { support: WRITTEN, label: \"Title\", description: \"The document's title (shown in a browser tab, and by some email clients).\" }),\n lang: prop(text({ maxLength: 35 }), {\n support: {\n ...WRITTEN,\n email: { level: \"partial\", shows: \"no language: the client removes it, and a screen reader reads the email in its own\", source: \"caniemail\", feature: \"html-lang\", clients: [\"hey\", \"gmx\", \"web-de\", \"orange\", \"ionos\"] },\n },\n label: \"Language\",\n description: 'Its language, as a BCP 47 tag (\"en\", \"ar\").',\n }),\n dir: prop(enumOf([\"ltr\", \"rtl\", \"auto\"]), {\n support: {\n ...WRITTEN,\n email: { level: \"partial\", values: [\"rtl\", \"auto\"], shows: \"left to right: the client removes the direction\", source: \"caniemail\", feature: \"html-dir\", clients: [\"gmx\", \"web-de\"] },\n },\n label: \"Text direction\",\n }),\n fonts: prop(fontFaces(), {\n support: {\n email: { level: \"partial\", shows: \"no web font loads: the next font in each stack shows\", source: \"caniemail\", feature: \"css-at-font-face\", clients: NO_WEB_FONTS },\n web: { level: \"full\", source: \"writer\" },\n },\n label: \"Web fonts\",\n description: \"The font files the template loads: a family's file for each weight and style it uses. Text names a family in its fontFamily stack, before the fonts to show where it can't load.\",\n }),\n};\n\n/** A root's own style: the window's background, the text styles its content inherits, and how it stacks its children. */\nexport const ROOT_STYLE = {\n ...inheritedTextStyle,\n backgroundColor: { ...boxStyle.backgroundColor, label: \"Background color\", description: \"The window's background, behind the content.\" },\n ...pick(layoutStyle, \"gap\", \"alignItems\"),\n};\n\nexport const ROOT_DEFAULT_STYLE = {\n color: \"#000000\",\n fontFamily: \"Arial, Helvetica, sans-serif\",\n fontSize: 16,\n fontWeight: 400,\n lineHeight: 1.5,\n textAlign: \"left\",\n} as const;\n\nexport const TEXT_EDITOR = { title: \"Text\", paths: [\"style.fontFamily\", \"style.fontSize\", \"style.fontWeight\", \"style.color\", \"style.lineHeight\", \"style.letterSpacing\", \"style.textAlign\"] };\n","/**\n * Printed documents: a Document's children on pages of its size, as print HTML (a page writer's\n * output with each page a box of the page's size, and CSS's @page) and as PDF (@hyper-elements/react/pdf, without a\n * browser). Pages are given (Document.Page) or made by PageBreaks; a PageHeader and a PageFooter go on every page, and a\n * PageNumber says which page it's on. Nothing flows from one page to the next: a page holds what it's given.\n */\nimport { defineComponent, prop, type SupportByTarget } from \"./define\";\nimport { boolean, enumOf, insets } from \"./kinds\";\nimport type { Json } from \"./model\";\nimport { ROOT_DEFAULT_STYLE, ROOT_PROPS, ROOT_STYLE, TEXT_EDITOR } from \"./roots\";\nimport { boxStyle, inheritedTextStyle, layoutStyle, pick } from \"./styles\";\n\nconst WRITTEN: SupportByTarget = { email: { level: \"full\", source: \"writer\" }, web: { level: \"full\", source: \"writer\" } };\n\n/** Paper sizes, in inches (ISO's in mm, converted): CSS's page sizes. */\nconst SIZES = {\n A3: [297 / 25.4, 420 / 25.4],\n A4: [210 / 25.4, 297 / 25.4],\n A5: [148 / 25.4, 210 / 25.4],\n Letter: [8.5, 11],\n Legal: [8.5, 14],\n Tabloid: [11, 17],\n} as const;\nexport type PageSize = keyof typeof SIZES;\n\n/** A CSS px: 96 to the inch. */\nconst PX_PER_INCH = 96;\n\ntype Sides = { top: number; right: number; bottom: number; left: number };\n\nexport interface PageBox {\n /** The page, in CSS px (96 to the inch). */\n width: number;\n height: number;\n margin: Sides;\n /** What's inside the margins. */\n contentWidth: number;\n contentHeight: number;\n /** The page's size as CSS's @page size says it (\"A4 portrait\"). */\n css: string;\n}\n\n/** A Document's page, from its props (size, orientation, margin). */\nexport function pageBox(props: Record<string, Json | undefined>): PageBox {\n const size = (props.size as PageSize | undefined) ?? \"A4\";\n const [w, h] = SIZES[size] ?? SIZES.A4;\n const landscape = props.orientation === \"landscape\";\n const width = Math.round((landscape ? h : w) * PX_PER_INCH * 100) / 100;\n const height = Math.round((landscape ? w : h) * PX_PER_INCH * 100) / 100;\n const margin = (props.margin as Sides | undefined) ?? { top: 48, right: 48, bottom: 48, left: 48 };\n return {\n width,\n height,\n margin,\n contentWidth: Math.round(width - margin.left - margin.right),\n contentHeight: Math.round(height - margin.top - margin.bottom),\n css: `${size} ${landscape ? \"landscape\" : \"portrait\"}`,\n };\n}\n\nconst PAGE_STYLE = {\n ...inheritedTextStyle,\n backgroundColor: { ...boxStyle.backgroundColor, description: \"The page's background, out to its edges.\" },\n ...pick(layoutStyle, \"gap\", \"alignItems\"),\n};\n\nexport const Document = defineComponent({\n type: \"Document\",\n label: \"Document\",\n description:\n \"A printed document: its children on pages of its size (Document.Page, or split by PageBreaks), a PageHeader and a PageFooter on each. Renders to print HTML, and to PDF with @hyper-elements/react/pdf.\",\n categories: [\"root\"],\n props: {\n size: prop(enumOf([\"A3\", \"A4\", \"A5\", \"Letter\", \"Legal\", \"Tabloid\"]), { support: WRITTEN, label: \"Page size\", default: \"A4\" }),\n orientation: prop(enumOf([\"portrait\", \"landscape\"]), { support: WRITTEN, label: \"Orientation\", default: \"portrait\" }),\n margin: prop(insets(), {\n support: WRITTEN,\n label: \"Margins\",\n description: \"Around each page's content (its header and footer too), in px: 96 to the inch.\",\n default: { top: 48, right: 48, bottom: 48, left: 48 },\n }),\n ...ROOT_PROPS,\n },\n style: { ...ROOT_STYLE, backgroundColor: { ...ROOT_STYLE.backgroundColor, description: \"Each page's background, out to its edges.\" } },\n defaultStyle: ROOT_DEFAULT_STYLE,\n children: { types: [\"DocumentPage\", \"PageBreak\", \"PageHeader\", \"PageFooter\"], categories: [\"section\", \"layout\", \"block\"] },\n sizing: \"none\",\n targets: { web: {} },\n editor: {\n groups: [\n { title: \"Document\", paths: [\"props.size\", \"props.orientation\", \"props.margin\", \"props.title\"] },\n { title: \"Background\", paths: [\"style.backgroundColor\"] },\n TEXT_EDITOR,\n ],\n },\n});\n\nexport const DocumentPage = defineComponent({\n type: \"DocumentPage\",\n label: \"Page\",\n description: \"One page of a Document (Document.Page in JSX): its children stacked down it, inside the Document's margins.\",\n categories: [],\n props: {},\n style: PAGE_STYLE,\n children: { categories: [\"section\", \"layout\", \"block\"] },\n sizing: \"stretch\",\n targets: { web: {} },\n editor: { groups: [{ title: \"Page\", paths: [\"style.backgroundColor\", \"style.gap\"] }, TEXT_EDITOR] },\n});\n\nexport const PageBreak = defineComponent({\n type: \"PageBreak\",\n label: \"Page break\",\n description: \"In a Document, where a page ends: what follows starts the next page.\",\n categories: [],\n props: {},\n style: {},\n children: {},\n sizing: \"none\",\n targets: { web: {} },\n});\n\nconst HEADER_STYLE = { ...inheritedTextStyle, ...pick(boxStyle, \"padding\", \"backgroundColor\", \"border\"), ...pick(layoutStyle, \"gap\", \"alignItems\") };\n\nexport const PageHeader = defineComponent({\n type: \"PageHeader\",\n label: \"Page header\",\n description: \"In a Document: drawn at the top of every page, inside its margins.\",\n categories: [],\n props: {},\n style: HEADER_STYLE,\n children: { categories: [\"layout\", \"block\"] },\n sizing: \"stretch\",\n targets: { web: {} },\n editor: { groups: [{ title: \"Header\", paths: [\"style.padding\", \"style.backgroundColor\", \"style.border\", \"style.gap\"] }, TEXT_EDITOR] },\n});\n\nexport const PageFooter = defineComponent({\n type: \"PageFooter\",\n label: \"Page footer\",\n description: \"In a Document: drawn at the bottom of every page, inside its margins.\",\n categories: [],\n props: {},\n style: HEADER_STYLE,\n children: { categories: [\"layout\", \"block\"] },\n sizing: \"stretch\",\n targets: { web: {} },\n editor: { groups: [{ title: \"Footer\", paths: [\"style.padding\", \"style.backgroundColor\", \"style.border\", \"style.gap\"] }, TEXT_EDITOR] },\n});\n\nexport const PageNumber = defineComponent({\n type: \"PageNumber\",\n label: \"Page number\",\n description: \"In a Document's text: the number of the page it's on, or (total) how many pages there are.\",\n categories: [\"inline\"],\n props: {\n total: prop(boolean(), { support: WRITTEN, label: \"Page count\", description: \"How many pages the Document has, instead of this page's number.\", default: false }),\n },\n style: {},\n children: {},\n sizing: \"none\",\n targets: { web: {} },\n // A Page's or a Canvas's text has no page to number.\n roots: [\"Document\"],\n notAllowed: { code: \"document/page-number\", message: (root) => `A PageNumber is a page's number in a Document; this ${root} has no pages` },\n});\n\n/**\n * A Document's pages: each Document.Page, and the other content between them in runs a PageBreak ends (an empty run\n * is no page, but a document without content has one blank page); its PageHeader and PageFooter, for every page.\n */\nexport function documentPages<N extends { type: string; children: Array<N | string> }>(root: N): { pages: Array<{ page?: N; children: N[] }>; header?: N; footer?: N } {\n const pages: Array<{ page?: N; children: N[] }> = [];\n let run: N[] = [];\n const end = () => {\n if (run.length) pages.push({ children: run });\n run = [];\n };\n let header: N | undefined;\n let footer: N | undefined;\n for (const child of root.children) {\n if (typeof child === \"string\") continue;\n if (child.type === \"PageHeader\") header = child;\n else if (child.type === \"PageFooter\") footer = child;\n else if (child.type === \"PageBreak\") end();\n else if (child.type === \"DocumentPage\") {\n end();\n pages.push({ page: child, children: child.children.filter((c): c is N => typeof c !== \"string\") });\n } else run.push(child);\n }\n end();\n // A document has a page, if a blank one.\n if (!pages.length) pages.push({ children: [] });\n return { pages, header, footer };\n}\n","/**\n * Images: a Canvas is a fixed-size root, its children laid out in it as on a page, written as an\n * image by @hyper-elements/react/image (and as HTML by render(), to look at); an Svg draws shapes (Rect, Circle, Ellipse,\n * Line, Polygon, Path) in a box of its own, on a page, in a Canvas and in a PDF. An email can't show one: Gmail and\n * Outlook drop inline SVG.\n */\nimport { defineComponent, prop, type PropSpecs, type SupportByTarget } from \"./define\";\nimport { color, length, number, text } from \"./kinds\";\nimport { ROOT_DEFAULT_STYLE, ROOT_PROPS, ROOT_STYLE, TEXT_EDITOR } from \"./roots\";\nimport { boxStyle, css, layoutStyle, pick, placementStyle } from \"./styles\";\n\nconst WRITTEN: SupportByTarget = { web: { level: \"full\", source: \"writer\" } };\nconst coordinate = (label: string, description?: string) => prop(number(), { support: WRITTEN, label, ...(description ? { description } : {}), default: 0 });\nconst size = (label: string) => prop(number({ min: 0 }), { support: WRITTEN, label, required: true });\n\nexport const Canvas = defineComponent({\n type: \"Canvas\",\n label: \"Canvas\",\n description: \"An image of a fixed size (a social card, a banner): its children laid out in it as on a page. Written as PNG or SVG with @hyper-elements/react/image.\",\n categories: [\"root\"],\n props: {\n width: prop(length([\"px\"], { min: 16 }), { support: WRITTEN, label: \"Width\", description: \"The image's width, in px.\", default: 1200 }),\n height: prop(length([\"px\"], { min: 16 }), { support: WRITTEN, label: \"Height\", description: \"The image's height, in px: what's past it is cut.\", default: 630 }),\n ...ROOT_PROPS,\n },\n style: { ...ROOT_STYLE, padding: boxStyle.padding, justifyContent: layoutStyle.justifyContent },\n defaultStyle: ROOT_DEFAULT_STYLE,\n children: { categories: [\"section\", \"layout\", \"block\"] },\n sizing: \"none\",\n targets: { web: {} },\n editor: {\n groups: [\n { title: \"Canvas\", paths: [\"props.width\", \"props.height\", \"style.backgroundColor\", \"style.padding\"] },\n { title: \"Layout\", paths: [\"style.gap\", \"style.alignItems\", \"style.justifyContent\"] },\n TEXT_EDITOR,\n ],\n },\n});\n\nexport const Svg = defineComponent({\n type: \"Svg\",\n label: \"Vector drawing\",\n description: \"Shapes (Rect, Circle, Ellipse, Line, Polygon, Path) drawn in a box of its own: its width and height, and the coordinates its viewBox gives them.\",\n categories: [\"block\"],\n props: {\n width: size(\"Width\"),\n height: size(\"Height\"),\n viewBox: prop(text({ maxLength: 100 }), { support: WRITTEN, label: \"View box\", description: 'The shapes\\' coordinates in it, as \"x y width height\" (its width and height by default).' }),\n title: prop(text({ maxLength: 200 }), { support: WRITTEN, label: \"Title\", description: \"What it shows, read out by screen readers.\" }),\n },\n style: { ...pick(boxStyle, \"padding\", \"backgroundColor\", \"border\", \"borderRadius\"), ...placementStyle },\n children: { categories: [\"shape\"] },\n sizing: \"shrink\",\n targets: { web: {} },\n unsupported: { email: \"Gmail and classic Outlook don't show inline SVG; use an Image of it (a PNG) instead\" },\n editor: { groups: [{ title: \"Drawing\", paths: [\"props.width\", \"props.height\", \"props.viewBox\", \"props.title\"] }] },\n});\n\n/** How a shape is painted. */\nconst PAINT = {\n fill: { kind: color(), label: \"Fill\", description: 'Its inside (\"transparent\" for none).', support: { web: css } },\n stroke: { kind: color(), label: \"Stroke\", description: \"Its outline's color.\", support: { web: css } },\n strokeWidth: { kind: number({ min: 0 }), label: \"Stroke width\", support: { web: css } },\n opacity: { kind: number({ min: 0, max: 1 }), label: \"Opacity\", support: { web: css } },\n};\nconst PAINT_DEFAULT = { fill: \"#000000\" } as const;\n\nconst shape = <const P extends PropSpecs>(type: string, label: string, description: string, props: P) =>\n defineComponent({ type, label, description, categories: [\"shape\"], props, style: PAINT, defaultStyle: PAINT_DEFAULT, children: {}, sizing: \"none\", targets: { web: {} } });\n\nexport const Rect = shape(\"Rect\", \"Rectangle\", \"A rectangle at x, y in its Svg, rounded by rx.\", {\n x: coordinate(\"X\"),\n y: coordinate(\"Y\"),\n width: size(\"Width\"),\n height: size(\"Height\"),\n rx: prop(number({ min: 0 }), { support: WRITTEN, label: \"Corner radius\" }),\n});\nexport const Circle = shape(\"Circle\", \"Circle\", \"A circle centered at cx, cy in its Svg.\", { cx: coordinate(\"Center X\"), cy: coordinate(\"Center Y\"), r: size(\"Radius\") });\nexport const Ellipse = shape(\"Ellipse\", \"Ellipse\", \"An ellipse centered at cx, cy in its Svg.\", { cx: coordinate(\"Center X\"), cy: coordinate(\"Center Y\"), rx: size(\"Radius across\"), ry: size(\"Radius down\") });\nexport const Line = shape(\"Line\", \"Line\", \"A straight line from x1, y1 to x2, y2 in its Svg (drawn by its stroke).\", {\n x1: coordinate(\"Start X\"),\n y1: coordinate(\"Start Y\"),\n x2: coordinate(\"End X\"),\n y2: coordinate(\"End Y\"),\n});\nexport const Polygon = shape(\"Polygon\", \"Polygon\", 'A closed shape through its points (\"0,0 40,0 20,30\"), in its Svg.', {\n points: prop(text({ maxLength: 10000 }), { support: WRITTEN, label: \"Points\", required: true }),\n});\nexport const Path = shape(\"Path\", \"Path\", \"A shape drawn by an SVG path (d), in its Svg.\", {\n d: prop(text({ maxLength: 100000 }), { support: WRITTEN, label: \"Path\", description: 'SVG path data (\"M0 0 L40 0 L20 30 Z\").', required: true }),\n});\n\n/** The shapes, by type. */\nexport const SHAPES = [Rect, Circle, Ellipse, Line, Polygon, Path];\n\n","/**\n * The components' definitions: Email, Page, Section, layouts, text, links,\n * buttons, images, dividers, lists and tables; grids, layers, documents,\n * canvases and shapes follow in their own steps.\n */\nimport { defineComponent, prop, type ComponentDefinition, type CompositeEditor, type SupportByTarget } from \"./define\";\nimport { attributes, asset, boolean, breakpoints, enumOf, insets, length, line, link, number, text, video } from \"./kinds\";\nimport type { Json } from \"./model\";\nimport { boxStyle, css, inheritedTextStyle, layoutStyle, pick, placementStyle, textStyle } from \"./styles\";\nimport { Menu, Social } from \"./composites\";\nimport { Grid, Layer } from \"./layouts\";\nimport { ROOT_DEFAULT_STYLE, ROOT_PROPS, ROOT_STYLE, TEXT_EDITOR } from \"./roots\";\nimport { Document, DocumentPage, PageBreak, PageFooter, PageHeader, PageNumber } from \"./document\";\nimport { Canvas, SHAPES, Svg } from \"./canvas\";\n\n/** A prop each output writes as given. */\nconst WRITTEN: SupportByTarget = { email: { level: \"full\", source: \"writer\" }, web: { level: \"full\", source: \"writer\" } };\n\n/** A block of text's own direction, beside its neighbours' (an Arabic paragraph in an English email). */\nconst TEXT_DIR = {\n dir: prop(enumOf([\"ltr\", \"rtl\", \"auto\"]), { support: WRITTEN, label: \"Text direction\", description: \"Its text's direction, where it differs from the template's; it starts on that side unless aligned otherwise.\" }),\n};\n\nconst SPACING_EDITOR = { title: \"Spacing\", paths: [\"style.padding\"] };\n\nexport const Email = defineComponent({\n type: \"Email\",\n label: \"Email\",\n description: \"An email. Its children are stacked down the content width, centered in the window.\",\n categories: [\"root\"],\n props: {\n width: prop(length([\"px\"], { min: 200 }), { support: WRITTEN, label: \"Content width\", default: 600 }),\n previewText: prop(text(), { support: WRITTEN, label: \"Preview text\", description: \"Shown after the subject in inbox lists, not in the email.\" }),\n ...ROOT_PROPS,\n },\n style: ROOT_STYLE,\n defaultStyle: ROOT_DEFAULT_STYLE,\n children: { categories: [\"section\", \"layout\", \"block\"] },\n sizing: \"none\",\n responsive: true,\n targets: { email: {} },\n editor: {\n groups: [\n { title: \"Email\", paths: [\"props.width\", \"props.previewText\", \"props.title\"] },\n { title: \"Background\", paths: [\"style.backgroundColor\"] },\n TEXT_EDITOR,\n ],\n },\n});\n\nexport const Page = defineComponent({\n type: \"Page\",\n label: \"Page\",\n description: \"A web page. Its children are stacked down the content width, centered in the window.\",\n categories: [\"root\"],\n props: {\n width: prop(length([\"px\"], { min: 200 }), { support: WRITTEN, label: \"Content width\", description: \"The widest the content gets.\", default: 1200 }),\n description: prop(text(), { support: WRITTEN, label: \"Description\", description: \"The page's meta description.\" }),\n breakpoints: prop(breakpoints(), {\n support: { web: { level: \"full\", source: \"writer\" } },\n label: \"Breakpoints\",\n description: \"Where its phone styles start: mobile, the widest window they apply to, in px (480 where it's not set).\",\n }),\n ...ROOT_PROPS,\n },\n style: ROOT_STYLE,\n defaultStyle: ROOT_DEFAULT_STYLE,\n children: { categories: [\"section\", \"layout\", \"block\"] },\n sizing: \"none\",\n responsive: true,\n // The page writer writes the root's phone gap, not its phone text styles.\n conditionSupport: {\n mobile: Object.fromEntries(\n ([\"fontSize\", \"lineHeight\", \"letterSpacing\", \"textAlign\"] as const).map((key) => [key, { web: { level: \"none\", shows: \"its desktop value: set phone text styles on its Sections or Columns\", source: \"writer\" } }])\n ),\n },\n targets: { web: {} },\n editor: {\n groups: [\n { title: \"Page\", paths: [\"props.width\", \"props.title\", \"props.description\"] },\n { title: \"Background\", paths: [\"style.backgroundColor\"] },\n TEXT_EDITOR,\n ],\n },\n});\n\nexport const Section = defineComponent({\n type: \"Section\",\n label: \"Section\",\n description: \"A band across the whole window, directly in an Email or Page: its background spans the window, its children are stacked at the content width.\",\n categories: [\"section\"],\n props: {},\n style: { ...inheritedTextStyle, ...pick(boxStyle, \"backgroundColor\", \"padding\", \"border\"), ...pick(layoutStyle, \"gap\", \"alignItems\") },\n children: { categories: [\"layout\", \"block\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Section\", paths: [\"style.backgroundColor\", \"style.padding\", \"style.border\", \"style.gap\"] }, TEXT_EDITOR] },\n});\n\nexport const Row = defineComponent({\n type: \"Row\",\n label: \"Row\",\n description: \"Lays its children out side by side. A child takes its width, or a share of what's left (its flex, 1 by default).\",\n categories: [\"layout\", \"block\"],\n props: {\n stackOnMobile: prop(boolean(), { support: WRITTEN, label: \"Stack on phones\", description: \"Its children stack full-width on phones (in an Email or a Page).\", default: true }),\n ...TEXT_DIR,\n },\n style: {\n ...inheritedTextStyle,\n ...boxStyle,\n ...layoutStyle,\n alignItems: {\n ...layoutStyle.alignItems,\n support: { email: { level: \"partial\", values: [\"stretch\"], shows: \"children not stretched to one height: each background or border ends with its content\", source: \"writer\" }, web: css },\n },\n justifyContent: {\n ...layoutStyle.justifyContent,\n support: { email: { level: \"none\", values: [\"space-between\"], shows: \"children start at the left\", source: \"writer\" }, web: css },\n },\n flexWrap: {\n kind: enumOf([\"nowrap\", \"wrap\", \"words\"]),\n label: \"Wrap\",\n description: '\"wrap\": children that don\\'t fit wrap onto another line, as CSS flex-wrap (in an email, in a Row kept side by side on phones, with no gap between the lines). \"words\": in an email, also a space of the text\\'s font apart, on lines at least as tall as its, as words are.',\n // A Row kept side by side wraps in an email (but classic Outlook, which the email's checks say where it matters).\n support: {\n email: { level: \"none\", values: [\"wrap\", \"words\"], when: (_, row) => row.props.stackOnMobile !== false, shows: \"children on one line on desktop, stacked on phones\", source: \"writer\" },\n web: css,\n },\n },\n ...placementStyle,\n },\n children: { categories: [\"layout\", \"block\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: {\n groups: [\n { title: \"Layout\", paths: [\"style.gap\", \"style.alignItems\", \"style.justifyContent\", \"props.stackOnMobile\"] },\n { title: \"Box\", paths: [\"style.backgroundColor\", \"style.padding\", \"style.border\", \"style.borderRadius\"] },\n ],\n },\n});\n\nexport const Column = defineComponent({\n type: \"Column\",\n label: \"Column\",\n description: \"Stacks its children vertically, with its own spacing and box.\",\n categories: [\"layout\", \"block\"],\n props: {},\n style: {\n ...inheritedTextStyle,\n ...boxStyle,\n ...layoutStyle,\n justifyContent: {\n ...layoutStyle.justifyContent,\n support: { email: { level: \"partial\", values: [\"center\", \"end\", \"space-between\"], shows: \"no effect: its children start at the top\", source: \"writer\" }, web: css },\n },\n ...placementStyle,\n },\n children: { categories: [\"layout\", \"block\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: {\n groups: [\n { title: \"Layout\", paths: [\"style.gap\", \"style.alignItems\"] },\n { title: \"Box\", paths: [\"style.backgroundColor\", \"style.padding\", \"style.border\", \"style.borderRadius\", \"style.width\"] },\n ],\n },\n});\n\nconst TEXT_BLOCK_STYLE = {\n ...textStyle,\n ...pick(boxStyle, \"width\", \"maxWidth\", \"padding\", \"backgroundColor\", \"border\", \"borderRadius\"),\n ...placementStyle,\n};\nconst TEXT_CHILDREN = { text: true, categories: [\"inline\"] } as const;\n\nexport const Text = defineComponent({\n type: \"Text\",\n label: \"Text\",\n description: \"A paragraph of text.\",\n categories: [\"block\"],\n props: TEXT_DIR,\n style: TEXT_BLOCK_STYLE,\n children: { ...TEXT_CHILDREN, types: [\"Image\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [TEXT_EDITOR, SPACING_EDITOR] },\n});\n\nexport const Heading = defineComponent({\n type: \"Heading\",\n label: \"Heading\",\n description: \"A heading, from level 1 (the page's title) to 6.\",\n categories: [\"block\"],\n props: {\n level: prop(enumOf([1, 2, 3, 4, 5, 6]), { support: WRITTEN, label: \"Level\", default: 1 }),\n ...TEXT_DIR,\n },\n style: TEXT_BLOCK_STYLE,\n defaultStyle: { fontWeight: 700, lineHeight: 1.25 },\n defaultStyleBy: {\n prop: \"level\",\n values: { 1: { fontSize: 32 }, 2: { fontSize: 24 }, 3: { fontSize: 20 }, 4: { fontSize: 18 }, 5: { fontSize: 16 }, 6: { fontSize: 14 } },\n },\n children: TEXT_CHILDREN,\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Heading\", paths: [\"props.level\"] }, TEXT_EDITOR, SPACING_EDITOR] },\n});\n\nconst RUN_STYLE = {\n ...pick(textStyle, \"color\", \"fontFamily\", \"fontSize\", \"fontWeight\", \"fontStyle\", \"letterSpacing\", \"textTransform\", \"textDecoration\"),\n backgroundColor: boxStyle.backgroundColor,\n};\n\nexport const Span = defineComponent({\n type: \"Span\",\n label: \"Span\",\n description: \"Styled text inside text; raised or lowered (superscript, subscript) with verticalAlign.\",\n categories: [\"inline\"],\n props: {},\n style: {\n ...RUN_STYLE,\n verticalAlign: {\n kind: enumOf([\"baseline\", \"super\", \"sub\"]),\n label: \"Raise or lower\",\n description: '\"super\": superscript (®, a footnote mark); \"sub\": subscript; as CSS vertical-align.',\n // Written as <sup> and <sub>, which every client (Word too) raises and lowers.\n support: { email: { level: \"full\", source: \"caniemail\" }, web: css },\n },\n },\n children: { text: true, categories: [\"inline\"] },\n sizing: \"none\",\n targets: { email: {}, web: {} },\n});\n\nexport const Link = defineComponent({\n type: \"Link\",\n label: \"Link\",\n description: \"A link: text inside text, or around an Image.\",\n categories: [\"inline\", \"block\"],\n props: {\n href: prop(link(), { support: WRITTEN, label: \"Link\", required: true }),\n title: prop(text(), { support: WRITTEN, label: \"Title\", description: \"Shown as a tooltip by mail clients and browsers that show one.\" }),\n \"aria-label\": prop(text(), { support: WRITTEN, label: \"Label for screen readers\", description: \"What a screen reader says for it, where its text alone doesn't say enough (\\\"Read more about pricing\\\").\" }),\n attrs: prop(attributes(), { support: WRITTEN, editable: false, label: \"More attributes\", description: \"More attributes for it: a class, a `data-` attribute.\" }),\n },\n style: { ...RUN_STYLE, ...placementStyle },\n defaultStyle: { color: \"#0000ee\", textDecoration: \"underline\" },\n hover: [\"color\", \"textDecoration\", \"backgroundColor\"],\n children: { text: true, categories: [\"inline\"], types: [\"Image\"] },\n sizing: \"shrink\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Link\", paths: [\"props.href\", \"style.color\", \"style.textDecoration\", \"hover.color\"] }] },\n});\n\ntype ButtonColors = { color?: string; backgroundColor?: string; hoverColor?: string; hoverBackgroundColor?: string };\n\n/** A button's colors, as one editor: the builder's button-color widget, for one. */\nexport const buttonColors: CompositeEditor<ButtonColors> = {\n editor: \"buttonColors\",\n covers: [\"style.color\", \"style.backgroundColor\", \"hover.color\", \"hover.backgroundColor\"],\n read: (node) => ({\n color: node.style?.color as string | undefined,\n backgroundColor: node.style?.backgroundColor as string | undefined,\n hoverColor: node.hover?.color as string | undefined,\n hoverBackgroundColor: node.hover?.backgroundColor as string | undefined,\n }),\n write: (value) => ({\n style: { color: value.color as Json | undefined, backgroundColor: value.backgroundColor as Json | undefined },\n hover: { color: value.hoverColor as Json | undefined, backgroundColor: value.hoverBackgroundColor as Json | undefined },\n }),\n};\n\nexport const Button = defineComponent({\n type: \"Button\",\n label: \"Button\",\n description: \"A link drawn as a button.\",\n categories: [\"block\"],\n props: {\n href: prop(link(), { support: WRITTEN, label: \"Link\", required: true }),\n title: prop(text(), { support: WRITTEN, label: \"Title\", description: \"Shown as a tooltip by mail clients and browsers that show one.\" }),\n \"aria-label\": prop(text(), { support: WRITTEN, label: \"Label for screen readers\", description: \"What a screen reader says for it, where its text alone doesn't say enough (\\\"Read more about pricing\\\").\" }),\n attrs: prop(attributes(), { support: WRITTEN, editable: false, label: \"More attributes\", description: \"More attributes for its link: a class, a `data-` attribute.\" }),\n },\n style: {\n ...textStyle,\n ...pick(boxStyle, \"width\", \"maxWidth\", \"padding\", \"backgroundColor\", \"border\", \"borderRadius\"),\n boxSizing: { kind: enumOf([\"border-box\", \"content-box\"]), label: \"Width holds\", description: \"Whether its width holds its padding and border (border-box), or they go on top of it (content-box).\", support: { email: { level: \"none\", shows: \"a width that holds them\", source: \"writer\" }, web: css } },\n alignSelf: { kind: enumOf([\"start\", \"center\", \"end\"]), label: \"Place\", description: \"Where it sits in its stack, whatever the stack's alignItems: on phones too, another place than on desktop.\", mobile: true, support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n ...placementStyle,\n },\n defaultStyle: {\n color: \"#ffffff\",\n backgroundColor: \"#0879a1\",\n fontSize: 14,\n lineHeight: 1.2,\n textAlign: \"center\",\n padding: { top: 10, right: 20, bottom: 10, left: 20 },\n borderRadius: 4,\n },\n hover: [\"color\", \"backgroundColor\"],\n children: { text: true, types: [\"Span\", \"MergeTag\", \"LineBreak\"] },\n sizing: \"shrink\",\n targets: { email: {}, web: {} },\n editor: {\n groups: [\n { title: \"Button\", paths: [\"props.href\", \"style.width\"] },\n { title: \"Colors\", composite: buttonColors },\n TEXT_EDITOR,\n { title: \"Spacing\", paths: [\"style.padding\", \"style.border\", \"style.borderRadius\"] },\n ],\n },\n});\n\nexport const Image = defineComponent({\n type: \"Image\",\n label: \"Image\",\n description: \"An image in the content. Without a width it takes its own size, no wider than its parent.\",\n categories: [\"block\"],\n props: {\n src: prop(asset(), { support: WRITTEN, label: \"Image\", required: true }),\n alt: prop(text(), { support: WRITTEN, label: \"Alternate text\", description: \"Read out by screen readers, and shown where images don't load.\", default: \"\" }),\n title: prop(text(), { support: WRITTEN, label: \"Title\", description: \"Shown as a tooltip by mail clients and browsers that show one.\" }),\n },\n style: {\n ...pick(boxStyle, \"width\", \"maxWidth\", \"height\", \"border\", \"borderRadius\"),\n ...placementStyle,\n alignSelf: { kind: enumOf([\"start\", \"center\", \"end\"]), label: \"Place\", description: \"Where it sits in its stack on phones, where that's another place than on desktop.\", mobile: true, support: { email: { level: \"full\", source: \"caniemail\" }, web: css } },\n verticalAlign: { kind: enumOf([\"top\", \"middle\"]), label: \"Place in its line\", description: \"Where it sits in a line of text it's in.\", support: { email: { level: \"full\", source: \"caniemail\" }, web: css } },\n },\n children: {},\n sizing: \"shrink\",\n conditionSupport: { mobile: { border: { email: { level: \"none\", shows: \"its desktop border\", source: \"writer\" } } } },\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Image\", paths: [\"props.src\", \"props.alt\", \"style.width\"] }, { title: \"Box\", paths: [\"style.border\", \"style.borderRadius\"] }] },\n});\n\nexport const Divider = defineComponent({\n type: \"Divider\",\n label: \"Divider\",\n description: \"A horizontal line.\",\n categories: [\"block\"],\n props: {},\n style: {\n borderTop: { kind: line(), label: \"Line\", description: 'The line, as CSS border-top: \"1px solid #bbbbbb\".', support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n width: { kind: length([\"px\", \"%\"]), label: \"Length\", mobile: true, support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n padding: { kind: insets(), label: \"Padding\", mobile: true, support: { email: { level: \"full\", source: \"outlook-captures\" }, web: css } },\n },\n defaultStyle: { borderTop: { width: 1, style: \"solid\", color: \"#bbbbbb\" }, width: \"100%\" },\n children: {},\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Line\", paths: [\"style.borderTop\", \"style.width\"] }, SPACING_EDITOR] },\n});\n\nexport const LineBreak = defineComponent({\n type: \"LineBreak\",\n label: \"Line break\",\n description: \"Starts a new line inside text.\",\n categories: [\"inline\"],\n props: {},\n style: {},\n children: {},\n sizing: \"none\",\n targets: { email: {}, web: {} },\n});\n\nexport const MergeTag = defineComponent({\n type: \"MergeTag\",\n label: \"Merge tag\",\n description: \"A value the sending service fills in (a name, a link), written in the service's own syntax.\",\n categories: [\"inline\"],\n props: {\n name: prop(text({ maxLength: 200 }), { support: WRITTEN, label: \"Name\", required: true }),\n },\n style: {},\n children: {},\n sizing: \"none\",\n targets: { email: {}, web: {} },\n});\n\nexport const List = defineComponent({\n type: \"List\",\n label: \"List\",\n description: \"A bulleted or numbered list of ListItems. Its markers sit in a column of their own (indent) before the items.\",\n categories: [\"block\"],\n props: {\n type: prop(enumOf([\"bullet\", \"number\"]), { support: WRITTEN, label: \"Type\", default: \"bullet\" }),\n start: prop(number({ min: 0, integer: true }), { support: WRITTEN, label: \"Starts at\", description: \"The first item's number, in a numbered list.\", default: 1 }),\n },\n style: {\n ...inheritedTextStyle,\n ...pick(boxStyle, \"width\", \"maxWidth\", \"padding\", \"backgroundColor\", \"border\"),\n gap: { kind: length([\"px\"]), label: \"Gap\", description: \"Space between items.\", mobile: true, support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n indent: { kind: length([\"px\"], { min: 0 }), label: \"Indent\", description: \"The width of the markers' column, before the items.\", support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n ...placementStyle,\n },\n defaultStyle: { indent: 24 },\n children: { types: [\"ListItem\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"List\", paths: [\"props.type\", \"props.start\", \"style.gap\", \"style.indent\"] }, TEXT_EDITOR, SPACING_EDITOR] },\n});\n\nexport const ListItem = defineComponent({\n type: \"ListItem\",\n label: \"List item\",\n description: \"An item of a List: text, and a List of its own to nest one.\",\n categories: [],\n props: TEXT_DIR,\n style: pick(textStyle, \"color\", \"fontFamily\", \"fontSize\", \"fontWeight\", \"fontStyle\", \"lineHeight\", \"letterSpacing\", \"textAlign\", \"textTransform\", \"textDecoration\"),\n children: { text: true, categories: [\"inline\"], types: [\"List\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [TEXT_EDITOR] },\n});\n\nexport const Table = defineComponent({\n type: \"Table\",\n label: \"Table\",\n description: \"A table of data: TableRows of TableCells. Columns take their cells' widths; the rest share what's left.\",\n categories: [\"block\"],\n props: {},\n style: {\n ...inheritedTextStyle,\n ...pick(boxStyle, \"width\", \"maxWidth\", \"backgroundColor\", \"border\"),\n cellPadding: { kind: insets(), label: \"Cell padding\", description: \"Every cell's padding, where the cell doesn't set its own.\", support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n rowBorder: { kind: line(), label: \"Line between rows\", support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n borderCollapse: { kind: enumOf([\"separate\", \"collapse\"]), label: \"Cell borders\", description: \"Whether cells side by side draw a border each (separate) or share one (collapse).\", support: { email: { level: \"full\", source: \"caniemail\" }, web: css } },\n ...placementStyle,\n },\n children: { types: [\"TableRow\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Table\", paths: [\"style.cellPadding\", \"style.rowBorder\", \"style.border\", \"style.backgroundColor\"] }, TEXT_EDITOR] },\n});\n\nexport const TableRow = defineComponent({\n type: \"TableRow\",\n label: \"Table row\",\n description: \"A row of a Table. A header row's cells are header cells, in bold.\",\n categories: [],\n props: {\n header: prop(boolean(), { support: WRITTEN, label: \"Header\", description: \"Its cells head the columns below them.\", default: false }),\n footer: prop(boolean(), { support: WRITTEN, label: \"Footer\", description: \"It ends the table (printed, on each page the table runs to).\", default: false }),\n },\n style: { ...pick(textStyle, \"color\", \"fontFamily\", \"fontSize\", \"fontWeight\", \"fontStyle\", \"lineHeight\", \"letterSpacing\", \"textAlign\", \"textTransform\"), backgroundColor: boxStyle.backgroundColor, height: boxStyle.height },\n defaultStyleBy: { prop: \"header\", values: { true: { fontWeight: 700 } } },\n children: { types: [\"TableCell\"] },\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Row\", paths: [\"props.header\", \"style.backgroundColor\"] }, TEXT_EDITOR] },\n});\n\nexport const TableCell = defineComponent({\n type: \"TableCell\",\n label: \"Table cell\",\n description: \"A cell of a TableRow: text, and images. Its width sets its column's.\",\n categories: [],\n props: {\n colSpan: prop(number({ min: 1, integer: true }), { support: WRITTEN, label: \"Columns\", description: \"How many columns it spans.\", default: 1 }),\n ...TEXT_DIR,\n },\n style: {\n ...textStyle,\n ...pick(boxStyle, \"padding\", \"backgroundColor\", \"border\"),\n width: { kind: length([\"px\", \"%\"]), label: \"Width\", description: \"Its column's width (of a cell spanning one column).\", support: { email: { level: \"full\", source: \"writer\" }, web: css } },\n verticalAlign: { kind: enumOf([\"top\", \"middle\", \"bottom\"]), label: \"Vertical alignment\", support: { email: { level: \"full\", source: \"caniemail\" }, web: css } },\n },\n children: { text: true, categories: [\"inline\"], types: [\"Image\"] },\n sizing: \"none\",\n conditionSupport: { mobile: { border: { email: { level: \"none\", shows: \"its desktop border\", source: \"writer\" } } } },\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Cell\", paths: [\"props.colSpan\", \"style.width\", \"style.verticalAlign\"] }, TEXT_EDITOR, { title: \"Box\", paths: [\"style.padding\", \"style.backgroundColor\", \"style.border\"] }] },\n});\n\nexport const Video = defineComponent({\n type: \"Video\",\n label: \"Video\",\n description: \"A YouTube or Vimeo video: its player on a page; in an email (which can't play one), its thumbnail, linked to it.\",\n categories: [\"block\"],\n props: {\n src: prop(video(), { support: WRITTEN, label: \"Video\", required: true, description: \"The video's YouTube or Vimeo link.\" }),\n thumbnail: prop(asset(), {\n support: { email: { level: \"full\", source: \"writer\" }, web: { level: \"none\", shows: \"the video's player: a page plays the video\", source: \"writer\" } },\n label: \"Thumbnail\",\n description: \"The image an email shows, linked to the video. A YouTube video's own where there's none; a Vimeo video's can't be found without the network.\",\n }),\n title: prop(text(), { support: WRITTEN, label: \"Title\", description: \"The player's title on a page, the thumbnail's alternate text in an email.\", default: \"Video\" }),\n },\n style: { ...pick(boxStyle, \"width\", \"maxWidth\"), ...placementStyle },\n children: {},\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"Video\", paths: [\"props.src\", \"props.thumbnail\", \"props.title\", \"style.width\", \"style.maxWidth\"] }] },\n});\n\n/**\n * Markup no component says (the builder's HTML block), written as it is. A PDF and an image can't draw markup: they\n * draw its plain text, and say so.\n */\nexport const Html = defineComponent({\n type: \"Html\",\n label: \"HTML\",\n description:\n \"Markup written as it is, for what no component says (the builder's HTML block): in an email and on a page as given, nothing in it checked or escaped. A Document's PDF and a Canvas's image draw its plain text.\",\n categories: [\"block\"],\n props: {\n html: prop(text(), { support: WRITTEN, label: \"HTML\", required: true, description: \"The markup, written as it is: only markup you trust. Or give it as JSX inside the block, which React writes.\" }),\n text: prop(text(), { support: WRITTEN, label: \"Plain text\", description: \"What it reads as in the plain-text version, and in a PDF or an image (its markup's words where there's none).\" }),\n },\n style: {},\n children: {},\n sizing: \"stretch\",\n targets: { email: {}, web: {} },\n editor: { groups: [{ title: \"HTML\", paths: [\"props.html\", \"props.text\"] }] },\n});\n\nexport const COMPONENTS: Readonly<Record<string, ComponentDefinition>> = Object.freeze(\n Object.fromEntries(\n [Email, Page, Document, DocumentPage, PageBreak, PageHeader, PageFooter, PageNumber, Canvas, Svg, ...SHAPES, Section, Row, Column, Grid, Layer, Text, Heading, Span, Link, Button, Image, Divider, LineBreak, MergeTag, List, ListItem, Table, TableRow, TableCell, Video, Social, Menu, Html].map((d) => [\n d.type,\n d as unknown as ComponentDefinition,\n ])\n )\n);\n\nexport function definitionOf(type: string): ComponentDefinition | undefined {\n return Object.prototype.hasOwnProperty.call(COMPONENTS, type) ? COMPONENTS[type] : undefined;\n}\n","/**\n * Which components a document may use: the built-in ones, and the custom\n * components a caller passes. A custom component is a definition like the\n * built-in ones, plus `expand`: what it is, as primitives.\n */\nimport { COMPONENTS } from \"./components\";\nimport { TARGETS, type ComponentDefinition, type PropSpecs, type Target, type TargetSupport } from \"./define\";\nimport type { OutputOf } from \"./kinds\";\nimport type { Diagnostic } from \"./diagnostics\";\nimport type { Json } from \"./model\";\nimport { placementStyle } from \"./styles\";\n\n/** A namespace, a dot, a capitalized name: \"acme.ProductCard\". Built-in types never look like this. */\nexport const CUSTOM_TYPE = /^[a-z][a-z0-9-]*\\.[A-Z][A-Za-z0-9]*$/;\n\n/** Props that always have a value: required ones, and ones with a default (see `prop`). */\ntype RequiredOrDefaulted<P extends PropSpecs> = {\n [K in keyof P]: Exclude<P[K][\"required\"], undefined> extends true ? K : [P[K][\"default\"]] extends [undefined] ? never : K;\n}[keyof P];\n\n/** The props `expand` (or a `render`) gets: normalized, with defaults applied. */\nexport type ExpandProps<P extends PropSpecs> = { [K in RequiredOrDefaulted<P>]: OutputOf<P[K][\"kind\"]> } & {\n [K in Exclude<keyof P, RequiredOrDefaulted<P>>]?: OutputOf<P[K][\"kind\"]>;\n};\n\n/** What `expand` may do besides returning its node, and what it may read besides its props. */\nexport interface ExpandContext {\n /** Makes custom components the expansion uses known (ones not passed in the components option). */\n register(definition: CustomDefinition<any>): void;\n /** The node's style, with its definition's defaults: a built-in made of primitives (Social, Menu) styles them by it. */\n style: Record<string, Json>;\n /** Whether the template has phones (an Email or a Page): what's hidden on phones is only hidden there. */\n responsive: boolean;\n /** A problem found while expanding that doesn't stop it (a warning or a note), said once at the expansion's place. */\n report(diagnostic: Diagnostic): void;\n}\n\nexport interface CustomDefinition<P extends PropSpecs = PropSpecs> extends ComponentDefinition<P, typeof placementStyle> {\n custom: true;\n /**\n * The component as primitives: one node of the template tree\n * (`{ type, props, style, children }`). Pure: the same props give the same node.\n */\n expand(props: ExpandProps<P>, context: ExpandContext): unknown;\n}\n\nexport interface CustomComponentSpec<P extends PropSpecs> {\n type: string;\n label: string;\n description?: string;\n props: P;\n /** Where it goes: where a block goes (default), or where a Section goes. */\n placement?: \"block\" | \"section\";\n expand(props: ExpandProps<P>, context: ExpandContext): unknown;\n}\n\nexport function defineCustomComponent<const P extends PropSpecs>(spec: CustomComponentSpec<P>): CustomDefinition<P> {\n if (!CUSTOM_TYPE.test(spec.type)) {\n throw new Error(`[Elements] A custom component's type is a namespace, a dot and a capitalized name (\"acme.ProductCard\"), not ${JSON.stringify(spec.type)}`);\n }\n const section = spec.placement === \"section\";\n const paths = Object.keys(spec.props).map((key) => `props.${key}`);\n return {\n type: spec.type,\n label: spec.label,\n description: spec.description ?? spec.label,\n categories: section ? [\"section\"] : [\"block\"],\n props: spec.props,\n style: section ? ({} as typeof placementStyle) : placementStyle,\n children: {},\n sizing: \"stretch\",\n // Rendered as the primitives it expands to, which are checked for each target themselves.\n targets: Object.fromEntries(TARGETS.map((target) => [target, {}])) as Record<Target, TargetSupport>,\n editor: paths.length ? { groups: [{ title: spec.label, paths }] } : undefined,\n custom: true,\n expand: spec.expand,\n };\n}\n\nexport function isCustom(definition: ComponentDefinition): definition is CustomDefinition {\n return (definition as Partial<CustomDefinition>).custom === true;\n}\n\nexport class Registry {\n private readonly custom = new Map<string, CustomDefinition>();\n\n constructor(components: readonly CustomDefinition<any>[] = []) {\n for (const definition of components) this.add(definition);\n }\n\n add(definition: CustomDefinition<any>): void {\n if (!isCustom(definition) || !CUSTOM_TYPE.test(definition.type)) {\n throw new Error(`[Elements] ${JSON.stringify((definition as { type?: unknown })?.type)} isn't a custom component (make one with component())`);\n }\n const known = this.custom.get(definition.type);\n if (known && known !== definition) throw new Error(`[Elements] Two custom components are named ${definition.type}`);\n this.custom.set(definition.type, definition as CustomDefinition);\n }\n\n get(type: string): ComponentDefinition | undefined {\n if (Object.prototype.hasOwnProperty.call(COMPONENTS, type)) return COMPONENTS[type];\n return this.custom.get(type);\n }\n\n get customs(): CustomDefinition[] {\n return [...this.custom.values()];\n }\n\n all(): ComponentDefinition[] {\n return [...Object.values(COMPONENTS), ...this.custom.values()];\n }\n}\n\n/** The props of a node with its definition's defaults where it has none. */\nexport function propsWithDefaults(definition: ComponentDefinition, props: Record<string, Json> | undefined): Record<string, Json> {\n const out: Record<string, Json> = {};\n for (const [key, spec] of Object.entries(definition.props)) if (spec.default !== undefined) out[key] = spec.default as Json;\n return { ...out, ...props };\n}\n\nexport interface ComponentsOption {\n /** Custom components (made with `component()`) the document may use. */\n components?: readonly CustomDefinition<any>[];\n}\n\nexport function registryOf(options: ComponentsOption | Registry | undefined): Registry {\n return options instanceof Registry ? options : new Registry(options?.components);\n}\n","/**\n * Reading the tree a template's JSX was collected into: validated against the\n * component definitions and normalized (values in their canonical form, ids\n * checked).\n */\nimport { CONDITION_NAMES, CONDITIONS, shownAnywhere } from \"./conditions\";\nimport type { ComponentDefinition, RootName, StyleSpecs } from \"./define\";\nimport { Diagnostics, ElementsError, type Diagnostic } from \"./diagnostics\";\nimport { type Child, type ElementsDocument, type Json, type Node } from \"./model\";\nimport { CUSTOM_TYPE, registryOf, type ComponentsOption, type Registry } from \"./registry\";\n\nexport interface CheckResult {\n /** The document with what could be read, or null when there's no usable root. */\n document: ElementsDocument | null;\n diagnostics: Diagnostic[];\n}\n\nconst NODE_KEYS = [\"id\", \"type\", \"props\", \"style\", \"mobile\", \"hover\", \"hidden\", \"children\"];\n/** An id is written into HTML ids and CSS selectors. */\nconst ID = /^[A-Za-z][A-Za-z0-9_-]*$/;\n\nconst isObject = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null && !Array.isArray(value);\n\ninterface Context {\n d: Diagnostics;\n registry: Registry;\n /**\n * Inside a custom component's expansion (see expand.ts): the instance's id, put before the ids its\n * render writes, or null when the instance has none (those ids are then dropped: a block used many\n * times can't own an id). Undefined outside one.\n */\n idPrefix?: string | null;\n /** Ids taken so far: an id is unique in a template. */\n used: Set<string>;\n /** The template's root: which conditions its nodes may have (phone styles only under one with a phone width). */\n root: ComponentDefinition | undefined;\n}\n\n/** Validates and normalizes a document; never throws. */\nexport function checkDocument(input: unknown, options?: ComponentsOption | Registry): CheckResult {\n const registry = registryOf(options);\n const d = new Diagnostics();\n if (!isObject(input)) {\n d.error(\"document/invalid\", \"A document is an object: { root: { type: \\\"Email\\\", … } }\", \"\");\n return { document: null, diagnostics: d.list };\n }\n const extra = Object.keys(input).filter((key) => key !== \"root\");\n for (const key of extra) d.error(\"document/unknown-key\", `\"${key}\" isn't part of a document (root)`, key);\n\n const rootDefinition = isObject(input.root) && typeof input.root.type === \"string\" ? registry.get(input.root.type) : undefined;\n const context: Context = { d, registry, used: new Set(), root: rootDefinition };\n const root = input.root === undefined ? null : readNode(input.root, \"root\", null, context);\n if (input.root === undefined) d.error(\"document/root\", 'A document has a root: { type: \"Email\" }, \"Page\", …', \"root\");\n return { document: root ? { root } : null, diagnostics: d.list };\n}\n\n/** Validates and normalizes a document, throwing an `ElementsError` if it has errors. */\nexport function parseDocument(input: unknown, options?: ComponentsOption | Registry): ElementsDocument {\n const { document, diagnostics } = checkDocument(input, options);\n if (!document || diagnostics.some((x) => x.severity === \"error\")) throw new ElementsError(diagnostics);\n return document;\n}\n\n/**\n * One node read as the child of `parent` would be: what a custom component\n * expands to. Ids its render writes go after the instance's id (`idPrefix`),\n * and mustn't take one of `taken`.\n */\nexport function checkFragment(\n input: unknown,\n options: { parent: ComponentDefinition; root: ComponentDefinition | undefined; idPrefix: string | null; taken: ReadonlySet<string>; registry: Registry; path: string }\n): { node: Node | null; diagnostics: Diagnostic[] } {\n const d = new Diagnostics();\n const context: Context = { d, registry: options.registry, idPrefix: options.idPrefix, used: new Set(options.taken), root: options.root };\n const node = readNode(input, options.path, options.parent, context);\n return { node, diagnostics: d.list };\n}\n\n/** \"an Email or a Page\", \"a Document\": the roots something is for, in a message. */\nexport function rootList(roots: readonly string[]): string {\n const named = roots.map((root) => a(root).replace(/^A/, \"a\"));\n return named.length > 1 ? `${named.slice(0, -1).join(\", \")} or ${named[named.length - 1]}` : named[0] ?? \"no root\";\n}\n\n/**\n * Whether a root takes what's declared for `roots` (a component's, a prop's, a style's): undefined is every root, and\n * so is a root Elements doesn't know (its own error says so).\n */\nfunction rootTakes(roots: readonly RootName[] | undefined, root: ComponentDefinition | undefined): boolean {\n return !roots || !root || roots.includes(root.type as RootName);\n}\n\n/** Whether a component and a root share an output: where they don't, it's the output's `target/unsupported`, as today. */\nfunction sharesOutput(definition: ComponentDefinition, root: ComponentDefinition): boolean {\n return Object.keys(definition.targets).some((target) => target in root.targets);\n}\n\nfunction allowedIn(parent: ComponentDefinition, child: ComponentDefinition): boolean {\n const rule = parent.children;\n return !!rule.types?.includes(child.type) || child.categories.some((category) => rule.categories?.includes(category));\n}\n\n/** Where each component's props and styles are listed: the guide the package ships. */\nconst GUIDE = \"@hyper-elements/react/GUIDE.md\";\n/** A message, then where to look the component up. */\nconst seeing = (message: string, type: string) => `${message}${/[?.]$/.test(message) ? \"\" : \".\"} See ${type} in ${GUIDE}`;\nconst a = (type: string) => `${/^[AEIOU]/.test(type) ? \"An\" : \"A\"} ${type}`;\n\n/** The name meant, where one is a typo away (a letter or two, or its case): \"colour\" is \"color\". */\nfunction nearest(key: string, names: readonly string[]): string | undefined {\n const lower = key.toLowerCase();\n let best: { name: string; distance: number } | undefined;\n for (const name of names) {\n const distance = name.toLowerCase() === lower ? 0 : editDistance(lower, name.toLowerCase());\n if (distance <= (key.length > 4 ? 2 : 1) && (!best || distance < best.distance)) best = { name, distance };\n }\n return best?.name;\n}\n\nfunction editDistance(from: string, to: string): number {\n let row = Array.from({ length: to.length + 1 }, (_, i) => i);\n for (let i = 1; i <= from.length; i++) {\n const next = [i];\n for (let j = 1; j <= to.length; j++) next[j] = Math.min(row[j] + 1, next[j - 1] + 1, row[j - 1] + (from[i - 1] === to[j - 1] ? 0 : 1));\n row = next;\n }\n return row[to.length];\n}\n\n/** What's wrong with a prop the component doesn't have, and what to write instead. */\n/** Breakpoint names other libraries use (Tailwind's, Chakra's, Bootstrap's), which Elements doesn't have. */\nconst OTHER_BREAKPOINTS = new Set([\"base\", \"initial\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\", \"tablet\", \"desktop\", \"wide\", \"small\", \"medium\", \"large\"]);\n\n/**\n * Where a key that names a condition goes, written the way another library writes it (`_hover`, `\":hover\"`,\n * `hoverStyle`, `$sm`, `md`, `@media …`) or as a prop (`mobile={…}`): what an agent or a person coming from Chakra,\n * Tailwind, Stitches or Tamagui tries first. Undefined: it isn't one.\n */\nfunction conditionHint(definition: ComponentDefinition, key: string): string | undefined {\n const name = key\n .trim()\n .replace(/^(&?:+|_+|\\$|@)/, \"\")\n .replace(/Style$/, \"\")\n .toLowerCase();\n const own = CUSTOM_TYPE.test(definition.type);\n const hoverStyles = definition.hover ?? [];\n const toHover = own\n ? `a template's own component takes only its place in a Row in its style: set hover styles in what it renders`\n : hoverStyles.length\n ? `hover styles go in its style's hover block, style={{ hover: { … } }} (it takes ${hoverStyles.join(\", \")})`\n : `${a(definition.type).replace(/^A/, \"a\")} takes no hover styles (a Button's and a Link's colors do)`;\n const toPhone = own\n ? `a template's own component takes only its place in a Row in its style: set phone styles in what it renders`\n : `phone styles go in its style's mobile block, style={{ mobile: { … } }}`;\n if (name === \"hover\") return toHover;\n if (name === \"mobile\" || name === \"phone\" || name === \"phones\" || key.trim().startsWith(\"@media\")) return toPhone;\n if (name === \"focus\" || name === \"focus-visible\" || name === \"focusvisible\" || name === \"focus-within\") {\n return hoverStyles.length && !own ? `keyboard focus gets its hover styles: set them in style={{ hover: { … } }}` : `there are no focus styles; keyboard focus gets a Button's and a Link's hover styles`;\n }\n if (OTHER_BREAKPOINTS.has(name)) {\n return `Elements has one breakpoint, phones: desktop styles go in style itself, phone styles in its mobile block, style={{ mobile: { … } }} (a Page sets where phones start with breakpoints={{ mobile }})`;\n }\n if (name === \"active\" || name === \"pressed\" || name === \"press\" || name === \"visited\" || name === \"dark\" || name === \"light\" || name === \"print\") {\n return `there are no ${name} styles: Elements has phone styles (mobile) and hover styles (hover) in style`;\n }\n return undefined;\n}\n\nfunction unknownProp(definition: ComponentDefinition, key: string): string {\n const condition = conditionHint(definition, key);\n if (condition) return `${a(definition.type)} has no prop \"${key}\": ${condition}`;\n if (Object.prototype.hasOwnProperty.call(definition.style, key)) return `${a(definition.type)} has no prop \"${key}\": it's a style, style={{ ${key}: … }}`;\n const known = Object.keys(definition.props);\n const meant = nearest(key, known);\n return seeing(`${a(definition.type)} has no prop \"${key}\"${meant ? `: did you mean \"${meant}\"?` : known.length ? ` (it has ${known.join(\", \")})` : \"\"}`, definition.type);\n}\n\nfunction placementMessage(parent: ComponentDefinition, child: ComponentDefinition): string {\n if (child.categories.includes(\"section\")) return `A ${child.type} goes directly in an Email or Page, not in a ${parent.type}`;\n if (child.categories.includes(\"root\")) return `A ${child.type} is a root: it can't be inside a ${parent.type}`;\n const takes = [...(parent.children.text ? [\"text\"] : []), ...(parent.children.categories ?? []).map((c) => `${c} components`), ...(parent.children.types ?? [])];\n return takes.length ? seeing(`A ${parent.type} takes ${takes.join(\", \")}; a ${child.type} can't go in it`, parent.type) : `A ${parent.type} has no children`;\n}\n\nfunction readNode(input: unknown, path: string, parent: ComponentDefinition | null, context: Context): Node | null {\n const { d } = context;\n if (!isObject(input)) {\n d.error(\"node/invalid\", `Expected a component ({ \"type\": … }), not ${JSON.stringify(input) ?? String(input)}`, path);\n return null;\n }\n if (typeof input.type !== \"string\") {\n d.error(\"node/type\", 'A component has a \"type\" (\"Row\", \"Heading\", …)', `${path}.type`);\n return null;\n }\n const definition = context.registry.get(input.type);\n if (!definition) {\n const custom = CUSTOM_TYPE.test(input.type);\n d.error(\n \"node/unknown-type\",\n custom ? `\"${input.type}\" is a custom component this document wasn't given: pass it in the components option` : `\"${input.type}\" isn't a component Elements knows`,\n `${path}.type`\n );\n return null;\n }\n if (!parent && !definition.categories.includes(\"root\")) {\n d.error(\"root/invalid\", `A document's root is an Email or Page, not a ${definition.type}`, `${path}.type`);\n return null;\n }\n if (parent && !allowedIn(parent, definition)) {\n d.error(\"children/not-allowed\", placementMessage(parent, definition), path);\n return null;\n }\n const root = context.root;\n if (root && !rootTakes(definition.roots, root) && sharesOutput(definition, root)) {\n const { code, message } = definition.notAllowed ?? {\n code: \"component/not-supported\",\n message: (under: string) => `${a(definition.type)} goes in ${rootList(definition.roots ?? [])}, not in ${a(under).replace(/^A/, \"a\")}`,\n };\n d.error(code, message(root.type), path);\n return null;\n }\n\n // Only what the author writes: an id is theirs (an anchor, a reference), never generated.\n let id: string | undefined;\n if (input.id !== undefined) {\n if (typeof input.id !== \"string\" || !ID.test(input.id)) {\n d.error(\"id/invalid\", `An id starts with a letter and holds letters, digits, \"_\" and \"-\", not ${JSON.stringify(input.id)}`, `${path}.id`);\n } else if (context.idPrefix === null) {\n d.add(\"id/dropped\", \"info\", `The id \"${input.id}\" is left out: inside a custom component, ids are kept only when the component is given one (a block used many times can't own an id)`, `${path}.id`);\n } else {\n const full = context.idPrefix ? `${context.idPrefix}-${input.id}` : input.id;\n if (context.used.has(full)) d.error(\"id/duplicate\", `The id \"${full}\" is already used by another component`, `${path}.id`);\n else {\n id = full;\n context.used.add(full);\n }\n }\n }\n\n for (const key of Object.keys(input)) {\n if (!NODE_KEYS.includes(key)) d.error(\"node/unknown-key\", `\"${key}\" isn't part of a component (${NODE_KEYS.join(\", \")})`, `${path}.${key}`, id);\n }\n\n const node: Node = id === undefined ? { type: definition.type } : { id, type: definition.type };\n\n const props = readProps(input.props, definition, `${path}.props`, id, d, context.root);\n if (props) node.props = props;\n\n // A condition's block written inside `style` (`style={{ mobile: { … } }}`) is read as the condition's own; a template's\n // own component (`acme.Card`) takes no condition, so in its style a block is an unknown style, as anything else is.\n const lifted: Partial<Record<string, unknown>> = {};\n let styleInput = input.style;\n if (isObject(styleInput) && !CUSTOM_TYPE.test(definition.type)) {\n const rest: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(styleInput)) {\n if (CONDITION_NAMES.has(key)) lifted[key] = value;\n else rest[key] = value;\n }\n styleInput = rest;\n }\n\n const style = readStyles(styleInput, definition, definition.style, `${path}.style`, id, d, \"style\", () => true, undefined, context.root);\n if (style) node.style = style;\n\n for (const condition of CONDITIONS) {\n const inStyle = lifted[condition.name];\n const given = input[condition.name];\n if (inStyle !== undefined && given !== undefined) {\n d.error(\n \"style/twice\",\n `${condition.name} is given twice: as ${condition.name}={…} and in style. Give it once, in style: style={{ ${condition.name}: { … } }}`,\n `${path}.style.${condition.name}`,\n id\n );\n continue;\n }\n let value = inStyle ?? given;\n if (value === undefined) continue;\n const at = inStyle !== undefined ? `${path}.style.${condition.name}` : `${path}.${condition.name}`;\n if (condition.roots && !condition.roots(context.root)) {\n if (condition.notAllowed) d.error(condition.notAllowed.code, condition.notAllowed.message, at, id);\n continue;\n }\n // One level deep: a condition inside a condition's block (hover on phones) isn't something Elements writes.\n if (isObject(value) && Object.keys(value).some((key) => CONDITION_NAMES.has(key))) {\n const own: Record<string, unknown> = {};\n for (const [key, inner] of Object.entries(value)) {\n if (CONDITION_NAMES.has(key)) d.error(\"style/nested\", `${key} can't be set inside ${condition.name}: a block holds styles, not another block`, `${at}.${key}`, id);\n else own[key] = inner;\n }\n value = own;\n }\n const read = readStyles(value, definition, definition.style, at, id, d, condition.name, (spec, key) => condition.allows(spec, key, definition), condition.for, context.root);\n if (read) node[condition.name] = read;\n }\n\n if (input.hidden !== undefined) {\n const hidden = readHidden(input.hidden, `${path}.hidden`, id, context);\n if (hidden) node.hidden = hidden;\n }\n\n const children = readChildren(input.children, definition, `${path}.children`, id, context);\n if (children.length) node.children = children;\n return node;\n}\n\nfunction readProps(input: unknown, definition: ComponentDefinition, path: string, id: string | undefined, d: Diagnostics, root: ComponentDefinition | undefined): Record<string, Json> | undefined {\n const out: Record<string, Json> = {};\n if (input !== undefined && !isObject(input)) {\n d.error(\"props/invalid\", \"props is an object\", path, id);\n input = undefined;\n }\n for (const [key, value] of Object.entries((input as Record<string, unknown> | undefined) ?? {})) {\n if (value === undefined) continue;\n const spec = Object.prototype.hasOwnProperty.call(definition.props, key) ? definition.props[key] : undefined;\n if (!spec) {\n d.error(\"prop/unknown\", unknownProp(definition, key), `${path}.${key}`, id);\n continue;\n }\n if (!rootTakes(spec.roots, root)) {\n d.error(\"prop/not-supported\", `${a(definition.type)}'s \"${key}\" is for ${rootList(spec.roots!)}, not ${a(root!.type).replace(/^A/, \"a\")}`, `${path}.${key}`, id);\n continue;\n }\n const parsed = spec.kind.parse(value);\n if (parsed.ok) {\n if (!spec.kind.empty?.(parsed.value)) out[key] = parsed.value;\n } else d.error(\"prop/invalid\", `${key}: ${parsed.message}`, `${path}.${key}`, id);\n }\n for (const [key, spec] of Object.entries(definition.props)) {\n if (spec.required && !(key in out) && !(isObject(input) && input[key] !== undefined)) {\n d.error(\"prop/required\", `A ${definition.type} needs \"${key}\" (${spec.kind.accepts})`, `${path}.${key}`, id);\n }\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nconst UNSUPPORTED_CSS: Record<string, string> = {\n margin: \"use the parent's gap for space between siblings, or padding for space inside\",\n marginTop: \"use the parent's gap, or padding\",\n marginBottom: \"use the parent's gap, or padding\",\n marginLeft: \"use padding\",\n marginRight: \"use padding\",\n display: \"the component sets it\",\n position: \"use a Layer for content placed over other content\",\n backgroundImage: \"put a Layer around it, its first child an Image (the Layer's height crops it to cover), the rest over it\",\n background: \"backgroundColor for a color; for an image, a Layer: its first child an Image, the rest over it\",\n float: \"use a Row to put things side by side\",\n // Names Elements used before it took CSS's.\n align: \"it's alignItems now\",\n justify: 'it\\'s justifyContent now (\"between\" is \"space-between\")',\n wrap: \"a Row stays side by side on phones with its stackOnMobile prop set to false; flexWrap wraps it on the web\",\n color: \"a Divider's line is its borderTop, with its color\",\n thickness: 'a Divider\\'s line is borderTop now: \"1px solid #bbbbbb\"',\n lineStyle: 'a Divider\\'s line is borderTop now: \"1px solid #bbbbbb\"',\n};\n\n/** What to write instead of a style a component doesn't take, after a colon; or nothing. */\nfunction styleHint(definition: ComponentDefinition, specs: StyleSpecs, key: string): string {\n if (Object.prototype.hasOwnProperty.call(definition.props, key)) return `: it's a prop, ${key}={…}`;\n if (key === \"padding\" && definition.categories.includes(\"root\")) return \": a root has no padding; put it on a Column (a card) or a Section (a band) inside it\";\n if (UNSUPPORTED_CSS[key]) return `: ${UNSUPPORTED_CSS[key]}`;\n const condition = conditionHint(definition, key);\n if (condition) return `: ${condition}`;\n const meant = nearest(key, Object.keys(specs));\n return meant ? `: did you mean \"${meant}\"?` : \"\";\n}\n\nfunction readStyles(\n input: unknown,\n definition: ComponentDefinition,\n specs: StyleSpecs,\n path: string,\n id: string | undefined,\n d: Diagnostics,\n what: string,\n allowed: (spec: StyleSpecs[string], key: string) => boolean,\n /** For a condition, what can be set for it is set \"for phones\". */\n forLabel?: string,\n /** The template's root: a style declared for other roots is an error under it. */\n root?: ComponentDefinition\n): Record<string, Json> | undefined {\n if (input === undefined) return undefined;\n if (!isObject(input)) {\n d.error(`${what}/invalid`, `${what} is an object of style properties`, path, id);\n return undefined;\n }\n const out: Record<string, Json> = {};\n for (const [key, value] of Object.entries(input)) {\n if (value === undefined) continue;\n const spec = Object.prototype.hasOwnProperty.call(specs, key) ? specs[key] : undefined;\n if (!spec) {\n d.error(\"style/unknown\", seeing(`\"${key}\" isn't a style ${a(definition.type).replace(/^A/, \"a\")} takes${styleHint(definition, specs, key)}`, definition.type), `${path}.${key}`, id);\n continue;\n }\n if (!rootTakes(spec.roots, root)) {\n d.error(\"style/not-supported\", `${a(definition.type)}'s \"${key}\" is for ${rootList(spec.roots!)}, not ${a(root!.type).replace(/^A/, \"a\")}`, `${path}.${key}`, id);\n continue;\n }\n if (!allowed(spec, key)) {\n d.error(`${what}/not-allowed`, `\"${key}\" can't be set ${forLabel ?? \"here\"}`, `${path}.${key}`, id);\n continue;\n }\n const parsed = spec.kind.parse(value);\n if (parsed.ok) out[key] = parsed.value;\n else d.error(`${what}/invalid`, `${key}: ${parsed.message}`, `${path}.${key}`, id);\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction readHidden(input: unknown, path: string, id: string | undefined, context: Context): Node[\"hidden\"] | undefined {\n const { d } = context;\n if (!context.root?.responsive) {\n d.error(\"hidden/not-supported\", \"Hiding on phones or desktops is for an Email or a Page\", path, id);\n return undefined;\n }\n if (!isObject(input) || Object.entries(input).some(([key, value]) => (key !== \"mobile\" && key !== \"desktop\") || (value !== undefined && typeof value !== \"boolean\"))) {\n d.error(\"hidden/invalid\", \"hidden is { mobile?: boolean, desktop?: boolean }\", path, id);\n return undefined;\n }\n const out: { mobile?: boolean; desktop?: boolean } = {};\n if (input.mobile === true) out.mobile = true;\n if (input.desktop === true) out.desktop = true;\n if (!shownAnywhere({ hidden: out })) d.warning(\"hidden/everywhere\", \"Hidden on phones and on desktops, it never shows\", path, id);\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction readChildren(input: unknown, definition: ComponentDefinition, path: string, id: string | undefined, context: Context): Child[] {\n const { d } = context;\n if (input === undefined) return [];\n if (!Array.isArray(input)) {\n d.error(\"children/invalid\", \"children is an array of components and text\", path, id);\n return [];\n }\n const out: Child[] = [];\n input.forEach((child, index) => {\n const at = `${path}[${index}]`;\n if (typeof child === \"string\") {\n if (!child) return;\n if (definition.children.text) {\n const last = out[out.length - 1];\n if (typeof last === \"string\") out[out.length - 1] = last + child;\n else out.push(child);\n } else if (child.trim()) {\n d.error(\"children/text-not-allowed\", `Text can't go straight in a ${definition.type}: put it in a Text or Heading`, at, id);\n }\n return;\n }\n const node = readNode(child, at, definition, context);\n if (!node) return;\n // A Document's header and footer are drawn on every page: it has one of each, and a second would replace the first.\n if (definition.type === \"Document\" && (node.type === \"PageHeader\" || node.type === \"PageFooter\") && out.some((other) => typeof other !== \"string\" && other.type === node.type)) {\n d.error(\"children/one-only\", `A Document has one ${node.type}, drawn on every page: this is a second (put what both hold in one)`, at, node.id);\n }\n out.push(node);\n });\n return out;\n}\n","/**\n * Property discovery: what a component takes and how each thing is edited, as\n * plain data for editors, docs and agents. Each component, prop and style says\n * which roots take it, read from the definitions (the same ones validation reads).\n */\nimport { CONDITIONS, type ConditionName } from \"./conditions\";\nimport { registryOf, type ComponentsOption, type Registry } from \"./registry\";\nimport { styleGroup } from \"./styles\";\nimport { ROOT_NAMES, type Category, type ComponentDefinition, type RootName, type StyleGroup, type Support, type SupportByTarget, type Target } from \"./define\";\nimport type { EditorKind, JsonSchema } from \"./kinds\";\nimport type { Json } from \"./model\";\n\nexport interface PropertyDescription {\n /** \"props.href\", \"style.padding\", \"hover.color\". */\n path: string;\n label: string;\n description?: string;\n kind: string;\n accepts: string;\n editor: EditorKind;\n editable: boolean;\n required: boolean;\n default?: Json;\n inherited: boolean;\n mobile: boolean;\n /** The roots it may be given under: those of its component's that it's declared for. */\n roots: RootName[];\n /** A style's group (\"Typography\", \"Spacing\", …); props have none. */\n group?: StyleGroup;\n schema: JsonSchema;\n}\n\nexport interface ComponentDescription {\n type: string;\n label: string;\n description: string;\n categories: readonly Category[];\n properties: PropertyDescription[];\n children: { text: boolean; categories: readonly Category[]; types: readonly string[] };\n targets: Target[];\n /** The roots it may go in: those whose output it renders to, whose children reach it, and that it's declared for. */\n roots: RootName[];\n /** Editor groups: the paths each shows, or the composite editor and the paths it covers. */\n groups: Array<{ title: string; paths: readonly string[]; composite?: string }>;\n}\n\nexport interface DescribeOptions extends ComponentsOption {\n /**\n * Only what this root takes: the components it can hold, and of each the props and styles it can be given there,\n * with phone styles only under a root that has phones.\n */\n root?: RootName;\n}\n\nexport function describeComponent(type: string, options?: DescribeOptions): ComponentDescription | undefined {\n const registry = registryOf(options);\n const definition = registry.get(type);\n if (!definition) return undefined;\n const described = describe(definition, registry, reachable(registry));\n return options?.root ? forRoot(described, options.root, registry) : described;\n}\n\n/** Every built-in component a template can use, and the custom ones given; with `root`, those that root takes. */\nexport function describeComponents(options?: DescribeOptions): ComponentDescription[] {\n const registry = registryOf(options);\n const reach = reachable(registry);\n const all = registry.all().map((definition) => describe(definition, registry, reach));\n const root = options?.root;\n if (!root) return all;\n return all.flatMap((description) => forRoot(description, root, registry) ?? []);\n}\n\n/** Each condition (phones, hover) and the roots it may be set under. */\nexport function describeConditions(options?: ComponentsOption): Array<{ name: ConditionName; on: string; roots: RootName[] }> {\n const registry = registryOf(options);\n return CONDITIONS.map((condition) => ({\n name: condition.name,\n on: condition.on,\n roots: rootDefinitions(registry)\n .filter((root) => !condition.roots || condition.roots(root))\n .map((root) => root.type as RootName),\n }));\n}\n\n/** A description narrowed to one root, or undefined where that root doesn't take the component. */\nfunction forRoot(description: ComponentDescription, root: RootName, registry: Registry): ComponentDescription | undefined {\n if (!description.roots.includes(root)) return undefined;\n const responsive = !!registry.get(root)?.responsive;\n return {\n ...description,\n roots: [root],\n properties: description.properties\n .filter((property) => property.roots.includes(root))\n .map((property) => ({ ...property, roots: [root], mobile: property.mobile && responsive })),\n };\n}\n\n/** The built-in roots, in ROOT_NAMES' order. */\nfunction rootDefinitions(registry: Registry): ComponentDefinition[] {\n return ROOT_NAMES.flatMap((name) => registry.get(name) ?? []);\n}\n\n/** Whether a parent's children rules take a child (as validation reads them). */\nfunction holds(parent: ComponentDefinition, child: ComponentDefinition): boolean {\n return !!parent.children.types?.includes(child.type) || child.categories.some((category) => parent.children.categories?.includes(category));\n}\n\n/** The types each root's children rules reach, at any depth (a Text's Span in a Column in a Page). */\nfunction reachable(registry: Registry): Map<string, Set<string>> {\n const all = registry.all();\n const out = new Map<string, Set<string>>();\n for (const root of rootDefinitions(registry)) {\n const seen = new Set<string>([root.type]);\n const queue = [root];\n while (queue.length) {\n const parent = queue.shift()!;\n for (const child of all) {\n if (seen.has(child.type) || child.categories.includes(\"root\") || !holds(parent, child)) continue;\n seen.add(child.type);\n queue.push(child);\n }\n }\n out.set(root.type, seen);\n }\n return out;\n}\n\n/** The roots a component may go in (see ComponentDescription.roots). */\nexport function componentRoots(definition: ComponentDefinition, options?: ComponentsOption | Registry, reach = reachable(registryOf(options))): RootName[] {\n const registry = registryOf(options);\n return rootDefinitions(registry)\n .filter((root) => reach.get(root.type)?.has(definition.type))\n .filter((root) => Object.keys(definition.targets).some((target) => target in root.targets))\n .filter((root) => !definition.roots || definition.roots.includes(root.type as RootName))\n .map((root) => root.type as RootName);\n}\n\nfunction describe(definition: ComponentDefinition, registry: Registry, reach: Map<string, Set<string>>): ComponentDescription {\n const roots = componentRoots(definition, registry, reach);\n const within = (declared: readonly RootName[] | undefined) => (declared ? roots.filter((root) => declared.includes(root)) : roots);\n const properties: PropertyDescription[] = [];\n for (const [key, spec] of Object.entries(definition.props)) {\n properties.push({\n path: `props.${key}`,\n label: spec.label,\n ...(spec.description ? { description: spec.description } : {}),\n kind: spec.kind.name,\n accepts: spec.kind.accepts,\n editor: spec.kind.editor,\n editable: spec.editable !== false,\n required: !!spec.required,\n ...(spec.default !== undefined ? { default: spec.default } : {}),\n inherited: false,\n mobile: false,\n roots: within(spec.roots),\n schema: spec.kind.jsonSchema(),\n });\n }\n const defaults = (definition.defaultStyle ?? {}) as Record<string, Json>;\n const hover = new Set<string>(definition.hover ?? []);\n // A phone style no output it renders to shows, whatever its value (a Page root's phone font size): not listed as one.\n const targets = Object.keys(definition.targets) as Target[];\n const unshownOnPhones = (key: string) => {\n const declared = (definition.conditionSupport?.mobile as Record<string, SupportByTarget> | undefined)?.[key];\n return !!declared && targets.every((target) => ([] as Support[]).concat(declared[target] ?? []).some((rule) => rule.level === \"none\" && !rule.values && !rule.when));\n };\n for (const [key, spec] of Object.entries(definition.style)) {\n const group = styleGroup(key, spec);\n const base = {\n label: spec.label,\n ...(spec.description ? { description: spec.description } : {}),\n kind: spec.kind.name,\n accepts: spec.kind.accepts,\n editor: spec.kind.editor,\n editable: spec.editable !== false,\n required: false,\n inherited: !!spec.inherited,\n mobile: !!spec.mobile && !unshownOnPhones(key),\n roots: within(spec.roots),\n ...(group ? { group } : {}),\n schema: spec.kind.jsonSchema(),\n };\n properties.push({ path: `style.${key}`, ...base, ...(defaults[key] !== undefined ? { default: defaults[key] } : {}) });\n if (hover.has(key)) properties.push({ path: `hover.${key}`, ...base, label: `${spec.label} on hover`, mobile: false });\n }\n return {\n type: definition.type,\n label: definition.label,\n description: definition.description,\n categories: definition.categories,\n properties,\n children: { text: !!definition.children.text, categories: definition.children.categories ?? [], types: definition.children.types ?? [] },\n targets: Object.keys(definition.targets) as Target[],\n roots,\n groups: (definition.editor?.groups ?? []).map((group) =>\n \"composite\" in group ? { title: group.title, paths: group.composite.covers, composite: group.composite.editor } : { title: group.title, paths: group.paths }\n ),\n };\n}\n","/**\n * The diagnostics a style's, a prop's or a condition's support declaration gives for a value: what an output shows\n * otherwise than asked. Shared by the support pass over the laid-out tree (writers/shared/support.ts) and expansion's\n * check of what a condition takes but an output doesn't show (expand.ts).\n */\nimport { Diagnostics, type Severity } from \"./diagnostics\";\nimport { caniemail } from \"./email-clients\";\nimport type { Json } from \"./model\";\nimport type { Support, SupportByTarget, Target } from \"./define\";\n\nconst same = (a: Json | undefined, b: Json | undefined) => JSON.stringify(a) === JSON.stringify(b);\n\n/**\n * The diagnostics a declaration gives for a value at `at` (`key` names it in the message), on this node: nothing where\n * it's shown as asked. Classic Outlook's notes are left out where `outlook` is false (a block it never applies). For\n * email, a rule's clients go on its diagnostics (`outlook` is classic Outlook's), with caniemail's page where it's from there.\n */\nexport function reportDeclared(\n d: Diagnostics,\n node: { type: string; id?: string; props: Record<string, Json> },\n at: string,\n key: string,\n value: Json,\n declared: SupportByTarget[Target] | undefined,\n target: Target,\n outlook = true\n): void {\n if (!declared) return;\n for (const rule of ([] as Support[]).concat(declared)) {\n if (rule.level === \"full\") continue;\n if (rule.level === \"outlook\" && !outlook) continue;\n if (rule.values && !rule.values.some((v) => same(v, value))) continue;\n if (rule.when && !rule.when(value, node)) continue;\n const asked = typeof value === \"string\" ? `${key}: \"${value}\"` : key;\n // For email, the clients it's about (`outlook`: classic Outlook).\n const clients = target === \"email\" ? (rule.clients ?? (rule.level === \"outlook\" ? ([\"outlook\"] as const) : undefined)) : undefined;\n const output = clients ? \"some email clients\" : target === \"web\" ? \"a page\" : target;\n const [code, severity, message]: [string, Severity, string] =\n rule.level === \"none\"\n ? [`${target}/unsupported`, \"warning\", `${asked} isn't possible in ${output}: ${rule.shows}`]\n : rule.level === \"partial\"\n ? [`${target}/degraded`, \"info\", `${asked} on this ${node.type} in ${output}: ${rule.shows}`]\n : [\"email/outlook-degraded\", \"info\", `${asked} on this ${node.type} in classic Outlook: ${rule.shows}`];\n // What Elements assumes, unchecked, is a note that says so.\n const [said, as] = rule.source === \"assumed\" ? ([\"info\", `${message} (not checked)`] as const) : [severity, message];\n d.add(code, said, as, at, node.id, { clients, fix: rule.fix, see: rule.feature && caniemail(rule.feature) });\n }\n}\n","/**\n * Custom components expanded into the primitives they're made of, before a\n * document is resolved and rendered. The document keeps them as one node\n * each; only what's rendered is expanded.\n */\nimport { blockOf, CONDITIONS } from \"./conditions\";\nimport type { ComponentDefinition, SupportByTarget, Target } from \"./define\";\nimport { Diagnostics, type Diagnostic } from \"./diagnostics\";\nimport { isNode, type ElementsDocument, type Json, type Node } from \"./model\";\nimport { checkFragment } from \"./normalize\";\nimport { reportDeclared } from \"./declared\";\nimport { CUSTOM_TYPE, isCustom, propsWithDefaults, registryOf, type ComponentsOption, type CustomDefinition, type Registry } from \"./registry\";\n\n/** How deep custom components may expand into others: deeper is a component that contains itself. */\nconst MAX_DEPTH = 32;\n\n/**\n * Each expanded node's place in the template (\"root.children[4].children[1]\"), for messages: a Grid's children are\n * where the template has them, not in the Rows and cells it lays them out in (which are the Grid); what a custom\n * component renders is its node, and the nodes inside it are \"root.children[2](acme.Card).children[1]\".\n */\nexport type TemplatePaths = WeakMap<Node, string>;\n\n/** A path in an expanded document (a node's place in it, and what follows: \".props.src\") as the template's. */\nexport function templatePathsOf(document: ElementsDocument, paths: TemplatePaths): (path: string) => string {\n const places = new Map<string, string>();\n const visit = (node: Node, at: string) => {\n places.set(at, paths.get(node) ?? at);\n node.children?.forEach((child, index) => isNode(child) && visit(child, `${at}.children[${index}]`));\n };\n visit(document.root, \"root\");\n return (path) => {\n // The deepest node it starts with.\n for (let at = path; at; at = at.slice(0, Math.max(at.lastIndexOf(\".\"), at.lastIndexOf(\"[\"), 0))) {\n const place = places.get(at);\n if (place !== undefined) return place + path.slice(at.length);\n }\n return path;\n };\n}\n\n/**\n * `target`, the output the root renders to: given, what a condition takes on a component but that output doesn't\n * show under it (its definition's `conditionSupport`) is reported here, before a Grid is arranged and loses it.\n */\nexport function expandDocument(document: ElementsDocument, options?: ComponentsOption | Registry, target?: Target): { document: ElementsDocument; diagnostics: Diagnostic[]; paths: TemplatePaths } {\n const registry = registryOf(options);\n const d = new Diagnostics();\n const paths: TemplatePaths = new WeakMap();\n const taken = new Set<string>();\n const collect = (node: Node) => {\n if (node.id) taken.add(node.id);\n node.children?.forEach((child) => isNode(child) && collect(child));\n };\n collect(document.root);\n const rootDefinition = registry.get(document.root.type);\n const responsive = !!rootDefinition?.responsive;\n\n /** What a condition takes on this node's component but the output doesn't show under it. */\n const unshown = (node: Node, path: string) => {\n const declared = target && registry.get(node.type)?.conditionSupport;\n if (!declared) return;\n for (const condition of CONDITIONS) {\n const block = blockOf(node, condition);\n const byStyle: Partial<Record<string, SupportByTarget>> | undefined = declared[condition.name];\n // Hidden where the condition applies (on phones), nothing in its block shows anyway: as the support pass skips it.\n if (!block || !byStyle || (condition.hiddenKey && node.hidden?.[condition.hiddenKey])) continue;\n for (const [key, value] of Object.entries(block)) {\n reportDeclared(d, { type: node.type, id: node.id, props: node.props ?? {} }, `${path}.${condition.name}.${key}`, key, value, byStyle[key]?.[target], target);\n }\n }\n };\n\n /** A node at `path` (its children's paths start from it), arranged first if its component arranges; it's at `self` in the template. */\n const visit = (given: Node, path: string, depth: number, self = path): Node => {\n unshown(given, path);\n const arrange = registry.get(given.type)?.arrange;\n if (!arrange) return walk(given, path, self, depth);\n // Its own children keep their places in the template, wherever it puts them.\n const origins = new Map<Node, string>();\n given.children?.forEach((child, index) => isNode(child) && origins.set(child, `${path}.children[${index}]`));\n return walk(arrange(given), path, self, depth, origins);\n };\n\n /** A node's children expanded; inside an arranged node, what it adds around the children it was given is it (`self`). */\n const walk = (node: Node, path: string, self: string, depth: number, origins?: Map<Node, string>): Node => {\n const definition = registry.get(node.type)!;\n const children = node.children?.map((child, index) => {\n if (!isNode(child)) return child;\n const at = origins ? (origins.get(child) ?? self) : `${path}.children[${index}]`;\n const childDefinition = registry.get(child.type);\n if (childDefinition && isCustom(childDefinition)) return expandOne(child, childDefinition, definition, at, depth) ?? null;\n if (origins && !origins.has(child)) return walk(child, self, self, depth, origins);\n return visit(child, at, depth);\n });\n const out = children?.length ? { ...node, children: children.filter((child): child is NonNullable<typeof child> => child !== null) } : node;\n paths.set(out, self);\n return out;\n };\n\n /** A custom node at `path` expanded; what it renders is at `self` (its own path, or the custom node's that rendered it). */\n const expandOne = (node: Node, definition: CustomDefinition, parent: ComponentDefinition, path: string, depth: number, self = path): Node | undefined => {\n if (depth >= MAX_DEPTH) {\n d.error(\"custom/depth\", `${node.type} expands into custom components ${MAX_DEPTH} deep: does it contain itself?`, path, node.id);\n return undefined;\n }\n let raw: unknown;\n const reported: Diagnostic[] = [];\n try {\n const style = { ...(definition.defaultStyle as Record<string, Json> | undefined), ...node.style } as Record<string, Json>;\n raw = definition.expand(propsWithDefaults(definition, node.props) as never, { register: (custom) => registry.add(custom), style, responsive, report: (diagnostic) => reported.push(diagnostic) });\n } catch (error) {\n d.error(\"custom/render\", `${node.type} failed to render: ${error instanceof Error ? error.message : String(error)}`, path, node.id);\n return undefined;\n }\n // What its render said that doesn't stop it, at its place: \"root.mobile\" in it is \"root.children[2](acme.Card).mobile\".\n const at = `${path}(${node.type})`;\n for (const diagnostic of reported) d.list.push({ ...diagnostic, path: diagnostic.path === \"root\" || diagnostic.path.startsWith(\"root.\") ? at + diagnostic.path.slice(4) : at });\n if (Array.isArray(raw) || typeof raw !== \"object\" || raw === null) {\n d.error(\"custom/render\", `${node.type} renders one component (a Column, a Section, …), not ${Array.isArray(raw) ? \"several\" : JSON.stringify(raw)}`, path, node.id);\n return undefined;\n }\n const { node: expanded, diagnostics } = checkFragment(raw, { parent, root: rootDefinition, idPrefix: node.id ?? null, taken, registry, path: `${path}(${node.type})` });\n for (const diagnostic of diagnostics) d.list.push(diagnostic);\n if (!expanded) return undefined;\n collectIds(expanded);\n // The custom node's place in a Row and its visibility go onto what it renders; a built-in's (a Menu's, a\n // Social's) id and phone styles too. A template's own component's id is only what the ids in it go after.\n if (node.style?.flex !== undefined) expanded.style = { ...expanded.style, flex: node.style.flex };\n if (node.hidden) expanded.hidden = { ...expanded.hidden, ...node.hidden };\n if (node.id && !expanded.id && !CUSTOM_TYPE.test(node.type)) expanded.id = node.id;\n for (const condition of CONDITIONS) {\n const rendered = registry.get(expanded.type);\n for (const [key, value] of Object.entries(node[condition.name] ?? {})) {\n const spec = rendered?.style[key];\n if (rendered && spec && condition.allows(spec, key, rendered)) expanded[condition.name] = { [key]: value, ...expanded[condition.name] };\n else d.warning(`${condition.name}/not-shown`, `${node.type}'s ${key} ${condition.on} isn't shown: what it renders (a ${expanded.type}) has no ${key} ${condition.for}`, `${path}.${condition.name}.${key}`, node.id);\n }\n }\n const inner = registry.get(expanded.type)!;\n if (isCustom(inner)) return expandOne(expanded, inner, parent, `${path}(${node.type})`, depth + 1, self);\n return visit(expanded, `${path}(${node.type})`, depth + 1, self);\n };\n\n const collectIds = (node: Node) => {\n if (node.id) taken.add(node.id);\n node.children?.forEach((child) => isNode(child) && collectIds(child));\n };\n\n return { document: { ...document, root: visit(document.root, \"root\", 0) }, diagnostics: d.list, paths };\n}\n","/**\n * Resolving a document: what every target needs worked out the same way\n * before it writes anything. Defaults applied, text styles inherited, and\n * every box's width on desktop in px, from the root's width down. Targets\n * only turn this into markup; none of them decides layout on its own.\n */\nimport type { ComponentDefinition, Target } from \"./define\";\nimport { Diagnostics, type Diagnostic } from \"./diagnostics\";\nimport { assetParts, readLength, type Asset, type Border, type BorderSide, type FontFamily, type Insets, type LineHeight } from \"./kinds\";\nimport { isNode, type ElementsDocument, type Json, type Node } from \"./model\";\nimport { pageBox } from \"./document\";\nimport { expandDocument, templatePathsOf, type TemplatePaths } from \"./expand\";\nimport { propsWithDefaults, registryOf, type ComponentsOption, type Registry } from \"./registry\";\n\n/** Text styles as they apply to a node: its own, its component's defaults, else its parent's. */\nexport interface ResolvedText {\n color: string;\n fontFamily: FontFamily;\n fontSize: number;\n fontWeight: number;\n fontStyle: \"normal\" | \"italic\";\n lineHeight: LineHeight;\n /** The line height in px at this node's font size. */\n lineHeightPx: number;\n letterSpacing: number;\n textAlign: \"left\" | \"center\" | \"right\" | \"justify\";\n textTransform: \"none\" | \"uppercase\" | \"lowercase\" | \"capitalize\";\n}\n\nexport interface ResolvedNode {\n /** The author's id, if any. */\n id?: string;\n /**\n * Where it is in the tree as laid out (\"root.children[2]\"): its place in the template, but inside a Grid (laid out\n * as Rows of cells) and inside what a custom component renders. The document's `templatePath` gives the template's.\n */\n path: string;\n type: string;\n definition: ComponentDefinition;\n /** Its props, with the definition's defaults where not given. */\n props: Record<string, Json>;\n /** Its component's default style under its own (inherited text styles are in `text`). */\n style: Record<string, Json>;\n hover?: Record<string, Json>;\n mobile?: Record<string, Json>;\n hidden?: { mobile?: boolean; desktop?: boolean };\n text: ResolvedText;\n /** The width its parent gives it on desktop, in px (null inside text). */\n available: number | null;\n /**\n * Its width on desktop in px, padding and border included; null where it\n * takes its own size and that size isn't known (a Button's text, an Image\n * without its size, text inside text).\n */\n width: number | null;\n /** Its width inside its padding and border, in px, or null. */\n contentWidth: number | null;\n children: Array<ResolvedNode | string>;\n /** A Table's column widths in px, each column's from its cells, the rest shared (null where the table's width isn't known). */\n columns?: number[] | null;\n /** On a Table and its rows, where a column of its own px sits beside one with no width: how each column is written. \"px\" stays that wide in a narrower window, \"share\" stays its share of the table, \"free\" takes what they leave (otherwise, none: every column is a share of the table). */\n columnSizes?: Array<\"px\" | \"share\" | \"free\"> | null;\n}\n\nexport interface ResolvedDocument {\n root: ResolvedNode;\n /** At their places in the template. */\n diagnostics: Diagnostic[];\n /** A path in the tree as laid out (a node's `path`, and what follows it: \".props.src\") as the template's, for messages. */\n templatePath?: (path: string) => string;\n}\n\n/**\n * The laid-out tree's format (ResolvedNode), as prepare() gives it to the packages that write a PDF or an image: each\n * reads the version it's built with and refuses another. Raise it only where a reader of the tree would break (a\n * field renamed, removed or meaning something else), not for one added.\n */\nexport const LAYOUT_VERSION = 1;\n\n/** What a root's text styles start from, under its own defaults. */\nconst INITIAL_TEXT: Omit<ResolvedText, \"lineHeightPx\"> = {\n color: \"#000000\",\n fontFamily: \"Arial, Helvetica, sans-serif\",\n fontSize: 16,\n fontWeight: 400,\n fontStyle: \"normal\",\n lineHeight: 1.5,\n letterSpacing: 0,\n textAlign: \"left\",\n textTransform: \"none\",\n};\n\nconst INHERITED = Object.keys(INITIAL_TEXT) as Array<keyof typeof INITIAL_TEXT>;\n\n/** A length in px, given the width a percentage is of. */\nexport function toPx(value: Json | undefined, of: number | null): number | null {\n const length = readLength(value);\n if (!length) return null;\n switch (length.unit) {\n case \"px\":\n return length.value;\n case \"%\":\n return of === null ? null : (of * length.value) / 100;\n case \"pt\":\n return (length.value * 96) / 72;\n case \"mm\":\n return (length.value * 96) / 25.4;\n case \"in\":\n return length.value * 96;\n }\n}\n\nexport function lineHeightPx(lineHeight: LineHeight, fontSize: number): number {\n // A font's own (\"normal\") is about this: for what can't leave it to the font (a PDF's lines, an estimate of a height).\n if (lineHeight === \"normal\") return Math.round(1.2 * fontSize * 100) / 100;\n return typeof lineHeight === \"number\" ? Math.round(lineHeight * fontSize * 100) / 100 : Number.parseFloat(lineHeight);\n}\n\n/** The horizontal space a box's padding and border take. */\nexport function horizontalFrame(style: Record<string, Json>): number {\n const padding = style.padding as Insets | undefined;\n const border = style.border as Border | undefined;\n return (padding ? padding.left + padding.right : 0) + (border?.left?.width ?? 0) + (border?.right?.width ?? 0);\n}\n\ninterface Context {\n d: Diagnostics;\n registry: Registry;\n /** The root's type: Rows stack on phones by default in a responsive one. */\n responsive: boolean;\n /** The root's type: a Row wraps on a Page, and in an Email where it stays side by side on phones. A PDF and an image draw one line. */\n root: string;\n}\n\n/**\n * Resolves a valid document (see `checkDocument`), its custom components\n * expanded first: what's resolved is primitives only.\n */\nexport function resolveDocument(input: ElementsDocument, options?: ComponentsOption | Registry): ResolvedDocument {\n const registry = registryOf(options);\n const expanded = expandDocument(input, registry);\n const resolved = resolveExpanded(expanded.document, registry, expanded.paths);\n return { ...resolved, diagnostics: [...expanded.diagnostics, ...resolved.diagnostics] };\n}\n\n/**\n * Resolves a document whose custom components are already expanded (`expandDocument`): primitives only. With the\n * expansion's `paths`, its messages (and its `templatePath`) say where things are in the template.\n */\nexport function resolveExpanded(document: ElementsDocument, options?: ComponentsOption | Registry, paths?: TemplatePaths): ResolvedDocument {\n const registry = registryOf(options);\n const d = new Diagnostics();\n const definition = registry.get(document.root.type)!;\n const context: Context = { d, registry, responsive: !!definition.responsive, root: document.root.type };\n const root = resolveNode(document.root, \"root\", { ...INITIAL_TEXT, lineHeightPx: 24 }, null, context);\n // A Document's content is as wide as its page inside the margins; a Canvas's, as it inside its padding.\n const width = root.type === \"Document\" ? pageBox(root.props).contentWidth : toPx(root.props.width, null);\n root.width = width;\n root.contentWidth = width === null ? null : width - horizontalFrame(root.style);\n root.children = resolveChildren(document.root, \"root\", root, root.contentWidth, \"stack\", context);\n const templatePath = paths ? templatePathsOf(document, paths) : (path: string) => path;\n return { root, diagnostics: d.list.map((diagnostic) => ({ ...diagnostic, path: templatePath(diagnostic.path) })), templatePath };\n}\n\nfunction styleOf(node: Node, definition: ComponentDefinition, props: Record<string, Json>, context: Context): Record<string, Json> {\n const style: Record<string, Json> = { ...((definition.defaultStyle ?? {}) as Record<string, Json>) };\n const by = definition.defaultStyleBy;\n if (by) Object.assign(style, by.values[String(props[by.prop])] ?? {});\n return { ...style, ...node.style };\n}\n\nfunction textOf(parent: ResolvedText, style: Record<string, Json>): ResolvedText {\n const text = { ...parent } as Record<string, unknown>;\n for (const key of INHERITED) if (style[key] !== undefined) text[key] = style[key];\n const out = text as unknown as ResolvedText;\n out.lineHeightPx = lineHeightPx(out.lineHeight, out.fontSize);\n return out;\n}\n\n/** A direction of its own (a block's, or the root's) sets where its text starts, unless its author aligned it. */\nfunction directed(text: ResolvedText, dir: Json | undefined, ownAlign: Json | undefined): ResolvedText {\n if (ownAlign !== undefined || (dir !== \"rtl\" && dir !== \"ltr\")) return text;\n return { ...text, textAlign: dir === \"rtl\" ? \"right\" : \"left\" };\n}\n\n/** A node with its own values worked out; its width and children are set by its parent's layout. */\nfunction resolveNode(node: Node, path: string, parentText: ResolvedText, available: number | null, context: Context): ResolvedNode {\n const definition = context.registry.get(node.type)!;\n const props = propsWithDefaults(definition, node.props);\n const style = styleOf(node, definition, props, context);\n return {\n ...(node.id ? { id: node.id } : {}),\n path,\n type: node.type,\n definition,\n props,\n style,\n ...(node.hover ? { hover: node.hover } : {}),\n ...(node.mobile ? { mobile: node.mobile } : {}),\n ...(node.hidden ? { hidden: node.hidden } : {}),\n text: directed(textOf(parentText, style), props.dir, node.style?.textAlign),\n available,\n width: null,\n contentWidth: null,\n children: [],\n };\n}\n\nfunction clamp(width: number, style: Record<string, Json>, of: number | null): number {\n const min = toPx(style.minWidth, of);\n const max = toPx(style.maxWidth, of);\n if (max !== null) width = Math.min(width, max);\n if (min !== null) width = Math.max(width, min);\n return width;\n}\n\n/** The size a node has of its own: an image's, when its document gives it. */\nfunction intrinsicWidth(resolved: ResolvedNode, available: number | null): number | null {\n // An Svg's drawing is as wide as it says, its padding and border around it; it's never narrowed (the Page draws it\n // so): wider than its room, it overflows it.\n if (resolved.type === \"Svg\" && typeof resolved.props.width === \"number\") return resolved.props.width + horizontalFrame(resolved.style);\n if (resolved.type !== \"Image\" || resolved.props.src === undefined) return null;\n const own = assetParts(resolved.props.src as Asset).width ?? null;\n if (own === null) return null;\n return clamp(available === null ? own : Math.min(own, available), resolved.style, available);\n}\n\n/** The width a node takes of `available` where its parent stacks its children. */\nfunction stackedWidth(resolved: ResolvedNode, available: number | null): number | null {\n const set = toPx(resolved.style.width, available);\n if (set !== null) return clamp(set, resolved.style, available);\n if (resolved.definition.sizing === \"stretch\") return available === null ? null : clamp(available, resolved.style, available);\n if (resolved.definition.sizing === \"shrink\") return intrinsicWidth(resolved, available);\n return null;\n}\n\nfunction setWidth(resolved: ResolvedNode, width: number | null): void {\n resolved.width = width === null ? null : Math.round(width);\n resolved.contentWidth = resolved.width === null ? null : Math.max(0, resolved.width - horizontalFrame(resolved.style));\n}\n\ntype Layout = \"stack\" | \"row\" | \"text\";\n\nfunction resolveChildren(node: Node, path: string, parent: ResolvedNode, available: number | null, layout: Layout, context: Context): Array<ResolvedNode | string> {\n const out: Array<ResolvedNode | string> = [];\n const nodes: Array<{ source: Node; resolved: ResolvedNode; at: string }> = [];\n (node.children ?? []).forEach((child, index) => {\n if (!isNode(child)) {\n out.push(child);\n return;\n }\n const at = `${path}.children[${index}]`;\n // Inside text, text takes no width of its own; what isn't text (an Image, a nested List) does.\n const inText = layout === \"text\" && !!context.registry.get(child.type)?.categories.includes(\"inline\");\n const resolved = resolveNode(child, at, parent.text, inText ? null : available, context);\n if (resolved.style.flex !== undefined && layout !== \"row\") {\n context.d.warning(\"style/ignored\", `flex only applies to a child of a Row; this ${child.type} is in a ${parent.type}`, `${at}.style.flex`, child.id);\n }\n nodes.push({ source: child, resolved, at });\n out.push(resolved);\n });\n\n if (layout === \"row\") layOutRow(parent, nodes, available, path, context);\n else {\n for (const { resolved, at, source } of nodes) {\n if (resolved.available === null && layout === \"text\") continue;\n // A stack that stretches its children widens those that take their own size (a Button, an Image), as flexbox does;\n // not an Svg, whose width is its drawing's. Across a Layer is its justifyItems (its alignItems is down it).\n const across = parent.type === \"Layer\" ? parent.style.justifyItems : parent.style.alignItems;\n const stretched = layout === \"stack\" && across === \"stretch\" && resolved.definition.sizing === \"shrink\" && resolved.style.width === undefined && resolved.type !== \"Svg\";\n const width = stretched && resolved.available !== null ? clamp(resolved.available, resolved.style, resolved.available) : stackedWidth(resolved, resolved.available);\n if (width !== null && resolved.available !== null && width > resolved.available + 0.5) {\n context.d.warning(\"layout/overflow\", `This ${source.type} is ${Math.round(width)}px wide, wider than the ${Math.round(resolved.available)}px it's in`, at, source.id);\n }\n setWidth(resolved, width);\n }\n }\n\n for (const { source, resolved, at } of nodes) {\n if (source.type === \"Table\") {\n resolved.children = resolveTable(source, at, resolved, context);\n continue;\n }\n const own: Layout = source.type === \"Row\" ? \"row\" : resolved.definition.children.text ? \"text\" : \"stack\";\n // A box without a known width (a Link around an image) gives its children what it was given; one inside text, what the text was given.\n let inner = resolved.contentWidth ?? resolved.available ?? (layout === \"text\" ? available : null);\n // A List's items are beside its markers' column.\n if (source.type === \"List\" && inner !== null) inner = Math.max(0, inner - (toPx(resolved.style.indent, null) ?? 0));\n resolved.children = resolveChildren(source, at, resolved, inner, own, context);\n // A block Link around an image is as wide as it; inside text, a Link is a run and takes no width.\n if (resolved.width === null && source.type === \"Link\" && layout !== \"text\") {\n const image = resolved.children.find((c): c is ResolvedNode => typeof c !== \"string\" && c.type === \"Image\");\n if (image && image.width !== null) setWidth(resolved, image.width + horizontalFrame(resolved.style));\n }\n }\n return out;\n}\n\n/**\n * A Row, laid out as CSS flexbox lays out the Page's (one line, no\n * wrapping), so email gets the widths a browser gives:\n * - each child starts from its base: its width (px or %), its own size\n * (`flex: \"none\"`: an image's), or, for a child sharing what's left (by its\n * `flex`, 1 by default), its padding and border;\n * - what's left is shared by `flex`; what's missing is taken back from the\n * children with a width, in proportion to their width inside their padding;\n * - a child that reaches its `minWidth` or `maxWidth` (or no room inside its\n * padding) keeps it, and the rest is shared again among the others.\n * Widths are whole px. Children hidden on desktop aren't in it.\n */\nfunction layOutRow(row: ResolvedNode, nodes: Array<{ source: Node; resolved: ResolvedNode; at: string }>, available: number | null, path: string, context: Context): void {\n if (available === null) return;\n // A child shown only on phones takes no room on desktop; on phones, where it shows, the Row's children stack: it's as wide as the Row.\n const desktop = nodes.filter(({ resolved }) => !resolved.hidden?.desktop);\n for (const { resolved } of nodes) if (resolved.hidden?.desktop) setWidth(resolved, available);\n const gap = toPx(row.style.gap, null) ?? 0;\n const items = desktop.map(({ resolved }) => flexItem(resolved, available));\n // A Row that wraps breaks where its children no longer fit, and each line is laid out on its own.\n const wraps = row.style.flexWrap === \"wrap\" && (context.root === \"Page\" || (context.root === \"Email\" && row.props.stackOnMobile === false));\n for (const line of wraps ? wrappedLines(items, gap, available) : [items.map((_, index) => index)]) {\n const room = available - gap * Math.max(0, line.length - 1);\n const ownItems = line.map((index) => items[index]);\n const widths = roundTogether(flexWidths(ownItems, room));\n // A child that takes its own size, and whose size isn't known (a Button without a width), takes no room and stays unknown.\n line.forEach((index, at) => setWidth(desktop[index].resolved, items[index].unknown ? null : widths[at]));\n\n const asked = ownItems.reduce((sum, item) => sum + item.base, 0);\n const used = widths.reduce((sum, width) => sum + width, 0);\n if (used > room + 0.5) {\n context.d.warning(\"layout/overflow\", `The Row's children need ${Math.round(used - room)}px more than the ${Math.round(available)}px it has, at their minimum widths`, path, row.id);\n } else if (asked > room + 0.5 && ownItems.some((item) => item.shrink > 0 && item.inner > 0)) {\n context.d.warning(\"layout/shrunk\", `The Row's children's widths add up to ${Math.round(asked)}px, more than the ${Math.round(room)}px it has: they're narrowed to fit, as a browser does`, path, row.id);\n }\n }\n}\n\n/** A wrapping Row's children by line, as flexbox breaks them: at the child whose size no longer fits beside the others. */\nfunction wrappedLines(items: FlexItem[], gap: number, available: number): number[][] {\n const lines: number[][] = [];\n let used = 0;\n items.forEach((item, index) => {\n const size = Math.max(item.min, Math.min(item.max, item.base));\n const line = lines[lines.length - 1];\n if (line && used + gap + size <= available + 0.5) {\n line.push(index);\n used += gap + size;\n } else {\n lines.push([index]);\n used = size;\n }\n });\n return lines;\n}\n\ninterface FlexItem {\n /** Where it starts from, padding and border included. */\n base: number;\n /** Its base inside its padding and border: what shrinking takes from. */\n inner: number;\n min: number;\n max: number;\n grow: number;\n shrink: number;\n /** It takes its own size, and that size isn't known. */\n unknown: boolean;\n}\n\n/** A Row's child as a flex item: its base and limits, as the Page writes it (`flex: 0 1 <width>`, `0 0 auto`, or `<flex> 1 0%`, with `min-width: 0`). */\nfunction flexItem(resolved: ResolvedNode, available: number): FlexItem {\n const { style } = resolved;\n const frame = horizontalFrame(style);\n const width = toPx(style.width, available);\n // An Svg is the size it says in a Row too (the Page draws it `flex: none`), not a share of what's left.\n const own = style.flex === \"none\" || style.flex === 0 || resolved.type === \"Svg\";\n const intrinsic = own && width === null ? intrinsicWidth(resolved, available) : null;\n const base = width !== null ? width : own ? (intrinsic ?? 0) : frame;\n // Its content can't be narrower than nothing: at least its padding and border.\n const min = Math.max(frame, toPx(style.minWidth, available) ?? 0);\n const max = Math.max(min, toPx(style.maxWidth, available) ?? Number.POSITIVE_INFINITY);\n return {\n base,\n inner: Math.max(0, base - frame),\n min,\n max,\n grow: width !== null || own ? 0 : typeof style.flex === \"number\" ? style.flex : 1,\n shrink: own ? 0 : 1,\n unknown: own && width === null && intrinsic === null,\n };\n}\n\n/** CSS flexbox's widths for one line of items in `room` px (css-flexbox-1, \"Resolving Flexible Lengths\"). */\nfunction flexWidths(items: FlexItem[], room: number): number[] {\n const clamp = (item: FlexItem, width: number) => Math.max(item.min, Math.min(item.max, width));\n const sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\n const hypothetical = items.map((item) => clamp(item, item.base));\n const growing = sum(hypothetical) <= room;\n const factor = (item: FlexItem) => (growing ? item.grow : item.shrink);\n const target = items.map((item) => item.base);\n const frozen = items.map((item, index) => {\n const inflexible = factor(item) === 0 || (growing ? item.base > hypothetical[index] : item.base < hypothetical[index]);\n if (inflexible) target[index] = hypothetical[index];\n return inflexible;\n });\n const initialFree = room - sum(items.map((item, index) => (frozen[index] ? target[index] : item.base)));\n\n for (let round = 0; round <= items.length && frozen.includes(false); round++) {\n const open = items.map((_, index) => index).filter((index) => !frozen[index]);\n let free = room - sum(items.map((item, index) => (frozen[index] ? target[index] : item.base)));\n // Flex factors that add up to less than 1 share only that part of the space.\n const factors = sum(open.map((index) => factor(items[index])));\n if (factors < 1 && Math.abs(initialFree * factors) < Math.abs(free)) free = initialFree * factors;\n const weights = open.map((index) => (growing ? items[index].grow : items[index].shrink * items[index].inner));\n const total = sum(weights);\n open.forEach((index, k) => {\n target[index] = items[index].base + (total > 0 ? (free * weights[k]) / total : 0);\n });\n // Clamp to the limits; freeze those that went past one, the side that went past most.\n const violation = open.map((index) => clamp(items[index], target[index]) - target[index]);\n const net = sum(violation);\n open.forEach((index, k) => {\n const past = Math.abs(net) < 1e-9 || (net > 0 ? violation[k] > 0 : violation[k] < 0);\n target[index] = clamp(items[index], target[index]);\n if (past) frozen[index] = true;\n });\n }\n return target;\n}\n\n/** Widths in whole px that add up to their rounded total (the largest remainders get the leftover px). */\nfunction roundTogether(widths: number[]): number[] {\n const floors = widths.map(Math.floor);\n let left = Math.round(widths.reduce((sum, width) => sum + width, 0)) - floors.reduce((sum, width) => sum + width, 0);\n const order = widths.map((width, index) => ({ index, rest: width - Math.floor(width) })).sort((a, b) => b.rest - a.rest || a.index - b.index);\n for (const { index } of order) {\n if (left <= 0) break;\n floors[index] += 1;\n left -= 1;\n }\n return floors;\n}\n\n/** `free` px shared by `weights`, in whole px that add up to it (the largest remainders get the leftover px). */\nfunction share(free: number, weights: number[]): number[] {\n const total = weights.reduce((sum, w) => sum + w, 0);\n const room = Math.floor(free);\n const exact = weights.map((w) => (total ? (room * w) / total : 0));\n const widths = exact.map(Math.floor);\n let left = room - widths.reduce((a, b) => a + b, 0);\n const order = exact.map((value, index) => ({ index, rest: value - Math.floor(value) })).sort((a, b) => b.rest - a.rest || a.index - b.index);\n for (const { index } of order) {\n if (left <= 0) break;\n widths[index] += 1;\n left -= 1;\n }\n return widths;\n}\n\n/**\n * A Table: its rows as wide as its content, its columns as wide as their\n * cells say (a cell spanning one column, the first that has a width), the\n * rest sharing what's left; each cell as wide as the columns it spans, its\n * padding its own or the table's `cellPadding`, its bottom border its own or\n * the table's `rowBorder` (but in the last row).\n */\nfunction resolveTable(source: Node, path: string, table: ResolvedNode, context: Context): Array<ResolvedNode | string> {\n const available = table.contentWidth;\n const rows = (source.children ?? []).flatMap((child, index) => {\n if (!isNode(child)) return [];\n const at = `${path}.children[${index}]`;\n const row = resolveNode(child, at, table.text, available, context);\n setWidth(row, available);\n const cells = (child.children ?? []).flatMap((cell, cellIndex) => {\n if (!isNode(cell)) return [];\n const resolved = resolveNode(cell, `${at}.children[${cellIndex}]`, row.text, available, context);\n if (resolved.style.padding === undefined && table.style.cellPadding !== undefined) resolved.style.padding = table.style.cellPadding;\n return [{ source: cell, resolved, at: `${at}.children[${cellIndex}]` }];\n });\n return [{ row, cells }];\n });\n\n const span = (cell: ResolvedNode) => Math.max(1, Number(cell.props.colSpan) || 1);\n const count = Math.max(0, ...rows.map(({ cells }) => cells.reduce((sum, { resolved }) => sum + span(resolved), 0)));\n let columns: number[] | null = null;\n if (available !== null && count > 0) {\n const set: Array<number | null> = new Array(count).fill(null);\n const own: boolean[] = new Array(count).fill(false);\n for (const { cells } of rows) {\n let column = 0;\n for (const { resolved } of cells) {\n if (span(resolved) === 1 && set[column] === null) {\n const width = toPx(resolved.style.width, available);\n set[column] = width === null ? null : Math.round(width);\n own[column] = typeof resolved.style.width === \"number\";\n }\n column += span(resolved);\n }\n }\n const fixed = set.reduce<number>((sum, width) => sum + (width ?? 0), 0);\n // (Each column's width is rounded: by half a pixel at most.)\n if (fixed > available + count / 2) {\n context.d.warning(\"layout/overflow\", `The Table's columns are ${Math.round(fixed - available)}px wider than the ${Math.round(available)}px it has`, path, table.id);\n }\n const free = set.map((width, index) => (width === null ? index : -1)).filter((index) => index >= 0);\n const shared = share(Math.max(0, available - fixed), free.map(() => 1));\n columns = set.map((width, index) => (width === null ? shared[free.indexOf(index)] : width));\n // Every column has a width and they don't add up to the table: they grow or shrink in proportion to fill it, as\n // the writers' shares of the table draw them (too wide is still warned about, above).\n if (free.length === 0 && fixed > 0 && Math.abs(fixed - available) > 0.5) columns = share(available, columns);\n // A column of its own px stays that wide in a narrower window, the others taking what's left: as a share of the\n // table it would shrink past its words. With no other to take it, the whole table would run past the window.\n if (free.length > 0 && own.some(Boolean)) {\n const sizes = set.map<\"px\" | \"share\" | \"free\">((width, index) => (own[index] ? \"px\" : width === null ? \"free\" : \"share\"));\n table.columnSizes = sizes;\n for (const { row } of rows) row.columnSizes = sizes;\n }\n }\n table.columns = columns;\n\n // The line between rows is each cell's bottom border, but in the last row and where a cell sets its own.\n const rowBorder = table.style.rowBorder as BorderSide | undefined;\n rows.forEach(({ cells }, index) => {\n if (!rowBorder || index === rows.length - 1) return;\n for (const { resolved } of cells) {\n const own = resolved.style.border as Border | undefined;\n if (!own?.bottom) resolved.style.border = { ...own, bottom: rowBorder };\n }\n });\n\n for (const { row, cells } of rows) {\n let column = 0;\n for (const { source: cell, resolved, at } of cells) {\n const width = columns ? columns.slice(column, column + span(resolved)).reduce((sum, w) => sum + w, 0) : null;\n column += span(resolved);\n resolved.available = width;\n setWidth(resolved, width);\n resolved.children = resolveChildren(cell, at, resolved, resolved.contentWidth, \"text\", context);\n }\n row.children = cells.map(({ resolved }) => resolved);\n }\n return rows.map(({ row }) => row);\n}\n\n/** Errors for each component the target doesn't render (custom components: for what they're made of). */\nexport function checkTarget(input: ElementsDocument, target: Target, options?: ComponentsOption | Registry): Diagnostic[] {\n const registry = registryOf(options);\n const expanded = expandDocument(input, registry);\n return checkTargetExpanded(expanded.document, target, registry, expanded.paths);\n}\n\n/** `checkTarget` for a document whose custom components are already expanded (its `paths`: each node's place in the template). */\nexport function checkTargetExpanded(document: ElementsDocument, target: Target, options?: ComponentsOption | Registry, paths?: TemplatePaths): Diagnostic[] {\n const registry = registryOf(options);\n const d = new Diagnostics();\n const visit = (node: Node, path: string) => {\n const definition = registry.get(node.type);\n if (definition && !definition.targets[target]) {\n const why = definition.unsupported?.[target];\n d.error(\"target/unsupported\", `A ${node.type} can't be rendered to ${target}${why ? `: ${why}` : \"\"}`, path, node.id);\n // What's in it goes with it: one error.\n return;\n }\n node.children?.forEach((child, index) => isNode(child) && visit(child, `${path}.children[${index}]`));\n };\n visit(document.root, \"root\");\n const templatePath = paths ? templatePathsOf(document, paths) : (path: string) => path;\n return d.list.map((diagnostic) => ({ ...diagnostic, path: templatePath(diagnostic.path) }));\n}\n","/**\n * What the email components get: one props object per node, with\n * what every component needs worked out (its styles, its phone text styles, its\n * text), and `render()` for its children, so components don't import each\n * other.\n */\nimport { shownAnywhere } from \"../../conditions\";\nimport type { Json } from \"../../model\";\nimport type { ResolvedNode } from \"../../resolve\";\nimport type { Html } from \"../jsx\";\nimport type { Declarations } from \"../shared/css\";\n\nexport interface EmailOptions {\n /** How a merge tag is written (default `{{name}}`): into the HTML as it is, the name in it escaped. */\n mergeTag?: (name: string) => string;\n /** What every class name in the stylesheet starts with (default \"e\"). */\n classPrefix?: string;\n /** The window's width in px at and below which what's hidden on phones is (default: where its phone styles start). */\n hideBelow?: number;\n}\n\nexport interface Props {\n node: ResolvedNode;\n /** Its styles, its component's defaults included. */\n style: Record<string, Json>;\n /** Its own phone styles (empty where it has none). */\n mobile: Record<string, Json>;\n parent: ResolvedNode;\n /** Its cell is exactly its width (a Row's child), so it fills it rather than placing itself. */\n fill: boolean;\n /** Inside text. */\n inline: boolean;\n /** The phone text styles of its text: its own, and its parents' where it doesn't set them itself (a run inside text: its own only, as CSS carries the text's to it). */\n phoneText: Declarations;\n /** Its text, and the runs in it. */\n text(): Html;\n /** Whether its text runs right to left: its own `dir`, else its parent's (the root's `dir` to start with). */\n rtl: boolean;\n /** Writes a child: a block (with `fill` where its cell is exactly its width), or with `inline`, a run inside text. */\n render(child: ResolvedNode, how?: { fill?: boolean; inline?: boolean }): Html;\n options: EmailOptions;\n}\n\n/** A component's markup in this output, from its props. */\nexport type Component = (props: Props) => Html;\n\nexport const isNode = (child: ResolvedNode | string): child is ResolvedNode => typeof child !== \"string\";\nexport const shown = (node: ResolvedNode) => shownAnywhere(node);\n","/**\n * Email layout: widths from the resolver as Word reads them (table and cell\n * attributes, px maximums), where a child sits in its cell, `<Box>` (a node's\n * box as a table around its content) and `<Stack>` (children as table rows);\n * a Row's gaps and its children's shares on phones; what a Layer draws.\n */\nimport { assetParts, type Asset } from \"../../kinds\";\nimport { toPx, type ResolvedNode } from \"../../resolve\";\nimport type { Json } from \"../../model\";\nimport { h, NotOutlook, withId, type Child, type Html, type Style, type StyleValue } from \"../jsx\";\nimport { length } from \"../shared/css\";\nimport { isNode, shown, type Props } from \"./context\";\nimport { bgcolor, ownBorders, Table } from \"./markup\";\nimport { hiding } from \"./styles\";\nimport { gapsAfter, type GapAt } from \"../shared/gaps\";\n\nexport const VALIGN: Record<string, string> = { start: \"top\", center: \"middle\", end: \"bottom\", stretch: \"top\" };\nconst ALIGN: Record<string, string | undefined> = { start: undefined, center: \"center\", end: \"right\", stretch: undefined };\nexport const TEXT_ALIGN: Record<string, string | undefined> = { left: \"left\", justify: \"left\", center: \"center\", right: \"right\" };\n\nexport const sized = (node: ResolvedNode) => node.style.width !== undefined || node.style.maxWidth !== undefined;\n\nexport const toNumber = (value: Json) => (typeof value === \"number\" ? value : Number.parseFloat(String(value)));\n\n/** A Row's child that takes its own size (`flex: \"none\"`), whatever its component's sizing. */\nconst ownSize = (node: ResolvedNode) => node.style.flex === \"none\" || node.style.flex === 0;\n\n/**\n * A box's table: filling its cell (`width` 100%), or its own width as a\n * percentage or a px maximum (fluid on phones; Word takes the maximum as the\n * width), or neither (as wide as its content: a Row's child of its own size, a Menu's link).\n */\nexport function boxWidth(node: ResolvedNode, fill: boolean): { width?: string; maxWidth?: number } {\n if (fill || (!sized(node) && node.definition.sizing === \"stretch\" && !ownSize(node))) return { width: \"100%\" };\n if (typeof node.style.width === \"string\" && node.style.width.endsWith(\"%\") && node.style.maxWidth === undefined) return { width: node.style.width };\n if (node.width !== null) return { width: \"100%\", maxWidth: node.width };\n // As wide as its content, up to its maximum.\n const max = toPx(node.style.maxWidth, node.available);\n return max !== null ? { maxWidth: max } : {};\n}\n\n/** Where an image sits in its cell on phones: its margins (the cell's `align` is for desktop). */\nexport const PLACE: Record<string, Style> = { start: { marginLeft: 0, marginRight: \"auto\" }, center: { marginLeft: \"auto\", marginRight: \"auto\" }, end: { marginLeft: \"auto\", marginRight: 0 } };\n\n/** An image's width (an Image's, a Video's thumbnail): 100% of its cell up to its width, and on phones what `mobile` says. */\nexport function fluidImage(node: ResolvedNode, style: Record<string, Json>, mobile: Record<string, Json>, fill: boolean): { style: Style; phone: Style[] } {\n const width = node.width ?? undefined;\n // A percentage of its cell on phones too, where it isn't the whole of a Row's cell; with a maximum, its width\n // as written and its size in px as the cap.\n const percent = !fill && typeof style.width === \"string\" && style.width.endsWith(\"%\") ? style.width : undefined;\n const capped = percent !== undefined && style.maxWidth !== undefined;\n // The cap: its width, or the maximum as given where its width is that maximum rounded (a share of a column can be a\n // fraction of a pixel, which the cap keeps so the image is as wide as the share).\n const given = typeof style.maxWidth === \"number\" || /^\\d*\\.?\\d+px$/.test(String(style.maxWidth)) ? toNumber(style.maxWidth as Json) : undefined;\n const cap = given !== undefined && width !== undefined && Math.round(given) === width ? given : width;\n return {\n style: { width: capped ? percent : width !== undefined ? \"100%\" : undefined, maxWidth: capped ? cap : (percent ?? width ?? \"100%\") },\n // (With a maximum, a share of its cell is its own on phones. A width there replaces that share, or it would still be the share.)\n phone: [{ width: mobile.maxWidth !== undefined || capped ? mobile.width : undefined, maxWidth: mobile.maxWidth ?? mobile.width }, PLACE[mobile.alignSelf as string]],\n };\n}\n\n/** A phone width for a table or div: a percentage of its cell, or a px maximum. */\nexport function phoneWidth(value: Json | undefined): Style {\n const written = length(value);\n if (written === undefined) return {};\n return typeof value === \"string\" && value.endsWith(\"%\") ? { width: written, maxWidth: \"none\" } : { width: \"100%\", maxWidth: written };\n}\n\n/**\n * Where a child sits across a stack: one that fills the width fills it; one\n * with its own size (a Button, an Image, a box with a width) sits where the\n * stack's `align` says, else where its text alignment says. As a cell's\n * `align`, which every client (Word too) applies to the tables and images in it.\n * Left is a cell's own unless its text runs right to left (`rtl`).\n */\nexport function cellAlign(child: ResolvedNode, stack: ResolvedNode, rtl = false): string | undefined {\n const text = TEXT_ALIGN[stack.text.textAlign];\n const written = text === \"left\" && !rtl ? undefined : text;\n if (child.type === \"Divider\") {\n if (stack.style.alignItems && stack.style.alignItems !== \"stretch\") return ALIGN[stack.style.alignItems as string];\n return written;\n }\n if (child.definition.sizing !== \"shrink\" && !sized(child)) return undefined;\n const align = (child.style.alignSelf ?? stack.style.alignItems) as string | undefined;\n if (align) return ALIGN[align];\n return written;\n}\n\n/** Whether a node has a box of its own to write: a background, padding, border, corners, a height or a width. */\nfunction hasBox(node: ResolvedNode, fill: boolean): boolean {\n const { style } = node;\n const mobile = node.mobile ?? {};\n const width = boxWidth(node, fill);\n return (\n [\"padding\", \"border\", \"borderRadius\", \"backgroundColor\", \"height\"].some((key) => style[key] !== undefined) ||\n [\"padding\", \"border\", \"backgroundColor\", \"width\", \"maxWidth\"].some((key) => mobile[key] !== undefined) ||\n width.width !== \"100%\" ||\n width.maxWidth !== undefined\n );\n}\n\n/**\n * A node's box as a one-cell table around its content (Word has no box on a\n * div or a paragraph), with the node's id. Without a box, the content alone,\n * with the id.\n */\nexport function Box({ node, fill, children }: { node: ResolvedNode; fill: boolean; children?: Child }): Html {\n const content = (Array.isArray(children) ? children[0] : children) as Html;\n if (!hasBox(node, fill)) return withId(content, node.id);\n const { style } = node;\n const mobile = node.mobile ?? {};\n const width = boxWidth(node, fill);\n const height = style.height !== undefined ? toNumber(style.height) : undefined;\n // A cell's CSS height leaves out its padding; Word's attribute, and a page's box, hold it.\n const padding = style.padding as { top: number; bottom: number } | undefined;\n const contentHeight = height !== undefined && padding ? Math.max(0, height - padding.top - padding.bottom) : height;\n return (\n <Table id={node.id} phone={phoneWidth(mobile.maxWidth ?? mobile.width)} width={width.width} style={{ maxWidth: width.maxWidth, borderCollapse: ownBorders(style, mobile) }}>\n <tr>\n <td\n phone={{ padding: mobile.padding, border: mobile.border, backgroundColor: mobile.backgroundColor }}\n bgcolor={bgcolor(style.backgroundColor)}\n height={height}\n // What's in a box of its own height starts at its top, as on a page.\n valign={height !== undefined ? \"top\" : undefined}\n style={{\n padding: style.padding,\n backgroundColor: style.backgroundColor,\n border: style.border,\n borderRadius: style.borderRadius,\n height: contentHeight,\n overflow: style.overflow === \"hidden\" ? \"hidden\" : undefined,\n }}\n >\n {content}\n </td>\n </tr>\n </Table>\n );\n}\n\n/**\n * A row's gap below it, for a table of rows with the gap as their cells' bottom padding (a stack, a list):\n * inline where a row after it shows on desktop, and by a class where phones need another (the phone gap, or none).\n */\nexport function gapBelow(node: ResolvedNode, at: GapAt): { style: Style; phone?: Style } {\n const gap = typeof node.style.gap === \"number\" ? node.style.gap : 0;\n const phoneGap = typeof node.mobile?.gap === \"number\" ? node.mobile.gap : gap;\n const desktop = at.desktop ? gap : 0;\n const phone = at.phone ? phoneGap : 0;\n return { style: { paddingBottom: desktop || undefined }, phone: phone !== desktop ? { paddingBottom: phone } : undefined };\n}\n\n/** A node's children stacked down a table, one row each, its `gap` as the cells' bottom padding. */\nexport function Stack({ node, rtl, render, style }: { node: ResolvedNode; rtl: boolean; render: Props[\"render\"]; style?: StyleValue }): Html {\n const children = node.children.filter(isNode).filter(shown);\n const gaps = gapsAfter(children);\n return (\n <Table width=\"100%\" style={style}>\n {children.map((child, index) => {\n const hidden = hiding(child, \"table-row\");\n const below = gapBelow(node, gaps[index]);\n const row = (\n <tr class={hidden.class} style={hidden.style}>\n <td align={cellAlign(child, node, rtl)} phone={below.phone} style={below.style}>\n {render(child)}\n </td>\n </tr>\n );\n // What's hidden on desktop isn't Outlook's at all (Outlook is never a phone).\n return child.hidden?.desktop ? <NotOutlook>{row}</NotOutlook> : row;\n })}\n </Table>\n );\n}\n\nexport const gapOf = (props: Props) => (typeof props.style.gap === \"number\" ? props.style.gap : 0);\n/** The gap on phones: the Row's phone gap, else its gap. */\nexport const phoneGapOf = (props: Props) => (typeof props.mobile.gap === \"number\" ? props.mobile.gap : gapOf(props));\nexport const valignOf = (props: Props) => VALIGN[(props.style.alignItems as string | undefined) ?? \"start\"];\n\n/** A child that shares its Row on phones (no width of its own, a flex). */\nexport const sharing = (child: ResolvedNode) => child.width !== null && child.style.width === undefined && child.mobile?.width === undefined && child.style.flex !== \"none\" && child.style.flex !== 0;\n\n/**\n * Each child's width on phones in a side-by-side Row whose children share it: a table shares its width out by its\n * cells' content, flexbox (as on desktop) by their widths. A cell's share is a percentage, and the gaps are the cells'\n * side padding, inside their width (a cell's share of the gaps, split so neighbours leave one gap between them): the\n * shares add up to the whole, which every client's table gives exactly. None where a padding would be negative.\n */\nexport function phoneShares(children: readonly ResolvedNode[], gap: number): Map<ResolvedNode, Style> | undefined {\n const onPhones = children.filter((child) => !child.hidden?.mobile);\n // Only children that share the Row: one of its own size keeps it, as on the page.\n if (onPhones.length < 2) return undefined;\n // Beside one of its own size, they take what it leaves: a table would shrink it with them.\n if (!onPhones.every(sharing)) {\n const beside = onPhones.filter(sharing);\n return beside.length ? new Map(beside.map((child) => [child, { width: \"auto\" }])) : undefined;\n }\n const total = onPhones.reduce((sum, child) => sum + child.width!, 0);\n const gaps = gap * (onPhones.length - 1);\n const out = new Map<ResolvedNode, Style>();\n let left = 0;\n for (const [index, child] of onPhones.entries()) {\n const share = child.width! / total;\n const right = index === onPhones.length - 1 ? 0 : share * gaps - left;\n if (left < -0.01 || right < -0.01) return undefined;\n const px = (n: number) => Math.round(n * 100) / 100;\n out.set(child, { width: `${px(share * 100)}%`, paddingLeft: left ? px(left) : undefined, paddingRight: right ? px(right) : undefined, boxSizing: \"border-box\" });\n left = gap - right;\n }\n return out;\n}\n\n/** What an email draws of a Layer: its Image, the child over it and its height; or why it can't. */\nexport function layerShape(node: ResolvedNode): { base: ResolvedNode; over?: ResolvedNode; height: number } | { problem: string; path: string } {\n const children = node.children.filter(isNode).filter(shown);\n const [base, over] = children;\n if (!base || base.type !== \"Image\" || children.length > 2) {\n return { problem: `In an email, a Layer is an Image with one child over it (drawn as the image's background); this one has ${children.length > 2 ? `${children.length} children` : base ? `a ${base.type} under` : \"no children\"}`, path: node.path };\n }\n if (base.width === null || node.contentWidth === null || Math.abs(base.width - node.contentWidth) > 1) {\n return { problem: \"In an email, a Layer's Image is as wide as the Layer (it's drawn as its background): give it width 100%\", path: `${base.path}.style.width` };\n }\n if (typeof node.style.height === \"number\") return { base, over, height: node.style.height };\n const { width, height } = assetParts(base.props.src as Asset);\n if (!width || !height) {\n return { problem: \"In an email, a Layer is as tall as its Image, which needs its file's width and height (src={{ src, width, height }}); or give the Layer a height\", path: `${base.path}.props.src` };\n }\n return { base, over, height: Math.round((base.width * height) / width) };\n}\n","/**\n * Sizes estimated where text isn't measured yet (RFC 0002): a character's width from its font size, a little under\n * most Latin text's, so text is never thought longer than it is, and only what looks clearly too big is said.\n */\nimport { horizontalFrame, type ResolvedNode } from \"../../resolve\";\n\n/** A character's average width, in ems. */\nexport const CHARACTER = 0.45;\n\n/** The characters a node's text runs hold. */\nexport const characters = (node: ResolvedNode): number =>\n node.children.reduce((sum: number, child) => sum + (typeof child === \"string\" ? child.length : child.type === \"MergeTag\" ? String(child.props.name ?? \"\").length + 4 : characters(child)), 0);\n\n/** A node's width on one line: its own where it's known, else its text's (an image's in it), its padding and border. With `phone`, a phone's width of that much room. */\nfunction widthOf(node: ResolvedNode, phone?: number): number {\n const own = phone === undefined ? undefined : node.mobile?.width;\n if (typeof own === \"number\") return own;\n if (typeof own === \"string\") return (Number.parseFloat(own) / 100) * phone!;\n if (node.width !== null) return node.width;\n const images = node.children.reduce((sum: number, child) => sum + (typeof child !== \"string\" && child.type === \"Image\" && child.width !== null ? child.width : 0), 0);\n return characters(node) * node.text.fontSize * CHARACTER + images + horizontalFrame(node.style);\n}\n\n/** The width a Row's children shown on desktop take side by side, with its gaps between them, estimated. With `phone`, those shown on a phone with that much room. */\nexport function oneLineWidth(row: ResolvedNode, phone?: number): number {\n const children = row.children.filter((child): child is ResolvedNode => typeof child !== \"string\" && !(phone === undefined ? child.hidden?.desktop : child.hidden?.mobile));\n const gap = gapOf(row, phone !== undefined);\n return children.reduce((sum, child) => sum + widthOf(child, phone), 0) + gap * Math.max(0, children.length - 1);\n}\n\nconst gapOf = (row: ResolvedNode, phone: boolean) => (phone && typeof row.mobile?.gap === \"number\" ? row.mobile.gap : typeof row.style.gap === \"number\" ? row.style.gap : 0);\n\n/** A Row that wraps (a Menu) whose children look wider than it on one line: where it can't wrap, they don't fit. */\nexport function wrapsPastIts(row: ResolvedNode): number | null {\n if (row.type !== \"Row\" || row.style.flexWrap !== \"wrap\" || row.contentWidth === null) return null;\n const width = oneLineWidth(row);\n return width > row.contentWidth + 0.5 ? Math.round(width) : null;\n}\n\n/** Where a Row kept side by side that wraps looks too wide for one line (at a small phone's width on phones), with a gap to keep between its lines. */\nexport function wrapsWithGap(row: ResolvedNode): \"desktop\" | \"phones\" | \"desktop and phones\" | null {\n if (row.props.stackOnMobile !== false || (row.style.flexWrap !== \"wrap\" && row.style.flexWrap !== \"words\") || row.contentWidth === null) return null;\n const room = Math.min(row.contentWidth, 320);\n const desktop = !row.hidden?.desktop && gapOf(row, false) > 0 && oneLineWidth(row) > row.contentWidth + 0.5;\n const phones = !row.hidden?.mobile && gapOf(row, true) > 0 && oneLineWidth(row, room) > room + 0.5;\n return desktop && phones ? \"desktop and phones\" : desktop ? \"desktop\" : phones ? \"phones\" : null;\n}\n","/**\n * What an output can't do as a template asks, from the components'\n * definitions: each style and prop says, for each output it renders to, how\n * that output shows it (`support`), and so does each condition (conditions.ts)\n * and each style inside one. One pass reads it for every output, for what the\n * author set (not a component's own defaults): `none` is a warning\n * (`<output>/unsupported`), `partial` a note (`<output>/degraded`), `outlook`\n * a note (`email/outlook-degraded`), each naming the email clients it's about\n * where the rule does (declared.ts). Each output adds what no single style or\n * prop says (email: `email/support.ts`).\n */\nimport { blockOf, CONDITIONS, shownAnywhere } from \"../../conditions\";\nimport { Diagnostics, type Diagnostic } from \"../../diagnostics\";\nimport type { Json } from \"../../model\";\nimport type { ResolvedNode } from \"../../resolve\";\nimport type { Target } from \"../../define\";\nimport { reportDeclared } from \"../../declared\";\n\nconst isNode = (child: ResolvedNode | string): child is ResolvedNode => typeof child !== \"string\";\nconst same = (a: Json | undefined, b: Json | undefined) => JSON.stringify(a) === JSON.stringify(b);\n\nexport function support(root: ResolvedNode, target: Target): Diagnostic[] {\n const d = new Diagnostics();\n const visit = (node: ResolvedNode) => {\n const { definition } = node;\n const byProp = definition.defaultStyleBy ? (definition.defaultStyleBy.values[String(node.props[definition.defaultStyleBy.prop])] as Record<string, Json> | undefined) : undefined;\n for (const [key, value] of Object.entries(node.style)) {\n const fallback = byProp?.[key] ?? (definition.defaultStyle as Record<string, Json> | undefined)?.[key];\n if (same(value, fallback)) continue;\n reportDeclared(d, node, `${node.path}.style.${key}`, key, value, definition.style[key]?.support?.[target], target);\n }\n for (const [key, value] of Object.entries(node.props)) {\n if (same(value, definition.props[key]?.default as Json | undefined)) continue;\n reportDeclared(d, node, `${node.path}.props.${key}`, key, value, definition.props[key]?.support?.[target], target);\n }\n for (const condition of CONDITIONS) {\n const block = blockOf(node, condition);\n if (!block || (condition.hiddenKey && node.hidden?.[condition.hiddenKey])) continue;\n const own = condition.support[target];\n // The block itself, once: what this output does with it.\n reportDeclared(d, node, `${node.path}.${condition.name}`, condition.name, block, own, target);\n // Where it doesn't apply at all, what's in it doesn't either.\n if (!own || own.level === \"none\") continue;\n for (const [key, value] of Object.entries(block)) {\n const rules = condition.styles?.[key]?.[target] ?? definition.style[key]?.support?.[target];\n reportDeclared(d, node, `${node.path}.${condition.name}.${key}`, key, value, rules, target, condition.outlookApplies);\n }\n }\n for (const child of node.children) if (isNode(child) && shownAnywhere(child)) visit(child);\n };\n visit(root);\n return d.list;\n}\n","/**\n * What email can't do as a template asks, found in one pass before the\n * email is written: what each style and prop declares for email (the shared\n * pass, `shared/support.ts`), and what no single style or prop says: a Row\n * child whose size isn't known, a wrapped Row's gap between its lines, an image\n * without a width, a hidden table cell, a font stack that ends on a web font,\n * phone styles where a client doesn't apply them, an image format a client\n * doesn't show, CSS in an Html block that an email client removes.\n * Size budgets are checked on the written email (index.tsx).\n */\nimport { Diagnostics, type Diagnostic } from \"../../diagnostics\";\nimport { COMPONENTS } from \"../../components\";\nimport { caniemail, type EmailClient } from \"../../email-clients\";\nimport { assetParts, fontStack, videoParts, type Asset, type FontFace } from \"../../kinds\";\nimport { NO_WEB_FONTS } from \"../../roots\";\nimport type { ResolvedNode } from \"../../resolve\";\nimport { support } from \"../shared/support\";\nimport { wrapsPastIts, wrapsWithGap } from \"../shared/estimate\";\nimport { isNode, shown } from \"./context\";\nimport { layerShape } from \"./layout\";\n\n/** `templatePath`: a node's place in the template (inside the component that made it, where one did). */\nexport function emailSupport(root: ResolvedNode, templatePath: (path: string) => string = (path) => path): Diagnostic[] {\n const d = new Diagnostics();\n d.list.push(...support(root, \"email\"));\n const webFonts = new Set(((root.props.fonts as FontFace[] | undefined) ?? []).map((face) => face.family.toLowerCase()));\n const phone = { styled: false, phoneHidden: false, desktopHidden: false };\n const visit = (node: ResolvedNode) => {\n structure(node, d);\n fallback(node, webFonts, d);\n if (node.type === \"Html\") htmlBlock(node, d);\n if (node.type === \"Image\") imageFormat(node, \"src\", d);\n if (node.type === \"Video\" && node.props.thumbnail !== undefined) imageFormat(node, \"thumbnail\", d);\n // What a built-in component hides itself (a Menu's separators on phones) is its own, not the author's to change.\n if (node.mobile && Object.keys(node.mobile).length) phone.styled = true;\n if (node.hidden?.mobile && !builtIn(templatePath(node.path))) phone.phoneHidden = true;\n if (node.hidden?.desktop && !builtIn(templatePath(node.path))) phone.desktopHidden = true;\n for (const child of node.children) if (isNode(child) && shown(child)) visit(child);\n };\n visit(root);\n phoneStyles(root, phone, d);\n return d.list;\n}\n\n/** Whether a node was made by a built-in component's expansion: its place in the template is inside one, `…(Menu)…`. */\nfunction builtIn(place: string): boolean {\n const made = [...place.matchAll(/\\((\\w+)\\)/g)].pop()?.[1];\n return !!made && Object.prototype.hasOwnProperty.call(COMPONENTS, made);\n}\n\n/**\n * The clients that show an email on a phone without its phone styles (caniemail's css-at-media and html-style): with\n * another account in the Gmail app, and in some webmail, the email's <style> or its media queries are removed. What\n * Elements does without them (a Row stacks) still happens.\n */\nexport const NO_PHONE_STYLES: readonly EmailClient[] = [\"gmail-app-other\", \"sfr\", \"laposte\", \"gmx\", \"web-de\", \"rainloop\"];\n\n/**\n * Said once for the email: a warning where it hides something on desktop (shown only on phones, it then shows\n * nowhere), a note otherwise (what's hidden on phones shows, its phone styles change nothing).\n */\nfunction phoneStyles(root: ResolvedNode, phone: { styled: boolean; phoneHidden: boolean; desktopHidden: boolean }, d: Diagnostics): void {\n const parts = [phone.desktopHidden && \"what's hidden on desktop shows nowhere\", phone.phoneHidden && \"what's hidden on phones shows\", phone.styled && \"it keeps its desktop styles\"].filter(Boolean);\n if (!parts.length) return;\n d.add(\"email/phone-styles\", phone.desktopHidden ? \"warning\" : \"info\", `On phones, the email's phone styles don't apply: ${parts.join(\", \")} (Rows still stack)`, root.path, root.id, {\n clients: NO_PHONE_STYLES,\n fix: phone.desktopHidden ? \"show what a reader needs on desktop too, and hide on phones only what they can do without\" : undefined,\n see: caniemail(\"css-at-media\"),\n });\n}\n\n/**\n * Image formats some clients don't show (caniemail's image-webp, image-avif, image-svg): by the file's extension, its\n * data: type, or the format an image CDN is asked for (`?fm=webp`, `?format=avif`, Cloudinary's `f_webp`).\n */\nexport const IMAGE_FORMATS: Readonly<Record<string, { clients: readonly EmailClient[]; feature: string; name: string }>> = {\n webp: { clients: [\"outlook\"], feature: \"image-webp\", name: \"a WebP\" },\n avif: { clients: [\"outlook\", \"fastmail\", \"gmx\", \"web-de\", \"orange\", \"sfr\", \"mail-ru\", \"ionos\"], feature: \"image-avif\", name: \"an AVIF\" },\n svg: { clients: [\"mail-ru\"], feature: \"image-svg\", name: \"an SVG\" },\n};\n\n/**\n * Where an image's format is said, first to last: its data: type, then the format an image CDN is asked for (which it\n * serves whatever the file's extension), then its extension. The first found is the format, even one every client shows.\n */\nconst FORMAT_IN = [/^data:image\\/([a-z]+)/i, /[?&](?:fm|format|f)=(webp|avif|svg|png|jpe?g|gif)\\b/i, /\\/f_(webp|avif|svg|png|jpe?g|gif)[,/]/i, /\\.([a-z]+)(?:[?#]|$)/i];\n\nfunction imageFormat(node: ResolvedNode, key: \"src\" | \"thumbnail\", d: Diagnostics): void {\n const src = assetParts(node.props[key] as Asset).src;\n const format = FORMAT_IN.map((pattern) => pattern.exec(src)?.[1]).find(Boolean)?.toLowerCase();\n const known = format && Object.prototype.hasOwnProperty.call(IMAGE_FORMATS, format) ? IMAGE_FORMATS[format] : undefined;\n if (!known) return;\n const what = key === \"src\" ? \"This Image is\" : \"This Video's thumbnail is\";\n d.warning(\"email/image-format\", `${what} ${known.name} file, which these email clients don't show`, `${node.path}.props.${key}`, node.id, {\n clients: known.clients,\n fix: \"use a PNG, JPEG or GIF file\",\n see: caniemail(known.feature),\n });\n}\n\n/** A stack that ends on a web font leaves the client to choose a font where that one doesn't load. */\nfunction fallback(node: ResolvedNode, webFonts: Set<string>, d: Diagnostics): void {\n const stack = node.style.fontFamily;\n if (typeof stack !== \"string\" || !webFonts.size) return;\n const families = fontStack(stack);\n const last = families[families.length - 1];\n if (!last || !webFonts.has(last.toLowerCase())) return;\n d.warning(\n \"email/font-fallback\",\n `This font stack ends with the web font \"${last}\": where it doesn't load, the email client picks its own font`,\n `${node.path}.style.fontFamily`,\n node.id,\n { clients: NO_WEB_FONTS, fix: `end it with a font the client has: \"${stack}, Arial, sans-serif\"`, see: caniemail(\"css-at-font-face\") }\n );\n}\n\n/** What email can't do that no single style or prop says. */\nfunction structure(node: ResolvedNode, d: Diagnostics): void {\n const { path, id } = node;\n if (node.type === \"Row\") {\n // A Row kept side by side wraps its children in every client but classic Outlook (a Menu's links): said where they\n // look too wide for one line.\n const past = node.props.stackOnMobile === false ? wrapsPastIts(node) : null;\n if (past !== null) {\n d.add(\n \"email/outlook-degraded\",\n \"info\",\n `What it holds looks about ${past}px wide on one line, wider than its ${node.contentWidth}px (an estimate: text isn't measured yet): classic Outlook can't wrap it onto another line as other clients do, and draws it wider`,\n path,\n id,\n { clients: [\"outlook\"], fix: \"put less in it, or let it stack on phones (stackOnMobile)\" }\n );\n }\n // Its children wrap as inline-blocks, whose lines touch: anything between them but no space around them takes a\n // negative margin or flex-wrap, neither of which Gmail or Yahoo reads.\n const lines = wrapsWithGap(node);\n if (lines !== null) {\n d.add(\n \"email/degraded\",\n \"info\",\n `What it holds looks too wide for one line on ${lines} (an estimate), and an email can't keep its gap between the lines it wraps onto: they touch. Give what's in it padding, or put each line in a Row of its own`,\n `${path}.style.gap`,\n id\n );\n }\n // A Link or a line of text in a Text is as wide as its text in a cell of its own, in Outlook too (today's Menu writes its\n // links so): only a box whose size isn't known needs a width.\n for (const child of node.children.filter(isNode).filter(shown)) {\n if (child.width === null && child.type !== \"Link\" && child.type !== \"Text\") {\n d.warning(\"email/width\", `This ${child.type} takes its own size in a Row, and its size isn't known: give it a width, so Outlook can lay the Row out`, `${child.path}.style.width`, child.id);\n }\n }\n }\n if (node.type === \"Layer\") {\n const shape = layerShape(node);\n if (\"problem\" in shape) d.error(\"email/layer\", shape.problem, shape.path, id);\n // Where its image is hidden on phones, it's as tall as what's over it there, as on a page.\n else if (node.style.height === undefined && !shape.base.hidden?.mobile) {\n d.add(\"email/layer-phone\", \"info\", \"On phones, the email keeps this Layer's height and cuts its image at the sides (a page scales it): give the Layer a height to draw both the same\", `${path}.style.height`, id);\n }\n }\n if (node.type === \"TableCell\" && node.hidden) {\n d.warning(\"email/unsupported\", \"A TableCell can't be hidden in email (its row would lose a column): hide its TableRow\", `${path}.hidden`, id);\n }\n if (node.type === \"Video\" && node.props.thumbnail === undefined && !videoParts(String(node.props.src))?.thumbnail) {\n d.warning(\"email/video-thumbnail\", \"A Vimeo video's thumbnail can't be found without the network: give this Video a thumbnail, or the email shows a link with its title\", `${path}.props.thumbnail`, id);\n }\n if (node.type === \"Image\" && node.width === null) {\n d.warning(\"email/image-width\", \"This Image has no width: Outlook shows it at the size of its file, however wide that is. Give it a width, or the file's width in src\", `${path}.props.src`, id);\n }\n}\n\n/**\n * CSS in an Html block's markup that an email client removes, found by pattern (the markup isn't parsed, so each is a\n * note that it may): what captures of Gmail and Outlook.com on the web showed them removing, and what caniemail's\n * tables say (`feature`, checked against them with what the captures add: test/caniemail.test.ts). Elements writes\n * none of these itself.\n */\nexport const HTML_CSS: ReadonlyArray<{ pattern: RegExp; clients: readonly EmailClient[]; removes: string; fix: string; feature?: string; use?: string }> = [\n { pattern: /!\\s*(?!important\\b)[iI][mM][pP][oO][rR][tT][aA][nN][tT]\\b/, clients: [\"gmail\"], removes: \"!important not written in lowercase: Gmail removes the whole style attribute, or the whole <style>, that holds it\", fix: \"write !important in lowercase\" },\n { pattern: /margin[a-z-]*\\s*:([^;\"'}]*\\s)?-\\d/i, clients: [\"gmail\", \"outlook-com\"], removes: \"a negative margin: the client removes the whole margin declaration\", fix: \"move it with padding on what holds it instead\" },\n {\n pattern: /(^|[\\s;{\"'])position\\s*:\\s*absolute\\b/i,\n clients: [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail\", \"gmail-app\", \"gmail-app-other\", \"yahoo\", \"aol\", \"hey\", \"sfr\", \"laposte\", \"mail-ru\", \"gmx\", \"web-de\"],\n removes: \"position: absolute: the client removes it\",\n fix: \"lay it out without position (a Layer puts content over an image)\",\n feature: \"css-position\",\n },\n {\n // Outlook.com removes every position (captures); the others not named keep relative.\n pattern: /(^|[\\s;{\"'])position\\s*:\\s*relative\\b/i,\n clients: [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail\", \"gmail-app\", \"gmail-app-other\", \"mail-ru\", \"gmx\", \"web-de\"],\n removes: \"position: relative: the client removes it, and what it moves stays where it is\",\n fix: \"move it with padding instead\",\n feature: \"css-position\",\n use: \"relative\",\n },\n {\n pattern: /var\\(\\s*--|(^|[\\s;{\"'])--[\\w-]+\\s*:/i,\n clients: [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail\", \"gmail-app\", \"gmail-app-other\", \"yahoo\", \"aol\", \"orange\", \"mail-ru\", \"fastmail\", \"gmx\", \"web-de\"],\n removes: \"CSS variables: the client removes var() and their declarations\",\n fix: \"write the values themselves\",\n feature: \"css-variables\",\n },\n {\n pattern: /gradient\\(/i,\n clients: [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail-app\", \"gmail-app-other\", \"yahoo\", \"aol\", \"orange\", \"gmx\", \"web-de\"],\n removes: \"a gradient: the client removes it\",\n fix: \"give it a solid background color too, or use an image\",\n feature: \"css-linear-gradient\",\n },\n { pattern: /\\b(oklch|oklab|lch|lab|hwb|color-mix|color)\\(/i, clients: [\"gmail\", \"outlook-com\"], removes: \"a newer color syntax: Outlook.com removes the declaration, and Gmail every inline style on its element\", fix: \"write the color as hex or rgb()\" },\n { pattern: /rgba?\\(\\s*[\\d.]+%?\\s+[\\d.]/i, clients: [\"gmail\"], removes: \"rgb() with spaces between its numbers: Gmail removes the whole style attribute, or the whole <style>\", fix: \"separate them with commas: rgb(8, 121, 161)\" },\n {\n pattern: /<style[\\s>]/i,\n clients: [\"gmail\", \"gmail-app\", \"gmail-app-other\", \"protonmail\", \"gmx\", \"web-de\", \"sfr\", \"laposte\", \"rainloop\"],\n removes: \"a <style> in the email's body: the client removes it, and what it styles shows without it\",\n fix: \"write the styles inline, on the elements they're for\",\n feature: \"html-style\",\n },\n { pattern: /box-shadow\\s*:/i, clients: [\"outlook\", \"gmail\", \"gmail-app\", \"yahoo\", \"aol\", \"orange\", \"gmx\", \"web-de\"], removes: \"box-shadow: the client removes it\", fix: \"draw it with a border, or leave it out\", feature: \"css-box-shadow\" },\n { pattern: /text-shadow\\s*:/i, clients: [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail\", \"gmail-app\", \"gmail-app-other\"], removes: \"text-shadow: the client removes it\", fix: \"leave it out, and keep the text readable without it\", feature: \"css-text-shadow\" },\n { pattern: /display\\s*:\\s*flex\\b/i, clients: [\"outlook\", \"gmail-app-other\", \"orange\", \"gmx\", \"web-de\"], removes: \"display: flex: the client lays it out as blocks\", fix: \"lay it out with a Row\", feature: \"css-display-flex\" },\n {\n pattern: /display\\s*:\\s*inline-flex\\b/i,\n clients: [\"outlook\", \"gmail-app-other\", \"yahoo\", \"aol\", \"orange\", \"gmx\", \"web-de\"],\n removes: \"display: inline-flex: the client lays it out without flex\",\n fix: \"lay it out with a Row\",\n feature: \"css-display-flex\",\n use: \"inline\",\n },\n { pattern: /display\\s*:\\s*(inline-)?grid\\b/i, clients: [\"outlook\", \"gmail-app-other\", \"orange\", \"gmx\", \"web-de\"], removes: \"display: grid: the client lays it out as blocks\", fix: \"lay it out with a Row or a Grid\", feature: \"css-display-grid\" },\n { pattern: /(^|[\\s;{\"'])opacity\\s*:/i, clients: [\"outlook\", \"aol\", \"orange\", \"mail-ru\", \"gmx\", \"web-de\"], removes: \"opacity: the client shows it opaque\", fix: \"use a lighter color instead\", feature: \"css-opacity\" },\n {\n pattern: /object-fit\\s*:/i,\n clients: [\"outlook\", \"gmail-app-other\", \"yahoo\", \"aol\", \"orange\", \"gmx\", \"web-de\"],\n removes: \"object-fit: the client stretches the image to its box\",\n fix: \"crop the image file to the size it's shown at\",\n feature: \"css-object-fit\",\n },\n {\n pattern: /(^|[\\s;{\"'])aspect-ratio\\s*:/i,\n clients: [\"outlook\", \"outlook-com\", \"outlook-mac\", \"outlook-app\", \"gmail\", \"gmail-app\", \"gmail-app-other\", \"yahoo\", \"aol\", \"samsung-email\", \"thunderbird\", \"fastmail\", \"gmx\", \"web-de\", \"orange\"],\n removes: \"aspect-ratio: the client removes it\",\n fix: \"give it a width and a height\",\n feature: \"css-aspect-ratio\",\n },\n];\n\n/** What only classic Outlook reads (`<!--[if mso]>…<![endif]-->`): the others never see it. */\nconst OUTLOOK_ONLY = /<!--\\[if\\s+(?:(?:gte?|lte?)\\s+)?mso[^\\]]*\\]>[\\s\\S]*?<!\\[endif\\]-->/gi;\n\nfunction htmlBlock(node: ResolvedNode, d: Diagnostics): void {\n if (typeof node.props.html !== \"string\") return;\n const markup = node.props.html.replace(OUTLOOK_ONLY, \"\");\n for (const check of HTML_CSS) {\n if (check.pattern.test(markup)) {\n d.add(\"email/html-css\", \"info\", `This Html block's markup may have ${check.removes}`, `${node.path}.props.html`, node.id, { clients: check.clients, fix: check.fix, see: check.feature && caniemail(check.feature) });\n }\n }\n}\n","/**\n * What a PDF (a Document's) and an image (a Canvas's) can't show as a template asks, that the page writer's checks\n * don't see: a page's checks are a browser's, and a PDF or an image has no pointer and no player (phone styles are\n * already an error in a Document or a Canvas). Each\n * output's own adds what no single style or prop says, as email/support.ts does for email; the styles and props that\n * declare how a PDF or an image shows them (`support`) join when every one of them does (test/support.test.ts).\n *\n * And content that can't fit: a Document's page and a Canvas are a fixed size, and what doesn't fit is cut off. Text\n * isn't measured yet (RFC 0002), so its height is an estimate from its length and size, and only content that looks\n * clearly taller is said, as an estimate.\n */\nimport { blockOf, CONDITIONS, shownAnywhere } from \"../../conditions\";\nimport { assetParts, type Asset } from \"../../kinds\";\nimport { documentPages, pageBox } from \"../../document\";\nimport { Diagnostics, type Diagnostic } from \"../../diagnostics\";\nimport { toPx, type ResolvedNode } from \"../../resolve\";\nimport { CHARACTER, characters, wrapsPastIts } from \"./estimate\";\n\nconst isNode = (child: ResolvedNode | string): child is ResolvedNode => typeof child !== \"string\";\nconst OUTPUT = { pdf: \"a PDF\", image: \"an image\" } as const;\n\n/** What a PDF or an image can't show of a template, as warnings that say what it shows instead. */\nexport function pagedSupport(root: ResolvedNode, output: \"pdf\" | \"image\"): Diagnostic[] {\n const d = new Diagnostics();\n const where = OUTPUT[output];\n const visit = (node: ResolvedNode) => {\n if (!shownAnywhere(node)) return;\n for (const condition of CONDITIONS) {\n if (condition.paged && blockOf(node, condition)) d.warning(`${output}/unsupported`, condition.paged(node, where), `${node.path}.${condition.name}`, node.id);\n }\n if (node.type === \"Video\") {\n const shows = output === \"pdf\" ? \"its thumbnail (where its file is given) or its title, linked to it\" : \"its title\";\n d.warning(`${output}/unsupported`, `A Video isn't possible in ${where}: it has no player. It shows ${shows}`, node.path, node.id);\n }\n if (node.type === \"Html\") {\n d.warning(`${output}/unsupported`, `Markup isn't possible in ${where}: it has no browser. The Html block shows its plain text`, node.path, node.id);\n }\n const past = wrapsPastIts(node);\n if (past !== null) {\n d.warning(\n `${output}/unsupported`,\n `What it holds looks about ${past}px wide on one line, wider than its ${node.contentWidth}px (an estimate: text isn't measured yet), and ${where} can't wrap it onto another line: it goes past the edge`,\n node.path,\n node.id\n );\n }\n node.children.filter(isNode).forEach(visit);\n };\n visit(root);\n return d.list;\n}\n\n// ─── Fitting ───────────────────────────────────────────────────────────────\n\n/** How much taller than its room content must look before it's said: the estimate is rough. */\nconst CLEARLY = 1.25;\n\nconst sides = (value: unknown) => {\n const s = (value ?? {}) as Partial<Record<\"top\" | \"right\" | \"bottom\" | \"left\", number>>;\n return { top: s.top ?? 0, bottom: s.bottom ?? 0 };\n};\nconst lineWidth = (line: unknown) => (line && typeof line === \"object\" && typeof (line as { width?: unknown }).width === \"number\" ? (line as { width: number }).width : 0);\n/** The padding and borders above and below a node's content. */\nconst frame = (node: ResolvedNode) => {\n const padding = sides(node.style.padding);\n const border = (node.style.border ?? {}) as Record<string, unknown>;\n return padding.top + padding.bottom + lineWidth(border.top) + lineWidth(border.bottom) + lineWidth(node.style.borderTop) + lineWidth(node.style.borderBottom);\n};\n/** Laid out side by side: a Row's children (a Grid's, a Menu's and a Social's, as laid out), a table row's cells, a Layer's on each other. */\nconst SIDE_BY_SIDE = new Set([\"Row\", \"TableRow\", \"Layer\"]);\n\n/** A node's height, estimated: its text's lines at its width, an image's at its ratio, its children stacked or side by side. */\nfunction heightOf(node: ResolvedNode, available: number): number {\n if (node.hidden?.desktop) return 0;\n const set = toPx(node.style.height, null);\n if (set !== null) return set;\n const width = node.contentWidth ?? node.width ?? available;\n if (node.children.some((child) => typeof child === \"string\" && child.trim())) {\n const perLine = Math.max(1, Math.floor(width / (node.text.fontSize * CHARACTER)));\n return Math.ceil(characters(node) / perLine) * node.text.lineHeightPx + frame(node);\n }\n if (node.type === \"Image\" && node.props.src !== undefined) {\n const { width: w, height: h } = assetParts(node.props.src as Asset);\n return (w && h ? ((node.width ?? w) * h) / w : 0) + frame(node);\n }\n const children = node.children.filter(isNode).filter((child) => !child.hidden?.desktop);\n if (SIDE_BY_SIDE.has(node.type)) return Math.max(0, ...children.map((child) => heightOf(child, width))) + frame(node);\n const gap = toPx(node.style.gap, null) ?? 0;\n return children.reduce((sum, child) => sum + heightOf(child, width), 0) + gap * Math.max(0, children.length - 1) + frame(node);\n}\n\n/** Content that looks clearly taller than the page or canvas it's on: cut off where it ends. */\nexport function overflow(root: ResolvedNode): Diagnostic[] {\n const d = new Diagnostics();\n const say = (code: string, height: number, room: number, path: string, what: string) => {\n if (room <= 0 || height <= room * CLEARLY) return;\n d.warning(code, `${what} looks about ${Math.round((height / room) * 100)}% as tall as its room (an estimate: text isn't measured yet). What doesn't fit is cut off`, path);\n };\n if (root.type === \"Document\") {\n const box = pageBox(root.props);\n const { pages, header, footer } = documentPages(root);\n const room = box.contentHeight - (header ? heightOf(header, box.contentWidth) : 0) - (footer ? heightOf(footer, box.contentWidth) : 0);\n pages.forEach(({ page, children }, i) => {\n const holder = page ?? root;\n const gap = toPx(holder.style.gap, null) ?? 0;\n const height = children.reduce((sum, child) => sum + heightOf(child, box.contentWidth), 0) + gap * Math.max(0, children.length - 1) + (page ? frame(page) : 0);\n say(\"document/overflow\", height, room, page?.path ?? children[0]?.path ?? \"root\", `Page ${i + 1}'s content (split it with a PageBreak, or into pages)`);\n });\n } else if (root.type === \"Canvas\") {\n const room = Number(root.props.height) - frame(root);\n say(\"canvas/overflow\", heightOf(root, Number(root.props.width)) - frame(root), room, \"root\", \"The Canvas's content\");\n }\n return d.list;\n}\n","/**\n * Page HTML (`<Page>`) from a laid-out template: one element per node, its\n * styles inline, flexbox for the root, Rows and Columns. The only stylesheet\n * is what inline styles can't do: phone overrides, hiding, hover, and fonts.\n *\n * Each component is written by its own file here (Button.tsx, Row.tsx, …), in\n * JSX that writes strings (../jsx.ts), from one props object (context.ts);\n * `layout.tsx` and `styles.tsx` are what they share.\n */\nimport type { Diagnostic } from \"../../diagnostics\";\nimport type { ResolvedDocument, ResolvedNode } from \"../../resolve\";\nimport { Fragment, h, withStylesheet, type Html } from \"../jsx\";\nimport { Stylesheet } from \"../shared/classes\";\nimport { attrs, css, escapeText, styleAttr, type Declarations } from \"../shared/css\";\nimport { fontFaces } from \"../shared/fonts\";\nimport { isNode, type PageOptions, type Props, type Component } from \"./context\";\nimport { alignSelf, layerPlacement, rowPlacement } from \"./layout\";\nimport { classesFor } from \"./styles\";\nimport { Button } from \"./Button\";\nimport { Column } from \"./Column\";\nimport { Divider } from \"./Divider\";\nimport { Heading } from \"./Heading\";\nimport { HtmlBlock } from \"./Html\";\nimport { Image } from \"./Image\";\nimport { LineBreak } from \"./LineBreak\";\nimport { Link } from \"./Link\";\nimport { List } from \"./List\";\nimport { ListItem } from \"./ListItem\";\nimport { MergeTag } from \"./MergeTag\";\nimport { Page } from \"./Page\";\nimport { Text } from \"./Text\";\nimport { Row } from \"./Row\";\nimport { Layer } from \"./Layer\";\nimport { Document, documentCss } from \"./Document\";\nimport { PageNumber } from \"./PageNumber\";\nimport { Canvas } from \"./Canvas\";\nimport { Svg } from \"./Svg\";\nimport { Section } from \"./Section\";\nimport { Span } from \"./Span\";\nimport { Table } from \"./Table\";\nimport { TableCell } from \"./TableCell\";\nimport { TableRow } from \"./TableRow\";\nimport { Video } from \"./Video\";\n\nexport type { PageOptions } from \"./context\";\n\nexport interface PageHtml {\n /** The whole document, from `<!DOCTYPE html>`. */\n html: string;\n /** What goes in `<head>`: meta tags, the title, the stylesheet. */\n head: string;\n /** What goes in `<body>`. */\n body: string;\n /** The `<body>`'s own style (the window's background), for a page that embeds `body`. */\n bodyStyle: string;\n}\n\n/** At and below this window width a Page is on a phone, unless its `breakpoints` say otherwise. */\nexport const PAGE_PHONE_WIDTH = 480;\n\n/** The window width at and below which a Page's phone styles apply: its `breakpoints.mobile`, or 480. */\nexport function pagePhoneWidth(root: ResolvedNode): number {\n const mobile = (root.props.breakpoints as { mobile?: number } | undefined)?.mobile;\n return typeof mobile === \"number\" ? mobile : PAGE_PHONE_WIDTH;\n}\n\n/** A Page whose phone width is at or above its content width: its phone styles apply to windows the content fills. */\nexport function pageBreakpoints(root: ResolvedNode): Diagnostic[] {\n const mobile = (root.props.breakpoints as { mobile?: number } | undefined)?.mobile;\n const width = typeof root.props.width === \"number\" ? root.props.width : undefined;\n if (root.type !== \"Page\" || typeof mobile !== \"number\" || width === undefined || mobile < width) return [];\n return [\n {\n code: \"page/phone-width\",\n severity: \"warning\",\n message: `Its phone styles apply to every window up to ${mobile}px, wider than its ${width}px content: on those, the content is at its full width with its phone styles. Set breakpoints.mobile below ${width}`,\n path: \"root.props.breakpoints\",\n },\n ];\n}\n\n/** The components. (The root, `Page`, is called on its own.) */\nconst COMPONENTS: Record<string, Component> = {\n Section,\n Row,\n Column,\n Layer,\n // A Document's header and footer, and a page, are stacks in their box.\n PageHeader: Column,\n PageFooter: Column,\n DocumentPage: Column,\n PageNumber,\n Svg,\n Text,\n Heading,\n Span,\n Link,\n Button,\n Image,\n Divider,\n LineBreak,\n MergeTag,\n List,\n ListItem,\n Table,\n TableRow,\n TableCell,\n Video,\n Html: HtmlBlock,\n};\n\n/** What a node's component gets. `inRtl`: its parent's text runs right to left. */\nfunction propsOf(node: ResolvedNode, parent: ResolvedNode, placement: Declarations, options: PageOptions, inRtl = false): Props {\n const rtl = node.props.dir === \"rtl\" || (inRtl && node.props.dir !== \"ltr\");\n const render: Props[\"render\"] = (child, childPlacement) => write(child, node, childPlacement, options, rtl);\n return {\n node,\n style: node.style,\n parent,\n placement,\n classes: () => classesFor(node, parent),\n children: () => {\n // Text and the runs in it; else the nodes it lays out, each placed by its layout.\n if (node.definition.children.text) return <>{node.children.map((child) => (typeof child === \"string\" ? child : render(child, [])))}</>;\n const place = (child: ResolvedNode) => (node.type === \"Row\" ? rowPlacement(child, node) : node.type === \"Layer\" ? layerPlacement(child) : alignSelf(child, node, rtl));\n return <>{node.children.filter(isNode).map((child) => render(child, place(child)))}</>;\n },\n rtl,\n render,\n options,\n };\n}\n\nfunction write(node: ResolvedNode, parent: ResolvedNode, placement: Declarations, options: PageOptions, inRtl: boolean): Html {\n const component = COMPONENTS[node.type];\n if (!component) throw new Error(`[Elements] The page exporter can't render a ${node.type}`);\n return component(propsOf(node, parent, placement, options, inRtl));\n}\n\nexport function renderPage(resolved: ResolvedDocument, options: PageOptions = {}): PageHtml {\n const root = resolved.root;\n const sheet = new Stylesheet(options.classPrefix);\n const fonts = fontFaces(root, { swap: true });\n const document = root.type === \"Document\";\n const writer = document ? Document : root.type === \"Canvas\" ? Canvas : Page;\n const body = withStylesheet(sheet, () => String(writer(propsOf(root, root, [], options))));\n\n // A Canvas and a Document are of a fixed size, whatever the window: no phone layout.\n const fixed = !root.definition.responsive;\n const phoneWidth = pagePhoneWidth(root);\n const stylesheet = [...fonts, sheet.css(fixed ? null : `@media (max-width: ${phoneWidth}px)`, fixed ? null : `@media (min-width: ${phoneWidth + 1}px)`), document ? documentCss(root) : \"\"].join(\"\");\n const head = [\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n typeof root.props.title === \"string\" ? `<title>${escapeText(root.props.title)}</title>` : \"\",\n typeof root.props.description === \"string\" ? `<meta${attrs({ name: \"description\", content: root.props.description })}>` : \"\",\n stylesheet ? `<style>${stylesheet}</style>` : \"\",\n ].join(\"\");\n // A Document's background is its pages', not the window's.\n const background = document ? undefined : (root.style.backgroundColor as string | undefined);\n const bodyStyle = css([\n [\"margin\", \"0\"],\n [\"background-color\", background],\n ]);\n const html = `<!DOCTYPE html><html${attrs({ lang: root.props.lang as string | undefined, dir: root.props.dir as string | undefined })}><head>${head}</head><body${styleAttr([[\"margin\", \"0\"], [\"background-color\", background]])}>${body}</body></html>`;\n return { html, head, body, bodyStyle };\n}\n","import { checkDocument } from \"../normalize\";\nimport { checkTargetExpanded, resolveExpanded, type ResolvedDocument, type ResolvedNode } from \"../resolve\";\nimport { ElementsError, type Diagnostic } from \"../diagnostics\";\nimport { checkEmailClients, forEmailClients, type EmailClient } from \"../email-clients\";\nimport { expandDocument } from \"../expand\";\nimport { registryOf, type ComponentsOption } from \"../registry\";\nimport type { Target } from \"../define\";\nimport { renderEmail, type EmailOptions } from \"./email\";\nimport { emailSupport } from \"./email/support\";\nimport { overflow, pagedSupport } from \"./shared/paged\";\nimport { support } from \"./shared/support\";\nimport { pageBreakpoints, renderPage, type PageOptions } from \"./page\";\nimport { renderText } from \"./plain-text\";\nimport { prettyHtml } from \"./shared/pretty\";\nimport type { BlockMap } from \"./shared/block-map\";\n\nexport { renderEmail, EMAIL_PHONE_MARGIN, GMAIL_CLIP_BYTES, GMAIL_STYLE_BYTES, type EmailHtml, type EmailOptions } from \"./email\";\nexport { renderPage, PAGE_PHONE_WIDTH, pagePhoneWidth, type PageHtml, type PageOptions } from \"./page\";\nexport { renderText, type TextOptions } from \"./plain-text\";\nexport { emailSupport } from \"./email/support\";\nexport { support } from \"./shared/support\";\nexport { overflow, pagedSupport } from \"./shared/paged\";\nexport { Stylesheet, CLASS_PREFIX, type Media } from \"./shared/classes\";\nexport { BLOCK_MAP_VERSION, type BlockMap, type BlockMapEntry } from \"./shared/block-map\";\n\nexport interface EmailClientsOption {\n /**\n * For an Email, the email clients to report problems for (default: `DEFAULT_EMAIL_CLIENTS`, the ones most email is\n * read in: classic Outlook, Outlook.com, Outlook for Mac, the Outlook and Gmail apps, Gmail, Apple Mail, Yahoo, AOL\n * and Samsung Email). A problem about other clients is left out; `[]` leaves out every email client problem, not the\n * problems of the email itself.\n */\n emailClients?: readonly EmailClient[];\n}\n\nexport interface RenderOptions extends PageOptions, EmailOptions, EmailClientsOption {\n /** The HTML indented, for reading it; for sending, the compact HTML (white space may change how some email clients show it). */\n pretty?: boolean;\n /**\n * For tools that preview an Email: also return `blocks`, where each block is in `html` (its template path and the\n * UTF-8 byte offset just after its outermost element's tag name). The HTML is the same either way. Not with `pretty`.\n */\n blockMap?: boolean;\n}\n\nexport interface RenderResult {\n /** The whole document, from `<!DOCTYPE html>`. */\n html: string;\n /** The plain-text version. */\n text: string;\n /** What goes in `<head>` and in `<body>`, and the body's own style: to embed the output in a page of your own. */\n head: string;\n body: string;\n bodyStyle: string;\n /** Warnings and notes (errors are thrown). */\n diagnostics: Diagnostic[];\n /** With `blockMap`, for an Email: where each block is in `html`. */\n blocks?: BlockMap;\n}\n\n/** The output each root renders to, and whether its writer exists yet. */\nconst OUTPUTS: Record<string, { target: Target; ready: boolean; later?: string }> = {\n Page: { target: \"web\", ready: true },\n // Print HTML: a page writer's, each page a box of the paper's size.\n Document: { target: \"web\", ready: true },\n // A Canvas as HTML, to look at (@hyper-elements/react/image writes the image).\n Canvas: { target: \"web\", ready: true },\n Email: { target: \"email\", ready: true },\n};\n\nexport interface Prepared {\n /** The template laid out, its custom components expanded; null where it has errors. */\n resolved: ResolvedDocument | null;\n /** The output its root renders to. */\n target: Target | null;\n /** Everything found: errors, warnings and notes. */\n diagnostics: Diagnostic[];\n}\n\n/**\n * What both validating and rendering do, once: the template checked, its\n * custom components expanded (each rendered once), checked against the output\n * its root says, laid out, and what that output can't do as asked found.\n * Only what needs the written output (an email's size against Gmail's limits)\n * is left to rendering.\n */\nexport function prepareTemplate(input: unknown, options: ComponentsOption & EmailClientsOption = {}): Prepared {\n checkEmailClients(options.emailClients);\n const registry = registryOf(options);\n const checked = checkDocument(input, registry);\n const diagnostics = [...checked.diagnostics];\n const failed = () => diagnostics.some((d) => d.severity === \"error\");\n if (!checked.document || failed()) return { resolved: null, target: null, diagnostics };\n const root = checked.document.root.type;\n /** What it found, an Email's problems with email clients for the clients asked for (expansion's too: a condition's notes). */\n const done = (resolved: ResolvedDocument | null, target: Target | null): Prepared => {\n if (root !== \"Email\" && options.emailClients) diagnostics.push({ code: \"email/clients-ignored\", severity: \"info\", message: `emailClients is for an Email; a ${root} isn't checked for email clients`, path: \"root\" });\n return { resolved, target, diagnostics: root === \"Email\" ? forEmailClients(diagnostics, options.emailClients) : diagnostics };\n };\n const output = OUTPUTS[root];\n if (!output?.ready) {\n diagnostics.push({ code: \"output/unavailable\", severity: \"error\", message: output?.later ?? `A ${root} can't be rendered yet`, path: \"root\" });\n return done(null, null);\n }\n const expanded = expandDocument(checked.document, registry, output.target);\n diagnostics.push(...expanded.diagnostics);\n if (failed()) return done(null, output.target);\n diagnostics.push(...checkTargetExpanded(expanded.document, output.target, registry, expanded.paths));\n if (failed()) return done(null, output.target);\n const resolved = resolveExpanded(expanded.document, registry, expanded.paths);\n diagnostics.push(...resolved.diagnostics);\n const found = output.target === \"email\" ? emailSupport(resolved.root, resolved.templatePath) : support(resolved.root, output.target);\n // A Document's page and a Canvas are a fixed size: content that can't fit is cut off.\n if (root === \"Document\" || root === \"Canvas\") found.push(...overflow(resolved.root));\n found.push(...pageBreakpoints(resolved.root));\n diagnostics.push(...inTemplate(resolved, found));\n return done(failed() ? null : resolved, output.target);\n}\n\n/** Diagnostics found on the tree as laid out, at their places in the template (a Grid's children, a custom component's). */\nexport function inTemplate(resolved: ResolvedDocument, diagnostics: Diagnostic[]): Diagnostic[] {\n const { templatePath } = resolved;\n return templatePath ? diagnostics.map((diagnostic) => ({ ...diagnostic, path: templatePath(diagnostic.path) })) : diagnostics;\n}\n\n/**\n * A template's problems, without writing it: errors make it invalid, warnings and notes don't. A Document's are its\n * PDF's too, and a Canvas's its image's (what they can't show that its HTML can).\n */\nexport function validateTemplate(input: unknown, options: ComponentsOption & EmailClientsOption = {}): { valid: boolean; diagnostics: Diagnostic[] } {\n const { diagnostics, resolved } = prepareTemplate(input, options);\n const root = resolved?.root;\n const paged = root?.type === \"Document\" ? pagedSupport(root, \"pdf\") : root?.type === \"Canvas\" ? pagedSupport(root, \"image\") : [];\n const all = [...diagnostics, ...(resolved ? inTemplate(resolved, paged) : paged)];\n return { valid: !all.some((d) => d.severity === \"error\"), diagnostics: all };\n}\n\n/**\n * A template (Elements' internal tree, with the custom components it uses)\n * rendered to the output its root says: prepared (`prepareTemplate`), then\n * written. Throws an `ElementsError` listing the errors if there are any.\n */\nexport function renderTemplate(input: unknown, options: RenderOptions & ComponentsOption = {}): RenderResult {\n // Indenting rewrites the HTML after it's written, which would move every offset.\n if (options.blockMap && options.pretty) throw new ElementsError([{ code: \"render/block-map-pretty\", severity: \"error\", message: \"blockMap gives offsets in the compact HTML; leave pretty off\", path: \"root\" }]);\n const { resolved, target, diagnostics } = prepareTemplate(input, options);\n if (!resolved) throw new ElementsError(diagnostics);\n const text = renderText(resolved, options);\n const written = target === \"email\" ? renderEmail(resolved, options) : { ...renderPage(resolved, options), diagnostics: [] };\n const shown = (html: string) => (options.pretty ? prettyHtml(html) : html);\n const blocks = \"blocks\" in written ? written.blocks : undefined;\n return {\n html: shown(written.html),\n head: shown(written.head),\n body: shown(written.body),\n bodyStyle: written.bodyStyle,\n text,\n diagnostics: [...diagnostics, ...inTemplate(resolved, forEmailClients(written.diagnostics, options.emailClients))],\n ...(blocks ? { blocks } : {}),\n };\n}\n","/**\n * What the render that collects a template (src/primitives/collect.tsx) shares with every copy of Elements a process\n * loads: the stack of collecting renders under way (which server-renderer.ts reads to choose a module of react-dom's;\n * an Elements 0.2 copy's collecting render pushes onto it too), each render's nonce, and how an async component is\n * told. A stack, not React context: Server Components have no context, and a collecting render can start inside\n * another.\n */\n\n// Shared by every copy of Elements a process loads (a project's ESM and CommonJS builds, a tool's own).\nconst SHARED = Symbol.for(\"@hyper-elements/react/collecting\");\nconst frames: Array<object | null> = ((globalThis as Record<symbol, unknown>)[SHARED] ??= []) as Array<object | null>;\n\n/** The collecting render under way, if any (and not a render of Elements' own inside it). */\nexport function collecting(): object | undefined {\n return frames[frames.length - 1] ?? undefined;\n}\n\n/** Runs `run` with `frame` collecting (or, with `null`, nothing collecting). */\nexport function within<T>(frame: object | null, run: () => T): T {\n frames.push(frame);\n try {\n return run();\n } finally {\n frames.pop();\n }\n}\n\n// Shared by every copy of Elements a process loads, as the collecting stack is: no two renders get one nonce.\nconst RENDERS = Symbol.for(\"@hyper-elements/react/renders\");\n\n/**\n * A collection's nonce, so markup a template's data holds can't name it: letters, digits and \"_\", from the count of\n * the process's renders and its high-resolution clock (when it started, and the time since to a fraction of a\n * millisecond), which data written before the render can't know. Not random numbers: a framework that prerenders\n * pages takes `crypto.getRandomValues()` and `Math.random()` for a value that changes the page, and Next.js's Cache\n * Components (its new apps' default) fail the build on one, but the nonce never reaches the output. `performance` is\n * what Next.js leaves for timing, and every runtime Elements supports has it.\n */\nexport function nonce(): string {\n const shared = globalThis as Record<symbol, number>;\n const clock = globalThis.performance;\n return [(shared[RENDERS] = (shared[RENDERS] ?? 0) + 1), (clock?.timeOrigin ?? 0) * 1e3, (clock?.now() ?? 0) * 1e6].map((n) => Math.floor(n).toString(36)).join(\"_\");\n}\n\n/** React's marks on a `memo` and a `forwardRef` component. */\nconst MEMO = Symbol.for(\"react.memo\");\nconst FORWARD_REF = Symbol.for(\"react.forward_ref\");\n\n/** A component declared `async`: it can't render synchronously, so it isn't called at all. */\nexport function isAsyncComponent(type: any): boolean {\n while (type?.$$typeof === MEMO) type = type.type;\n return (type?.$$typeof === FORWARD_REF ? type.render : type)?.[Symbol.toStringTag] === \"AsyncFunction\";\n}\n","/**\n * The server renderer Elements renders with: react-dom/server, loaded as an app loads it and doing nothing when it\n * loads.\n *\n * react-dom keeps a render's hook state in its module, so a render started inside another one with the same module\n * breaks the hooks the outer component calls after it (a page rendered with `renderToString` that computes\n * `useMemo(() => toDesign(<T />))` and then calls `useState`). Apps mostly render with react-dom's streaming\n * renderers, another module than the one renderToString is in, so it's rare; where it happens, Elements renders\n * with a second module of react-dom's (React 19's Bun build, the browser one, or Node's when react-dom/server is the\n * browser one), loaded then, only where a synchronous `require` can load it with the same React (Node, Jest, a\n * CommonJS bundle); elsewhere (a bundled module, a browser) it says to render first.\n * Which module a render is under way with is told by React's hooks dispatcher (each module has its own), read in a\n * class component's render: that doesn't touch the hook state of a render it's in.\n */\nimport * as defaultBuild from \"react-dom/server\";\n\nimport React from \"react\";\nimport { collecting } from \"./collect\";\n\ntype Build = typeof defaultBuild;\n\n// The builds rendering (an Elements render, or the app's render one is called in), innermost last, shared by every\n// copy of Elements a process loads (they share react-dom).\nconst SHARED = Symbol.for(\"@hyper-elements/react/render-builds\");\nconst using = ((globalThis as Record<symbol, unknown>)[SHARED] ??= []) as Build[];\n\n/** The same module (a bundler can wrap one in two objects). */\nconst same = (a: Build, b: Build) => a.renderToString === b.renderToString;\n\n/** The hooks dispatcher of the React render under way (React sets it while a component renders), or null. */\nfunction dispatcher(): unknown {\n // Each step can be missing (React Server Components' React has neither).\n const internals = React as unknown as Record<string, { H?: unknown; ReactCurrentDispatcher?: { current?: unknown } } | undefined>;\n return internals.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE?.H ?? internals.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED?.ReactCurrentDispatcher?.current ?? null;\n}\n\n/** The dispatcher a build renders with, from a render of a class component (no hooks: safe inside its own render). */\nconst dispatchers = new Map<Build, unknown>();\nfunction dispatcherOf(build: Build): unknown {\n if (!dispatchers.has(build)) {\n let seen: unknown = null;\n try {\n // (React Server Components' React has no Component: none of react-dom's renders is under way there.)\n class Probe extends React.Component {\n render() {\n seen = dispatcher();\n return null;\n }\n }\n build.renderToStaticMarkup(React.createElement(Probe));\n } catch {\n // It can't render here: no dispatcher.\n }\n dispatchers.set(build, seen);\n }\n return dispatchers.get(build);\n}\n\ndeclare const module: { require(id: string): unknown } | undefined;\n/** Whether this is the CommonJS build (set when it's built; undefined in the sources). */\ndeclare const __UNLAYER_CJS__: boolean | undefined;\n\n/**\n * Another module of react-dom's than react-dom/server, loaded the first time one's needed, with a synchronous\n * `require`: the one CommonJS loads this module with (Jest's registry gives the test's React), then Node's for a\n * module (a module a bundler bundles has neither that gives its React). One that renders with this React (its\n * dispatcher is one this React sets, and not `outer`'s). React 19's Bun build first: its browser one opens a\n * MessageChannel when it loads, which keeps Node from exiting. Undefined where there's none.\n */\nlet second: Build | null | undefined;\nfunction secondBuild(outer: unknown): Build | undefined {\n if (second === undefined) {\n second = null;\n const node = (globalThis as any).process;\n const requirers = [\n // (`module`'s, read so that a bundler doesn't take it for a require of a path worked out when it runs.)\n () => {\n const own = (typeof __UNLAYER_CJS__ === \"boolean\" ? __UNLAYER_CJS__ : true) && typeof module === \"object\" ? Reflect.get(module ?? {}, \"require\") : undefined;\n return typeof own === \"function\" ? (id: string) => own.call(module, id) : undefined;\n },\n // From this module's URL (as a stack names it: webpack 4 can't parse the syntax for it), the app's script, then\n // the folder Node started in; only where `react` is this React. Another React's isn't loaded (React 19's browser\n // build keeps Node running).\n ...[/file:\\/\\/\\S+?(?=:\\d+:\\d+)/.exec(String(new Error().stack))?.[0], node?.argv?.[1], `${node?.cwd?.()}/`].map((from) => () => {\n const required = node?.getBuiltinModule?.(\"module\")?.createRequire(from);\n return (required?.(\"react\") as typeof React | undefined)?.createElement === React.createElement ? required : undefined;\n }),\n ];\n // React 19's browser build opens a MessageChannel when it loads, which keeps Node running: its Bun build instead.\n const ids = [\"react-dom/server.bun\", ...(Number.parseInt(React.version) >= 19 ? [] : [\"react-dom/server.browser\"]), \"react-dom/server.node\"];\n search: for (const id of ids) {\n for (const requirer of requirers) {\n try {\n const build = requirer()?.(id) as Build | undefined;\n if (build?.renderToStaticMarkup && !same(build, defaultBuild) && ![null, outer].includes(dispatcherOf(build))) {\n second = build;\n break search;\n }\n } catch {\n // Not there, or it can't load here: the next one.\n }\n }\n }\n }\n return second ?? undefined;\n}\n\n/** The build whose render is under way, of the ones Elements has: react-dom/server's, or the second one if loaded. */\nconst buildOf = (outer: unknown): Build | undefined => (outer === null ? undefined : [defaultBuild, second].find((b): b is Build => !!b && dispatcherOf(b) === outer));\n\n/**\n * Runs one Elements render with a build that isn't rendering; every render it makes uses that one. Called from the\n * user's code in a render with a build it has (the app's renderToString, or a component a collecting render on the\n * stack in collect.ts renders), it takes another one, which mustn't be rendering either (a third level: it can't).\n * Otherwise (no render under way, the app's streaming render or a client one) it keeps the one it's in.\n */\nexport function withBuild<T>(render: () => T): T {\n const outer = dispatcher();\n let build = current();\n const theirs = using.length === 0 || collecting() !== undefined ? buildOf(outer) : undefined;\n const busy: Build[] = [];\n if (theirs) {\n const free = (b: Build) => !same(b, theirs) && !using.some((u) => same(u, b));\n const other = free(defaultBuild) ? defaultBuild : secondBuild(outer);\n // Where none renders with this React (a bundle, Next.js's own react-dom, a test runner's module registry): the\n // module it's in. The component calling it then can't call a hook after the call (React throws).\n if (other && free(other)) {\n busy.push(theirs);\n build = other;\n } else build = theirs;\n }\n using.push(...busy, build);\n try {\n return render();\n } catch (error) {\n // React Server Components' React (Next.js's edge runtime), which react-dom can't render with at all. (Not checked\n // in a render of the same module, whose hooks a check would disturb.)\n if (build !== theirs && !rendersHere(build)) throw Object.assign(new Error(\"[Unlayer] react-dom can't render with this React (React Server Components', as in Next.js's edge runtime): render emails in the Node.js runtime.\"), { cause: error });\n throw error;\n } finally {\n using.length -= busy.length + 1;\n }\n}\n\n/** Whether `build` can render a component here (one that isn't rendering, so its render disturbs none). */\nfunction rendersHere(build: Build): boolean {\n try {\n build.renderToStaticMarkup(React.createElement(() => null));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction current(): Build {\n return using[using.length - 1] ?? defaultBuild;\n}\n\nexport const renderToString: Build[\"renderToString\"] = (element, options) => current().renderToString(element, options);\n","/**\n * One render's scope (the render that collects a template for render(), validate(), outline(), prepare() and\n * toDesign()): it runs with a module of react-dom's that isn't rendering, apart from any template being collected\n * around it.\n */\nimport { within } from \"./collect\";\nimport { withBuild } from \"./server-renderer\";\n\n/**\n * Runs one render, apart from a template being collected: called inside a component of one, it renders what it's\n * given.\n */\nexport function withRenderScope<T>(render: () => T): T {\n // Called in a render (a component of the user's own calling toDesign() in its useMemo, while the app renders it),\n // it renders with a server build that isn't rendering (see server-renderer.ts). The build is chosen first: whether a\n // template is being collected tells who calls it.\n return withBuild(() => within(null, render));\n}\n","/**\n * JSX → Elements document. One React render: each primitive records its props\n * and renders markers around its children, and React renders everything else\n * (the user's components, hooks, Context, Fragments, arrays), so the document\n * holds what React would show. The markers and the text between them are then\n * read back into nodes, and the result is checked like any JSON document.\n *\n * A stack shared by every copy of Elements in a process, not React context:\n * Server Components have no context.\n */\nimport React from \"react\";\nimport { checkDocument, Registry, type CheckResult, type CustomDefinition, type Diagnostic } from \"@unlayer-internal/elements-core\";\nimport { isAsyncComponent, nonce, within } from \"../utils/collect\";\nimport { renderToString } from \"../utils/server-renderer\";\nimport { withRenderScope } from \"../utils/render-scope\";\n\ninterface Recorded {\n type: string;\n props: Record<string, unknown>;\n}\n\ninterface PrimitiveCollection {\n nonce: string;\n recorded: Recorded[];\n /** The custom components the JSX used. */\n components: Map<string, CustomDefinition<any>>;\n /** Types two different custom components were both made with. */\n clashes: Set<string>;\n /** An async component was left out (not called: React would drop the promise it returns, unhandled). */\n async?: boolean;\n}\n\nconst SHARED = Symbol.for(\"@hyper-elements/react/primitives/collecting\");\nconst frames = ((globalThis as Record<symbol, unknown>)[SHARED] ??= []) as PrimitiveCollection[];\n\nexport function collectingPrimitives(): PrimitiveCollection | undefined {\n return frames[frames.length - 1];\n}\n\nconst MARK = \"elements-node\";\n\nfunction marker(collection: PrimitiveCollection, at: number, edge: \"o\" | \"c\"): React.ReactElement {\n return React.createElement(MARK, { key: `${at}${edge}`, \"data-n\": collection.nonce, \"data-i\": at, \"data-e\": edge });\n}\n\n/** A custom component the JSX being collected uses. */\nexport function registerUsed(collection: PrimitiveCollection, definition: CustomDefinition<any>): void {\n const known = collection.components.get(definition.type);\n // (A frame made by an older copy of Elements has no clashes.)\n if (known && known !== definition) (collection.clashes ??= new Set()).add(definition.type);\n else collection.components.set(definition.type, definition);\n}\n\n/** What a primitive renders while JSX is collected: its props recorded, markers around its children. */\nexport function recordPrimitive(collection: PrimitiveCollection, type: string, props: Record<string, unknown>): React.ReactElement {\n const { children, ...rest } = props;\n const at = collection.recorded.push({ type, props: rest }) - 1;\n return React.createElement(React.Fragment, null, marker(collection, at, \"o\"), withoutAsync(children as React.ReactNode, collection), marker(collection, at, \"c\"));\n}\n\nconst PROVIDER = Symbol.for(\"react.provider\");\nconst CONTEXT = Symbol.for(\"react.context\");\n\n/**\n * React's own wrappers, which render their children as they are: Fragment, Suspense, StrictMode, Profiler, a\n * context's provider (a consumer's child is a function, called with the value).\n */\nfunction wraps(element: React.ReactElement): boolean {\n const type = element.type as unknown;\n if (typeof (element.props as { children?: unknown }).children === \"function\") return false;\n const kind = (type as { $$typeof?: symbol } | null)?.$$typeof;\n return typeof type === \"symbol\" || kind === PROVIDER || kind === CONTEXT;\n}\n\nconst childrenOf = (element: React.ReactElement) => (element.props as { children?: React.ReactNode }).children;\n\n/** Whether children hold an async component, directly or in React's own wrappers. */\nfunction holdsAsync(children: React.ReactNode): boolean {\n let found = false;\n React.Children.forEach(children, (child) => {\n if (!found && React.isValidElement(child)) found = isAsyncComponent(child.type) || (wraps(child) && holdsAsync(childrenOf(child)));\n });\n return found;\n}\n\n/**\n * A primitive's children with the async components among them (in React's own wrappers too) left out, and\n * noted: React would call them and drop the promise they return, whose rejection would then go unhandled.\n * Children without one stay as they are (rebuilt, they'd move useId's ids). One inside a component of the\n * user's own is called by React, and reported as React fails on it.\n */\nfunction withoutAsync(children: React.ReactNode, collection: PrimitiveCollection): React.ReactNode {\n if (!holdsAsync(children)) return children;\n collection.async = true;\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n if (isAsyncComponent(child.type)) return null;\n return wraps(child) ? React.cloneElement(child, undefined, withoutAsync(childrenOf(child), collection)) : child;\n });\n}\n\nconst ENTITIES: Record<string, string> = { \"&\": \"&\", \"<\": \"<\", \">\": \">\", \""\": '\"', \"'\": \"'\" };\nconst unescape = (text: string) => text.replace(/&|<|>|"|'/g, (entity) => ENTITIES[entity]);\n\n/**\n * Where a node's own keys go: the rest of its JSX props are its semantic props. Phone and hover styles are blocks of its\n * style; a mobile={…} or hover={…} prop is an unknown prop, whose message says so.\n */\nconst NODE_KEYS = new Set([\"id\", \"style\", \"hidden\"]);\n\nexport interface JsonNode {\n type: string;\n [key: string]: unknown;\n children: Array<JsonNode | string>;\n}\n\nfunction toJsonNode({ type, props }: Recorded, diagnostics: Diagnostic[]): JsonNode {\n const node: JsonNode = { type, children: [] };\n const semantic: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (value === undefined) continue;\n // What Elements 0.2's components gave the writers as they lowered into the tree (markup and CSS): the engine has\n // none now, and a template never had a say in it.\n if (key === \"compat\") diagnostics.push({ code: \"jsx/compat\", severity: \"warning\", message: `A <${type}>'s compat isn't a prop of a template: it's left out`, path: \"jsx\" });\n else if (NODE_KEYS.has(key)) node[key] = value;\n else semantic[key] = value;\n }\n if (Object.keys(semantic).length) node.props = semantic;\n return node;\n}\n\n/** The markers and text of a collected render, as JSON nodes; markup that isn't a primitive is reported. */\nfunction read(html: string, collection: PrimitiveCollection, diagnostics: Diagnostic[]): Array<JsonNode | string> {\n const pattern = new RegExp(`<${MARK} data-n=\"${collection.nonce}\" data-i=\"(\\\\d+)\" data-e=\"([oc])\"></${MARK}>`, \"g\");\n const top: Array<JsonNode | string> = [];\n const open: Array<{ node: JsonNode | null; children: Array<JsonNode | string> }> = [{ node: null, children: top }];\n let last = 0;\n const text = (between: string) => {\n if (!between) return;\n const into = open[open.length - 1];\n // What an Html block holds is its markup, as React writes it.\n if (into.node?.type === \"Html\") {\n const props = (into.node.props ??= {}) as Record<string, unknown>;\n props.html = `${typeof props.html === \"string\" ? props.html : \"\"}${between}`;\n return;\n }\n if (/<[a-zA-Z!/]/.test(between)) {\n const where = into.node ? `in a ${into.node.type}` : \"around the root\";\n diagnostics.push({\n code: \"jsx/markup\",\n severity: \"error\",\n message: `HTML ${where} isn't part of an Elements document: use the primitives (Text, Link, Image, …) instead of ${JSON.stringify(between.slice(0, 60))}. Every component: @hyper-elements/react/GUIDE.md`,\n path: \"jsx\",\n });\n return;\n }\n into.children.push(unescape(between));\n };\n for (const match of html.matchAll(pattern)) {\n text(html.slice(last, match.index));\n last = match.index! + match[0].length;\n if (match[2] === \"o\") {\n const node = toJsonNode(collection.recorded[Number(match[1])], diagnostics);\n open[open.length - 1].children.push(node);\n open.push({ node, children: node.children });\n } else open.pop();\n }\n text(html.slice(last));\n return top;\n}\n\n/**\n * React's own comments in renderToString's output (between text nodes, around Suspense and Activity boundaries).\n * The template's content never holds one: React escapes text and attributes.\n */\nconst COMMENTS = /<!--[\\s\\S]*?-->/g;\n/** What React throws for an async component, or one that suspends outside a <Suspense> (its own words, or its production code's). */\nconst ASYNC_ERROR =\n /^(?:Objects are not valid as a React child \\(found: \\[object Promise\\]\\)|A component suspended while responding to synchronous input|Minified React error #426\\b|Minified React error #31\\b.*%5Bobject%20Promise%5D)/;\nconst ASYNC_MESSAGE =\n \"A component is async or suspends (an async function, React.lazy, use()): render() doesn't wait for it yet. Load its data first and pass it in as props\";\n/** Why React didn't finish a Suspense boundary, when it says (development builds): it was waiting for something. */\nconst SUSPENDED = /does not support Suspense|did not finish this Suspense boundary/;\n\n/**\n * The Suspense boundaries React didn't finish (`<!--$!-->` … `<!--/$-->`, its fallback in place of the content)\n * taken out, with the reason React gives for each in development (`<template data-msg>`), else \"\".\n */\nfunction unfinished(html: string): { html: string; reasons: string[] } {\n const reasons: string[] = [];\n let [out, at] = [\"\", 0];\n for (let start = html.indexOf(\"<!--$!-->\"); start >= 0; start = html.indexOf(\"<!--$!-->\", at)) {\n out += html.slice(at, start);\n reasons.push(unescape(/^<!--\\$!--><template[^>]*?\\bdata-msg=\"([^\"]*)\"/.exec(html.slice(start))?.[1] ?? \"\"));\n // To the boundary's own end: boundaries can nest.\n const marks = /<!--(\\$[!?]?|\\/\\$)-->/g;\n marks.lastIndex = start;\n let depth = 0;\n for (let mark = marks.exec(html); mark; mark = marks.exec(html)) {\n depth += mark[1] === \"/$\" ? -1 : 1;\n if (depth === 0) break;\n }\n at = depth === 0 ? marks.lastIndex : html.length;\n }\n return { html: out + html.slice(at), reasons };\n}\n\n/** A boundary that didn't finish: something in it was async or suspended, or threw (React says which in development). */\nfunction unfinishedDiagnostic(reason: string): Diagnostic {\n const said = reason.replace(/^Switched to client rendering because the server rendering errored:\\s*/, \"\");\n // (What React threw there can be its own words for an async component inside a component of the user's.)\n const thrown = reason && !SUSPENDED.test(reason) && !ASYNC_ERROR.test(said) ? said : \"\";\n if (thrown) return { code: \"jsx/error\", severity: \"error\", message: `A component inside <Suspense> threw: ${thrown}`, path: \"jsx\" };\n const message = reason ? ASYNC_MESSAGE : `${ASYNC_MESSAGE}. (With React's production build, a component that threw inside <Suspense> looks the same: check it too.)`;\n return { code: \"jsx/async\", severity: \"error\", message, path: \"jsx\" };\n}\n\n/** JSX rendered once, read back as JSON nodes, with the custom components it used. */\nexport function collectNodes(element: React.ReactElement): {\n nodes: Array<JsonNode | string>;\n components: CustomDefinition<any>[];\n diagnostics: Diagnostic[];\n /** Nothing was collected, for a reason already said: React couldn't render it, or all of it suspended. */\n aborted?: boolean;\n} {\n const diagnostics: Diagnostic[] = [];\n const collection: PrimitiveCollection = { nonce: nonce(), recorded: [], components: new Map(), clashes: new Set() };\n let html: string;\n try {\n html = withRenderScope(() => {\n frames.push(collection);\n try {\n // On the shared stack too: a component that renders another template inside this one (toDesign() in a\n // useMemo) renders it with another module of react-dom's, so the hooks after it keep theirs (withBuild).\n return within(collection, () => renderToString(element));\n } finally {\n frames.pop();\n }\n });\n } catch (error) {\n // An async component's promise isn't a child React can render; React 18 and 19 say so in their own words.\n if (!ASYNC_ERROR.test(String((error as Error | undefined)?.message))) throw error;\n diagnostics.push({ code: \"jsx/async\", severity: \"error\", message: ASYNC_MESSAGE, path: \"jsx\" });\n return { nodes: [], components: [...collection.components.values()], diagnostics, aborted: true };\n }\n if (collection.async) diagnostics.push({ code: \"jsx/async\", severity: \"error\", message: ASYNC_MESSAGE, path: \"jsx\" });\n // A Suspense boundary that didn't finish: React wrote its fallback in place of the content. Neither is read.\n const done = unfinished(html);\n for (const reason of done.reasons) {\n const diagnostic = unfinishedDiagnostic(reason);\n // The same problem in several places is said once.\n if (!diagnostics.some((d) => d.code === diagnostic.code && d.message === diagnostic.message)) diagnostics.push(diagnostic);\n }\n const nodes = read(done.html.replace(COMMENTS, \"\"), collection, diagnostics).filter((child) => typeof child !== \"string\" || child.trim());\n for (const type of collection.clashes) {\n diagnostics.push({\n code: \"custom/duplicate\",\n severity: \"error\",\n message: `Two different custom components are named ${type}. If component() ran more than once (inside a function or a component, or in a module loaded twice), call it once, at the top of a module; if they're different components, give each its own type`,\n path: \"jsx\",\n });\n }\n // All of it was in a boundary that didn't finish: that says why there's no root.\n return { nodes, components: [...collection.components.values()], diagnostics, aborted: nodes.length === 0 && done.reasons.length > 0 };\n}\n\n\n/** A template collected from JSX: its tree (internal: never part of the API), the problems, the custom components it uses. */\nexport interface CollectedTemplate extends CheckResult {\n components: CustomDefinition<any>[];\n /**\n * The root as collected, before it's read: every component the JSX gave, those an error leaves out of `document`\n * too, at the paths diagnostics name (reading merges text and drops what's left out, so `document`'s may differ).\n */\n collected: JsonNode | null;\n}\n\n/** JSX collected into Elements' internal tree and checked, never throwing for what's in it. */\nexport function collectTemplate(element: React.ReactElement): CollectedTemplate {\n const { nodes: top, components, diagnostics, aborted } = collectNodes(element);\n if (top.length !== 1 || typeof top[0] === \"string\") {\n // (A render React couldn't do has already said why nothing was collected.)\n if (!aborted) {\n diagnostics.push({\n code: \"jsx/root\",\n severity: \"error\",\n message: top.length ? \"A template renders one root (an Email or a Page) and nothing beside it\" : \"The JSX rendered no Elements root (an Email or a Page)\",\n path: \"jsx\",\n });\n }\n return { document: null, diagnostics, components, collected: null };\n }\n const result = checkDocument({ root: top[0] }, new Registry(components));\n return { document: result.document, diagnostics: [...diagnostics, ...result.diagnostics], components, collected: top[0] };\n}\n","/**\n * `@hyper-elements/react/inspect`: what each root takes, and what a template holds, as data, without rendering\n * anything. For an agent's tool call or an editor: \"can I use this here?\" before writing, and \"is each part of this\n * template allowed in its root?\" after. Read from the components' definitions, the same ones validation and the\n * generated guide read, so the three agree. Synchronous; it loads no engine, browser or network.\n *\n * Every result carries `version`: its shape changes only with a new version.\n */\nimport React from \"react\";\nimport {\n componentRoots,\n describeComponent as describeOne,\n describeComponents as describeAll,\n describeConditions,\n Registry,\n validateTemplate,\n CONDITION_NAMES,\n CUSTOM_TYPE,\n ROOT_NAMES,\n type ComponentDescription,\n type ConditionName,\n type CustomDefinition,\n type Diagnostic,\n type PropertyDescription,\n type RootName,\n type StyleGroup,\n} from \"@unlayer-internal/elements-core\";\nimport { collectTemplate, type JsonNode } from \"../primitives/collect\";\n\nexport type { ComponentDescription, ConditionName, Diagnostic, PropertyDescription, RootName, StyleGroup };\n\n/** The shape of what this entry returns: a new version is a new shape. */\nexport const INSPECT_VERSION = 1;\n\n/** A template's own component (made with `component()`), described alongside the built-in ones. */\ninterface WithDefinition {\n definition: CustomDefinition<any>;\n}\n\nexport interface DescribeOptions {\n /** Only what this root takes, with phone styles only under a root that has phones. */\n root?: RootName;\n /** A template's own components (made with `component()`), described with the built-in ones. */\n components?: readonly WithDefinition[];\n}\n\nexport interface ConditionDescription {\n /** \"mobile\", \"hover\": the block of `style` it's written in. */\n name: ConditionName;\n /** \"on phones\", \"on hover\". */\n on: string;\n /** The roots it may be set under. */\n roots: RootName[];\n}\n\nexport interface ComponentsDescription {\n version: typeof INSPECT_VERSION;\n /** The root it's narrowed to, if one was given. */\n root?: RootName;\n /** The roots a template can have. */\n roots: RootName[];\n /** Each component, with its props and styles: their kinds, groups, defaults and the roots that take them. */\n components: ComponentDescription[];\n /** The style blocks a component may have besides its own style, and the roots that take each. */\n conditions: ConditionDescription[];\n}\n\n/** The core's options: the definitions of the components given, and the root. */\nconst coreOptions = (options: DescribeOptions) => ({ components: (options.components ?? []).map((component) => component.definition), ...(options.root ? { root: options.root } : {}) });\n\n/**\n * Every component a template can use (the built-in ones and those given), each with its props and styles: what\n * each takes, its group, its default, and the roots that take it. With `root`, only what that root takes.\n */\nexport function describeComponents(options: DescribeOptions = {}): ComponentsDescription {\n const conditions = describeConditions(coreOptions(options));\n return {\n version: INSPECT_VERSION,\n ...(options.root ? { root: options.root } : {}),\n roots: options.root ? [options.root] : [...ROOT_NAMES],\n components: describeAll(coreOptions(options)),\n conditions: options.root ? conditions.filter((condition) => condition.roots.includes(options.root!)).map((condition) => ({ ...condition, roots: [options.root!] })) : conditions,\n };\n}\n\n/** One component, as `describeComponents()` describes it; undefined where there's no such component, or `root` doesn't take it. */\nexport function describeComponent(type: string, options: DescribeOptions = {}): (ComponentDescription & { version: typeof INSPECT_VERSION }) | undefined {\n const described = describeOne(type, coreOptions(options));\n return described && { version: INSPECT_VERSION, ...described };\n}\n\nexport interface InspectedNode {\n /** Where it is, as diagnostics say it: \"root\", \"root.children[2]\". */\n path: string;\n type: string;\n id?: string;\n /** The roots its component may go in. */\n roots: RootName[];\n /** Whether the template's root takes it. */\n allowed: boolean;\n /** What it's given, as written: \"props.href\", \"style.padding\", \"mobile.fontSize\", \"hover.color\", \"hidden.mobile\". */\n given: string[];\n /** The problems found on it (its props, styles and blocks, and what it renders), not on its children. */\n problems: Diagnostic[];\n}\n\nexport interface Inspection {\n version: typeof INSPECT_VERSION;\n /** The template's root, or null where it has none Elements knows. */\n root: RootName | null;\n /** No errors (there may be warnings and notes), as `validate()` says. */\n valid: boolean;\n /**\n * Each component in the template, in document order, as written: one its root doesn't take is here too, with\n * `allowed: false` and its error in `problems`. Each `path` is the one diagnostics give.\n */\n nodes: InspectedNode[];\n /** Everything found, as `validate()` finds it. */\n diagnostics: Diagnostic[];\n}\n\n/**\n * What a template holds, as data: each component, what it's given, whether its root takes it, and the problems\n * found on it. It checks what `validate()` checks, without rendering.\n */\nexport function inspect(element: React.ReactElement): Inspection {\n if (!React.isValidElement(element)) {\n throw new TypeError(`[Elements] inspect() takes a template as JSX (<Email>…</Email>, <Page>…</Page>), not ${element === null ? \"null\" : typeof element}`);\n }\n const { document, diagnostics: read, components, collected } = collectTemplate(element);\n const failed = read.some((d) => d.severity === \"error\");\n const diagnostics = [...read, ...(document && !failed ? validateTemplate(document, { components }).diagnostics : [])];\n const registry = new Registry(components);\n const rootType = document?.root.type;\n const root = rootType && (ROOT_NAMES as readonly string[]).includes(rootType) ? (rootType as RootName) : null;\n const nodes: InspectedNode[] = [];\n const visit = (node: JsonNode, path: string) => {\n const definition = registry.get(node.type);\n const roots = definition ? componentRoots(definition, registry) : [];\n nodes.push({\n path,\n type: node.type,\n ...(typeof node.id === \"string\" && node.id ? { id: node.id } : {}),\n roots,\n allowed: !!root && roots.includes(root),\n given: given(node),\n problems: diagnostics.filter((diagnostic) => on(diagnostic.path, path)),\n });\n (Array.isArray(node.children) ? node.children : []).forEach((child, index) => {\n if (child && typeof child === \"object\") visit(child, `${path}.children[${index}]`);\n });\n };\n // The tree as collected, not as read: reading leaves out a component its root doesn't take (and merges text), and\n // what's listed here is every component written, at the paths diagnostics name.\n if (document && collected) visit(collected, \"root\");\n return { version: INSPECT_VERSION, root, valid: !diagnostics.some((d) => d.severity === \"error\"), nodes, diagnostics };\n}\n\n/**\n * The keys a node was given, by where they're written. A condition's block written in `style` (`style={{ mobile: { … } }}`)\n * is the condition's, as reading takes it; a template's own component takes no condition, so in its style it's a style.\n */\nfunction given(node: JsonNode): string[] {\n const keys = (prefix: string, values: unknown) => (values && typeof values === \"object\" && !Array.isArray(values) ? Object.keys(values).map((key) => `${prefix}.${key}`) : []);\n const style = node.style && typeof node.style === \"object\" && !Array.isArray(node.style) ? (node.style as Record<string, unknown>) : {};\n const lifts = !CUSTOM_TYPE.test(node.type);\n const own = Object.keys(style).filter((key) => !(lifts && CONDITION_NAMES.has(key)));\n const condition = (name: string) => [...keys(name, node[name]), ...(lifts ? keys(name, style[name]) : [])];\n return [...keys(\"props\", node.props), ...own.map((key) => `style.${key}`), ...condition(\"mobile\"), ...condition(\"hover\"), ...keys(\"hidden\", node.hidden)];\n}\n\n/** Whether a diagnostic's path is on a node itself (or what it renders), not on one of its children. */\nfunction on(diagnostic: string, node: string): boolean {\n if (diagnostic === node) return true;\n if (!diagnostic.startsWith(node)) return false;\n const rest = diagnostic.slice(node.length);\n return (rest.startsWith(\".\") || rest.startsWith(\"(\")) && !rest.startsWith(\".children[\");\n}\n"]}
|