@unlayer/react-elements 0.2.0 → 0.2.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/README.md +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/collect.ts","../src/utils/server-renderer.ts","../src/utils/unwrap-root.ts","../src/utils/record.tsx","../src/utils/image-sizing.ts","../../shared/src/config.ts","../../shared/src/layouts.ts","../../shared/src/utils/lexical-helpers.ts","../../shared/src/utils/merge-values.ts","../../shared/src/utils/css-values.ts","../../shared/src/utils/semantic-props.ts","../../shared/src/utils/html-to-text.ts","../src/utils/create-component.tsx","../src/components/Button.tsx","../src/components/Divider.tsx","../src/components/Heading.tsx","../src/components/Html.tsx","../src/components/Image.tsx","../src/components/Menu.tsx","../src/components/Paragraph.tsx","../src/components/PageBreak.tsx","../src/components/Social.tsx","../src/components/Table.tsx","../src/components/Video.tsx","../src/utils/container-defaults.ts","../src/utils/render-scope.ts","../src/components/Row.tsx","../src/components/Column.tsx","../src/utils/normalize.tsx","../src/components/Body.tsx","../src/components/Email.tsx","../src/components/Page.tsx","../src/components/Document.tsx","../src/context/UnlayerProvider.tsx","../src/utils/device-overrides.ts","../src/utils/render-to-json.ts","../src/utils/extract-head.ts","../src/utils/document-layouts.ts","../src/utils/render-to-html.tsx","../src/utils/register-tool.tsx"],"names":["React","SHARED","element","current","at","collected","parts","childrenHtml","text","componentName","named","jsxs","size","DEFAULT_VALUES","css","jsx","nonce","guarded","markup","Fragment","_schemaVersion","name","collectChildren"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The render that collects a template's Rows, Columns and blocks (see\n * normalize.tsx). While one runs, those components record their props and\n * render markers instead of HTML; React renders everything else (the user's\n * components, Fragments, conditions, Context). A render of Elements' own\n * inside it (a row's HTML, a nested renderToHtml) is under `null`: nothing is\n * collected there. A stack, not React context: Server Components have no\n * context, and a collecting render can start inside another.\n */\nimport React from \"react\";\n\nexport type Recorded =\n | { kind: \"row\" | \"column\"; props: Record<string, any> }\n | { kind: \"block\"; type: React.ComponentType<any>; props: Record<string, any> }\n | { kind: \"boundary\"; element: React.ReactElement };\n\nexport interface Collection {\n /** In each marker, so markup a template writes can't pass for one. */\n nonce: string;\n recorded: Recorded[];\n /** Markup is guarded too, as components are (a render once more after one threw: see normalize.tsx's `collected`). */\n markup?: boolean;\n /**\n * The React Elements' components call isn't the renderer's (a bundler gave them other copies, as Next.js's\n * server layers can): `useId()` can't tell this render from one inside it, so Rows, Columns and blocks record\n * while it's collecting.\n */\n blind?: boolean;\n}\n\n// Shared by every copy of Elements a process loads (a project's ESM and CommonJS builds, a tool's own): a render one\n// copy starts collects the Rows, Columns and blocks another's template uses.\nconst SHARED = Symbol.for(\"@unlayer/react-elements/collecting\");\nconst frames: Array<Collection | null> = ((globalThis as Record<symbol, unknown>)[SHARED] ??= []) as Array<Collection | null>;\n\n/** The collecting render under way, if any (and not a render of Elements' own inside it). */\nexport function collecting(): Collection | 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: Collection | null, run: () => T): T {\n frames.push(frame);\n try {\n return run();\n } finally {\n frames.pop();\n }\n}\n\nexport const MARK = \"unlayer-mark\";\n\n/**\n * On the Rows, Columns and blocks that record themselves while a template is collected (0.2 and later). One of an\n * older copy (0.1.x, from a package still on it) doesn't, and guard records it in its place (see record.tsx).\n */\nexport const RECORDS = Symbol.for(\"@unlayer/react-elements/records\");\n\n/**\n * The collecting render's `identifierPrefix`: React puts it at the start of every `useId()` there (after its\n * opening `:` or `«`), so a Row, Column or block can tell that render from another one started inside it (a\n * component rendering a block to a string with react-dom), where it renders what it renders instead of a\n * marker. React's own ids never hold a \"-\", so none of them starts with it.\n */\nexport const COLLECTING_ID = \"unlayer-collect-\";\n\n/**\n * A marker for what's recorded at `at`: its start (\"o\"), end (\"c\"), a component that failed (\"f\"), or a block.\n * React writes its attributes in this order, which the patterns that find markers in HTML spell out exactly\n * (normalize.tsx): nothing looser, as they run on HTML that holds the template's own.\n */\nexport function marker(collection: Collection, at: number, edge?: \"o\" | \"c\" | \"f\"): React.ReactElement {\n return React.createElement(MARK, { key: `${at}${edge ?? \"\"}`, \"data-n\": collection.nonce, \"data-i\": at, ...(edge ? { \"data-e\": edge } : {}) });\n}\n","/**\n * The server renderer Elements renders with: react-dom/server, as in 0.1.22, loaded the same way and doing nothing\n * when it 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(() => renderToJson(<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(\"@unlayer/react-elements/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 an Elements render collects),\n * it takes another one, which mustn't be rendering either (a third level: it can't). Otherwise (no render under way,\n * the app's streaming render or a client one, or one of Elements' own renders, whose components call no hooks after)\n * it keeps the one it's in.\n */\nexport function withBuild<T>(render: () => T, own = false): T {\n const outer = own ? null : dispatcher();\n let build = current();\n // Elements' own component (Body, rendered by the app's react-dom/server), which calls no hooks after: the module\n // it's in, as in 0.1.22 (a browser bundle has no other).\n const theirs = !own && (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, as 0.1.22 rendered there. The component calling it then can't call a hook after the call\n // (React throws, as it did with 0.1.22's renderToHtml).\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 renderToStaticMarkup: Build[\"renderToStaticMarkup\"] = (element, options) => current().renderToStaticMarkup(element, options);\nexport const renderToString: Build[\"renderToString\"] = (element, options) => current().renderToString(element, options);\n","/**\n * Template components (`<Welcome />`, `memo`, `forwardRef`) unwrapped down to\n * their root element. `renderToJson` walks the element tree and `renderToHtml`\n * reads the root's settings (fonts, language, direction, phone styles) from it,\n * so a wrapper is called first to reach <Email>/<Page>/<Document>/<Body>.\n */\n\nimport React from \"react\";\nimport { renderToStaticMarkup } from \"./server-renderer\";\nimport { UNLAYER_RENDER_KEY } from \"./create-component\";\nimport { RECORDS } from \"./collect\";\n\n/** The root components a design starts from. */\nexport const ROOT_NAMES = new Set([\"Body\", \"Email\", \"Page\", \"Document\"]);\nconst CONTAINER_NAMES = new Set([...ROOT_NAMES, \"Row\", \"Column\"]);\nexport const MEMO = Symbol.for(\"react.memo\");\nexport const FORWARD_REF = Symbol.for(\"react.forward_ref\");\n/** A context's provider: `<Ctx.Provider>` in React 18, `<Ctx>` (and `<Ctx.Provider>`, the same) in React 19. */\nconst PROVIDER = Symbol.for(\"react.provider\");\nconst CONTEXT = Symbol.for(\"react.context\");\n\n/**\n * The Elements component an element is, by the `displayName` Elements gives\n * each of its own: a user function that happens to be named `Email` or `Row`\n * (a template, a wrapper) isn't one, and is called like any component.\n */\nexport function getDisplayName(element: React.ReactElement): string | undefined {\n return (element.type as any)?.displayName;\n}\n\n/** A component's name, for messages. */\nexport function componentName(element: React.ReactElement): string | undefined {\n const type = element.type as any;\n return type?.displayName || type?.name;\n}\n\n/** Whether a component type is an Elements component (a root, a container or a content block). */\nexport function isElementsType(type: any): boolean {\n return !!type?.[UNLAYER_RENDER_KEY] || CONTAINER_NAMES.has(type?.displayName);\n}\n\n/** Whether the element is an Elements component (a root, a container or a content block). */\nfunction isElementsComponent(element: React.ReactElement): boolean {\n return isElementsType(element.type);\n}\n\n/** Thrown for a template that is async or suspends: renderToHtml renders synchronously. */\nconst ASYNC_TEMPLATE =\n \"async and suspending templates aren't supported: load the data first and pass it as props\";\n\nexport const isThenable = (value: unknown): boolean => typeof (value as { then?: unknown } | null)?.then === \"function\";\n\n/** A promise a component gave back, which Elements doesn't wait for: its rejection mustn't end the process. */\nconst settle = (value: unknown): void => {\n if (isThenable(value)) (value as PromiseLike<unknown>).then(undefined, () => {});\n};\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/**\n * Call a template component in a throwaway render of its own. Its hooks run\n * there, never on the component that is rendering when renderToHtml is called\n * (a live preview in `useMemo`), whose hooks they would otherwise corrupt.\n * Components called in renders of their own each need their own `prefix`, or\n * their `useId()` values repeat in the document.\n */\nexport function callIsolated(call: () => unknown, prefix?: string, providers: React.ReactElement[] = []): unknown {\n let result: unknown;\n let error: unknown;\n let ran = false;\n let threw = false;\n let calling = false;\n const Probe = () => {\n // React's development build calls a component again from inside its render, with hooks off, to say where a warning\n // came from (an undefined component, a list without keys): that call fails where the render didn't. A render React\n // starts again (the template set its state while it rendered) counts, as its last one does in React.\n if (calling) return null;\n ran = calling = true;\n threw = false;\n try {\n result = call();\n } catch (cause) {\n threw = true;\n error = cause;\n } finally {\n calling = false;\n }\n return null;\n };\n // Inside the context providers around it, so a template that reads their context gets their values.\n const probe = providers.reduceRight<React.ReactElement>((inside, provider) => React.cloneElement(provider, undefined, inside), React.createElement(Probe));\n renderToStaticMarkup(probe, prefix ? { identifierPrefix: prefix } : undefined);\n settle(error);\n settle(result);\n if (threw) throw isThenable(error) ? new Error(ASYNC_TEMPLATE) : error;\n if (!ran) throw new Error(\"the template wasn't rendered\");\n if (isThenable(result)) throw new Error(ASYNC_TEMPLATE);\n return result;\n}\n\n/**\n * Call wrapper components (plain functions, `memo`, `forwardRef`, nested in any\n * order) until a root element comes out, each in a render of its own (so its\n * hooks work). Returns the element it stops at, which isn't a root when a\n * wrapper can't be called (a class) or doesn't return an element (null, an\n * array). Throws what a wrapper throws, and for an async template.\n */\nexport function unwrapRoot(element: React.ReactElement, why: { unread?: string } = {}): React.ReactElement {\n let current = element;\n // Context providers around the root (`<Theme.Provider value=\"dark\"><Email>…`): the root's content goes in them.\n const providers: React.ReactElement[] = [];\n for (let depth = 0; ; depth++) {\n if (ROOT_NAMES.has(getDisplayName(current) ?? \"\")) break;\n // A Row or block: what it renders is Elements' own, never a root.\n if (elementsOwn(current)) break;\n if (depth === 20) {\n why.unread = \"it wraps more than 20 components\";\n break;\n }\n const type = current.type as any;\n const props = current.props as Record<string, unknown>;\n if (type?.$$typeof === MEMO) {\n current = React.createElement(type.type, props);\n continue;\n }\n if ((type?.$$typeof === PROVIDER || type?.$$typeof === CONTEXT) && \"value\" in props) {\n const inside = React.Children.toArray(props.children as React.ReactNode);\n if (inside.length !== 1 || !React.isValidElement(inside[0])) break;\n providers.push(current);\n current = inside[0];\n continue;\n }\n // A Fragment, StrictMode or Profiler around the template (`<><Welcome /></>`): what's in it, when that's one\n // element. They add nothing to a server render.\n if (type === React.Fragment || type === React.StrictMode || type === React.Profiler) {\n const inside = React.Children.toArray(props.children as React.ReactNode);\n if (inside.length !== 1 || !React.isValidElement(inside[0])) break;\n current = inside[0];\n continue;\n }\n let produced: unknown;\n // Each wrapper renders on its own: one inside another gets its own `useId()` prefix (the first keeps React's).\n const prefix = depth ? `w${depth}-` : undefined;\n if (type?.$$typeof === FORWARD_REF) produced = callIsolated(() => type.render({ ...props }, null), prefix, providers);\n else if (typeof type === \"function\" && !type.prototype?.isReactComponent) produced = callIsolated(() => type({ ...props }), prefix, providers);\n else {\n if (type?.prototype?.isReactComponent) why.unread = `<${componentName(current)}> is a class component, which isn't called to find it`;\n break;\n }\n if (!React.isValidElement(produced)) {\n if (holdsRoot(produced as React.ReactNode)) why.unread = \"it doesn't return a root element\";\n break;\n }\n current = produced;\n }\n if (!providers.length || !ROOT_NAMES.has(getDisplayName(current) ?? \"\")) return current;\n const children = providers.reduceRight<React.ReactNode>((inside, provider) => React.cloneElement(provider, undefined, inside), (current.props as { children?: React.ReactNode }).children);\n return React.cloneElement(current, undefined, children);\n}\n\n/** Elements' own Row, Column or block (not a component of the user's own named like one, which is called). */\nconst elementsOwn = (element: React.ReactElement): boolean => {\n const type = element.type as any;\n return !!(type?.[UNLAYER_RENDER_KEY] || type?.[RECORDS]);\n};\n\n/** Whether a root element is somewhere in `node` (markup, Fragments, arrays, providers), whose settings would go unread. */\nfunction holdsRoot(node: React.ReactNode): boolean {\n if (Array.isArray(node)) return node.some(holdsRoot);\n if (!React.isValidElement(node)) return false;\n return ROOT_NAMES.has(getDisplayName(node) ?? \"\") || (!elementsOwn(node) && holdsRoot((node.props as { children?: React.ReactNode }).children));\n}\n\n/** The advice both render functions give when a wrapper can't be unwrapped. */\nexport const UNWRAP_ADVICE = \"Pass the root element (<Email>…</Email>), or a function component that returns one.\";\n\n/**\n * For renderToHtml: the root a template component unwraps to. An element that\n * is already an Elements component (or plain HTML) is returned as it is. When\n * a wrapper can't be unwrapped it's rendered through React as before, with a\n * warning: its root's settings aren't read.\n */\nexport function htmlRoot(element: React.ReactElement, api: string): React.ReactElement {\n if (typeof element.type === \"string\" || isElementsComponent(element)) return element;\n let reason: string;\n try {\n const why: { unread?: string } = {};\n const root = unwrapRoot(element, why);\n if (ROOT_NAMES.has(getDisplayName(root) ?? \"\")) return root;\n // A template of Rows, or nothing: there's no root whose settings go unread.\n if (!why.unread && !holdsRoot(root)) return element;\n reason = why.unread ?? \"its root is inside other markup\";\n } catch (cause) {\n // An async template can't be rendered through React either: say why.\n if (cause instanceof Error && cause.message === ASYNC_TEMPLATE) throw new Error(`[Unlayer] ${api}: ${ASYNC_TEMPLATE}.`);\n reason = cause instanceof Error ? cause.message : String(cause);\n }\n console.warn(`[Unlayer] ${api}: couldn't unwrap <${componentName(element) || \"wrapper\"}> (${reason}): its root's fonts, lang, dir and phone styles are ignored. ${UNWRAP_ADVICE}`);\n return element;\n}\n","/**\n * What Rows, Columns and blocks render while a template is collected (see\n * collect.ts): they record their props, and render markers around what React\n * renders inside them.\n */\nimport React, { Suspense } from \"react\";\nimport { collecting, COLLECTING_ID, marker, RECORDS, within, type Collection } from \"./collect\";\nimport { isAsyncComponent, isElementsType } from \"./unwrap-root\";\n\n/**\n * Children with each component Elements doesn't know wrapped: markers that\n * say where its output starts and ends, inside a Suspense whose fallback (a\n * marker) stands for it when it throws, suspends or is async, so it's left\n * out and the rest renders. Fragments are kept, their children wrapped too.\n */\nexport function guard(children: React.ReactNode, collection: Collection, inContainer = false): React.ReactNode {\n return React.Children.toArray(children).map((child) => {\n const placed = guarded(child, collection, inContainer);\n // The template's own element, placed in this list: a copy, with the key the list gave it. React 19 warns about an\n // element of a list without keys (`items.map(…)`) wherever it's rendered, on every render, and 0.1.22 never\n // rendered the template's lists: a static render has nothing to match keys for.\n return placed === child && React.isValidElement(child) ? React.cloneElement(child) : placed;\n });\n}\n\n/** One child of `guard`'s list. */\nfunction guarded(child: React.ReactNode, collection: Collection, inContainer: boolean): React.ReactNode {\n if (!React.isValidElement(child)) return child;\n if (isElementsType(child.type)) {\n if ((child.type as unknown as Record<symbol, unknown>)[RECORDS]) return child;\n // A component of the user's own named Row or Column (its displayName): rendered as React renders it.\n if (!olderContainer(child.type)) return bounded(child, collection);\n return recordedForOlder(child, collection, inContainer);\n }\n // No component at all (`undefined` from a broken or circular import): React says so and the render fails, as an\n // email missing a block shouldn't send. Only what can render gets a boundary that leaves it out.\n if (!child.type || (typeof child.type === \"object\" && !(\"$$typeof\" in child.type))) return child;\n if (typeof child.type === \"string\") {\n // Markup with a component of the user's own in it (`<div><Promo /></div>`): that component gets its own too.\n const inside = (child.props as { children?: React.ReactNode }).children;\n const element = inside !== undefined && hasComponent(inside) ? React.cloneElement(child, undefined, guard(inside, collection, inContainer)) : child;\n // Markup React rejects (`<hr style=\"…\">` as a string) throws out of the render: guarded too when it did.\n return collection.markup ? bounded(element, collection) : element;\n }\n if (child.type === React.Fragment) {\n return React.createElement(React.Fragment, { key: child.key }, guard((child.props as { children?: React.ReactNode }).children, collection, inContainer));\n }\n return bounded(child, collection);\n}\n\n/** `child` between markers, in a Suspense whose fallback (a marker) stands for it when it throws or suspends. */\nfunction bounded(child: React.ReactElement, collection: Collection): React.ReactNode {\n const at = collection.recorded.push({ kind: \"boundary\", element: child }) - 1;\n // An async component is left out without calling it: it can't render synchronously, and React 18 leaves\n // the promise it gives back unhandled (its rejection would end the process).\n if (isAsyncComponent(child.type)) return marker(collection, at, \"f\");\n return React.createElement(\n Suspense,\n { key: child.key ?? `b${at}`, fallback: marker(collection, at, \"f\") },\n marker(collection, at, \"o\"),\n child,\n marker(collection, at, \"c\")\n );\n}\n\n/**\n * A Row, Column or block of an older copy of Elements (0.1.x, from a package still on it), which renders its HTML\n * instead of recording itself: recorded here as this copy's would, so it's in the HTML and the design (rendered by\n * this copy's Row and Column, and by the block's own exporter).\n */\n/**\n * Whether a type named Row or Column is an older copy's (0.1.x marks them only by name): their code reads the\n * config Body passes them (`_config`), which a component of the user's own named after one doesn't. Blocks and\n * roots are marked otherwise (`__unlayerRender`, and roots aren't recorded).\n */\nfunction olderContainer(type: unknown): boolean {\n return !/^(Row|Column)$/.test((type as { displayName?: string } | null)?.displayName ?? \"\") || /\\b_config\\b/.test(String(type));\n}\n\nfunction recordedForOlder(child: React.ReactElement, collection: Collection, inContainer: boolean): React.ReactNode {\n const type = child.type as unknown as { displayName?: string; __unlayerRender?: unknown };\n const props = child.props as Record<string, any>;\n if (type.displayName === \"Row\" || type.displayName === \"Column\") {\n const at = collection.recorded.push({ kind: type.displayName === \"Row\" ? \"row\" : \"column\", props }) - 1;\n return (\n <React.Fragment key={child.key ?? `r${at}`}>\n {marker(collection, at, \"o\")}\n {guard(props.children, collection, true)}\n {marker(collection, at, \"c\")}\n </React.Fragment>\n );\n }\n // A root (Email, Page, Document) placed in a Row or Column: left out, as 0.1.22 left it out, saying so. Among the\n // rows (`<Email><Email>…</Email></Email>`) it renders as it renders, as 0.1.22 rendered it.\n if (!type.__unlayerRender && !inContainer) return child;\n if (!type.__unlayerRender) {\n console.warn(`[Unlayer] <${type.displayName}> is a root: it can't be placed in a Row or Column, so it's left out.`);\n return null;\n }\n const at = collection.recorded.push({ kind: \"block\", type: child.type as React.ComponentType<any>, props }) - 1;\n return React.cloneElement(marker(collection, at), { key: child.key ?? `b${at}` });\n}\n\n/** Whether there's a component of the user's own in `children`, in markup or Fragments (not in Elements' own). */\nfunction hasComponent(children: React.ReactNode): boolean {\n return React.Children.toArray(children).some(\n (child) =>\n React.isValidElement(child) &&\n (typeof child.type === \"string\" || child.type === React.Fragment ? hasComponent((child.props as { children?: React.ReactNode }).children) : !isElementsType(child.type))\n );\n}\n\n/**\n * What a Row, Column or block renders while a template is collected: in the collecting render (its ids carry\n * COLLECTING_ID), what `record` gives; in any other render started inside it, what it renders anyway (`real`,\n * called with nothing collecting). When it can't tell, it renders what it renders: a marker never leaves the\n * collecting render.\n */\nfunction Sentinel({ record, real }: { record: () => React.ReactNode; real: () => React.ReactNode }): React.ReactNode {\n // Where ids can't tell (another copy of React: see Collection.blind), it records while collecting: a marker in a\n // render started inside the collecting one is then rendered in its place (normalize.tsx).\n let collected = !!collecting()?.blind;\n if (!collected) {\n try {\n collected = React.useId().slice(1).startsWith(COLLECTING_ID);\n } catch {\n // Not in a render React runs: what it renders.\n }\n }\n return collected ? record() : within(null, real);\n}\n\n/** Sentinel by the name of the component it stands for, which React's warnings name (`Check the render method of Column`). */\nconst named = new Map<string, typeof Sentinel>();\n\n/** A Row, Column or block, while a template is collected (see Sentinel). */\nexport function whileCollecting(record: () => React.ReactNode, real: () => React.ReactNode, name: string): React.ReactElement {\n let type = named.get(name);\n if (!type) named.set(name, (type = Object.assign((props: Parameters<typeof Sentinel>[0]) => Sentinel(props), { displayName: name })));\n return React.createElement(type, { record, real });\n}\n\n/** A Row or Column while collecting: its props, and markers around its children. */\nexport function recordContainer(kind: \"row\" | \"column\", props: Record<string, any>): React.ReactElement {\n const collection = collecting()!;\n const at = collection.recorded.push({ kind, props }) - 1;\n return (\n <>\n {marker(collection, at, \"o\")}\n {guard(props.children, collection, true)}\n {marker(collection, at, \"c\")}\n </>\n );\n}\n\n/** A block while collecting: its props, and a marker in its place. */\nexport function recordBlock(type: React.ComponentType<any>, props: Record<string, any>): React.ReactElement {\n const collection = collecting()!;\n const at = collection.recorded.push({ kind: \"block\", type, props }) - 1;\n return marker(collection, at);\n}\n","/**\n * Image display-width resolution.\n *\n * In Unlayer's value model an image's display size is `autoWidth` + `maxWidth`,\n * kept separate from the natural `src.width`/`height`. A fixed display size is\n * `autoWidth: false` with `maxWidth` as a PERCENT of the column's content slot\n * (e.g. `\"50%\"`) — not the natural-size field. Encoding a fixed width that way\n * keeps it stable when the design JSON is opened in an editor, which treats\n * `src.width`/`height` as the intrinsic dimensions and may refresh them.\n *\n * Authors pass pixels, so a px pin is captured as `{ autoWidth:false,\n * maxWidth:<px> }` and converted here to the equivalent percent using the same\n * available-width geometry the renderers use (contentWidth × column share, minus\n * paddings/borders), so the emitted value renders at the requested on-screen size.\n */\n\n/** Parse a CSS length to px, strictly: a number or a numeric string with an\n * optional px unit (\"12\" / \"12px\"). Non-px units (\"1.5em\", \"calc(…)\") return\n * undefined so the pinning pass leaves them untouched instead of misreading\n * them as px (SizeInput allows non-px CSS strings). */\nfunction toPx(value: unknown): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value !== \"string\") return undefined;\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(value.trim());\n return m ? parseFloat(m[1]) : undefined;\n}\n\n// NOTE: the geometry parsers below use parseFloat on each token, intentionally\n// mirroring the renderer's explodePaddingsOrMargins / explodeBorder (which the\n// image exporter subtracts from the available width). The renderer reads a token\n// like \"10%\" as its numeric value (10), so the slot math must too — switching to\n// strict px parsing here would make the pinned percent diverge from what the\n// editor actually renders. Strict px parsing is only for the display-pin value\n// (toPx, in pinImageSrc), never for the geometry.\n\n/** Left/right edge sizes from a CSS box shorthand (padding/margin), parsed the\n * same way the renderer's explodePaddingsOrMargins does (parseFloat per token). */\nfunction edges(value: unknown): { left: number; right: number } {\n if (value == null) return { left: 0, right: 0 };\n if (typeof value === \"number\") return { left: value, right: value };\n const parts = String(value)\n .trim()\n .split(/\\s+/)\n .map((p) => parseFloat(p) || 0);\n // CSS order: 1 = all; 2 = [v h]; 3 = [t h b]; 4 = [t r b l].\n if (parts.length === 1) return { left: parts[0], right: parts[0] };\n if (parts.length === 2 || parts.length === 3)\n return { left: parts[1], right: parts[1] };\n return { left: parts[3] || 0, right: parts[1] || 0 };\n}\n\n/** Left/right border widths from a per-side border object, parsed the same way\n * the renderer's explodeBorder does (parseFloat per width). */\nfunction borderEdges(border: unknown): { left: number; right: number } {\n if (!border || typeof border !== \"object\") return { left: 0, right: 0 };\n const b = border as Record<string, unknown>;\n const width = (v: unknown) => parseFloat(`${v ?? \"\"}`) || 0;\n return {\n left: width(b.borderLeftWidth),\n right: width(b.borderRightWidth),\n };\n}\n\n/** A body `contentWidth` is \"fixed px\" only when it's a number or a numeric\n * string with an optional px unit (`600`, `\"600px\"`, or `\"600\"`). Percentages\n * and keywords like `\"auto\"` are NOT fixed → `undefined`. */\nfunction fixedContentWidth(contentWidth: unknown): number | undefined {\n if (typeof contentWidth === \"number\")\n return Number.isFinite(contentWidth) ? contentWidth : undefined;\n if (typeof contentWidth === \"string\") {\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(contentWidth.trim());\n if (m) return parseFloat(m[1]);\n }\n return undefined;\n}\n\n/** Unlayer's body content width fallback when `contentWidth` isn't fixed px. */\nconst FALLBACK_BODY_CONTENT_WIDTH = 500;\n/** Unlayer's default content-block padding when a block sets none. */\nexport const DEFAULT_CONTAINER_PADDING = \"10px\";\n\n/**\n * A body `contentWidth` resolved to px: the fixed px value, or `fallback`\n * (500, Unlayer's base width) for non-px values like `\"50%\"` / `\"auto\"`.\n *\n * Shared with Row's grid CSS (`toContentWidthPx`) so the slot geometry here and\n * the renderer's column math agree on what counts as a fixed width — and so a\n * non-px `contentWidth` collapses to the same base everywhere instead of being\n * `parseInt`-ed into a bogus px value (e.g. `\"50%\"` → 50).\n */\nexport function bodyContentWidthPx(\n contentWidth: unknown,\n fallback: number = FALLBACK_BODY_CONTENT_WIDTH\n): number {\n return fixedContentWidth(contentWidth) ?? fallback;\n}\n\nexport interface SlotContext {\n bodyValues?: { contentWidth?: number | string; padding?: unknown; border?: unknown };\n rowValues?: { padding?: unknown; border?: unknown };\n rowCells?: number[];\n columnIndex?: number;\n columnValues?: { padding?: unknown; border?: unknown };\n /** The image block's own containerPadding (defaults to 10px like the editor). */\n containerPadding?: unknown;\n}\n\n/**\n * Width in px available to a content block, mirroring the renderers'\n * available-width math: contentWidth, minus body/row/column/container paddings\n * and borders, scaled by the column's share of the row.\n */\nexport function contentSlotWidth(ctx: SlotContext): number {\n const { bodyValues = {}, rowValues = {}, columnValues = {} } = ctx;\n const rowCells = ctx.rowCells && ctx.rowCells.length ? ctx.rowCells : [1];\n const columnIndex = ctx.columnIndex ?? 0;\n\n const bodyWidth = bodyContentWidthPx(bodyValues.contentWidth);\n\n const bp = edges(bodyValues.padding);\n const bb = borderEdges(bodyValues.border);\n const bodyAvail = bodyWidth - bp.left - bp.right - bb.left - bb.right;\n\n const rp = edges(rowValues.padding);\n const rb = borderEdges(rowValues.border);\n const rowAvail = bodyAvail - rp.left - rp.right - rb.left - rb.right;\n\n const rowSpan = rowCells.reduce((a, b) => a + b, 0) || 1;\n const colSpan = rowCells[columnIndex] || 1;\n const colWidth = (colSpan / rowSpan) * rowAvail;\n\n const cp = edges(columnValues.padding);\n const cb = borderEdges(columnValues.border);\n const colAvail = colWidth - cp.left - cp.right - cb.left - cb.right;\n\n const ip = edges(ctx.containerPadding ?? DEFAULT_CONTAINER_PADDING);\n return colAvail - ip.left - ip.right;\n}\n\nconst PERCENT = /^\\d+(?:\\.\\d+)?%$/;\n\n/** Round to 2 decimals, matching the editor's percent precision. */\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\n/**\n * Convert a px display pin on an image `src` to the editor's canonical percent.\n *\n * Only touches a pinned image (`autoWidth === false`) whose `maxWidth` is a\n * px/number placeholder; a percent `maxWidth` is already canonical and is left\n * as-is, and a responsive image (`autoWidth !== false`) is untouched. A pin\n * wider than the slot clamps to 100%, mirroring the editor.\n */\nexport function pinImageSrc<T extends Record<string, any> | undefined>(\n src: T,\n availableWidth: number | undefined\n): T {\n if (!src || typeof src !== \"object\") return src;\n if ((src as Record<string, any>).autoWidth !== false) return src;\n\n const maxWidth = (src as Record<string, any>).maxWidth;\n if (typeof maxWidth === \"string\" && PERCENT.test(maxWidth.trim())) return src;\n\n const pinPx = toPx(maxWidth);\n if (pinPx == null) return src;\n\n const avail = availableWidth && availableWidth > 0 ? availableWidth : undefined;\n const pct = avail ? (pinPx >= avail ? 100 : round2((pinPx / avail) * 100)) : 100;\n\n return { ...src, autoWidth: false, maxWidth: `${pct}%` } as T;\n}\n","import type { RenderMode } from \"./types\";\n\nexport interface HeadConfig {\n hasFeature?: (featureName: string) => boolean;\n getInitialValues?: (containerType: string) => Record<string, any>;\n}\n\nexport interface UnlayerConfig {\n cdnBaseUrl: string;\n toSafeHtml?: (text: string, options?: any) => string;\n textDirection?: string;\n mergeTagState?: Record<string, any>;\n mode?: RenderMode;\n headConfig?: HeadConfig;\n}\n\nexport const DEFAULT_CONFIG: UnlayerConfig = {\n cdnBaseUrl: \"https://cdn.tools.unlayer.com\",\n mode: \"web\",\n};\n","/**\n * Column Layouts - All 8 supported column combinations from Unlayer Editor\n *\n * These layouts provide a structured and type-safe way to specify column\n * configurations that match exactly what the Unlayer editor supports.\n *\n * Usage:\n * import { ColumnLayouts } from '@unlayer/react-elements';\n * <Row layout={ColumnLayouts.TwoEqual}>\n * <Column>...</Column>\n * <Column>...</Column>\n * </Row>\n */\n\nexport interface ColumnLayout {\n name: string;\n description: string;\n cells: number[];\n expectedColumns: number;\n widths: string[]; // e.g., [\"50%\", \"50%\"]\n}\n\nexport const ColumnLayouts = {\n OneColumn: {\n name: 'OneColumn',\n description: 'One full column (100%)',\n cells: [1],\n expectedColumns: 1,\n widths: ['100%'],\n } as ColumnLayout,\n\n TwoEqual: {\n name: 'TwoEqual',\n description: 'Two equal columns (50% + 50%)',\n cells: [1, 1],\n expectedColumns: 2,\n widths: ['50%', '50%'],\n } as ColumnLayout,\n\n TwoWideNarrow: {\n name: 'TwoWideNarrow',\n description: 'Two columns: wide + narrow (67% + 33%)',\n cells: [2, 1],\n expectedColumns: 2,\n widths: ['66.67%', '33.33%'],\n } as ColumnLayout,\n\n TwoNarrowWide: {\n name: 'TwoNarrowWide',\n description: 'Two columns: narrow + wide (33% + 67%)',\n cells: [1, 2],\n expectedColumns: 2,\n widths: ['33.33%', '66.67%'],\n } as ColumnLayout,\n\n ThreeEqual: {\n name: 'ThreeEqual',\n description: 'Three equal columns (33% + 33% + 33%)',\n cells: [1, 1, 1],\n expectedColumns: 3,\n widths: ['33.33%', '33.33%', '33.33%'],\n } as ColumnLayout,\n\n ThreeNarrowWideNarrow: {\n name: 'ThreeNarrowWideNarrow',\n description: 'Three columns: narrow + wide + narrow (25% + 50% + 25%)',\n cells: [1, 2, 1],\n expectedColumns: 3,\n widths: ['25%', '50%', '25%'],\n } as ColumnLayout,\n\n FourEqual: {\n name: 'FourEqual',\n description: 'Four equal columns (25% + 25% + 25% + 25%)',\n cells: [1, 1, 1, 1],\n expectedColumns: 4,\n widths: ['25%', '25%', '25%', '25%'],\n } as ColumnLayout,\n\n FiveEqual: {\n name: 'FiveEqual',\n description: 'Five equal columns (20% + 20% + 20% + 20% + 20%)',\n cells: [1, 1, 1, 1, 1],\n expectedColumns: 5,\n widths: ['20%', '20%', '20%', '20%', '20%'],\n } as ColumnLayout,\n};\n\n// Export the layout type for strict typing\nexport type ValidColumnLayout = (typeof ColumnLayouts)[keyof typeof ColumnLayouts];\n\n/**\n * Validates that a layout has the correct number of Column components\n */\nexport function validateColumnLayout(layout: ColumnLayout, childrenCount: number): void {\n if (layout.expectedColumns !== childrenCount) {\n throw new Error(`${layout.name} layout expects ${layout.expectedColumns} <Column> components, but got ${childrenCount}. Layout: ${layout.description}. Make sure you have exactly ${layout.expectedColumns} <Column> children.`);\n }\n}\n","/**\n * Lexical Helpers for Text JSON Conversion\n *\n * Utilities to convert between plain text, Lexical JSON, and HTML.\n * HTML generation is done via direct JSON tree walking — no Lexical\n * headless editor or DOM required.\n */\n\n/**\n * Empty Lexical JSON structure (used as fallback).\n * Uses extended-paragraph type for Unlayer editor compatibility.\n */\nexport const EMPTY_TEXT_JSON =\n '{\"root\":{\"children\":[{\"children\":[],\"format\":\"\",\"indent\":0,\"type\":\"extended-paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"}],\"format\":\"\",\"indent\":0,\"type\":\"root\",\"version\":1}}';\n\n/**\n * Create Lexical JSON for plain text.\n *\n * Builds the JSON string directly to match the Unlayer editor's\n * rich-text serialization format.\n *\n * @param text - Plain text string\n * @returns Lexical JSON string\n *\n * @example\n * ```ts\n * const json = textToTextJson(\"Hello world\");\n * ```\n */\nexport function textToTextJson(text: string): string {\n if (!text) return EMPTY_TEXT_JSON;\n\n const escaped = JSON.stringify(text); // handles quotes/newlines in text\n return `{\"root\":{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":${escaped},\"type\":\"extended-text\",\"version\":1}],\"format\":\"\",\"indent\":0,\"type\":\"extended-paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"}],\"format\":\"\",\"indent\":0,\"type\":\"root\",\"version\":1}}`;\n}\n\n// ── Lexical format bitmask → HTML tag mapping ────────────────────────────────\n// Lexical encodes inline formatting in a numeric `format` bitmask on text nodes.\nconst FORMAT_TAGS: Array<[number, string, string]> = [\n [1, \"<strong>\", \"</strong>\"], // bold\n [2, \"<em>\", \"</em>\"], // italic\n [4, \"<s>\", \"</s>\"], // strikethrough\n [8, \"<u>\", \"</u>\"], // underline\n [16, \"<code>\", \"</code>\"], // code\n [32, \"<sub>\", \"</sub>\"], // subscript\n [64, \"<sup>\", \"</sup>\"], // superscript\n];\n\n/**\n * Escape HTML special characters in text content.\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/**\n * Convert a Lexical text node to HTML, applying format bitmask.\n */\nfunction textNodeToHtml(node: any): string {\n let html = escapeHtml(node.text || \"\");\n\n // Apply inline style attribute if present\n const style = node.style;\n\n // Wrap in format tags (innermost first)\n const format = node.format || 0;\n let openTags = \"\";\n let closeTags = \"\";\n for (const [bit, open, close] of FORMAT_TAGS) {\n if (format & bit) {\n openTags += open;\n closeTags = close + closeTags;\n }\n }\n html = openTags + html + closeTags;\n\n // Wrap in <span> if inline style is present\n if (style) {\n html = `<span style=\"${escapeHtml(style)}\">${html}</span>`;\n }\n\n return html;\n}\n\n// Lexical serializes element-node alignment either as a string (\"center\")\n// or, in older payloads, as the in-memory numeric format code.\nconst NUMERIC_ALIGN: Record<number, string> = {\n 1: \"left\",\n 2: \"center\",\n 3: \"right\",\n 4: \"justify\",\n};\n\n/**\n * Build a ` dir=\"...\"` attribute chunk from a node's direction. Only \"ltr\"\n * and \"rtl\" are valid — the editor ignores anything else, and whitelisting\n * also keeps untrusted Lexical JSON from injecting attribute markup.\n */\nfunction dirAttribute(direction: unknown): string {\n return direction === \"ltr\" || direction === \"rtl\"\n ? ` dir=\"${direction}\"`\n : \"\";\n}\n\n/**\n * Resolve a paragraph node's text-align value from its `format` field.\n */\nfunction paragraphAlign(format: unknown): string | undefined {\n if (typeof format === \"string\") {\n return [\"left\", \"center\", \"right\", \"justify\"].includes(format)\n ? format\n : undefined;\n }\n if (typeof format === \"number\") {\n return NUMERIC_ALIGN[format];\n }\n return undefined;\n}\n\n/**\n * Convert a Lexical paragraph node to HTML, matching the markup the\n * Unlayer editor exports for paragraphs.\n */\nfunction paragraphNodeToHtml(node: any, childrenHtml: string): string {\n // Heading/Button textJson from editor round-trips marks its paragraphs as\n // inline tools; those export as <span> with no block styling.\n const isInlineTool = !!node.isInlineTool;\n const tag = isInlineTool ? \"span\" : \"p\";\n\n const dir = dirAttribute(node.direction);\n\n const styleParts: string[] = [];\n\n // Custom paragraph styles (e.g. background-color) come first so the\n // resets below win if they overlap.\n if (node.style) {\n styleParts.push(String(node.style).replace(/;+\\s*$/, \"\"));\n }\n\n if (!isInlineTool) {\n // Reset the browser's default <p> margins so multiple paragraph lines\n // don't gain extra vertical spacing in email clients that strip head\n // resets. Zero both the physical shorthand and the logical block\n // longhands so the reset wins regardless of how a client resolves the\n // logical-vs-physical cascade.\n styleParts.push(\n \"margin: 0px\",\n \"margin-block-start: 0px\",\n \"margin-block-end: 0px\"\n );\n }\n\n const indent = Number(node.indent) || 0;\n if (indent > 0) {\n styleParts.push(`padding-inline-start: ${indent * 40}px`);\n }\n\n const align = paragraphAlign(node.format);\n if (align) {\n styleParts.push(`text-align: ${align}`);\n }\n\n const style =\n styleParts.length > 0\n ? ` style=\"${escapeHtml(styleParts.join(\"; \") + \";\")}\"`\n : \"\";\n\n // Empty paragraphs get a <br> for consistency with the editor\n return `<${tag}${dir}${style}>${childrenHtml || \"<br>\"}</${tag}>`;\n}\n\n/**\n * Convert a Lexical JSON node (and its children) to HTML.\n * Handles: root, paragraph, heading, text, link, list, listitem, linebreak.\n */\nfunction nodeToHtml(node: any): string {\n if (!node || typeof node !== \"object\") return \"\";\n\n const type = node.type;\n\n // Leaf: text node\n if (type === \"text\" || type === \"extended-text\") {\n return textNodeToHtml(node);\n }\n\n // Leaf: line break\n if (type === \"linebreak\") {\n return \"<br>\";\n }\n\n // Recurse into children\n const childrenHtml = (node.children || []).map(nodeToHtml).join(\"\");\n\n switch (type) {\n case \"root\":\n return childrenHtml;\n\n case \"paragraph\":\n case \"extended-paragraph\":\n return paragraphNodeToHtml(node, childrenHtml);\n\n case \"heading\": {\n // Whitelist the tag — it's interpolated into markup\n const tag = /^h[1-6]$/.test(node.tag) ? node.tag : \"h1\";\n const dir = dirAttribute(node.direction);\n return `<${tag}${dir}>${childrenHtml}</${tag}>`;\n }\n\n case \"link\": {\n const href = node.url ? ` href=\"${escapeHtml(node.url)}\"` : \"\";\n const target = node.target ? ` target=\"${escapeHtml(node.target)}\"` : \"\";\n const rel = node.rel ? ` rel=\"${escapeHtml(node.rel)}\"` : \"\";\n return `<a${href}${target}${rel}>${childrenHtml}</a>`;\n }\n\n case \"list\": {\n const tag = node.listType === \"number\" ? \"ol\" : \"ul\";\n return `<${tag}>${childrenHtml}</${tag}>`;\n }\n\n case \"listitem\":\n return `<li>${childrenHtml}</li>`;\n\n default:\n // Unknown node type — pass through children\n return childrenHtml;\n }\n}\n\n/**\n * Convert Lexical JSON to HTML.\n *\n * Walks the JSON tree directly — no Lexical headless editor or DOM required.\n * Works identically in Node.js and browser environments.\n *\n * @param textJson - Lexical JSON string\n * @returns HTML string\n *\n * @example\n * ```ts\n * const html = generateHtmlFromTextJson('{\"root\":...}');\n * ```\n */\nexport function generateHtmlFromTextJson(textJson: string): string {\n if (!textJson) return \"\";\n\n try {\n const parsed = JSON.parse(textJson);\n\n // Raw HTML passthrough (produced by htmlToTextJson)\n if (parsed.__html) return parsed.__html;\n\n // Walk the Lexical JSON tree and produce HTML\n return nodeToHtml(parsed.root);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Convert an HTML string to a textJson-compatible value.\n *\n * Wraps the HTML in a passthrough format that `generateHtmlFromTextJson`\n * detects and returns directly — avoiding the Lexical headless editor\n * round-trip (HTML → Lexical JSON → HTML) which doesn't work reliably\n * in browser environments.\n *\n * Supports any HTML formatting: bold, italic, underline, strikethrough,\n * code, links, lists, etc.\n *\n * @param html - HTML string with formatting (e.g. `\"Hello <b>bold</b>\"`)\n * @returns JSON string compatible with Paragraph's `textJson` prop\n *\n * @example\n * ```ts\n * const json = htmlToTextJson('Hello <b>world</b> and <a href=\"https://example.com\">link</a>');\n * ```\n */\nexport function htmlToTextJson(html: string): string {\n if (!html) return EMPTY_TEXT_JSON;\n return JSON.stringify({ __html: html });\n}\n","/**\n * Deep-merge user values with defaults.\n * Plain objects are merged recursively; arrays and primitives\n * from userValues override the default entirely.\n */\nexport function mergeValues<T extends Record<string, any>>(\n defaults: T,\n userValues?: Partial<T>\n): T {\n if (!userValues) return defaults;\n\n const result: any = { ...defaults };\n\n for (const key of Object.keys(userValues)) {\n const userVal = (userValues as any)[key];\n const defaultVal = (defaults as any)[key];\n\n if (\n userVal !== null &&\n defaultVal !== null &&\n typeof userVal === \"object\" &&\n typeof defaultVal === \"object\" &&\n !Array.isArray(userVal) &&\n !Array.isArray(defaultVal)\n ) {\n // Recursively merge plain objects\n result[key] = mergeValues(defaultVal, userVal);\n } else {\n result[key] = userVal;\n }\n }\n\n return result as T;\n}\n","/**\n * CSS values as the exporters can read them.\n *\n * Props accept any CSS color, but the exporters convert colors for Outlook\n * (bgcolor attributes) assuming hex or `rgba(r, g, b, a)` — the forms the\n * editor's color picker produces — so `rgb(1, 2, 3)` or `rgb(1 2 3)` came out\n * as \"#NaN0203\". And font stacks are written into style=\"\" attributes, so a\n * double-quoted family name ended the attribute early.\n */\n\n/** A channel: a number, maybe a percentage. One way to read each digit, so a long value can't make it backtrack. */\nconst CHANNEL = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%?$/;\n\n/**\n * rgb()/rgba() in any CSS syntax → \"#rrggbb\", or \"rgba(r, g, b, a)\" when translucent. Other values pass through.\n * Read in one pass, token by token (no pattern that could backtrack on a long value from data).\n */\nexport function normalizeColor(value: string): string {\n const text = value.trim();\n const open = text.indexOf(\"(\");\n if (!/^rgba?$/i.test(text.slice(0, open)) || !text.endsWith(\")\")) return value;\n // r g b, r, g, b, or either with an alpha after \"/\" or \",\".\n const [rgb, slashed, extra] = text.slice(open + 1, -1).split(\"/\");\n const channels = rgb.trim().split(/\\s*,\\s*|\\s+/);\n if (slashed !== undefined) channels.push(slashed.trim());\n if (extra !== undefined || channels.length > 4 || channels.length < (slashed === undefined ? 3 : 4) || !channels.every((c) => CHANNEL.test(c))) return value;\n // A number, or a percentage of `full`.\n const num = (text: string, full: number) => (text.endsWith(\"%\") ? (parseFloat(text) / 100) * full : parseFloat(text));\n const [r, g, b] = channels.slice(0, 3).map((text) => Math.max(0, Math.min(255, Math.round(num(text, 255)))));\n const alpha = channels[3] === undefined ? 1 : num(channels[3], 1);\n if (alpha < 1) return `rgba(${r}, ${g}, ${b}, ${Math.max(0, alpha)})`;\n return `#${[r, g, b].map((n) => n.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/**\n * Whether a value can be written into a CSS declaration as it is: nothing that ends the declaration, the rule or\n * the `<style>` element (`16px</style><script>`, `;`, `}`), no comment that hides the rules after it (`/*`), and\n * every bracket closed by its own kind (`calc(12px` or `16px (]` would swallow the rules after it).\n */\nexport function cssValueSafe(text: string): boolean {\n if (/[<>{};]|\\/\\*|\\*\\//.test(text)) return false;\n const open: string[] = [];\n for (const c of text) {\n if (c === \"(\" || c === \"[\") open.push(c === \"(\" ? \")\" : \"]\");\n else if ((c === \")\" || c === \"]\") && open.pop() !== c) return false;\n }\n return !open.length;\n}\n\n/**\n * A device's settings (`_override.mobile`) with each text value that isn't safe in CSS left out: the editor writes\n * them into its export's `<style>` as they are, as Elements' head does with the ones it keeps.\n */\nexport function cssSafeValues<T>(value: T): T {\n if (typeof value === \"string\") return (cssValueSafe(value) ? value : undefined) as T;\n if (Array.isArray(value)) return value.map(cssSafeValues) as T;\n if (!isPlainObject(value)) return value;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n const safe = cssSafeValues(v);\n if (safe !== undefined || v === undefined) out[k] = safe;\n }\n return out as T;\n}\n\n/** A font stack safe inside style=\"\": family names quoted with ' instead of \" (an apostrophe in one escaped). */\nexport function normalizeFontStack(value: string): string {\n return value.replace(/\"([^\"]*)\"?/g, (_, name: string) => `'${name.replace(/'/g, \"\\\\'\")}'`);\n}\n\n/**\n * Normalize color fields and font stacks in a component's values. Returns\n * new objects (values can alias the caller's, e.g. a shared style constant).\n */\nexport function normalizeCssValues<T>(value: T, key?: string): T {\n if (typeof value === \"string\") return (key === \"fontFamily\" ? normalizeFontStack(value) : key === \"color\" || key?.endsWith(\"Color\") ? normalizeColor(value) : value) as T;\n if (Array.isArray(value)) return value.map((item) => normalizeCssValues(item)) as T;\n if (!isPlainObject(value)) return value;\n const out: Record<string, unknown> = {};\n // A fontFamily object ({ label, value }) holds font stacks.\n for (const [k, v] of Object.entries(value)) out[k] = normalizeCssValues(v, key === \"fontFamily\" ? key : k);\n return out as T;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n","/**\n * Universal Semantic Props System\n *\n * Automatically flattens nested properties for ALL components\n * No build-time generation needed - pure TypeScript + runtime detection\n *\n * Example:\n * - ButtonValues has: { buttonColors: { color, backgroundColor }, fontSize }\n * - Users can pass: { color: \"red\", backgroundColor: \"blue\" } OR { buttonColors: { color: \"red\" } }\n * - TypeScript provides autocomplete for ALL properties (flat and nested)\n */\n\nimport type { DeviceProps } from \"../types\";\nimport { cssSafeValues, normalizeCssValues } from \"./css-values\";\nimport { textToTextJson, htmlToTextJson } from \"./lexical-helpers\";\n\n/**\n * Type utility: Extracts all properties from nested objects\n * This provides TypeScript autocomplete for flat props!\n */\ntype FlattenObjectProps<T> = T extends object\n ? {\n [K in keyof T]?: T[K] extends object\n ? T[K] | FlattenObjectProps<T[K]> // Accept nested OR its flattened props\n : T[K];\n } & {\n // Also accept all nested object properties as flat props\n [K in keyof T as T[K] extends object\n ? keyof T[K] extends string\n ? keyof T[K]\n : never\n : never]?: any;\n }\n : T;\n\n/**\n * Semantic props type for any component.\n * Generic TChildren parameter allows each framework to supply its own child type.\n */\nexport type SemanticProps<T, TChildren = any> = Omit<FlattenObjectProps<T>, keyof DeviceProps> & DeviceProps & {\n children?: TChildren;\n values?: T; // Escape hatch for full control\n /** HTML string with inline formatting for Paragraph (e.g. `'Hello <b>bold</b>'`) */\n html?: string;\n};\n\n/**\n * Runtime detection of nested object structures\n * Analyzes default values to identify which properties are nested objects.\n * Results are cached per defaultValues object reference to avoid recomputing\n * on every render.\n */\nconst nestedStructureCache = new WeakMap<object, Map<string, Set<string>>>();\n\nfunction analyzeNestedStructure(defaultValues: any): Map<string, Set<string>> {\n const cached = nestedStructureCache.get(defaultValues);\n if (cached) return cached;\n\n const nestedGroups = new Map<string, Set<string>>();\n\n for (const [key, value] of Object.entries(defaultValues)) {\n // Skip special keys\n if (key === \"_meta\" || key === \"text\" || key === \"textJson\" || key === \"children\") {\n continue;\n }\n\n // Check if this is a nested object (plain object, not array, not null)\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length > 0\n ) {\n const props = new Set(Object.keys(value));\n nestedGroups.set(key, props);\n }\n }\n\n nestedStructureCache.set(defaultValues, nestedGroups);\n return nestedGroups;\n}\n\n/**\n * Coerce CSS-idiom flat prop values to the shapes the exporters expect.\n * Mutates the given props object in place. Each rule fixes a footgun where the\n * natural/CSS form type-checks (flat props are loosely typed) but renders blank\n * or invalid:\n * - `fontFamily: \"Arial\"` → `{ label, value }` (a bare string is otherwise\n * char-spread when merged into the fontFamily group, dropping the font).\n * - `fontWeight: \"700\"` → `700` (numeric string → number; keyword strings like\n * \"bold\"/\"normal\" are valid CSS and left as-is).\n * - `fontSize: 28` → `\"28px\"` (a unitless number is invalid CSS the browser\n * ignores). Same for other bare-number size fields.\n * - `lineHeight: 1.4` → `\"1.4\"` (the field is typed as a string; unitless\n * line-height is valid CSS).\n */\nconst PX_SIZE_KEYS = [\n \"fontSize\",\n \"padding\",\n \"containerPadding\",\n \"borderRadius\",\n \"letterSpacing\",\n] as const;\n\nfunction normalizeCssProps(props: Record<string, any>): void {\n if (typeof props.fontFamily === \"string\") {\n const v = props.fontFamily;\n props.fontFamily = { label: v, value: v };\n }\n if (\n typeof props.fontWeight === \"string\" &&\n /^\\d+$/.test(props.fontWeight.trim())\n ) {\n props.fontWeight = Number(props.fontWeight.trim());\n }\n if (typeof props.lineHeight === \"number\") {\n props.lineHeight = String(props.lineHeight);\n }\n for (const key of PX_SIZE_KEYS) {\n const v = props[key];\n // bare number (28) or a unit-less numeric string (\"0\", \"20\") → \"<n>px\"\n if (typeof v === \"number\") {\n props[key] = `${v}px`;\n } else if (typeof v === \"string\" && /^\\d+$/.test(v.trim())) {\n props[key] = `${v.trim()}px`;\n }\n }\n}\n\nconst ENTITIES: Record<string, string> = { \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" };\n\n/** Text as HTML: `&`, `<` and `>` escaped (and quotes, with `quotes`). */\nexport function escapeText(text: string, quotes?: boolean): string {\n return text.replace(quotes ? /[&<>\"']/g : /[&<>]/g, (c) => ENTITIES[c]);\n}\n\n/**\n * `escapeText`, keeping an email service's `<%name%>` tag (SendGrid's substitution tags) as written, as 0.1.22\n * did in this text: the service fills it in. `<%` can't start an element, so it adds no markup.\n */\nexport function escapeKeepingTags(text: string, quotes?: boolean, escape = (part: string) => escapeText(part, quotes)): string {\n return text\n .split(/(<%[\\w.]+%>)/)\n .map((part, i) => (i % 2 ? part : escape(part)))\n .join(\"\");\n}\n\n/**\n * A Menu item's text in an email, which its exporter writes as HTML (0.1.22 wrote what it was given): markup escaped,\n * an entity reference kept (`→`, ` `), as a single quote (a template's string: `{{ name | default: 'you' }}`);\n * a double quote escaped, also in a template tag: the exporter writes the text in a double-quoted `aria-label` too,\n * which a raw one would end (`{{ \" }} onmouseover=…`).\n */\nconst menuText = (text: string) =>\n escapeKeepingTags(text, false, (part) => part.replace(/&(?!(?:#\\d+|#x[\\da-f]+|[a-z][\\da-z]*);)|[<>\"]/gi, (c) => ENTITIES[c]));\n\n/**\n * Flatten a JSX/ReactNode children tree to its plain text content.\n * Text components store a string (or Lexical JSON derived from one); a raw React\n * element passed as children would otherwise stringify to \"[object Object]\".\n * Duck-types the element shape (`.props.children`) so this stays framework-free.\n * Inline formatting is not preserved — use the `html` prop for rich text.\n */\nfunction flattenChildrenText(node: any, breaks?: boolean): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map((child) => flattenChildrenText(child, breaks)).join(\"\");\n if (typeof node === \"object\" && \"props\" in node) {\n return breaks && node.type === \"br\" ? \"<br/>\" : flattenChildrenText(node.props?.children, breaks);\n }\n return \"\";\n}\n\n/**\n * Heading and Button children as HTML: text, with markup escaped, so a\n * value like a user's name can't inject HTML. A line break stays one,\n * written `<br>` in a string (as it worked before) or as a JSX `<br />`.\n */\nfunction childrenHtml(children: any): string {\n return flattenChildrenText(children, true)\n .split(/(<br\\s*\\/?>)/i)\n .map((part, i) => (i % 2 ? \"<br/>\" : escapeKeepingTags(part)))\n .join(\"\");\n}\n\n/**\n * Universal semantic props mapper\n * Works for ANY component - no configuration needed!\n *\n * @param props - User props (can include flat or nested properties)\n * @param defaultValues - Component default values (used to detect structure)\n * @param componentType - Component name (for special handling like Paragraph)\n * @returns Properly structured values object for exporter\n */\nexport function mapSemanticProps<T extends Record<string, any>>(\n props: SemanticProps<T>,\n defaultValues: T,\n componentType: string\n): T {\n const { children, values, mobile, hideOnMobile: hideMobileProp, hideOnDesktop: hideDesktopProp, ...restProps } = props;\n // The editor hides rows and content on a device, never a column.\n const hideOnMobile = componentType === \"Column\" ? undefined : hideMobileProp;\n const hideOnDesktop = componentType === \"Column\" ? undefined : hideDesktopProp;\n const userProps: any = { ...restProps };\n\n // Start with escape hatch if provided\n const result: any = values ? { ...values } : {};\n\n // Handle children → text/textJson conversion\n // Paragraph uses textJson (Lexical JSON); all others use text (plain string)\n // Note: editor-types codegen renamed text→textJson for Button/Heading but\n // the exporter still uses plain text at runtime via generateHtmlFromTextJson\n if (children !== undefined && !result.text && !result.textJson) {\n const textContent =\n typeof children === \"string\" ? children : flattenChildrenText(children);\n if (componentType === \"Paragraph\") {\n result.textJson = textToTextJson(textContent);\n } else if (componentType === \"Heading\" || componentType === \"Button\") {\n // Children are text, as in React (and as Paragraph's are): markup in them\n // shows as typed, so a value like a user's name can't inject HTML, but a\n // line break stays one. The `text` prop still takes HTML.\n result.text = childrenHtml(children);\n } else {\n result.text = textContent;\n }\n }\n\n // Paragraph: auto-convert `text` → `textJson` (Lexical JSON)\n // This allows Paragraph to accept the same `text` field as Heading/Button,\n // making it a drop-in replacement for the legacy Text component.\n // - values.text (escape hatch) = legacy HTML → use htmlToTextJson (preserves HTML)\n // - text prop (API) = plain text → use textToTextJson (wraps in Lexical JSON)\n const textFromEscapeHatch = result.text;\n const textFromProp = userProps.text;\n const textProp = textFromEscapeHatch || textFromProp;\n if (componentType === \"Paragraph\" && textProp && !result.textJson) {\n result.textJson = textFromEscapeHatch\n ? htmlToTextJson(String(textProp))\n : textToTextJson(String(textProp));\n delete result.text;\n delete userProps.text;\n }\n\n // Paragraph: convert `html` (rich HTML string) → `textJson` (Lexical JSON)\n // Supports both: <Paragraph html=\"...\" /> and <Paragraph values={{ html: \"...\" }} />\n const htmlProp = userProps.html || result.html;\n if (componentType === \"Paragraph\" && htmlProp && !result.textJson) {\n result.textJson = htmlToTextJson(String(htmlProp));\n delete userProps.html;\n delete result.html;\n }\n\n // Canonicalize link/action fields to the schema's storage shape so the rest of\n // the pipeline (mergeValues, renderToJson, AND the editor) sees a consistent\n // type:\n // - `\"https://…\"` string shorthand → `{ name:\"web\", values:{ href, target } }`.\n // - a link placed in `attrs` (the canonical Href type also surfaces\n // `attrs:{ href, target }`) is moved into `values.href`/`target`, where the\n // editor reads it — so the link round-trips into the Builder, not just into\n // renderToHtml. Genuine custom attrs (class, data-*, …) are preserved.\n // Applied to both the flat prop and the `values` escape hatch. (Render-time\n // `normalizeLinkValue` also reads `attrs` as a defensive fallback.)\n const canonicalizeLink = (v: any): any => {\n if (typeof v === \"string\") {\n return { name: \"web\", values: { href: v, target: \"_blank\" } };\n }\n if (v && typeof v === \"object\" && \"name\" in v && v.attrs && typeof v.attrs === \"object\") {\n const { href: attrsHref, target: attrsTarget, ...customAttrs } = v.attrs;\n if (attrsHref !== undefined || attrsTarget !== undefined) {\n const linkValues = { ...(v.values as Record<string, any> | undefined) };\n if (!linkValues.href && attrsHref !== undefined) linkValues.href = attrsHref;\n if (!linkValues.target && attrsTarget !== undefined) linkValues.target = attrsTarget;\n const next: Record<string, any> = { ...v, values: linkValues };\n if (Object.keys(customAttrs).length) next.attrs = customAttrs;\n else delete next.attrs;\n return next;\n }\n }\n return v;\n };\n for (const key of [\"href\", \"action\"] as const) {\n if (userProps[key] !== undefined) userProps[key] = canonicalizeLink(userProps[key]);\n if (result[key] !== undefined) result[key] = canonicalizeLink(result[key]);\n }\n\n // Normalize CSS-idiom prop values to the shapes the exporters expect. Authors\n // (humans and AI) reach for CSS habits — a string `fontFamily`, a numeric\n // `fontSize`, a string `fontWeight` — which type-check (flat props are loose)\n // but otherwise render blank or invalid. Coercing the natural form here makes\n // it render correctly. Applied to flat props only; the `values` escape hatch\n // is the full-control path and is left untouched.\n normalizeCssProps(userProps);\n\n // Analyze default values to detect nested object structure\n const nestedGroups = analyzeNestedStructure(defaultValues);\n\n // Separate flat props from potential nested props\n const nested: Record<string, any> = {};\n const flat: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(userProps)) {\n if (value === undefined) continue;\n\n // Check if user already provided a nested object\n if (nestedGroups.has(key)) {\n // User passed the nested object directly\n nested[key] = value;\n continue;\n }\n\n // Check if this prop belongs to any nested group\n let belongsToGroup = false;\n for (const [groupName, groupProps] of nestedGroups.entries()) {\n if (groupProps.has(key)) {\n // This flat prop should be grouped\n nested[groupName] = nested[groupName] || {};\n nested[groupName][key] = value;\n belongsToGroup = true;\n break;\n }\n }\n\n if (!belongsToGroup) {\n // Regular flat prop\n flat[key] = value;\n }\n }\n\n // Merge everything: escape hatch < flat props < nested groups\n const final: any = {\n ...result,\n ...flat\n };\n\n // Merge nested groups (preserve existing from escape hatch)\n for (const [groupName, groupValues] of Object.entries(nested)) {\n if (Object.keys(groupValues).length > 0) {\n final[groupName] = {\n ...result[groupName],\n ...groupValues\n };\n }\n }\n\n // Some components (e.g. Column) ship an empty `border: {}` default, so the\n // nested-group detector can't see the border sub-keys and flat border-side\n // props (borderTopWidth, …) would land loose and be dropped by the exporter.\n // If the component declares a `border` field, gather them into it.\n if (\n defaultValues &&\n typeof defaultValues === \"object\" &&\n \"border\" in (defaultValues as object)\n ) {\n const borderSideRe = /^border(Top|Right|Bottom|Left)(Width|Style|Color)$/;\n const collected: Record<string, any> = {};\n for (const key of Object.keys(final)) {\n if (borderSideRe.test(key)) {\n collected[key] = final[key];\n delete final[key];\n }\n }\n if (Object.keys(collected).length > 0) {\n final.border = { ...(final.border || {}), ...collected };\n }\n\n // Border widths must carry a unit — `borderTopWidth: 1` would otherwise\n // render `border-top: 1 solid` (invalid CSS the browser drops). The\n // BorderInput type accepts a number, so normalize *Width fields (bare number\n // or unit-less numeric string → px), wherever the border came from.\n if (final.border && typeof final.border === \"object\") {\n // Clone before rewriting: final.border may alias the caller's object (the\n // `values` escape hatch is only a shallow clone, and a nested `border` prop\n // passes through by reference), so mutating in place would be an impure side\n // effect — e.g. a shared `const HAIRLINE = { borderTopWidth: 1 }` would get\n // rewritten to \"1px\" in the caller.\n const b: Record<string, any> = { ...(final.border as Record<string, any>) };\n for (const key of Object.keys(b)) {\n if (!/Width$/.test(key)) continue;\n const v = b[key];\n if (typeof v === \"number\") b[key] = `${v}px`;\n else if (typeof v === \"string\" && /^\\d+(?:\\.\\d+)?$/.test(v.trim())) b[key] = `${v.trim()}px`;\n }\n final.border = b;\n }\n }\n\n if (mobile || hideOnMobile !== undefined || hideOnDesktop !== undefined) {\n const overrides = { ...final._override };\n if (mobile || hideOnMobile !== undefined) {\n const { width, maxWidth, autoWidth, ...phone } = mobile || {};\n const mapped = mapSemanticProps(phone as SemanticProps<T>, defaultValues, componentType) as Record<string, any>;\n if (componentType === \"Image\" && (width !== undefined || maxWidth !== undefined || autoWidth !== undefined)) {\n mapped.src = {\n ...(overrides.mobile?.src || {}),\n ...(autoWidth !== undefined ? { autoWidth } : { autoWidth: false }),\n ...(width !== undefined || maxWidth !== undefined ? { maxWidth: width ?? maxWidth } : {}),\n };\n } else if (width !== undefined || autoWidth !== undefined) {\n const key = componentType === \"Button\" ? \"size\" : \"width\";\n mapped[key] = { autoWidth: autoWidth ?? false, ...(width !== undefined ? { width: typeof width === \"number\" ? `${width}px` : width } : {}) };\n }\n overrides.mobile = { ...overrides.mobile, ...cssSafeValues(mapped), ...(hideOnMobile !== undefined ? { hideMobile: hideOnMobile } : {}) };\n }\n if (hideOnDesktop !== undefined) overrides.desktop = { ...overrides.desktop, hideDesktop: hideOnDesktop };\n final._override = overrides;\n }\n\n // \"Do not stack on mobile\" is a mobile override, as the editor saves it:\n // the exporters read it only there.\n if (componentType === \"Row\" && final.noStackMobile === true) {\n final._override = { ...final._override, mobile: { ...final._override?.mobile, noStackMobile: true } };\n final.noStackMobile = false;\n }\n\n // Colors and font stacks in forms the exporters write correctly.\n return normalizeCssValues(final) as T;\n}\n\n/**\n * Convert any of the three link-shaped inputs into the render-value shape\n * the exporter expects: `{ url, target, ...customAttrs }`.\n *\n * The schema stores links as `{ name, values: { href, target } }`, but\n * exporters (consumed via @unlayer/exporters) expect the editor's render\n * value shape `{ url, target, customAttrs?, class?, onClick? }`. The editor\n * runs this conversion via the link property-editor's `renderValue()` —\n * `normalizeValuesForExporter` (in render-time code) mirrors it so React\n * rendered output matches.\n *\n * Accepted inputs:\n * - `\"https://...\"` (string shorthand)\n * - `{ url, target?, customAttrs?, class?, onClick? }` (already render shape)\n * - `{ name, values: { href, target? }, attrs? }` (storage shape from schema)\n *\n * Returns `undefined` for shapes we don't recognize so the caller can fall\n * back to the original value (avoids silently dropping data).\n *\n * IMPORTANT: this is render-time only. Do NOT apply during renderToJson —\n * JSON output is for round-tripping into the editor, which expects the\n * storage shape.\n */\nexport function normalizeLinkValue(value: unknown): Record<string, any> | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") {\n return { url: value, target: \"_blank\" };\n }\n if (typeof value !== \"object\") return undefined;\n const v = value as Record<string, any>;\n // Already render-shape (has url) — pass through.\n if (\"url\" in v) return v;\n // Storage shape from the schema: { name, values: { href, target }, attrs? }.\n // The canonical Href type also surfaces `attrs: { href, target }`, so authors\n // reasonably put the link there — read href/target from `values` first, then\n // fall back to `attrs`, and spread any remaining `attrs` as custom attributes.\n // (Without this, `{ name, attrs: { href } }` type-checks but renders href=\"\".)\n if (\n \"name\" in v &&\n ((v.values && typeof v.values === \"object\") || (v.attrs && typeof v.attrs === \"object\"))\n ) {\n const inner = v.values && typeof v.values === \"object\" ? (v.values as Record<string, any>) : {};\n const attrs = v.attrs && typeof v.attrs === \"object\" ? (v.attrs as Record<string, any>) : {};\n const { href: attrsHref, target: attrsTarget, ...customAttrs } = attrs;\n // `||` not `??`: the schema default merges in `values: { href: \"\" }`, so an\n // empty `values.href` must fall through to the `attrs` href, not win over it.\n return {\n url: inner.href || attrsHref || \"\",\n target: inner.target || attrsTarget || \"_blank\",\n ...customAttrs,\n };\n }\n return undefined;\n}\n\n/**\n * A link whose URL the exporters write into an `href=\"…\"` as it is: `\"`, `<`\n * and `>`, which a URL can't hold unencoded, are percent-encoded (as a browser\n * would), so a URL can't end the attribute (or Outlook's conditional comment).\n * An email service's placeholder in the form `<%name%>` (SendGrid's\n * `<%asm_group_unsubscribe_raw_url%>`) is kept: the service fills it in as\n * written, and it can end neither.\n */\nfunction safeLink(link: Record<string, any>): Record<string, any> {\n // A URL that isn't a string (an array from a JSON body or `?url[]=`) is written as its text: escaped as one.\n const url = link.url === undefined || link.url === null ? link.url : String(link.url);\n return typeof url === \"string\" ? { ...link, url: url.replace(/<%[\\w.]+%>|[\"<>]/g, (c) => (c.length > 1 ? c : encodeURIComponent(c))) } : link;\n}\n\n/**\n * Normalize all link/action fields on an item's values to the render-value\n * shape the exporter reads. Returns a shallow clone — does not mutate.\n *\n * Knows about the link-bearing paths per component:\n * - top-level `href` (Button, Video)\n * - top-level `action` (Image, Timer)\n * - `menu.items[].link` (Menu), and its items' text\n * - `icons.icons[].url` (Social)\n *\n * Only the bridge between mapper and exporter should call this; renderToJson\n * must NOT, because JSON output preserves storage shape.\n */\nexport function normalizeValuesForExporter<T extends Record<string, any>>(\n values: T,\n componentName: string,\n mode?: string\n): T {\n if (values == null || typeof values !== \"object\") return values;\n\n const out: Record<string, any> = { ...values };\n\n // Top-level link fields used by Button (href), Image (action), Video (href),\n // Timer (action). Cheap to check both keys for every component.\n for (const key of [\"href\", \"action\"]) {\n if (out[key] !== undefined) {\n const normalized = normalizeLinkValue(out[key]);\n if (normalized !== undefined) out[key] = safeLink(normalized);\n }\n }\n\n // The Button exporter unescapes its text before writing it, where the\n // editor's canvas shows the text as the HTML it is. Escaping it once here\n // gives it back as stored: `<b>` shows as text, `<b>` as bold.\n if (componentName === \"Button\" && typeof out.text === \"string\") {\n out.text = escapeKeepingTags(out.text, true);\n }\n\n // Menu items each carry a `link` field, and text the email exporter writes\n // as it is (the web and document exporters escape it).\n if (componentName === \"Menu\" && out.menu && Array.isArray(out.menu.items)) {\n out.menu = {\n ...out.menu,\n items: out.menu.items.map((item: any) => {\n if (!item) return item;\n const next = mode === \"email\" && typeof item.text === \"string\" ? { ...item, text: menuText(item.text) } : item;\n if (next.link === undefined) return next;\n const normalized = normalizeLinkValue(next.link);\n if (normalized === undefined) return next;\n return { ...next, link: safeLink(normalized) };\n }),\n };\n }\n\n // Social icons each carry a `url`, written into an href as it is, and a `name`, which an email writes into its\n // `title`, `alt` and image URL as it is too (a web page or a document escapes it).\n if (componentName === \"Social\" && out.icons && Array.isArray(out.icons.icons)) {\n const named = (icon: any) => (mode === \"email\" && typeof icon.name === \"string\" ? { ...icon, name: escapeText(icon.name, true) } : icon);\n out.icons = { ...out.icons, icons: out.icons.icons.map((icon: any) => (icon && typeof icon === \"object\" ? named(safeLink(icon)) : icon)) };\n }\n\n return out as T;\n}\n","/**\n * HTML to Plain Text Converter\n *\n * Pure regex-based HTML-to-text conversion — no DOM dependency.\n * Works in Node.js, edge runtimes, and browsers.\n *\n * Critical for email deliverability: spam filters penalize HTML-only emails.\n */\n\n/**\n * Common HTML named entity map for decoding.\n *\n * Covers the entities that actually appear in email/marketing content —\n * currency, typographic punctuation, common symbols, and the Latin-1 accented\n * letters used in European names and words. Kept as a curated map (rather than\n * the full HTML5 named-reference set, which is ~2000 entries) so the bundle\n * stays within its size budget. Numeric entities (`{`, ``) are\n * handled separately below, so anything missing here still decodes if written\n * numerically.\n */\nconst HTML_ENTITIES: Record<string, string> = {\n // Core markup + whitespace\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \""\": '\"',\n \"'\": \"'\",\n \"'\": \"'\",\n \" \": \" \",\n // Dashes, quotes, and typographic punctuation\n \"—\": \"—\",\n \"–\": \"–\",\n \"«\": \"«\",\n \"»\": \"»\",\n \"‘\": \"‘\",\n \"’\": \"’\",\n \"“\": \"“\",\n \"”\": \"”\",\n \"•\": \"•\",\n \"·\": \"·\",\n \"…\": \"…\",\n // Currency\n \"¢\": \"¢\",\n \"£\": \"£\",\n \"¥\": \"¥\",\n \"€\": \"€\",\n // Legal / trademark\n \"©\": \"©\",\n \"®\": \"®\",\n \"™\": \"™\",\n \"§\": \"§\",\n \"¶\": \"¶\",\n // Math and misc symbols\n \"°\": \"°\",\n \"±\": \"±\",\n \"×\": \"×\",\n \"÷\": \"÷\",\n \"µ\": \"µ\",\n \"¼\": \"¼\",\n \"½\": \"½\",\n \"¾\": \"¾\",\n // Latin-1 accented letters (common in European names/words)\n \"ß\": \"ß\",\n \"à\": \"à\",\n \"á\": \"á\",\n \"â\": \"â\",\n \"ã\": \"ã\",\n \"ä\": \"ä\",\n \"å\": \"å\",\n \"æ\": \"æ\",\n \"ç\": \"ç\",\n \"è\": \"è\",\n \"é\": \"é\",\n \"ê\": \"ê\",\n \"ë\": \"ë\",\n \"ì\": \"ì\",\n \"í\": \"í\",\n \"î\": \"î\",\n \"ï\": \"ï\",\n \"ñ\": \"ñ\",\n \"ò\": \"ò\",\n \"ó\": \"ó\",\n \"ô\": \"ô\",\n \"õ\": \"õ\",\n \"ö\": \"ö\",\n \"ø\": \"ø\",\n \"ù\": \"ù\",\n \"ú\": \"ú\",\n \"û\": \"û\",\n \"ü\": \"ü\",\n};\n\n/**\n * Decode HTML entities (named and numeric).\n */\nfunction decodeEntities(text: string): string {\n // Named entities\n let result = text.replace(/&\\w+;/g, (match) => HTML_ENTITIES[match] ?? match);\n\n // Numeric entities: { and \n result = result.replace(/&#(\\d+);/g, (_, code) =>\n String.fromCharCode(parseInt(code, 10))\n );\n result = result.replace(/&#x([0-9a-fA-F]+);/g, (_, code) =>\n String.fromCharCode(parseInt(code, 16))\n );\n\n return result;\n}\n\n/**\n * Convert an HTML string to readable plain text.\n *\n * @param html - HTML string to convert\n * @returns Plain text representation\n *\n * @example\n * ```ts\n * import { htmlToPlainText } from \"@unlayer-internal/shared-elements\";\n *\n * const text = htmlToPlainText(\"<h1>Hello</h1><p>World</p>\");\n * // \"HELLO\\nWorld\"\n * ```\n */\nexport function htmlToPlainText(html: string): string {\n if (!html) return \"\";\n\n let text = html;\n\n // 1. Remove elements marked with data-skip-in-text (preview div, etc.)\n text = text.replace(/<[^>]+data-skip-in-text=\"true\"[^>]*>[\\s\\S]*?<\\/[^>]+>/gi, \"\");\n\n // 2. Remove <head>, <style>, <script> blocks entirely\n text = text.replace(/<head[\\s\\S]*?<\\/head>/gi, \"\");\n text = text.replace(/<style[\\s\\S]*?<\\/style>/gi, \"\");\n text = text.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\");\n\n // A line break, first: headings, links and list items keep theirs (\"WELCOME BACK,<br>ADA\").\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n // 3. Convert headings: h1-h2 → UPPERCASE, h3-h6 → as-is\n text = text.replace(/<h[12][^>]*>([\\s\\S]*?)<\\/h[12]>/gi, (_, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n // Entities stay as written, to decode below (`&` uppercased wouldn't).\n const upper = clean.replace(/&#?\\w+;|[^&]+|&/g, (part: string) => (/^&#?\\w+;$/.test(part) ? part : part.toUpperCase()));\n return \"\\n\" + upper + \"\\n\";\n });\n text = text.replace(/<h[3-6][^>]*>([\\s\\S]*?)<\\/h[3-6]>/gi, (_, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n return \"\\n\" + clean + \"\\n\";\n });\n\n // 4. Convert links: <a href=\"url\">text</a> → text (url)\n text = text.replace(/<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n // Skip if link text is the same as URL (avoid duplication)\n if (clean === href || clean === decodeEntities(href)) {\n return clean;\n }\n return `${clean} (${href})`;\n });\n\n // 5. Convert images: <img alt=\"text\"> → [text]\n text = text.replace(/<img[^>]+alt=[\"']([^\"']+)[\"'][^>]*\\/?>/gi, (_, alt) => {\n return `[${alt}]`;\n });\n // Remove images without alt text\n text = text.replace(/<img[^>]*\\/?>/gi, \"\");\n\n // 6. Convert horizontal rules\n text = text.replace(/<hr[^>]*\\/?>/gi, \"\\n---\\n\");\n\n // 7. Convert list items\n text = text.replace(/<li[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n return \"- \" + clean + \"\\n\";\n });\n\n // 9. Convert block-level closing tags to newlines\n text = text.replace(/<\\/(?:p|div|tr|blockquote|section|article|header|footer|main|nav|aside)>/gi, \"\\n\");\n text = text.replace(/<\\/(?:ul|ol|table|thead|tbody|tfoot)>/gi, \"\\n\");\n\n // 10. Convert <td> and <th> to tab-separated values\n text = text.replace(/<\\/(?:td|th)>/gi, \"\\t\");\n\n // 11. Remove all remaining HTML tags\n text = text.replace(/<[^>]+>/g, \"\");\n\n // 12. Decode HTML entities\n text = decodeEntities(text);\n\n // 13. Clean up whitespace\n // Replace tabs with spaces\n text = text.replace(/\\t/g, \" \");\n // Collapse multiple spaces (but not newlines) into one\n text = text.replace(/[^\\S\\n]+/g, \" \");\n // Trim each line\n text = text\n .split(\"\\n\")\n .map((line) => line.trim())\n .join(\"\\n\");\n // Collapse 3+ consecutive newlines to 2\n text = text.replace(/\\n{3,}/g, \"\\n\\n\");\n // Trim leading/trailing whitespace\n text = text.trim();\n\n return text;\n}\n","/**\n * Universal Component Factory\n *\n * Eliminates boilerplate by creating components from configuration.\n * This factory handles all the repetitive logic that was duplicated\n * across Button, Heading, Paragraph, etc.\n */\n\nimport React from \"react\";\nimport { collecting, RECORDS } from \"./collect\";\nimport { recordBlock, whileCollecting } from \"./record\";\nimport type { ExporterName } from \"@unlayer/types\";\n\n/** Exporter map keyed by display mode. Defined locally until added to @unlayer/types. */\ntype ItemExporters = Partial<Record<ExporterName, (...args: any[]) => string>>;\nimport type { RenderMode, UnlayerConfig } from \"@unlayer-internal/shared-elements\";\nimport type { DeviceProps, SizeInput } from \"../types\";\nimport { contentSlotWidth, pinImageSrc } from \"./image-sizing\";\nimport {\n mergeValues,\n generateHtmlFromTextJson,\n normalizeValuesForExporter,\n DEFAULT_CONFIG,\n} from \"@unlayer-internal/shared-elements\";\n\n\n/**\n * Static property key for the hook-free render function.\n * Column calls this directly instead of the outer component\n * (which uses hooks and would break when called as a plain function).\n */\nexport const UNLAYER_RENDER_KEY = \"__unlayerRender\";\n\n/**\n * Static property key for the item's config (name, defaultValues, propMapper).\n * Used by renderToJson to extract values without rendering to HTML.\n */\nexport const UNLAYER_CONFIG_KEY = \"__unlayerItemConfig\";\n\n/**\n * Base props that all item components support\n */\nexport interface BaseItemComponentProps extends DeviceProps {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n mode?: RenderMode;\n /** Padding of the content wrapper around this item — a number (→ px) or a CSS\n * string (\"10px\", \"16px 24px\"). Applied by the containing Column. */\n containerPadding?: SizeInput;\n\n // Internal props (for advanced use)\n index?: number;\n /** @internal — content id allocated by the containing Column; keeps the\n * value-level _meta.htmlID unique per instance and aligned with the\n * wrapper id and head/json numbering. */\n _metaHtmlId?: string;\n colIndex?: number;\n cells?: any[];\n bodyValues?: any;\n rowValues?: any;\n /** @internal - this column's values, threaded by Column for width-aware exporters */\n columnValues?: any;\n /** @internal - Unlayer config threaded from UnlayerProvider */\n _config?: UnlayerConfig;\n}\n\n/**\n * Configuration for creating an item component\n */\nexport interface ItemComponentConfig<TValues, TSemanticProps> {\n /** Component name (e.g., 'Button', 'Heading') */\n name: string;\n\n /** Default values for the component */\n defaultValues: TValues;\n\n /** Function to map semantic props to values format */\n propMapper: (\n props: TSemanticProps & { children?: React.ReactNode }\n ) => Partial<TValues>;\n\n /** Display name for React DevTools */\n displayName?: string;\n\n /** Per-component exporters map — enables tree-shaking.\n * Keys are display modes ('web', 'email', 'document'), values are exporter functions. */\n exporters: ItemExporters;\n\n /** Design-JSON content type override (defaults to the lowercased name).\n * Custom tools use \"custom\". */\n contentType?: string;\n\n /** Custom tool name — emitted as the content's `slug` in design JSON. */\n slug?: string;\n\n /** Base name for `_meta.htmlID`/`htmlClassNames`, prefixed with\n * `u_content_` where used (defaults to the lowercased `name`). Custom\n * tools pass `custom_<slug>`, rendering as `u_content_custom_<slug>`. */\n metaName?: string;\n\n /** Head contributions (css/js/tags builders) carried by the component\n * itself instead of looked up in the exporters registry. */\n head?: Record<string, any>;\n\n /** Skip the content-container wrapper when this component's exporter returns\n * an empty string for an unsupported mode. */\n omitEmptyOutput?: boolean;\n}\n\n/**\n * Props type that combines base props with semantic props\n */\nexport type ItemComponentProps<TSemanticProps> = BaseItemComponentProps &\n Omit<TSemanticProps, keyof DeviceProps>;\n\n// ============================================\n// Internal: rendering helpers (merged from render-component.tsx)\n// ============================================\n\ninterface ErrorFallbackProps {\n type: string;\n error: Error;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Error fallback component shown when an exporter throws. */\nconst ErrorFallback: React.FC<ErrorFallbackProps> = ({\n type,\n className,\n style\n}) => (\n <div className={className} style={style}>\n <div\n style={{\n padding: \"20px\",\n backgroundColor: \"#fee\",\n border: \"1px solid #fcc\",\n borderRadius: \"4px\",\n color: \"#c33\",\n textAlign: \"center\",\n fontFamily: \"system-ui, sans-serif\"\n }}\n >\n <strong>{type} failed to render.</strong>\n <br />\n <small>Check console for details.</small>\n </div>\n </div>\n);\n\ninterface RenderConfig<T = any> {\n type: string;\n values: T;\n mode: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n args?: any[];\n /** Column/body context merged into the exporter `meta` (8th arg). */\n metaContext?: Record<string, any>;\n innerHTML?: string;\n _config?: UnlayerConfig;\n exporter: Function;\n}\n\n/**\n * Allocate the next unique HTML id for a prefix, scoped to one render.\n * Counters live on the threaded `_config` (`__ids`), which Body resets per\n * render — so renderToHtml produces unique ids (u_row_1, u_row_2, …) like the\n * editor and like renderToJson, instead of resetting per row. Falls back to\n * `${prefix}_1` when rendered standalone (no _config).\n */\nexport function nextHtmlId(config: any, prefix: string): string {\n if (!config) return `${prefix}_1`;\n const ids: Record<string, number> = (config.__ids ??= {});\n ids[prefix] = (ids[prefix] || 0) + 1;\n return `${prefix}_${ids[prefix]}`;\n}\n\n/**\n * An HTML id (or, with `spaces`, a list of class names) that can't end its attribute: all else stays as 0.1.22 wrote\n * it (`סיכום`, `section.2`, `sm:hidden`). The head's CSS escapes the id it selects (see device-overrides.ts).\n */\nexport function safeName(value: unknown, spaces = false): string {\n const text = String(value ?? \"\");\n // Class names apart on lines or by tabs stay apart, as the browser reads them.\n return spaces ? text.replace(/[\\t\\n\\f\\r]/g, \" \").replace(/[\"'<>&`\\u0000-\\u001f\\u007f]/g, \"\") : text.replace(/[\"'<>&`\\s\\u0000-\\u001f\\u007f]/g, \"\");\n}\n\n/** A block's or row's `_meta` with its id and class names kept to what they can hold (see `safeName`). */\nexport const safeMeta = <T extends { htmlID?: unknown; htmlClassNames?: unknown }>(meta: T) => ({ ...meta, htmlID: safeName(meta.htmlID), htmlClassNames: safeName(meta.htmlClassNames, true) });\n\n/** Add _meta fields if not present. */\nfunction ensureMeta(values: any, type: string, index: number = 0): any {\n return {\n ...values,\n _meta: {\n htmlID: `u_content_${type.toLowerCase()}_${index + 1}`,\n htmlClassNames: `u_content_${type.toLowerCase()}`,\n ...(values._meta || {})\n }\n };\n}\n\n/**\n * Render a component by calling its exporter and wrapping the HTML output.\n * Handles error boundaries, exporterConfig construction, and container vs item calling conventions.\n */\n/** A direction the `dir` attribute takes (ltr, rtl, auto). Anything else is dropped: it's written into markup. */\nexport function textDirectionOf(value: unknown): \"ltr\" | \"rtl\" | \"auto\" | undefined {\n const dir = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n return dir === \"ltr\" || dir === \"rtl\" || dir === \"auto\" ? dir : undefined;\n}\n\nfunction renderComponent<T = any>(config: RenderConfig<T>): JSX.Element {\n const { type, values, mode, className, style, args = [], innerHTML, _config, exporter, metaContext } = config;\n\n try {\n // Build exporterConfig from _config (falls back to defaults)\n const cfg = _config ?? DEFAULT_CONFIG;\n const exporterConfig = {\n generateHtmlFromTextJson,\n toSafeHtml: cfg.toSafeHtml,\n textDirection: textDirectionOf(cfg.textDirection),\n cdnBaseUrl: cfg.cdnBaseUrl,\n };\n\n // Call exporter with appropriate arguments\n let html: string;\n if (innerHTML !== undefined) {\n // Container components (Row, Body) take innerHTML first\n html = exporter(innerHTML, values, ...args);\n } else {\n // Content components take values first\n // Item exporters signature: (values, index, colIndex, cells, bodyValues, rowValues, embeddedValues, meta)\n // Args 2-7 are deprecated positional params; the 8th arg is a meta object with all context\n const meta = {\n exporterConfig,\n mergeTagState: cfg.mergeTagState,\n ...(metaContext ?? {}),\n };\n html = exporter(values, ...args, undefined, meta);\n }\n\n // Ensure string output\n html = typeof html === \"string\" ? html : String(html);\n\n // Return rendered component\n return (\n <div\n className={className}\n style={style}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n } catch (error) {\n console.error(`${type} rendering failed:`, error);\n return (\n <ErrorFallback\n type={type}\n error={error as Error}\n className={className}\n style={style}\n />\n );\n }\n}\n\n// ============================================\n// Public API\n// ============================================\n\n/**\n * Create an item component (Button, Heading, Paragraph, etc.)\n *\n * This factory eliminates the ~100 lines of boilerplate code that was\n * duplicated across every item component.\n *\n * @example\n * ```tsx\n * const Button = createItemComponent({\n * name: \"Button\",\n * defaultValues: BUTTON_DEFAULTS,\n * propMapper: mapButtonProps,\n * displayName: \"Button\"\n * });\n * ```\n */\nexport function createItemComponent<\n TValues extends Record<string, any> = any,\n TSemanticProps = any\n>(\n config: ItemComponentConfig<TValues, TSemanticProps>\n): React.FC<ItemComponentProps<TSemanticProps>> {\n // Inner render function — no hooks, safe to call as a plain function (Column does this)\n function renderFn(\n props: ItemComponentProps<TSemanticProps>\n ): React.ReactElement | null {\n const {\n // Base props\n mode: modeProp,\n className,\n style,\n\n // Internal props\n index = 0,\n _metaHtmlId,\n colIndex = 0,\n cells = [],\n bodyValues = {},\n rowValues = {},\n columnValues = {},\n _config,\n\n // Children\n children,\n\n // Rest are semantic props\n ...restProps\n } = props as ItemComponentProps<TSemanticProps>;\n\n // Resolve mode: explicit prop > _config > default\n const mode: RenderMode = modeProp ?? _config?.mode ?? \"web\";\n\n // 1. Map semantic props to values format (handles dual API)\n const mappedValues = config.propMapper({\n children,\n ...restProps\n } as TSemanticProps & { children?: React.ReactNode });\n\n // 2. Merge with defaults\n const finalValues = mergeValues(config.defaultValues, mappedValues);\n\n // 3. Ensure _meta is present. The Column-allocated id wins so every\n // instance is unique; the index fallback covers standalone renders.\n const metaName = config.metaName ?? config.name.toLowerCase();\n const meta = {\n htmlID: _metaHtmlId ?? `u_content_${metaName}_${index + 1}`,\n htmlClassNames: `u_content_${metaName}`,\n ...((finalValues as Record<string, any>)._meta || {}),\n };\n // An id or class name given in `values` reaches an attribute and the head's CSS selectors: only what they can hold.\n const valuesWithMeta = { ...finalValues, _meta: safeMeta(meta) };\n\n // 4. Ensure bodyValues has a contentWidth. Default to the schema-shaped\n // \"500px\" (matches BodyDefaults.contentWidth and the exporter's image\n // fallback width), so a standalone item (no Body) sizes the same as the\n // editor and the value is a CSS string everywhere it might be consumed.\n const safeBodyValues = {\n contentWidth: \"500px\",\n ...bodyValues\n };\n\n // 5. Resolve link/action fields to the exporter's render-value shape.\n // Skipped on the renderToJson path (which uses propMapper directly)\n // so JSON output preserves the schema's storage shape.\n const valuesForExporter = normalizeValuesForExporter(\n valuesWithMeta as Record<string, any>,\n config.name,\n mode\n );\n\n // 5b. Convert a fixed (px) image pin to the editor's canonical percent now\n // that the column geometry is known (Column threads columnValues/cells/\n // bodyValues). Guarded on `src.autoWidth === false`, so only pinned\n // images are touched; responsive images and non-image blocks pass through.\n const exportSrc = (valuesForExporter as Record<string, any>).src;\n if (exportSrc && typeof exportSrc === \"object\" && exportSrc.autoWidth === false) {\n const availableWidth = contentSlotWidth({\n bodyValues: safeBodyValues,\n rowValues,\n rowCells: cells,\n columnIndex: colIndex,\n columnValues,\n containerPadding:\n (props as { containerPadding?: unknown; values?: { containerPadding?: unknown } })\n .containerPadding ??\n (props as { values?: { containerPadding?: unknown } }).values?.containerPadding,\n });\n (valuesForExporter as Record<string, any>).src = pinImageSrc(exportSrc, availableWidth);\n }\n\n // 6. Resolve exporter for this mode (fallback to web)\n const exporter = (config.exporters[mode] || config.exporters.web)!;\n\n // 7. Render using utility (handles all boilerplate)\n return renderComponent<TValues>({\n type: config.name,\n values: valuesForExporter as TValues,\n mode,\n className,\n style,\n args: [index, colIndex, cells, safeBodyValues, rowValues],\n // The 8th arg the exporters actually read: column/body context for\n // width-aware rendering (Image's available-width calc), mirroring the editor.\n metaContext: {\n columnIndex: colIndex,\n columnValues,\n rowCells: cells,\n rowValues,\n bodyValues: safeBodyValues,\n },\n _config,\n exporter,\n });\n }\n\n // Outer React component — hook-free, works in both Server and Client Components\n const ItemComponent: React.FC<ItemComponentProps<TSemanticProps>> = (\n props\n ) => {\n if (collecting()) return whileCollecting(() => recordBlock(ItemComponent, props as Record<string, any>), () => renderFn(props), ItemComponent.displayName ?? \"Block\");\n return renderFn(props);\n };\n\n // Set display name for React DevTools\n ItemComponent.displayName = config.displayName || config.name;\n\n // Expose hook-free render for Column to call directly\n (ItemComponent as any)[UNLAYER_RENDER_KEY] = renderFn;\n (ItemComponent as any)[RECORDS] = true;\n\n // Expose config for renderToJson to extract values without HTML rendering\n (ItemComponent as any)[UNLAYER_CONFIG_KEY] = {\n name: config.name,\n defaultValues: config.defaultValues,\n propMapper: config.propMapper,\n contentType: config.contentType,\n slug: config.slug,\n metaName: config.metaName,\n head: config.head,\n omitEmptyOutput: config.omitEmptyOutput,\n };\n\n return ItemComponent;\n}\n","import { ButtonExporters, ButtonDefaults } from \"@unlayer/exporters\";\nimport type { ButtonValues, TextStyleProps, SizeInput, BorderInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Button semantic props — agent-friendly text/style types (replacing the loose\n * `any` flat props) plus a CSS-style `width` (number/px pins; \"100%\" full-width).\n */\ntype ButtonSemanticProps = Omit<\n SemanticProps<ButtonValues>,\n keyof TextStyleProps | \"width\" | \"padding\" | \"borderRadius\" | \"border\"\n> &\n TextStyleProps & {\n /** Display width — a number/px pins the button; \"100%\" makes it full-width. */\n width?: SizeInput;\n /** Inner padding — a number (→ px) or CSS string (\"14px 28px\"). */\n padding?: SizeInput;\n /** Corner radius — a number (→ px) or CSS string (\"8px\", \"500px\"). */\n borderRadius?: SizeInput;\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n };\n\n/**\n * Button Component Props\n * Automatically provides autocomplete for ALL properties (flat and nested)\n */\nexport interface ButtonProps extends ItemComponentProps<ButtonSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific additions\nconst DEFAULT_VALUES = {\n ...ButtonDefaults,\n text: \"Button\", // React convenience — not in schema\n} as unknown as ButtonValues;\n\n/**\n * Button - Universal SSR/Client Component with Automatic Semantic Props\n *\n * ✅ TypeScript provides autocomplete for ALL props (flat and nested)\n * ✅ Works for any nested structure - no configuration needed\n * ✅ Escape hatch: values prop for full control\n * ✅ Works on both server and client\n *\n * @example Flat Props (Simple - most common)\n * ```tsx\n * // `href` accepts a plain URL string (the ergonomic form).\n * <Button href=\"https://example.com\" color=\"white\" backgroundColor=\"#3b82f6\" fontSize=\"16px\">\n * Click me\n * </Button>\n * ```\n *\n * @example Advanced (per-side borders)\n * ```tsx\n * <Button\n * backgroundColor=\"blue\"\n * borderTopColor=\"red\"\n * borderTopWidth=\"2px\"\n * borderBottomWidth=\"0px\"\n * >\n * Click me\n * </Button>\n * ```\n *\n * @example Nested Objects (full control)\n * ```tsx\n * <Button\n * buttonColors={{ backgroundColor: \"#3b82f6\", hoverBackgroundColor: \"#2563eb\" }}\n * border={{ borderTopWidth: \"2px\" }}\n * >\n * Click me\n * </Button>\n * ```\n */\nconst Button = createItemComponent<ButtonValues, ButtonSemanticProps>({\n name: \"Button\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const mapped = mapSemanticProps(\n props as SemanticProps<ButtonValues>,\n DEFAULT_VALUES,\n \"Button\"\n );\n // In Unlayer's model a button's display width is size.width, used only when\n // size.autoWidth is false (otherwise the width is auto / content-sized). So a\n // user-provided width sets autoWidth:false. Read the MAPPED size, which\n // already includes the flat prop, the nested prop, AND the `values` escape\n // hatch; mapSemanticProps does not inject the schema default, so a present\n // size.width means the user set it. Honor an explicit autoWidth.\n const size = (mapped as { size?: unknown }).size;\n if (size && typeof size === \"object\" && !Array.isArray(size)) {\n const s = size as { width?: unknown; autoWidth?: unknown };\n // width accepts a number per SizeInput, but the exporter wants a CSS\n // string — coerce a bare number / unit-less numeric string to px.\n if (typeof s.width === \"number\") {\n s.width = `${s.width}px`;\n } else if (typeof s.width === \"string\" && /^\\d+(?:\\.\\d+)?$/.test(s.width.trim())) {\n s.width = `${s.width.trim()}px`;\n }\n if (s.width !== undefined && s.autoWidth === undefined) {\n s.autoWidth = false;\n }\n }\n return mapped;\n },\n displayName: \"Button\",\n exporters: ButtonExporters,\n});\n\nexport default Button;\n","import { DividerExporters, DividerDefaults } from \"@unlayer/exporters\";\nimport type { DividerValues, BorderInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\ntype DividerSemanticProps = Omit<SemanticProps<DividerValues>, \"border\"> & {\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n};\n\nexport interface DividerProps extends ItemComponentProps<DividerSemanticProps> {}\n\n// Defaults from the editor schema\nconst DEFAULT_VALUES = {\n ...DividerDefaults,\n} as unknown as DividerValues;\n\n/**\n * Divider - Universal SSR/Client Component with Automatic Semantic Props\n *\n * @example Flat Props\n * ```tsx\n * <Divider borderTopWidth=\"2px\" borderTopColor=\"#ccc\" width=\"80%\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Divider values={{\n * border: { borderTopWidth: \"2px\", borderTopColor: \"#ccc\" },\n * width: \"80%\"\n * }} />\n * ```\n */\nconst Divider = createItemComponent<DividerValues, DividerSemanticProps>({\n name: \"Divider\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => mapSemanticProps(props as SemanticProps<DividerValues>, DEFAULT_VALUES, \"Divider\"),\n displayName: \"Divider\",\n exporters: DividerExporters,\n});\n\nexport default Divider;\n","import { HeadingExporters, HeadingDefaults } from \"@unlayer/exporters\";\nimport type { HeadingValues, TextStyleProps, HeadingLevel } from \"../types\";\nimport {\n createItemComponent,\n type ItemComponentProps\n} from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Heading semantic props — agent-friendly text/style types (replacing the loose\n * `any` flat props) plus the `level` alias and h1–h6 levels.\n */\ntype HeadingSemanticProps = Omit<\n SemanticProps<HeadingValues>,\n keyof TextStyleProps | \"headingType\"\n> &\n TextStyleProps & {\n /** Heading level h1–h6. */\n headingType?: HeadingLevel;\n /** Alias for `headingType`. */\n level?: HeadingLevel;\n /** Heading text (or use children). */\n text?: string;\n };\n\n/**\n * Heading Component Props\n * Automatically provides autocomplete for ALL properties (flat and nested)\n */\nexport interface HeadingProps extends ItemComponentProps<HeadingSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific additions\nconst DEFAULT_VALUES = {\n ...HeadingDefaults,\n color: \"#000000\", // Not in schema options but used by renderer\n fontWeight: 400, // Not in schema options but used by renderer\n text: \"Heading\", // React convenience — not in schema\n} as unknown as HeadingValues;\n\n/**\n * Heading - Universal SSR/Client Component with Semantic Props API\n *\n * ✅ Semantic flat props (level, color, fontSize, etc.)\n * ✅ Escape hatch: values prop for full control\n * ✅ Works on both server and client\n * ✅ Minimal boilerplate using component factory\n *\n * @example Semantic Props (Recommended)\n * ```tsx\n * <Heading level=\"h1\" color=\"#222\" fontSize=\"32px\">\n * Welcome\n * </Heading>\n * ```\n *\n * @example Full Control via Values\n * ```tsx\n * <Heading values={{ headingType: \"h1\", color: \"#222\" }}>Welcome</Heading>\n * ```\n */\nconst Heading = createItemComponent<HeadingValues, HeadingSemanticProps>({\n name: \"Heading\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { level, ...rest } = props as SemanticProps<HeadingValues> & { level?: HeadingValues[\"headingType\"] };\n const result = mapSemanticProps(rest as SemanticProps<HeadingValues>, DEFAULT_VALUES, \"Heading\");\n // Map level prop to headingType\n if (level && !result.headingType) {\n result.headingType = level;\n }\n return result;\n },\n displayName: \"Heading\",\n exporters: HeadingExporters,\n});\n\nexport default Heading;\n","import { HtmlExporters, HtmlDefaults } from \"@unlayer/exporters\";\nimport type { HtmlValues } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\nexport interface HtmlProps extends ItemComponentProps<SemanticProps<HtmlValues>> {}\n\n// Defaults from the editor schema\nconst DEFAULT_VALUES = {\n ...HtmlDefaults,\n} as unknown as HtmlValues;\n\n/**\n * Html - Universal SSR/Client Component for custom HTML with Automatic Semantic Props\n *\n * ⚠️ Renders the HTML verbatim — it is NOT sanitized by default. Only pass HTML\n * you trust, and make sure it is valid: notably, an inline SVG inside a `url(...)`\n * must be URL-encoded, because a raw `\"` inside a double-quoted `style=\"…\"`\n * closes the attribute and the rest leaks out as text. To sanitize (matching the\n * editor's HTML block, which strips scripts/event handlers), pass a `toSafeHtml`\n * function via the `UnlayerProvider` config.\n *\n * @example Flat Props\n * ```tsx\n * <Html html=\"<div>Custom HTML</div>\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Html values={{ html: \"<div>Custom HTML</div>\" }} />\n * ```\n */\nconst Html = createItemComponent<HtmlValues, SemanticProps<HtmlValues>>({\n name: \"Html\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => mapSemanticProps(props, DEFAULT_VALUES, \"Html\"),\n displayName: \"Html\",\n exporters: HtmlExporters,\n});\n\nexport default Html;\n","import { ImageExporters, ImageDefaults } from \"@unlayer/exporters\";\nimport type { ImageValues, ImageSrcInput, SizeInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Image semantic props — agent-friendly `src` (plain URL string or value object)\n * and CSS-style sizing (number/px pins, \"50%\" sets a percentage), replacing the\n * loose `any` flat props.\n */\ntype ImageSemanticProps = Omit<\n SemanticProps<ImageValues>,\n \"src\" | \"width\" | \"maxWidth\"\n> & {\n /** Alt text (alias for altText) */\n alt?: string;\n /** Image URL string, or the value object `{ url, width?, maxWidth?, ... }`. */\n src?: ImageSrcInput;\n /** Display width — number/px pins the image; \"50%\" sets a percentage width. */\n width?: SizeInput;\n /** Display width as a CSS value (\"50%\", \"300px\"). */\n maxWidth?: SizeInput;\n};\n\nexport interface ImageProps extends ItemComponentProps<ImageSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific overrides.\n// Drop the schema placeholder's `height` so an image with no explicit dimensions\n// doesn't inherit its 4:1 aspect ratio: the email exporter then omits the `height`\n// attribute (height:auto), letting the real image keep its own ratio instead of\n// being letterboxed (Outlook honors the height attribute). `width` is kept — it\n// drives the responsive display width attribute. Real dimensions, when provided\n// via an object `src`, override these.\nconst { height: _placeholderHeight, ...defaultSrc } = ImageDefaults.src as Record<string, unknown>;\nconst DEFAULT_VALUES = {\n ...ImageDefaults,\n src: {\n ...defaultSrc,\n autoWidth: true,\n maxWidth: \"100%\",\n },\n} as unknown as ImageValues;\n\n/**\n * Image - Renders an image element.\n *\n * @example Shorthand\n * ```tsx\n * <Image src=\"https://example.com/photo.jpg\" alt=\"A photo\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Image values={{\n * src: { url: \"https://example.com/image.jpg\", width: 600 },\n * altText: \"Description\"\n * }} />\n * ```\n */\nconst Image = createItemComponent<ImageValues, ImageSemanticProps>({\n name: \"Image\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n // `width`/`maxWidth` are DISPLAY intent — pull them out so mapSemanticProps\n // can't fold them into the natural-size `src.width` field. They drive\n // autoWidth + maxWidth below; the natural dimensions come only from an\n // object `src` / the loaded image.\n const { alt, src, width: widthProp, maxWidth: maxWidthProp, ...rest } = props;\n\n // Normalize a string `values.src` to { url } before mapping. mapSemanticProps\n // merges flat src props onto the src group by spreading; if the escape-hatch\n // src is a string, spreading it character-spreads the URL into numeric keys\n // ({0:\"h\",1:\"t\",…}) and loses the url. Wrapping it first keeps the merge\n // object-to-object.\n const restValues = (rest as { values?: { src?: unknown } }).values;\n const normalizedRest =\n restValues && typeof restValues.src === \"string\"\n ? { ...rest, values: { ...restValues, src: { url: restValues.src } } }\n : rest;\n\n const base: Partial<ImageValues> = mapSemanticProps(\n normalizedRest as SemanticProps<ImageValues>,\n DEFAULT_VALUES,\n \"Image\"\n );\n\n // Map alt → altText\n if (alt !== undefined) {\n base.altText = alt;\n }\n\n // Build the src value. Note: ImageValues.src is typed as string (codegen\n // bug) but the exporter expects { url, autoWidth?, maxWidth?, width?, ... }.\n // Natural src fields come from the `src` prop (string or object) and the\n // `values.src` escape hatch (which lands on `base.src` via mapSemanticProps);\n // the display `width`/`maxWidth` props were pulled out above. Combine the\n // natural fields (defensively, since base.src may be a string or non-object),\n // then apply the display intent.\n const baseSrc = (base as Record<string, any>).src;\n const fromValues: Record<string, any> =\n baseSrc && typeof baseSrc === \"object\" && !Array.isArray(baseSrc)\n ? (baseSrc as Record<string, any>)\n : typeof baseSrc === \"string\"\n ? { url: baseSrc }\n : {};\n const fromProp: Record<string, any> =\n typeof src === \"string\" ? { url: src } : (src ?? {}) as Record<string, any>;\n const userSrc = { ...fromValues, ...fromProp };\n\n if (src !== undefined || baseSrc !== undefined) {\n // A string url (from the `src` prop or `values.src`) carries no\n // dimensions, so it starts responsive with no placeholder size; an object\n // src starts from the schema defaults.\n const isStringUrl =\n typeof src === \"string\" || (src === undefined && typeof baseSrc === \"string\");\n const start = isStringUrl\n ? { autoWidth: true, maxWidth: \"100%\" }\n : { ...DEFAULT_VALUES.src };\n const merged = { ...start, ...userSrc } as Record<string, any>;\n\n // Display size = autoWidth + maxWidth: the default is responsive\n // (autoWidth:true); a fixed display size is autoWidth:false + `maxWidth` as a\n // PERCENT of the column's content slot (see image-sizing.ts for why a\n // percent, not a raw px). A px/number pin is kept here as a placeholder and\n // converted to that percent by the width-aware pass in renderToHtml /\n // renderToJson, where the column geometry is known.\n //\n // A `width` the author provides — the flat `width` prop OR `src.width`\n // (the documented full-control form) — is treated as that display intent and\n // pins. This is the canonical pinned shape the editor stores, so it survives\n // the round-trip; an `autoWidth` set explicitly on `src` is honored as-is.\n const pctRe = /^\\d+(?:\\.\\d+)?%$/;\n const asPercent = (v: unknown): string | undefined =>\n typeof v === \"string\" && pctRe.test(v.trim()) ? v.trim() : undefined;\n const asPx = (v: unknown): number | undefined => {\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v === \"string\") {\n const t = v.trim();\n if (pctRe.test(t)) return undefined;\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(t);\n if (m) return parseFloat(m[1]);\n }\n return undefined;\n };\n\n // Resolve display intent in priority order: flat `width` → flat `maxWidth`\n // → object src `maxWidth` → object src `width`.\n let displayPct: string | undefined;\n let displayPx: number | undefined;\n for (const candidate of [widthProp, maxWidthProp, userSrc.maxWidth, userSrc.width]) {\n if (candidate === undefined) continue;\n const pct = asPercent(candidate);\n if (pct) {\n displayPct = pct;\n break;\n }\n const px = asPx(candidate);\n if (px != null) {\n displayPx = px;\n break;\n }\n }\n\n // An explicit escape-hatch `autoWidth` is honored as-is (its own maxWidth\n // stays); otherwise the display intent decides.\n if (userSrc.autoWidth === undefined) {\n if (displayPct && displayPct !== \"100%\") {\n merged.autoWidth = false;\n merged.maxWidth = displayPct;\n } else if (displayPx != null) {\n merged.autoWidth = false;\n merged.maxWidth = displayPx;\n } else {\n merged.autoWidth = true;\n merged.maxWidth = \"100%\";\n }\n }\n\n base.src = merged as ImageValues[\"src\"];\n }\n\n return base;\n },\n displayName: \"Image\",\n exporters: ImageExporters,\n});\n\nexport default Image;\n","import { MenuExporters, MenuDefaults } from \"@unlayer/exporters\";\nimport type { MenuValues, MenuItem, SizeInput, TextStyleProps } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n// Menu carries fontFamily/fontWeight/fontSize/letterSpacing (but not color or\n// lineHeight) — relax those to the same agent-friendly inputs Heading/Paragraph\n// use, so a string fontFamily or a number/em size type-checks (normalized at\n// render time). It has no `color` field (uses linkColor/textColor).\ntype MenuSemanticProps = Omit<\n SemanticProps<MenuValues>,\n \"padding\" | \"fontFamily\" | \"fontWeight\" | \"fontSize\" | \"letterSpacing\"\n> &\n Omit<TextStyleProps, \"color\" | \"lineHeight\"> & {\n /** Menu items shorthand */\n items?: MenuItem[];\n /** Inner padding — a number (→ px) or CSS string. */\n padding?: SizeInput;\n };\n\nexport interface MenuProps extends ItemComponentProps<MenuSemanticProps> {}\n\n// Defaults from the editor schema\nconst DEFAULT_MENU: NonNullable<MenuValues[\"menu\"]> = MenuDefaults.menu ?? { items: [] };\n\nconst DEFAULT_VALUES = {\n ...MenuDefaults,\n} as unknown as MenuValues;\n\n/**\n * Menu - Renders a navigation menu.\n *\n * @example Shorthand\n * ```tsx\n * <Menu items={[{ text: \"Home\", href: \"/\" }, { text: \"About\", href: \"/about\" }]} />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Menu values={{\n * menu: {\n * items: [\n * { key: \"home\", text: \"Home\", link: { name: \"web\", values: { href: \"/\" } } }\n * ]\n * }\n * }} />\n * ```\n */\nconst Menu = createItemComponent<MenuValues, MenuSemanticProps>({\n name: \"Menu\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { items, ...rest } = props;\n\n if (Array.isArray(items)) {\n const mapped = items.map((item: MenuItem, i: number) => ({\n key: String(i + 1),\n text: item.text,\n link: {\n name: \"web\",\n values: { href: item.href, target: item.target ?? \"_blank\" },\n },\n }));\n const base: Partial<MenuValues> = mapSemanticProps(\n rest as SemanticProps<MenuValues>,\n DEFAULT_VALUES,\n \"Menu\"\n );\n base.menu = { items: mapped };\n return base;\n }\n\n return mapSemanticProps(\n props as SemanticProps<MenuValues>,\n DEFAULT_VALUES,\n \"Menu\"\n );\n },\n displayName: \"Menu\",\n exporters: MenuExporters,\n});\n\nexport default Menu;\n","import { ParagraphExporters, ParagraphDefaults } from \"@unlayer/exporters\";\nimport type { ParagraphValues, TextStyleProps } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Paragraph semantic props — agent-friendly text/style types (replacing the\n * loose `any` flat props) plus the `text` shorthand (converted to textJson).\n */\ntype ParagraphSemanticProps = Omit<\n SemanticProps<ParagraphValues>,\n keyof TextStyleProps\n> &\n TextStyleProps & {\n /** Plain-text content (or use `html` for inline formatting, or children). */\n text?: string;\n };\n\n/**\n * Paragraph Component Props\n * Automatically provides autocomplete for ALL properties (flat and nested)\n */\nexport interface ParagraphProps extends ItemComponentProps<ParagraphSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific additions\nconst DEFAULT_VALUES = {\n ...ParagraphDefaults,\n color: \"#000000\", // Not in schema options but used by renderer\n} as unknown as ParagraphValues;\n\n/**\n * Paragraph - Universal SSR/Client Component with Semantic Props API\n *\n * ✅ Semantic flat props (color, fontSize, textAlign, etc.)\n * ✅ Escape hatch: values prop for full control\n * ✅ Works on both server and client\n * ✅ Minimal boilerplate using component factory\n *\n * @example Semantic Props (Recommended)\n * ```tsx\n * <Paragraph color=\"#555\" fontSize=\"14px\" lineHeight=\"1.6\">\n * Your paragraph content here with <strong>rich text</strong> support\n * </Paragraph>\n * ```\n *\n * @example Full Control via Values\n * ```tsx\n * <Paragraph values={{ textJson: \"...\", color: \"#555\" }} />\n * ```\n */\nconst Paragraph = createItemComponent<ParagraphValues, ParagraphSemanticProps>({\n name: \"Paragraph\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) =>\n mapSemanticProps(props as SemanticProps<ParagraphValues>, DEFAULT_VALUES, \"Paragraph\"),\n displayName: \"Paragraph\",\n exporters: ParagraphExporters,\n});\n\nexport default Paragraph;\n","import type { PageBreakValues } from \"../types\";\nimport {\n createItemComponent,\n type ItemComponentProps,\n} from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\nexport type PageBreakProps = ItemComponentProps<SemanticProps<PageBreakValues>>;\n\nconst DEFAULT_VALUES = {\n color: \"#6b7280\",\n} as PageBreakValues;\n\nconst pageBreakExporters = {\n // Page breaks are a document-only concept. Keep the unsupported renderers\n // inert so a component rendered outside <Document> does not throw.\n web: () => \"\",\n email: () => \"\",\n document: () => '<div class=\"u-content-page-break\" aria-hidden=\"true\"></div>',\n};\n\nconst pageBreakHead = {\n css: (\n _values: Record<string, unknown>,\n _bodyValues: Record<string, unknown>,\n meta: { displayMode?: string },\n ) =>\n meta.displayMode === \"document\"\n ? `\n .u-content-page-break {\n break-after: page;\n page-break-after: always;\n }\n `\n : undefined,\n};\n\n/**\n * PageBreak - Forces subsequent document content onto a new PDF page.\n *\n * Page breaks render only in document mode. In email and web output they are\n * intentionally inert.\n */\nconst PageBreak = createItemComponent<\n PageBreakValues,\n SemanticProps<PageBreakValues>\n>({\n name: \"PageBreak\",\n contentType: \"page_break\",\n metaName: \"page_break\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => mapSemanticProps(props, DEFAULT_VALUES, \"PageBreak\"),\n displayName: \"PageBreak\",\n exporters: pageBreakExporters,\n head: pageBreakHead,\n omitEmptyOutput: true,\n});\n\nexport default PageBreak;\n","import { SocialExporters, SocialDefaults } from \"@unlayer/exporters\";\nimport type { SocialValues, SocialIcon, SizeInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n// `iconSize`/`spacing` are pixel counts the exporter does arithmetic on, so they\n// must reach it as numbers. Accept a number or a px string for DX and coerce in\n// the mapper — a raw \"34px\" would otherwise render `max-width:NaNpx`.\ntype SocialSemanticProps = Omit<SemanticProps<SocialValues>, \"iconSize\" | \"spacing\"> & {\n /** Social icons shorthand (array of {name, url}) */\n icons?: SocialIcon[];\n /** Icon shape */\n iconType?: \"circle\" | \"rounded\" | \"squared\";\n /** Icon size in px — a number (34) or px string (\"34px\"). */\n iconSize?: SizeInput;\n /** Gap between icons in px — a number or px string. */\n spacing?: SizeInput;\n};\n\nexport interface SocialProps\n extends Omit<ItemComponentProps<SemanticProps<SocialValues>>, \"icons\" | \"iconSize\" | \"spacing\"> {\n icons?: SocialIcon[] | SocialValues[\"icons\"];\n iconType?: \"circle\" | \"rounded\" | \"squared\";\n iconSize?: SizeInput;\n spacing?: SizeInput;\n}\n\n// Defaults from the editor schema\nconst DEFAULT_ICONS: SocialValues[\"icons\"] = SocialDefaults.icons ?? { iconType: \"circle\", icons: [] };\n\nconst DEFAULT_VALUES = {\n ...SocialDefaults,\n} as unknown as SocialValues;\n\n/**\n * Social - Renders social-media icon links.\n *\n * @example Shorthand\n * ```tsx\n * <Social icons={[{ name: \"Facebook\", url: \"https://facebook.com\" }]} iconType=\"rounded\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Social values={{\n * icons: { icons: [\n * { name: \"Facebook\", url: \"https://facebook.com/...\" },\n * { name: \"Twitter\", url: \"https://twitter.com/...\" }\n * ]}\n * }} />\n * ```\n */\nconst Social = createItemComponent<SocialValues, SocialSemanticProps>({\n name: \"Social\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { icons, iconType, ...rest } = props;\n\n // The exporter does arithmetic on iconSize/spacing (icon box sizing and the\n // container max-width), so coerce a px string or number down to a number.\n const coerceSizes = (base: Partial<SocialValues>): Partial<SocialValues> => {\n for (const key of [\"iconSize\", \"spacing\"] as const) {\n const v = (base as Record<string, unknown>)[key];\n if (typeof v === \"string\") {\n // px count only — a non-px unit (\"50%\", \"1.5em\") is invalid here, so\n // drop it and let mergeValues fall back to the schema default.\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(v.trim());\n if (m) (base as Record<string, unknown>)[key] = parseFloat(m[1]);\n else delete (base as Record<string, unknown>)[key];\n }\n }\n return base;\n };\n\n // Map shorthand icons array → exporter format\n if (Array.isArray(icons)) {\n const mapped = icons.map((icon: SocialIcon) => ({\n name: icon.name,\n url: icon.url,\n }));\n const base: Partial<SocialValues> = mapSemanticProps(\n rest as SemanticProps<SocialValues>,\n DEFAULT_VALUES,\n \"Social\"\n );\n base.icons = {\n iconType: iconType ?? base.icons?.iconType ?? \"circle\",\n icons: mapped,\n };\n return coerceSizes(base);\n }\n\n // If iconType passed without shorthand icons, thread it into nested group\n if (iconType !== undefined) {\n const base: Partial<SocialValues> = mapSemanticProps(\n rest as SemanticProps<SocialValues>,\n DEFAULT_VALUES,\n \"Social\"\n );\n base.icons = { ...DEFAULT_ICONS, ...base.icons, iconType };\n return coerceSizes(base);\n }\n\n return coerceSizes(\n mapSemanticProps(props as SemanticProps<SocialValues>, DEFAULT_VALUES, \"Social\")\n );\n },\n displayName: \"Social\",\n exporters: SocialExporters,\n});\n\nexport default Social;\n","import { TableExporters, TableDefaults } from \"@unlayer/exporters\";\nimport type { TableValues, SizeInput, BorderInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\ntype TableSemanticProps = Omit<SemanticProps<TableValues>, \"padding\" | \"border\"> & {\n /** Column headers as string[] */\n headers?: string[];\n /** Row data as 2D string array */\n data?: string[][];\n /** Inner padding — a number (→ px) or CSS string. */\n padding?: SizeInput;\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n};\n\nexport interface TableProps\n extends Omit<ItemComponentProps<Omit<SemanticProps<TableValues>, \"padding\" | \"border\">>, \"headers\" | \"data\"> {\n headers?: string[];\n data?: string[][];\n /** Inner padding — a number (→ px) or CSS string. */\n padding?: SizeInput;\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n}\n\n// Defaults from the editor schema, plus table data structure\nconst DEFAULT_TABLE: NonNullable<TableValues[\"table\"]> = { headers: [], rows: [], footers: [] };\n\nconst DEFAULT_VALUES = {\n ...TableDefaults,\n table: DEFAULT_TABLE, // Schema doesn't include table data structure\n} as unknown as TableValues;\n\n/**\n * Table - Renders a data table.\n *\n * @example Shorthand\n * ```tsx\n * <Table\n * headers={[\"Name\", \"Email\", \"Role\"]}\n * data={[[\"Alice\", \"alice@co.com\", \"Admin\"], [\"Bob\", \"bob@co.com\", \"User\"]]}\n * />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Table values={{\n * table: {\n * headers: [{ cells: [{ text: \"Name\" }, { text: \"Email\" }] }],\n * rows: [{ cells: [{ text: \"John\" }, { text: \"john@example.com\" }] }]\n * },\n * enableHeader: true\n * }} />\n * ```\n */\nconst Table = createItemComponent<TableValues, TableSemanticProps>({\n name: \"Table\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n // `columns`/`rows` are top-level COUNTS, but the table data lives under the\n // nested `table` group whose keys also include `rows` — so routing the flat\n // `rows` through the generic mapper collides with `table.rows` and makes the\n // exporter iterate a number (crash). Pull them out and handle them here.\n const { headers, data, columns, rows, ...rest } = props as typeof props & {\n columns?: number;\n rows?: number;\n };\n\n if (\n headers ||\n data ||\n typeof columns === \"number\" ||\n typeof rows === \"number\"\n ) {\n const base: Partial<TableValues> = mapSemanticProps(\n rest as SemanticProps<TableValues>,\n DEFAULT_VALUES,\n \"Table\"\n );\n\n const colCount = headers\n ? headers.length\n : typeof columns === \"number\"\n ? columns\n : data?.[0]?.length ?? 0;\n const blankCells = (n: number) =>\n Array.from({ length: n }, () => ({ text: \"\", width: 0 }));\n\n const tableHeaders = headers\n ? [{ cells: headers.map((text: string) => ({ text, width: 0 })), height: 0 }]\n : [];\n\n const tableRows = data\n ? data.map((row: string[]) => ({\n cells: row.map((text: string) => ({ text, width: 0 })),\n height: 0,\n }))\n : typeof rows === \"number\"\n ? // No data: build an empty grid sized by `columns` × `rows`.\n Array.from({ length: rows }, () => ({\n cells: blankCells(colCount),\n height: 0,\n }))\n : [];\n\n base.table = { headers: tableHeaders, rows: tableRows, footers: [] };\n\n if (headers || typeof columns === \"number\") {\n base.columns = colCount;\n }\n if (headers) {\n base.enableHeader = true;\n }\n if (data) {\n base.rows = data.length;\n } else if (typeof rows === \"number\") {\n base.rows = rows;\n }\n\n return base;\n }\n\n return mapSemanticProps(\n props as SemanticProps<TableValues>,\n DEFAULT_VALUES,\n \"Table\"\n );\n },\n displayName: \"Table\",\n exporters: TableExporters,\n});\n\nexport default Table;\n","import { VideoExporters, VideoDefaults } from \"@unlayer/exporters\";\nimport type { VideoValues } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\ntype VideoSemanticProps = SemanticProps<VideoValues> & {\n /** YouTube/Vimeo URL (auto-parsed) */\n videoUrl?: string;\n};\n\nexport interface VideoProps extends ItemComponentProps<SemanticProps<VideoValues>> {\n videoUrl?: string;\n}\n\n// Defaults from the editor schema, plus React-specific video structure\nconst DEFAULT_VIDEO: NonNullable<VideoValues[\"video\"]> = {\n type: \"youtube\",\n videoId: \"\",\n thumbnail: \"\",\n loading: false,\n ...VideoDefaults.video,\n};\n\nconst DEFAULT_VALUES = {\n ...VideoDefaults,\n video: DEFAULT_VIDEO,\n} as unknown as VideoValues;\n\n/**\n * Parses a YouTube or Vimeo URL and returns exporter-ready video data.\n */\nexport function parseVideoUrl(url: string): { type: \"youtube\" | \"vimeo\"; videoId: string; thumbnail: string } | null {\n // YouTube: youtube.com/watch?v=ID, youtu.be/ID, youtube.com/embed/ID\n const ytMatch = url.match(\n /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/\n );\n if (ytMatch) {\n const videoId = ytMatch[1];\n return {\n type: \"youtube\",\n videoId,\n thumbnail: `https://img.youtube.com/vi/${videoId}/0.jpg`,\n };\n }\n\n // Vimeo: vimeo.com/ID\n const vimeoMatch = url.match(/vimeo\\.com\\/(\\d+)/);\n if (vimeoMatch) {\n return {\n type: \"vimeo\",\n videoId: vimeoMatch[1],\n thumbnail: \"\",\n };\n }\n\n return null;\n}\n\n/**\n * Video - Renders an embedded video player (YouTube/Vimeo).\n *\n * @example Shorthand\n * ```tsx\n * <Video videoUrl=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Video values={{\n * video: { type: \"youtube\", videoId: \"dQw4w9WgXcQ\", thumbnail: \"...\" }\n * }} />\n * ```\n */\nconst Video = createItemComponent<VideoValues, VideoSemanticProps>({\n name: \"Video\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { videoUrl, ...rest } = props;\n\n if (typeof videoUrl === \"string\") {\n const parsed = parseVideoUrl(videoUrl);\n const base: Partial<VideoValues> = mapSemanticProps(\n rest as SemanticProps<VideoValues>,\n DEFAULT_VALUES,\n \"Video\"\n );\n if (parsed) {\n base.video = { ...DEFAULT_VIDEO, ...parsed };\n }\n return base;\n }\n\n return mapSemanticProps(\n props as SemanticProps<VideoValues>,\n DEFAULT_VALUES,\n \"Video\"\n );\n },\n displayName: \"Video\",\n exporters: VideoExporters,\n});\n\nexport default Video;\n","/**\n * Default values for container components (Body, Row, Column).\n *\n * Runtime values come from @unlayer/exporters (extracted from the editor\n * schema at generation time). Types come from @unlayer/types\n * (generated from the same schema). Both are single source of truth.\n *\n * Imported by both render-to-json.ts and extract-head.ts to ensure the\n * JSON output and head CSS always use consistent defaults.\n */\n\nimport {\n BodyDefaults,\n RowDefaults,\n ColumnDefaults,\n} from \"@unlayer/exporters\";\nimport type { BodyValues, RowValues, ColumnValues } from \"@unlayer-internal/shared-elements\";\n\n// Body defaults from the editor schema.\n// Filter out popup-specific fields that aren't relevant for email/web rendering.\nconst allBodyDefaults = BodyDefaults as Record<string, any>;\nconst {\n popupPosition: _p1,\n popupDisplayDelay: _p2,\n popupWidth: _p3,\n popupHeight: _p4,\n popupBackgroundColor: _p5,\n popupBackgroundImage: _p6,\n popupOverlay_backgroundColor: _p7,\n popupCloseButton_position: _p8,\n popupCloseButton_backgroundColor: _p9,\n popupCloseButton_iconColor: _p10,\n popupCloseButton_borderRadius: _p11,\n popupCloseButton_margin: _p12,\n popupCloseButton_action: _p13,\n ...bodyRest\n} = allBodyDefaults;\n\nexport const BODY_DEFAULTS = bodyRest as BodyValues;\n\nexport const ROW_DEFAULTS = { ...RowDefaults } as RowValues;\n\nexport const COLUMN_DEFAULTS = { ...ColumnDefaults } as ColumnValues;\n","/**\n * One render's scope (renderToHtml, renderToJson, …): what it works out once,\n * like a template's collected render, is reused for the rest of it and never\n * by the next render (an element kept between renders may read other data).\n */\nimport { escapeKeepingTags } from \"@unlayer-internal/shared-elements\";\nimport { within } from \"./collect\";\nimport { withBuild } from \"./server-renderer\";\n\nlet scoped: WeakMap<object, unknown> | undefined;\n\n/** `make()`'s result for `key`, worked out once per render (each time outside one). */\nexport function scopeCache<T>(key: object, make: () => T): T {\n if (!scoped) return make();\n if (!scoped.has(key)) scoped.set(key, make());\n return scoped.get(key) as T;\n}\n\n/**\n * Runs one render with its own scope (a render inside another shares it), apart from a template being\n * collected: called inside a component of one (a block rendered to a string), it renders what it's given.\n */\nexport function withRenderScope<T>(render: () => T, own = false): T {\n // Called in a render (a component of the user's own calling renderToJson in its useMemo, while Elements or the app\n // renders it), it renders with a server build that isn't rendering (see server-renderer.ts).\n const scope = () => {\n if (scoped) return render();\n scoped = new WeakMap();\n try {\n return render();\n } finally {\n scoped = undefined;\n }\n };\n // The build is chosen first: whether a template is being collected tells who calls it.\n // `own`: from Elements' own component, which calls no hooks after (see withBuild).\n return withBuild(() => within(null, scope), own);\n}\n\n/**\n * Text placed straight in a Row or Column, as HTML: escaped, as React shows\n * text (raw HTML goes in an Html block). The editor has no place for it, so\n * the warning says where it belongs.\n */\nconst warnedLoose = new Set<string>();\n\nexport function looseText(child: string | number, container: string): string {\n const text = String(child);\n // Said once per container, not on every render.\n if (text.trim() && !warnedLoose.has(container)) {\n warnedLoose.add(container);\n console.warn(`${container}: text placed straight in a ${container} shows as text and isn't kept in the editor's design. Put it in a <Paragraph>, or HTML in an <Html> block.`);\n }\n // An email service's `<%name%>` tag stays as written, as in other text.\n return escapeKeepingTags(text, true);\n}\n","import React from \"react\";\nimport type { RenderMode, UnlayerConfig, RowValues } from \"@unlayer-internal/shared-elements\";\nimport { validateColumnLayout } from \"@unlayer-internal/shared-elements\";\nimport type { ColumnLayout } from \"@unlayer-internal/shared-elements\";\nimport { RowExporters } from \"@unlayer/exporters\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\nimport { nextHtmlId, safeMeta } from \"../utils/create-component\";\nimport { bodyContentWidthPx } from \"../utils/image-sizing\";\nimport type { DeviceProps, SizeInput } from \"../types\";\nimport { ROW_DEFAULTS, BODY_DEFAULTS } from \"../utils/container-defaults\";\nimport { looseText } from \"../utils/render-scope\";\nimport { collecting, RECORDS } from \"../utils/collect\";\nimport { recordContainer, whileCollecting } from \"../utils/record\";\n\n/**\n * Row - Container for columns in a layout\n *\n * Uses the Row exporter from @unlayer/exporters.\n * Column children call their own exporters.\n *\n * @example\n * ```tsx\n * <Row cells={[1, 1]}>\n * <Column><Button>Click me</Button></Column>\n * <Column><Paragraph>Hello</Paragraph></Column>\n * </Row>\n * ```\n */\n\nconst DEFAULT_VALUES = ROW_DEFAULTS;\n\nconst DEFAULT_BODY_VALUES = BODY_DEFAULTS;\n\nexport type RowProps = Omit<SemanticProps<RowValues>, \"padding\" | keyof DeviceProps> & DeviceProps & {\n children?: React.ReactNode;\n layout?: ColumnLayout;\n cells?: number[];\n mode?: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n index?: number;\n bodyValues?: any;\n collection?: string;\n /** Padding — a CSS string (\"0 48px\", \"20px 40px\") or a number (px). */\n padding?: SizeInput;\n /** @internal - Unlayer config threaded from UnlayerProvider via Body */\n _config?: UnlayerConfig;\n};\n\n// ============================================\n// Grid CSS (inlined from shared/utils/grid-css.ts)\n// ============================================\n\ninterface WidthPercentage {\n value: number;\n className: string;\n}\n\nfunction getWidthPercentages(cells: number[]): WidthPercentage[] {\n if (cells.length === 0) return [];\n const total = cells.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n return cells.map((span) => {\n const value = Math.round((span / total) * 100 * 100) / 100;\n const className = `${value}`.replace(/\\./g, 'p');\n return { value, className };\n });\n}\n\nfunction generateGridCSS(cells: number[], mode: RenderMode, contentWidth: number = 600, mobileBreakpoint: number = 480): string {\n const widths = getWidthPercentages(cells);\n\n if (mode === 'email') {\n const minQuery = `@media only screen and (min-width: ${contentWidth + 20}px)`;\n const maxQuery = `@media only screen and (max-width: ${contentWidth + 20}px)`;\n // Every Row writes this block, so a later row's `.u-row .u-col` rules\n // would override an earlier row's `.no-stack` ones of equal specificity:\n // `.u-row.no-stack` outranks them wherever it comes.\n\n return `\n${minQuery} {\n .u-row { width: ${contentWidth}px !important; }\n .u-row .u-col { vertical-align: top; }\n${widths.map(({ value, className }) => ` .u-row .u-col-${className} { width: ${Math.round((contentWidth * value) / 100)}px !important; }`).join('\\n')}\n}\n\n${maxQuery} {\n .u-row-container { max-width: 100% !important; padding-left: 0px !important; padding-right: 0px !important; }\n .u-row { width: 100% !important; }\n .u-row .u-col { display: block !important; width: 100% !important; min-width: 320px !important; max-width: 100% !important; }\n .u-row .u-col > div { margin: 0 auto; }\n .u-row.no-stack .u-col { min-width: 0 !important; display: table-cell !important; }\n${widths.map(({ value, className }) => ` .u-row.no-stack .u-col-${className} { width: ${value}% !important; }`).join('\\n')}\n}`;\n }\n\n // Web mode\n const baseCSS = `\n.u-row {\n display: flex;\n flex-wrap: nowrap;\n margin-left: 0;\n margin-right: 0;\n}\n.u-row .u-col {\n position: relative;\n width: 100%;\n padding-right: 0;\n padding-left: 0;\n}`;\n\n const columnCSS = widths\n .map(\n ({ value, className }) =>\n `.u-row .u-col.u-col-${className} { flex: 0 0 ${value}%; max-width: ${value}%; }`,\n )\n .join('\\n');\n\n // Flex rows stack by wrapping: below the mobile breakpoint the row allows\n // wrapping and each column's flex-basis grows to the full width. Block or\n // width overrides can't stack flex items — flex-basis governs their size.\n // `.no-stack` rows keep a single line; print/document output never stacks.\n // .container is scoped under .u_row: Elements output embeds into host\n // pages where bare .container (Bootstrap et al.) would collide.\n const responsiveCSS = mode === \"document\" ? \"\" : `\n@media (max-width: ${mobileBreakpoint}px) {\n .u_row .container { max-width: 100% !important; }\n .u-row:not(.no-stack) { flex-wrap: wrap; }\n .u-row:not(.no-stack) .u-col {\n flex: 0 0 100% !important;\n max-width: 100% !important;\n }\n}`;\n\n return baseCSS + '\\n' + columnCSS + '\\n' + responsiveCSS;\n}\n\n// ============================================\n// Row exporter wrapper (inlined from shared/utils/render-container-to-html.ts)\n// ============================================\n\ntype ContainerExporterFunction = (innerHTML: string, values: Record<string, any>, bodyValues?: Record<string, any>, options?: Record<string, any>) => string;\n\n/**\n * Resolve the row's content width (px number) from body values. contentWidth\n * may be \"600px\" (string), 600 (number), or \"600\" (bare numeric string); the\n * grid CSS needs a number. In EMAIL mode this drives the per-column desktop\n * widths and the stacking breakpoint — so without it, multi-column emails were\n * pinned to 600px regardless of <Body contentWidth>. Web mode uses percentages,\n * so this is a no-op there.\n *\n * Uses the same strict px parse as the image slot geometry (a non-px value like\n * \"50%\" → fallback, not a parseInt artifact like 50) so the two stay in sync.\n */\nfunction toContentWidthPx(bodyValues: any, fallback = 500): number {\n return bodyContentWidthPx(bodyValues?.contentWidth, fallback);\n}\n\nfunction renderRowToHtml(innerHTML: string, values: any, bodyValues: any, mode: RenderMode, cells: number[], collection: string = \"rows\"): string {\n const rowExporter = (RowExporters[mode] || RowExporters.web) as ContainerExporterFunction;\n const html = rowExporter(innerHTML, values, bodyValues, {\n collection,\n variant: mode,\n });\n\n const contentWidth = toContentWidthPx(bodyValues);\n const css = generateGridCSS(cells, mode, contentWidth);\n return css ? `<style>${css}</style>${html}` : html;\n}\n\n// ============================================\n// Children processing\n// ============================================\n\nfunction processChildren(\n children: React.ReactNode,\n cells: number[],\n bodyValues: any,\n rowValues: any,\n mode: RenderMode,\n _config?: UnlayerConfig\n): string {\n if (!children) return \"\";\n\n let innerHTML = \"\";\n const childrenArray = React.Children.toArray(children);\n // Each Column's place among the Columns: markup or text beside them (an Outlook comment, a wrapper the Row says\n // isn't a Column) takes none, or the Columns after it got no cell (`width=\"NaN\"`).\n let index = 0;\n\n childrenArray.forEach((child) => {\n if (!React.isValidElement(child)) {\n if (typeof child === \"string\" || typeof child === \"number\") {\n innerHTML += looseText(child, \"Row\");\n }\n return;\n }\n\n const componentType = child.type as any;\n const isColumn =\n componentType?.displayName === \"Column\" ||\n componentType?.name === \"Column\";\n\n if (isColumn && typeof child.type === \"function\") {\n // Call Column component with context props\n const rendered = (child.type as Function)({\n ...child.props,\n index: index++,\n cells,\n bodyValues,\n rowValues,\n mode,\n _config\n });\n\n // Extract HTML from dangerouslySetInnerHTML\n if (rendered?.props?.dangerouslySetInnerHTML?.__html) {\n innerHTML += rendered.props.dangerouslySetInnerHTML.__html;\n }\n } else if (React.isValidElement(child)) {\n const name = (child.type as any)?.displayName || (child.type as any)?.name || \"Unknown\";\n console.warn(\n `Row: <${name}> is not a valid Row child. Only <Column> components can be direct children of <Row>. ` +\n `Wrap it in a <Column>: <Row><Column><${name} /></Column></Row>`\n );\n }\n });\n\n return innerHTML;\n}\n\n// ============================================\n// Component\n// ============================================\n\nfunction renderRow(props: RowProps): React.ReactElement | null {\n const {\n layout,\n cells: propsCells,\n children,\n mode: modeProp,\n className,\n style,\n index = 0,\n bodyValues = {},\n collection = \"rows\",\n _config,\n ...semanticProps\n } = props;\n\n // Resolve mode: explicit prop > _config > default\n const mode: RenderMode = modeProp ?? _config?.mode ?? \"web\";\n\n // Determine cells from layout or props. With neither, default to one equal\n // cell PER <Column> child (mirroring renderToJson) — `[1]` regardless of column\n // count left the 2nd/3rd column with no cell, rendering width=\"NaN\".\n // Its Columns, as React rendered them (see normalize.tsx).\n const columnCount = React.Children.toArray(children).filter(\n (c) => React.isValidElement(c) && /^Column$/.test((c.type as any)?.displayName || (c.type as any)?.name || \"\")\n ).length;\n let cells: number[];\n if (layout) {\n // The Columns as rendered, or as written (a condition's place included, as 0.1.22 counted them): either fits it.\n if (columnCount !== layout.expectedColumns) validateColumnLayout(layout, React.Children.count(children));\n cells = layout.cells;\n } else if (propsCells) {\n cells = propsCells;\n } else {\n cells = Array(Math.max(1, columnCount)).fill(1);\n }\n\n // Merge body values with defaults\n const safeBodyValues = { ...DEFAULT_BODY_VALUES, ...bodyValues };\n\n // Map semantic props to values\n const values = mapSemanticProps<RowValues>(\n semanticProps as SemanticProps<RowValues>,\n DEFAULT_VALUES,\n \"Row\"\n );\n\n const valuesWithMeta = { ...values, cells, _meta: safeMeta({ htmlID: nextHtmlId(_config, \"u_row\"), htmlClassNames: \"u_row\", ...(values._meta || {}) }) };\n\n // Process Column children\n const innerHTML = processChildren(\n children,\n cells,\n safeBodyValues,\n valuesWithMeta,\n mode,\n _config\n );\n\n try {\n const html = renderRowToHtml(innerHTML, valuesWithMeta, safeBodyValues, mode, cells, collection);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={className}\n style={style}\n />\n );\n } catch (error) {\n console.error(\"Row rendering failed:\", error);\n return (\n <div className={className} style={style}>\n {children}\n </div>\n );\n }\n}\n\n// While a template is collected, a Row records itself (see normalize.tsx); then it renders the collected tree.\nconst Row: React.FC<RowProps> = (props) =>\n collecting() ? whileCollecting(() => recordContainer(\"row\", props), () => renderRow(props), \"Row\") : renderRow(props);\n\nRow.displayName = \"Row\";\n(Row as unknown as Record<symbol, boolean>)[RECORDS] = true;\n\nexport default Row;\n","import React from \"react\";\nimport type { RenderMode, UnlayerConfig, ColumnValues } from \"@unlayer-internal/shared-elements\";\nimport { ColumnExporters, ContentExporters } from \"@unlayer/exporters\";\nimport { UNLAYER_RENDER_KEY, UNLAYER_CONFIG_KEY, nextHtmlId, safeName, safeMeta } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\nimport type { DeviceProps, SizeInput, BorderInput } from \"../types\";\nimport { COLUMN_DEFAULTS } from \"../utils/container-defaults\";\nimport { looseText } from \"../utils/render-scope\";\nimport { collecting, RECORDS } from \"../utils/collect\";\nimport { recordContainer, whileCollecting } from \"../utils/record\";\nimport { DEFAULT_CONTAINER_PADDING } from \"../utils/image-sizing\";\n\n/** Unlayer's default content-block padding when a block sets none. */\n\n/**\n * Column - Single column in a Row layout\n *\n * Calls the Column exporter from @unlayer/exporters.\n * Must be used inside <Row> component.\n *\n * @example\n * ```tsx\n * <Row cells={[1, 1]}>\n * <Column>\n * <Button>Click me</Button>\n * </Column>\n * <Column>\n * <Paragraph>Hello</Paragraph>\n * </Column>\n * </Row>\n * ```\n */\n\nconst DEFAULT_VALUES = COLUMN_DEFAULTS;\n\n// ============================================\n// Column exporter wrapper (inlined from shared/utils/render-container-to-html.ts)\n// ============================================\n\ntype ColumnExporterFunction = (innerHTML: string, values: Record<string, any>, index: number, cells: number[], bodyValues?: Record<string, any>, rowValues?: Record<string, any>) => string;\n\nfunction renderColumnToHtml(innerHTML: string, values: any, index: number, cells: number[], bodyValues: any, rowValues: any, mode: RenderMode): string {\n const columnExporter = (ColumnExporters[mode] || ColumnExporters.web) as ColumnExporterFunction;\n return columnExporter(innerHTML, values, index, cells, bodyValues, rowValues);\n}\n\n// Canonical content-container wrapper (the `u_content_*` block that carries\n// each item's containerPadding). Signature per mode: (innerHTML, values,\n// bodyValues, meta). Delegating to the exporter keeps padding, classes, and the\n// per-mode div/table structure consistent with the canonical exporter output.\ntype ContentExporterFunction = (innerHTML: string, values: Record<string, any>, bodyValues?: Record<string, any>, meta?: Record<string, any>) => string;\n\nfunction renderContentToHtml(innerHTML: string, values: any, bodyValues: any, mode: RenderMode): string {\n const contentExporter = (ContentExporters[mode] || ContentExporters.web) as ContentExporterFunction;\n return contentExporter(innerHTML, values, bodyValues, {});\n}\n\n// ============================================\n// Component\n// ============================================\n\n// The editor hides rows and content on a device, never a column: no hideOnMobile/hideOnDesktop here.\nexport type ColumnProps = Omit<SemanticProps<ColumnValues>, \"padding\" | \"border\" | \"borderRadius\" | keyof DeviceProps> & Omit<DeviceProps, \"hideOnMobile\" | \"hideOnDesktop\"> & {\n children?: React.ReactNode;\n // Internal props (provided by Row)\n index?: number;\n cells?: number[];\n bodyValues?: any;\n rowValues?: any;\n mode?: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n /** Padding — a CSS string (\"0 24px\", \"10px\") or a number (px). */\n padding?: SizeInput;\n /** Corner radius — a number (→ px) or CSS string (\"8px\"). */\n borderRadius?: SizeInput;\n /** Per-side border object (great for hairline dividers). Width fields accept\n * a number/px string; reuse it as a factored-out const without `as const`. */\n border?: BorderInput;\n /** @internal - Unlayer config threaded from UnlayerProvider via Body/Row */\n _config?: UnlayerConfig;\n};\n\nexport const Column: React.FC<ColumnProps> = (props) => {\n if (collecting()) return whileCollecting(() => recordContainer(\"column\", props), () => Column(props), \"Column\");\n const {\n children,\n index = 0,\n cells = [1],\n bodyValues = {},\n rowValues = {},\n mode: modeProp,\n className,\n style,\n _config,\n ...semanticProps\n } = props;\n\n // Resolve mode: explicit prop > _config > default\n const mode: RenderMode = modeProp ?? _config?.mode ?? \"web\";\n\n // Map semantic props to values\n const values = mapSemanticProps<ColumnValues>(\n semanticProps as SemanticProps<ColumnValues>,\n DEFAULT_VALUES,\n \"Column\"\n );\n\n // Add _meta (an id or class names given in values kept to what they can hold, as for rows and blocks)\n const valuesWithMeta = { ...values, _meta: safeMeta({ htmlID: nextHtmlId(_config, \"u_column\"), htmlClassNames: \"u_column\", ...(values._meta || {}) }) };\n\n // Render children to HTML - extract from dangerouslySetInnerHTML\n let innerHTML = \"\";\n if (children) {\n try {\n const childrenArray = React.Children.toArray(children);\n\n childrenArray.forEach((child, childIndex) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n innerHTML += looseText(child, \"Column\");\n } else if (React.isValidElement(child)) {\n // Call component function to get rendered result\n if (typeof child.type === \"function\") {\n const ComponentType = child.type as any;\n // Use __unlayerRender (hook-free) if available, otherwise call directly\n const renderFn: Function = ComponentType[UNLAYER_RENDER_KEY] || ComponentType;\n // Allocate the content id BEFORE rendering and thread it in, so\n // the value-level _meta.htmlID exporters see (custom tool head\n // css scopes on it) is unique per instance and matches both the\n // wrapper id and the head-extraction/json numbering. Custom\n // tools carry an explicit meta base (custom_<slug>); built-ins\n // derive it from the component name.\n const componentName =\n ComponentType?.[UNLAYER_CONFIG_KEY]?.metaName ??\n (\n ComponentType?.displayName ||\n ComponentType?.name ||\n \"component\"\n ).toLowerCase();\n const contentHtmlId = nextHtmlId(_config, `u_content_${componentName}`);\n // Thread the column/body context so width-aware item exporters (Image)\n // can size against the real available width (contentWidth × column\n // fraction) instead of the fallback. Mirrors the editor, which passes\n // this context to the content exporters.\n const rendered = renderFn({\n ...child.props,\n _config,\n _metaHtmlId: contentHtmlId,\n colIndex: index,\n cells,\n bodyValues,\n rowValues,\n columnValues: valuesWithMeta,\n });\n\n // Extract HTML from dangerouslySetInnerHTML\n if (\n rendered &&\n typeof rendered === \"object\" &&\n rendered.props &&\n rendered.props.dangerouslySetInnerHTML\n ) {\n const componentHTML =\n rendered.props.dangerouslySetInnerHTML.__html;\n\n // Some components intentionally produce no output in unsupported\n // modes. Do not turn that into a padded content wrapper.\n if (\n !componentHTML &&\n ComponentType?.[UNLAYER_CONFIG_KEY]?.omitEmptyOutput\n ) return;\n\n // Resolve the block's OWN containerPadding directly from props.\n // `containerPadding` is a universal base-content prop: it passes\n // straight through mapSemanticProps untouched and is not present in\n // any item's defaultValues, so reading it from props (flat prop +\n // `values` escape hatch) is equivalent to running the item's full\n // value pipeline — without paying for a second propMapper call per\n // child (for Paragraph that re-runs the Lexical textJson convert).\n // Falls back to Unlayer's content default. (Previously this read\n // `child.props.values?.containerPadding` only, which is undefined\n // for the flat-prop API, so every block collapsed to 0px padding.)\n const childProps = child.props as {\n containerPadding?: string | number;\n mobile?: { containerPadding?: string | number };\n hideOnMobile?: boolean;\n hideOnDesktop?: boolean;\n values?: { containerPadding?: string | number; _override?: Record<string, any>; _meta?: Record<string, any> };\n };\n const rawContainerPadding =\n childProps.containerPadding ??\n childProps.values?.containerPadding ??\n DEFAULT_CONTAINER_PADDING;\n // A bare number is treated as px (same idiom as other size props).\n const containerPadding =\n typeof rawContainerPadding === \"number\"\n ? `${rawContainerPadding}px`\n : rawContainerPadding;\n\n // A custom tool's props are its own values, as in 0.1.22: a `hideOnMobile` of its own isn't a device setting.\n const device = ComponentType?.[UNLAYER_CONFIG_KEY]?.contentType === \"custom\" ? {} : childProps;\n\n // Wrap via the canonical content-container exporter for this mode.\n const contentValues = {\n containerPadding,\n _override: {\n ...childProps.values?._override,\n mobile: { ...childProps.values?._override?.mobile,\n ...(device.hideOnMobile !== undefined ? { hideMobile: device.hideOnMobile } : {}),\n },\n desktop: { ...childProps.values?._override?.desktop,\n ...(device.hideOnDesktop !== undefined ? { hideDesktop: device.hideOnDesktop } : {}),\n },\n },\n _meta: {\n htmlID: contentHtmlId,\n htmlClassNames: `u_content_${componentName}`,\n ...(childProps.values?._meta?.htmlID ? { htmlID: safeName(childProps.values._meta.htmlID) } : {}),\n },\n };\n innerHTML += renderContentToHtml(\n componentHTML,\n contentValues,\n bodyValues,\n mode\n );\n } else if (rendered) {\n const name = (child.type as any)?.displayName || (child.type as any)?.name || \"Unknown\";\n console.warn(\n `Column: <${name}> did not produce renderable HTML. ` +\n `Ensure it is an Unlayer component (Button, Text, Image, etc.).`\n );\n }\n }\n }\n });\n } catch (error) {\n console.error(\"Column: Failed to render children:\", error);\n innerHTML = \"\";\n }\n }\n\n try {\n const html = renderColumnToHtml(innerHTML, valuesWithMeta, index, cells, bodyValues, rowValues, mode);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={className}\n style={style}\n />\n );\n } catch (error) {\n console.error(\"Column rendering failed:\", error);\n return (\n <div className={className} style={style}>\n {children}\n </div>\n );\n }\n};\n\nColumn.displayName = \"Column\";\n(Column as unknown as Record<symbol, boolean>)[RECORDS] = true;\n\nexport default Column;\n","/**\n * A template's Rows, Columns and blocks, as React renders them: one render\n * collects them (see collect.ts and record.tsx), with the user's components,\n * Fragments, conditions, hooks and Context handled by React itself. What it\n * gives back is the template as Elements components only (Email > Row >\n * Column > blocks), which the HTML, the head and the design are then made\n * from, so they can't disagree.\n *\n * What a template puts among them that isn't one keeps what it did before:\n * markup among the rows is kept as it is; text in a Row or Column shows as\n * text (with a warning); a component of the user's own that renders markup in\n * a Column is an HTML block named after it; other markup in a Row or Column is\n * left out. A component that throws, suspends or is async is left out, with a\n * message, and the rest renders.\n */\nimport React from \"react\";\nimport { renderToStaticMarkup, renderToString } from \"./server-renderer\";\nimport { COLLECTING_ID, MARK, within, type Collection, type Recorded } from \"./collect\";\nimport { guard } from \"./record\";\nimport { callIsolated, FORWARD_REF, isAsyncComponent, isThenable, MEMO } from \"./unwrap-root\";\nimport { scopeCache } from \"./render-scope\";\nimport Row from \"../components/Row\";\nimport Column from \"../components/Column\";\nimport Html from \"../components/Html\";\n\n/**\n * On markup a component of the user's own rendered in a Column (see `keptMarkup`): the Html block the design\n * keeps it as. The HTML numbers it after the component, and the head counts it so too.\n */\nexport const KEPT = Symbol.for(\"@unlayer/react-elements/kept\");\n\ntype Within = { at: number; children: Node[] };\ntype Node =\n | { kind: \"raw\"; html: string }\n | ({ kind: \"block\" } | { kind: \"failed\" }) & { at: number }\n | ({ kind: \"row\" } | { kind: \"column\" } | { kind: \"boundary\" }) & Within;\n\n/** The markers in a collected render, as a tree; what's between them is kept as raw HTML. */\nfunction parse(html: string, collection: Collection): Node[] {\n const root: Node[] = [];\n const open: Node[][] = [root];\n const pattern = new RegExp(`<${MARK} data-n=\"${collection.nonce}\" data-i=\"(\\\\d+)\"(?: data-e=\"([ocf])\")?></${MARK}>`, \"g\");\n let last = 0;\n for (const match of html.matchAll(pattern)) {\n const into = open[open.length - 1];\n if (match.index! > last) into.push({ kind: \"raw\", html: html.slice(last, match.index) });\n last = match.index! + match[0].length;\n const at = Number(match[1]);\n const edge = match[2];\n if (edge === \"o\") {\n const children: Node[] = [];\n into.push({ kind: collection.recorded[at].kind as \"row\" | \"column\" | \"boundary\", at, children });\n open.push(children);\n } else if (edge === \"c\") open.pop();\n else into.push({ kind: edge === \"f\" ? \"failed\" : \"block\", at });\n }\n if (last < html.length) open[open.length - 1].push({ kind: \"raw\", html: html.slice(last) });\n if (open.length !== 1) throw new Error(\"[Unlayer] a collected render's markers don't pair up\");\n return root;\n}\n\nconst TEXT_ENTITIES: Record<string, string> = { \"&\": \"&\", \"<\": \"<\", \">\": \">\", \""\": '\"', \"'\": \"'\" };\nconst VOID = /^(area|base|br|col|embed|hr|img|input|link|meta|source|track|wbr)$/i;\n\ntype Part = { text: string } | { tag: string; html: string; inner?: string };\n\n/** Raw HTML as React wrote it: text (unescaped) and top-level elements, in order. */\nfunction parts(html: string): Part[] {\n const out: Part[] = [];\n let at = 0;\n const text = (s: string) => s && out.push({ text: s.replace(/&|<|>|"|'/g, (e) => TEXT_ENTITIES[e]) });\n while (at < html.length) {\n const start = html.indexOf(\"<\", at);\n if (start < 0) {\n text(html.slice(at));\n break;\n }\n text(html.slice(at, start));\n const name = /^<([a-zA-Z][\\w:-]*)/.exec(html.slice(start))?.[1];\n if (!name) {\n // Not an element (a comment from a template's own markup): kept with what follows as markup.\n out.push({ tag: \"#\", html: html.slice(start) });\n break;\n }\n const openEnd = html.indexOf(\">\", start);\n if (VOID.test(name) || html[openEnd - 1] === \"/\") {\n out.push({ tag: name, html: html.slice(start, openEnd + 1) });\n at = openEnd + 1;\n continue;\n }\n // Its matching end tag: the same name, nested ones counted.\n const tags = new RegExp(`<(/?)${name}(?=[\\\\s>/])`, \"gi\");\n tags.lastIndex = openEnd + 1;\n let depth = 1;\n let end = -1;\n for (let m = tags.exec(html); m; m = tags.exec(html)) {\n depth += m[1] ? -1 : 1;\n if (depth === 0) {\n end = m.index;\n break;\n }\n }\n if (end < 0) {\n out.push({ tag: \"#\", html: html.slice(start) });\n break;\n }\n const close = html.indexOf(\">\", end) + 1;\n out.push({ tag: name, html: html.slice(start, close), inner: html.slice(openEnd + 1, end) });\n at = close;\n }\n return out;\n}\n\nfunction innerType(type: any): any {\n while (type?.$$typeof === MEMO) type = type.type;\n return type;\n}\n\n/** One render of a root's children, collected. */\ninterface Collected {\n nodes: Node[];\n collection: Collection;\n /** The components left out that were said so (once: the HTML, the head and the design build from the same render). */\n told: Set<number>;\n /** Each component's kept markup, worked out once (asking the component means calling it again). */\n kept?: Map<number, React.ReactElement | undefined>;\n /** A template that isn't one (see tell): every use of this render fails with it, the head's and the design's too. */\n fatal?: unknown;\n}\n\nconst recorded = (c: Collected, node: { at: number }) => c.collection.recorded[node.at] as Recorded & Record<string, any>;\n\nconst nameOf = (element: React.ReactElement): string => {\n if (typeof element.type === \"string\") return element.type;\n const type = innerType(element.type);\n return type?.displayName || type?.name || \"component\";\n};\n\n/** A component that threw, suspended or is async, left out: said once per render. */\nfunction leftOut(c: Collected, node: { at: number }): [] {\n if (c.fatal) throw c.fatal;\n if (!c.told.has(node.at)) {\n c.told.add(node.at);\n try {\n tell(recorded(c, node).element);\n } catch (error) {\n c.fatal = error;\n throw error;\n }\n }\n return [];\n}\n\n/** A function component of the user's own (memo, forwardRef), called once more on its own; undefined for others. */\nfunction calledAgain(element: React.ReactElement<any>): { out: unknown } | undefined {\n const type = innerType(element.type);\n if (type?.$$typeof !== FORWARD_REF && (typeof type !== \"function\" || type.prototype?.isReactComponent)) return undefined;\n const props = { ...element.props };\n for (const key in type.defaultProps) if (props[key] === undefined) props[key] = type.defaultProps[key];\n return { out: callIsolated(() => (type.$$typeof === FORWARD_REF ? type.render(props, null) : type(props))) };\n}\n\n/**\n * Says why a component was left out: it's called once more on its own, and what it renders is collected, so a\n * component in it that fails says so itself.\n */\nfunction tell(element: React.ReactElement<any>): void {\n const type = innerType(element.type);\n const name = nameOf(element);\n const async = () =>\n console.warn(`[Unlayer] <${name}> is async or suspends: Elements renders synchronously, so it's left out. Load its data first and pass it as props.`);\n if (isAsyncComponent(type)) return async();\n try {\n const again = calledAgain(element);\n // A class, lazy, …: React renders it, and throws what it does.\n const inner = again ? collected(again.out as React.ReactNode) : collected(element, false);\n const failed = (nodes: Node[]): Array<{ at: number }> => nodes.flatMap((n) => (n.kind === \"failed\" ? [n] : \"children\" in n ? failed(n.children) : []));\n const found = failed(inner.nodes);\n for (const node of found) tell(recorded(inner, node).element);\n if (!found.length) console.error(`[Unlayer] <${name}> failed while rendering, so it's left out.`);\n } catch (error) {\n const message = String((error as Error)?.message);\n // A template that isn't one (a component that's undefined, from a broken or circular import; an object or a Date\n // as a child) fails the render, wherever it is, as without a component around it: an email missing a block\n // shouldn't send. (React's production build names these by their error numbers, 130 and 31.)\n if (/Element type is invalid|Objects are not valid as a React child|Minified React error #(130|31)\\b/.test(message)) throw error;\n // (React's production build says \"suspended\" as its error #426.)\n if (isThenable(error) || /async and suspending|suspended|Minified React error #426\\b/.test(message)) async();\n else console.error(`[Unlayer] <${name}> threw while rendering, so it's left out:`, error);\n }\n}\n\n/** What a component rendered, when that's markup only (its own components' markup in, those that failed left out). */\nfunction markupOnly(c: Collected, nodes: Node[]): string | undefined {\n let out = \"\";\n for (const node of nodes) {\n if (node.kind === \"raw\") out += node.html;\n else if (node.kind === \"failed\") leftOut(c, node);\n else if (node.kind !== \"boundary\") return undefined;\n else {\n const inner = markupOnly(c, node.children);\n if (inner === undefined) return undefined;\n out += inner;\n }\n }\n return out;\n}\n\n/**\n * A component of the user's own that rendered markup in a Column: an HTML block of it, named after the component\n * (with its props, for its padding and visibility). An element given `dangerouslySetInnerHTML` gives what's in it,\n * as 0.1.22 kept it (the element itself left out), whatever that holds (a `<div/>`, a stray end tag, a comment);\n * other markup, which 0.1.22 left out (a link, a table, an image, elements side by side), is kept as it is.\n */\nfunction keptMarkup(c: Collected, node: Within): React.ReactElement | undefined {\n c.kept ??= new Map();\n if (!c.kept.has(node.at)) c.kept.set(node.at, keptMarkupOnce(c, node));\n return c.kept.get(node.at);\n}\n\nfunction keptMarkupOnce(c: Collected, node: Within): React.ReactElement | undefined {\n const raw = markupOnly(c, node.children);\n if (raw === undefined) return undefined;\n const list = parts(raw);\n // Text alone shows as text (see `elements`).\n if (!list.some((p) => \"tag\" in p)) return undefined;\n const element = recorded(c, node).element as React.ReactElement<any>;\n // One element (what's in it may not pair up as markup): React writes `dangerouslySetInnerHTML` and children\n // alike, so the component is asked which it gave (a <div> when it can't say, as most such are).\n const one = list.length === 1 || list.some((p) => \"tag\" in p && p.tag === \"#\") ? /^<([a-zA-Z][\\w:-]*)\\b[^>]*>([\\s\\S]*)<\\/\\1>$/.exec(raw) : null;\n // Asked only when it matters (one element), as asking calls the component again.\n let given = false;\n if (one) {\n try {\n const out = calledAgain(element)?.out as React.ReactElement<{ dangerouslySetInnerHTML?: unknown }> | undefined;\n given = React.isValidElement(out) && typeof out.type === \"string\" && out.props.dangerouslySetInnerHTML != null;\n } catch {\n given = one[1].toLowerCase() === \"div\";\n }\n }\n const html = one && given ? one[2] : raw;\n const Rendered = () => React.createElement(\"div\", { dangerouslySetInnerHTML: { __html: html } });\n Rendered.displayName = nameOf(element);\n const { containerPadding, hideOnMobile, hideOnDesktop } = (element.props ?? {}) as Record<string, unknown>;\n (Rendered as unknown as Record<symbol, unknown>)[KEPT] = React.createElement(Html, {\n html,\n ...(containerPadding !== undefined ? { containerPadding } : {}),\n ...(hideOnMobile !== undefined ? { hideOnMobile } : {}),\n ...(hideOnDesktop !== undefined ? { hideOnDesktop } : {}),\n } as Record<string, unknown>);\n return React.createElement(Rendered, { ...element.props });\n}\n\n/**\n * A block a component of the template rendered to a string (react-dom's own `renderToStaticMarkup`) while the\n * template is collected comes out as its marker. In a prop (an Html block's `html`) that's what it renders.\n */\nfunction resolvedProps(c: Collected, props: Record<string, any>): Record<string, any> {\n let out = props;\n for (const [key, value] of Object.entries(props)) {\n if (typeof value !== \"string\" || !value.includes(MARK)) continue;\n let html = value;\n try {\n if (value.includes(c.collection.nonce)) html = markup(c, parse(value, c.collection), (block) => within(null, () => renderToStaticMarkup(block)));\n } catch {\n // Markers that don't pair up (part of a string): left for withoutMarkers.\n }\n out = out === props ? { ...props } : out;\n out[key] = withoutMarkers(html, c.collection.nonce);\n }\n return out;\n}\n\n/**\n * A marker that got out of the collecting render (it can't, by the Sentinel: this is the net under it) is\n * taken out, and said, rather than sent in an email: what it stood for can't be told any more. Only this\n * render's markers, whole, as React writes them: this runs on finished HTML, after `toSafeHtml`, and taking\n * out anything else (text shaped like a marker in an attribute) could move where an attribute ends.\n */\nfunction withoutMarkers(html: string, nonce: string): string {\n const left = new RegExp(`<${MARK} data-n=\"${nonce}\" data-i=\"\\\\d+\"(?: data-e=\"[ocf]\")?></${MARK}>`, \"g\");\n if (!html.includes(nonce) || !html.match(left)) return html;\n console.error(`[Unlayer] an Elements block rendered inside a component left a marker behind; it's taken out, and the block it stood for is missing.`);\n return html.replace(left, \"\");\n}\n\n/** Collected nodes as HTML: markup as it is, each row, column or block by `render`. */\nfunction markup(c: Collected, nodes: Node[], render: (element: React.ReactElement) => string): string {\n return nodes\n .map((node) => {\n switch (node.kind) {\n case \"raw\":\n return node.html;\n case \"boundary\":\n return markup(c, node.children, render);\n case \"failed\":\n leftOut(c, node);\n return \"\";\n default:\n return render(element(c, node));\n }\n })\n .join(\"\");\n}\n\n/** A list with keys, as React asks for one it renders (a Row or Column that fails renders its children as they are). */\nconst keyed = (list: React.ReactNode[]): React.ReactNode[] =>\n list.map((child, i) => (React.isValidElement(child) && child.key == null ? React.cloneElement(child, { key: `k${i}` }) : child));\n\n/** A recorded Row, Column or block, as the Elements component it was, with what React rendered in it. */\nfunction element(c: Collected, node: Extract<Node, { kind: \"row\" | \"column\" | \"block\" }>): React.ReactElement {\n const r = recorded(c, node);\n if (node.kind === \"block\") return React.createElement(r.type, resolvedProps(c, r.props));\n if (node.kind === \"column\") return React.createElement(Column, { ...r.props, children: keyed(elements(c, node.children, \"column\")) });\n const props = { ...r.props };\n const children = keyed(elements(c, node.children, \"row\"));\n // A layout counts the Columns as written (a condition's place included) or as rendered (from Fragments and\n // components): either fits it. The rendered Row is then given its cells, which hold no condition's place.\n if (props.layout) {\n const columns = children.filter((child) => React.isValidElement(child) && child.type === Column).length;\n if (columns === props.layout.expectedColumns || React.Children.count(props.children) === props.layout.expectedColumns) {\n props.cells = props.layout.cells;\n delete props.layout;\n }\n }\n return React.createElement(Row, { ...props, children });\n}\n\ntype Place = \"root\" | \"row\" | \"column\";\n\n/**\n * Markup in a Row or Column that a marker cuts in two (`<p>Hello <Name />, welcome back</p>`, a `<div>` around a\n * block): an element whose start and end tags are in different pieces. Each piece of `nodes`, raw HTML cut where\n * such an element starts and ends, with whether it's in one. React writes each element whole, so one that isn't\n * whole in its piece is cut by a marker.\n */\nfunction spanned(nodes: Node[]): { node: Node; inside: boolean }[] {\n const out: { node: Node; inside: boolean }[] = [];\n // The elements open across pieces, outermost first.\n const spans: string[] = [];\n for (const node of nodes) {\n if (node.kind !== \"raw\") {\n out.push({ node, inside: spans.length > 0 });\n continue;\n }\n const html = node.html;\n // Elements opened in this piece and not closed yet; an end tag of one opened in another ends it (and what's open\n // in it); one that ends nothing open is passed over, as the browser does.\n const open: { name: string; at: number }[] = [];\n let closed = spans.length ? -1 : 0;\n for (const m of html.matchAll(/<!--[\\s\\S]*?(?:-->|$)|<(\\/?)([a-zA-Z][\\w:-]*)\\b[^>]*>/g)) {\n if (!m[2]) continue;\n const name = m[2].toLowerCase();\n if (m[1]) {\n const i = open.map((o) => o.name).lastIndexOf(name);\n const across = spans.lastIndexOf(name);\n if (i >= 0) open.length = i;\n else if (across >= 0) {\n spans.length = across;\n open.length = 0;\n if (!spans.length) closed = m.index! + m[0].length;\n }\n } else if (!VOID.test(name) && !m[0].endsWith(\"/>\")) open.push({ name, at: m.index! });\n }\n const piece = (from: number, to: number, inside: boolean) => {\n if (to > from) out.push({ node: { kind: \"raw\", html: html.slice(from, to) }, inside });\n };\n if (closed < 0) piece(0, html.length, true);\n else {\n piece(0, closed, true);\n piece(closed, open[0]?.at ?? html.length, false);\n if (open.length) piece(open[0].at, html.length, true);\n }\n spans.push(...open.map((o) => o.name));\n }\n return out;\n}\n\n/**\n * What's among the rows, or in a Row or a Column, as Elements components. In a Row or Column, markup a marker cuts\n * (see `spanned`) is left out whole, as 0.1.22 left it out, with what's in it (text, markup a component renders\n * there); a Row, Column or block in it is kept, as one beside it is.\n */\nfunction elements(c: Collected, nodes: Node[], place: Place, owner?: React.FC, inMarkup = false): React.ReactNode[] {\n const inColumn = place === \"column\";\n return (place === \"root\" || inMarkup ? nodes.map((node) => ({ node, inside: inMarkup })) : spanned(nodes)).flatMap(({ node, inside }): React.ReactNode[] => {\n switch (node.kind) {\n case \"failed\":\n return leftOut(c, node);\n case \"boundary\": {\n const kept = inColumn && !inside ? keptMarkup(c, node) : undefined;\n if (kept) return [kept];\n // Markup it renders, where it isn't kept, is named after it in the messages that say so.\n const Named = () => null;\n Named.displayName = nameOf(recorded(c, node).element);\n if (inColumn && !inside && !c.told.has(node.at) && node.children.some((n) => n.kind === \"raw\" && parts(n.html).some((p) => \"tag\" in p))) {\n c.told.add(node.at);\n console.warn(`Column: <${Named.displayName}> rendered markup that isn't a block, so it's left out. Put HTML in an <Html> block.`);\n }\n return elements(c, node.children, place, Named, inside);\n }\n case \"raw\":\n // In markup a marker cuts, it's that markup's: a Row says where it starts isn't a Column.\n if (inside) {\n const name = /^<([a-zA-Z][\\w:-]*)/.exec(node.html)?.[1];\n return place === \"row\" && name && !inMarkup ? [React.createElement(owner ?? name)] : [];\n }\n // Text shows as text. Other markup isn't a Column, which a Row says (and leaves it out); in a Column it's left out.\n return parts(node.html).flatMap((p): React.ReactNode[] => (\"text\" in p ? [p.text] : inColumn ? [] : [React.createElement(owner ?? (p.tag === \"#\" ? \"div\" : p.tag))]));\n default:\n return [element(c, node)];\n }\n });\n}\n\n/** A render of `children` that collects them; `guarded`, a component in them that fails is left out. */\nfunction collected(children: React.ReactNode, guarded = true): Collected {\n const once = (markup: boolean): Collected => {\n const collection: Collection = { nonce: nonce(), recorded: [], ...(markup ? { markup } : {}), ...(idsSeen() ? {} : { blind: true }) };\n const html = within(collection, () => renderToStaticMarkup(<>{guarded ? guard(children, collection) : children}</>, { identifierPrefix: COLLECTING_ID }));\n return { nodes: parse(html, collection), collection, told: new Set() };\n };\n try {\n return once(false);\n } catch (error) {\n // Markup React rejects (`<hr style=\"…\">` with a string style, in a JavaScript template) isn't a component, so no\n // boundary catches it and it ends the render. Once more with markup guarded too: it's left out, with a message,\n // and the rest renders, as in 0.1.22. A template that renders doesn't get here, so nothing else changes.\n if (!guarded) throw error;\n return once(true);\n }\n}\n\n/**\n * Whether the React Elements' components call gives them the ids of the render Elements starts (see Sentinel):\n * not where a bundler gave them another copy than react-dom's (Next.js's server layers), where `useId()` throws or\n * gives an outer render's ids.\n */\nfunction idsSeen(): boolean {\n let seen = false;\n const Probe = () => {\n try {\n seen = React.useId().slice(1).startsWith(COLLECTING_ID);\n } catch {\n // another copy: no render it can see\n }\n return null;\n };\n renderToStaticMarkup(<Probe />, { identifierPrefix: COLLECTING_ID });\n return seen;\n}\n\n/**\n * A collection's nonce: letters and digits, from the platform's cryptographic random numbers where there are any\n * (Math.random's can be worked out from other values it gave), so markup a template's data holds can't name it.\n */\nfunction nonce(): string {\n const random = globalThis.crypto?.getRandomValues?.(new Uint32Array(2));\n return random ? Array.from(random, (n) => n.toString(36)).join(\"\") : `${Math.random().toString(36).slice(2)}${Math.random().toString(36).slice(2)}`;\n}\n\n/** `children` collected, once per render (the HTML, the head and the design ask for the same). */\nconst collect = (children: React.ReactNode): Collected =>\n children !== null && typeof children === \"object\" ? scopeCache(children, () => collected(children)) : collected(children);\n\n/**\n * A root's children as HTML (what Body puts inside it): markup among the rows as it is, and each row or block\n * rendered by Elements with `place` giving it the root's settings.\n */\nexport function childrenHtml(children: React.ReactNode, place: (child: React.ReactElement) => React.ReactElement): string {\n const c = collect(children);\n return withoutMarkers(markup(c, c.nodes, (child) => within(null, () => renderToString(place(child)))), c.collection.nonce);\n}\n\n/** Children (a root's, or a Row on its own) as Elements components only, for the head and the design. */\nexport function normalizedChildren(children: React.ReactNode): React.ReactNode[] {\n const c = collect(children);\n return elements(c, c.nodes, \"root\");\n}\n\n/** `root` with its children as Elements components only. */\nexport function normalizedRoot(root: React.ReactElement): React.ReactElement {\n return React.cloneElement(root, undefined, ...normalizedChildren((root.props as { children?: React.ReactNode }).children));\n}\n","import React from \"react\";\nimport type { RenderMode, UnlayerConfig, BodyValues } from \"@unlayer-internal/shared-elements\";\nimport { DEFAULT_CONFIG, mergeValues } from \"@unlayer-internal/shared-elements\";\nimport { BodyExporters } from \"@unlayer/exporters\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\nimport { nextHtmlId } from \"../utils/create-component\";\nimport type { SizeInput } from \"../types\";\nimport { BODY_DEFAULTS } from \"../utils/container-defaults\";\nimport { withRenderScope } from \"../utils/render-scope\";\nimport { childrenHtml } from \"../utils/normalize\";\n\nexport type BodyProps = Omit<SemanticProps<BodyValues>, \"padding\" | \"borderRadius\"> & {\n children?: React.ReactNode;\n mode?: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n index?: number;\n /** Optional config (replaces context-based config for Server Component usage) */\n config?: Partial<UnlayerConfig>;\n /** Preview text shown in email client inboxes (email mode only) */\n previewText?: string;\n /** Document text direction, also kept in the design JSON. Renderer options can override it. */\n textDirection?: string;\n /** Language of the rendered document (for example, \"ar\"). */\n lang?: string;\n /**\n * Web font stylesheets the content uses (e.g. a Google Fonts CSS URL).\n * renderToHtml links them in the document head, with any `fonts` option.\n */\n fonts?: Array<{ url: string }>;\n /** Padding — a CSS string (\"0 48px\", \"20px\") or a number (px). */\n padding?: SizeInput;\n /** Corner radius — a number (→ px) or CSS string (\"8px\"). */\n borderRadius?: SizeInput;\n};\n\nconst DEFAULT_VALUES = BODY_DEFAULTS;\n\n// ============================================\n// Preview text (inlined from shared/utils/preview.ts)\n// ============================================\n\nconst MAX_PREVIEW_LENGTH = 150;\n\nconst PADDING_CHARS = [\n \"\\u00A0\", \"\\u200C\", \"\\u200B\", \"\\u200D\", \"\\u200E\", \"\\u200F\", \"\\uFEFF\",\n];\n\n/**\n * previewText is text, as React treats text (it often carries user data, like\n * a name), so it's escaped: markup like `</div>` would end the hidden preview\n * and show whatever follows. The preview is padded with invisible characters\n * below, so it needs no entities.\n */\nfunction escapePreviewText(text: string): string {\n // An email service's `<%name%>` tag (SendGrid's) stays as written, as in 0.1.22, for it to fill in: `<%` can't start an element.\n return text\n .split(/(<%[\\w.]+%>)/)\n .map((part, i) => (i % 2 ? part : part.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\")))\n .join(\"\");\n}\n\nfunction generatePreviewHtml(text: string): string {\n if (!text || text.trim().length === 0) return \"\";\n\n const truncated = text.length > MAX_PREVIEW_LENGTH\n ? text.slice(0, MAX_PREVIEW_LENGTH)\n : text;\n\n const paddingLength = Math.max(0, MAX_PREVIEW_LENGTH - truncated.length);\n let padding = \"\";\n for (let i = 0; i < paddingLength; i++) {\n padding += PADDING_CHARS[i % PADDING_CHARS.length];\n }\n\n return (\n `<div data-skip-in-text=\"true\" style=\"display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">` +\n escapePreviewText(truncated) +\n padding +\n `</div>`\n );\n}\n\n// ============================================\n// Body exporter wrapper (inlined from shared/utils/render-container-to-html.ts)\n// ============================================\n\ntype ContainerExporterFunction = (innerHTML: string, values: Record<string, any>, bodyValues?: Record<string, any>, options?: Record<string, any>) => string;\n\nfunction renderBodyToHtml(innerHTML: string, values: any, mode: RenderMode, previewText?: string): string {\n // Prepend preview text HTML in email mode\n let finalInnerHtml = innerHTML;\n if (mode === \"email\" && previewText) {\n const previewHtml = generatePreviewHtml(previewText);\n if (previewHtml) {\n finalInnerHtml = previewHtml + innerHTML;\n }\n }\n\n const bodyExporter = (BodyExporters[mode] || BodyExporters.web) as ContainerExporterFunction;\n // The email body exporter reads body context (contentWidth, contentAlign)\n // from `arg3.bodyValues` — it drives the Outlook (MSO) container table width.\n // Passing `values` directly left `bodyValues` undefined, pinning the Outlook\n // table to 600px regardless of contentWidth (modern clients were fine via the\n // container max-width, so non-600px emails rendered narrow only in Outlook).\n const raw =\n mode === \"document\"\n ? bodyExporter(finalInnerHtml, values, { type: \"\" })\n : mode === \"email\"\n ? // The email body exporter reads body context (contentWidth,\n // contentAlign) from the `bodyValues` field of its 3rd argument.\n // Passing `values` directly left it undefined, so the Outlook (MSO)\n // table fell back to 600px regardless of contentWidth.\n bodyExporter(finalInnerHtml, values, { bodyValues: values })\n : bodyExporter(finalInnerHtml, values, values);\n\n return raw\n .replace('min-height: 100vh; ', '')\n .replace('min-height: 100vh;', '');\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * Body - Universal Server/Client Component\n *\n * Works in both Server Components and Client Components.\n * In Server Components, pass config as a prop.\n * In Client Components, config can come from UnlayerProvider context or props.\n *\n * @example Server Component\n * ```tsx\n * <Body backgroundColor=\"#F7F8F9\" contentWidth=\"600px\" mode=\"web\">\n * <Row><Column><Paragraph values={{...}} mode=\"web\" /></Column></Row>\n * </Body>\n * ```\n *\n * @example Client Component with Provider\n * ```tsx\n * <UnlayerProvider config={{ mode: \"email\" }}>\n * <Body>...</Body>\n * </UnlayerProvider>\n * ```\n */\nconst Body: React.FC<BodyProps> = (props) => {\n const { children, mode: modeProp, className, style, index = 0, config: configProp, previewText, fonts: _fonts, lang: _lang, ...semanticProps } = props;\n\n // Resolve config: explicit prop > default (no hooks, Server Component safe)\n const resolvedConfig: UnlayerConfig = { ...DEFAULT_CONFIG, ...configProp };\n\n // Resolve mode: explicit prop > config > default\n const mode: RenderMode = modeProp ?? resolvedConfig.mode ?? \"web\";\n\n // Build _config to thread through children. Reset the per-render id counters so\n // unique ids are allocated across the whole tree (shared by reference downward).\n const _config: UnlayerConfig = { ...resolvedConfig, mode };\n (_config as { __ids?: Record<string, number> }).__ids = {};\n\n // Map semantic props, then merge BODY_DEFAULTS on top so the body always\n // carries its full default values (notably contentWidth \"500px\", textColor\n // \"#000000\") before rendering — the same way item components merge their\n // defaults. Without this the body exporter / grid CSS fall back to their own\n // internal defaults (e.g. 600px) instead of the schema default, so the\n // Outlook table, container, and grid CSS disagree. Mapped values win.\n const values = mergeValues<BodyValues>(\n DEFAULT_VALUES,\n mapSemanticProps<BodyValues>(semanticProps as SemanticProps<BodyValues>, DEFAULT_VALUES, \"Body\")\n );\n\n // Ensure _meta\n const valuesWithMeta = {\n ...values,\n _meta: {\n htmlID: nextHtmlId(_config, \"u_body\"),\n htmlClassNames: \"u_body\",\n ...(values._meta || {})\n }\n };\n\n // Clone children with _config AND the body's resolved values so Row/Column\n // inherit body-level context — notably `contentWidth`, which determines the\n // row container max-width (and therefore each column's width) in web mode.\n // Without this, Row falls back to BODY_DEFAULTS.contentWidth (\"500px\") and\n // <Body contentWidth=\"…\"> is silently ignored for layout.\n // Fragments and user components expanded: their rows get the context too.\n let innerHTML = \"\";\n if (children) {\n try {\n // A render of its own when Body is rendered straight through React (not renderToHtml).\n innerHTML = withRenderScope(() => {\n // One React render collects the rows and blocks; each is then rendered with Body's settings.\n return childrenHtml(children, (child) => React.cloneElement(child as React.ReactElement<any>, { _config, bodyValues: values }));\n }, true);\n } catch (error) {\n console.error(\"Body: Failed to render children:\", error);\n innerHTML = \"\";\n }\n }\n\n try {\n const html = renderBodyToHtml(innerHTML, valuesWithMeta, mode, previewText);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={className}\n style={style}\n />\n );\n } catch (error) {\n console.error(\"Body rendering failed:\", error);\n return (\n <div className={className} style={style}>\n {children}\n </div>\n );\n }\n};\n\nBody.displayName = \"Body\";\n\nexport default Body;\n","import Body, { type BodyProps } from \"./Body\";\n\nexport type EmailProps = Omit<BodyProps, \"mode\">;\n\n/**\n * Email - Renders email-client safe HTML (tables for Outlook, Gmail, Yahoo).\n *\n * Thin wrapper around Body with mode locked to \"email\".\n *\n * @example\n * ```tsx\n * <Email backgroundColor=\"#f4f4f5\" contentWidth=\"560px\" previewText=\"Welcome!\">\n * <Row><Column><Paragraph text=\"Hello\" /></Column></Row>\n * </Email>\n * ```\n */\nexport default function Email(props: EmailProps) {\n return <Body {...props} mode=\"email\" />;\n}\n\nEmail.displayName = \"Email\";\n","import Body, { type BodyProps } from \"./Body\";\n\nexport type PageProps = Omit<BodyProps, \"mode\">;\n\n/**\n * Page - Renders with div/flexbox for responsive web display.\n *\n * Thin wrapper around Body with mode locked to \"web\".\n *\n * @example\n * ```tsx\n * <Page backgroundColor=\"#ffffff\" contentWidth=\"960px\">\n * <Row><Column><Paragraph text=\"Hello\" /></Column></Row>\n * </Page>\n * ```\n */\nexport default function Page(props: PageProps) {\n return <Body {...props} mode=\"web\" />;\n}\n\nPage.displayName = \"Page\";\n","import Body, { type BodyProps } from \"./Body\";\n\nexport type DocumentPageSize =\n | \"A3\"\n | \"A4\"\n | \"A5\"\n | \"Legal\"\n | \"Letter\"\n | \"Tabloid\";\n\nexport type DocumentOrientation = \"portrait\" | \"landscape\";\n\nexport type DocumentProps = Omit<\n BodyProps,\n \"mode\" | \"documentSize\" | \"documentOrientation\" | \"documentMargin\"\n> & {\n documentSize?: DocumentPageSize;\n documentOrientation?: DocumentOrientation;\n};\n\n/**\n * Document - Print-optimized rendering for PDF generation.\n *\n * Thin wrapper around Body with mode locked to \"document\".\n *\n * @example\n * ```tsx\n * <Document\n * backgroundColor=\"#ffffff\"\n * contentWidth=\"700px\"\n * documentSize=\"A4\"\n * documentOrientation=\"portrait\"\n * >\n * <Row><Column><Paragraph text=\"Hello\" /></Column></Row>\n * </Document>\n * ```\n */\nexport default function Document(props: DocumentProps) {\n return <Body {...props} mode=\"document\" />;\n}\n\nDocument.displayName = \"Document\";\n","\"use client\";\n\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type { UnlayerConfig } from \"@unlayer-internal/shared-elements\";\nimport { DEFAULT_CONFIG } from \"@unlayer-internal/shared-elements\";\n\n/**\n * @internal Flag added to context value when a provider is active.\n * Used by item components to detect provider-without-Body usage.\n */\nexport const PROVIDER_ACTIVE_KEY = \"__unlayerProviderActive\";\n\n// Lazy-init: createContext is not available in React Server Component modules.\n// Deferring the call ensures it only runs when UnlayerProvider or\n// useUnlayerConfig is actually invoked (always in a client context).\nlet _UnlayerContext: React.Context<UnlayerConfig> | null = null;\nfunction getUnlayerContext(): React.Context<UnlayerConfig> {\n if (!_UnlayerContext) {\n _UnlayerContext = createContext<UnlayerConfig>(DEFAULT_CONFIG);\n }\n return _UnlayerContext;\n}\n\nexport interface UnlayerProviderProps {\n config: Partial<UnlayerConfig>;\n children: React.ReactNode;\n}\n\nexport const UnlayerProvider: React.FC<UnlayerProviderProps> = ({\n config,\n children,\n}) => {\n const merged = useMemo(\n () => ({ ...DEFAULT_CONFIG, ...config, [PROVIDER_ACTIVE_KEY]: true }),\n [config]\n );\n\n const Context = getUnlayerContext();\n return (\n <Context.Provider value={merged}>\n {children}\n </Context.Provider>\n );\n};\n\nUnlayerProvider.displayName = \"UnlayerProvider\";\n\nexport function useUnlayerConfig(): UnlayerConfig {\n return useContext(getUnlayerContext());\n}\n","import { cssValueSafe, type RenderMode } from \"@unlayer-internal/shared-elements\";\nimport { safeName } from \"./create-component\";\n\ntype DeviceStyles = Record<string, string[]>;\ntype Collection = \"rows\" | \"columns\" | \"contents\";\n\n// Mirrors the Unlayer editor's device-override CSS, including option order.\nconst contentOptions: Record<string, string[]> = {\n Button: [\"size\", \"fontSize\", \"lineHeight\", \"textAlign\", \"padding\"],\n Image: [\"src\", \"textAlign\"],\n Heading: [\"fontSize\", \"textAlign\", \"lineHeight\"],\n Paragraph: [\"fontSize\", \"textAlign\", \"lineHeight\"],\n Menu: [\"fontSize\", \"padding\"],\n Divider: [\"width\", \"textAlign\"],\n};\n\n/**\n * A value as CSS writes it in a declaration, or undefined when it could end the\n * declaration, the rule or the `<style>` element (`16px</style><script>`),\n * start a comment that hides the rules after it (`16px /*`), or leave a\n * bracket open, which swallows the rules after it (`calc(12px + 4px`): a\n * phone setting may come from data, and it's written into the head as is.\n */\nfunction css(value: unknown): string | undefined {\n const text = String(value).trim();\n return text && !/[!\\\\\"'\\n\\r]/.test(text) && cssValueSafe(text) ? text : undefined;\n}\n\n/** An id as a selector writes it, as `CSS.escape` does: `section.2` is `section\\\\.2`, not the id `section` and a class. */\nfunction ident(id: string): string {\n return id.replace(/^-?\\d|^-$|[^\\w\\u0080-\\uffff-]/g, (c) =>\n /\\d/.test(c.slice(-1)) ? `${c.slice(0, -1)}\\\\${c.slice(-1).charCodeAt(0).toString(16)} ` : `\\\\${c}`);\n}\n\nfunction size(value: unknown): string | undefined {\n const number = parseFloat(String(value));\n if (!Number.isFinite(number)) return;\n const rounded = parseFloat(number.toFixed(2));\n if (typeof value === \"number\" || String(value).endsWith(\"px\")) return `${rounded}px`;\n if (String(value).endsWith(\"%\")) return `${rounded}%`;\n}\n\nexport function collectDeviceStyles(values: Record<string, any>, collection: Collection, name: string, mode: RenderMode, styles: DeviceStyles): void {\n // The id the block's HTML has, escaped.\n const given = safeName(values._meta?.htmlID);\n if (!given) return;\n const id = ident(given);\n const options = collection === \"contents\" ? [\"containerPadding\", ...(contentOptions[name] || [])] : collection === \"columns\" ? [\"padding\", \"border\"] : [\"padding\"];\n for (const device of mode === \"document\" ? [\"desktop\"] : [\"desktop\", \"mobile\"]) {\n const overrides = values._override?.[device];\n if (!overrides) continue;\n for (const option of options) {\n if (!(option in overrides)) continue;\n const value = overrides[option];\n const property = option.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n const prefix = collection === \"rows\" ? \"row-\" : collection === \"columns\" ? \"col-\" : \"\";\n const selector = (attribute: string) => `#${id} .v-${prefix}${property === attribute ? property : `${property}-${attribute}`}`;\n const push = (rule: string) => (styles[device] ||= []).push(rule);\n if (option === \"padding\" || option === \"containerPadding\") {\n if (!(value || value === 0) || css(value) === undefined) continue;\n const direct = collection === \"rows\" || (mode === \"web\" && collection === \"contents\" && option === \"containerPadding\");\n const target = direct ? selector(\"padding\").replace(`#${id} `, `#${id}`) : selector(\"padding\");\n push(`${target} { padding: ${css(value)} !important; }`);\n if (mode === \"email\" && collection === \"rows\") {\n const parts = String(value).trim().split(/\\s+/);\n // A length the editor doesn't write (`2em`, a bare `0`) is written as it is.\n const [top, bottom] = [parts[0], parts[2] || parts[0]].map((part) => size(part) ?? css(part));\n if (top !== undefined && bottom !== undefined) push(`${target}--vertical { padding-top: ${top} !important; padding-bottom: ${bottom} !important; }`);\n }\n } else if (option === \"border\") {\n // As the editor's borderToStyle: transparent unless a side has a width.\n if (value) push(`${selector(\"border\")} { ${[\"Top\", \"Left\", \"Right\", \"Bottom\"].map((d) => { const w = css(value[`border${d}Width`] || \"0px\") ?? \"0px\"; return `border-${d.toLowerCase()}: ${w} ${css(value[`border${d}Style`] || \"solid\") ?? \"solid\"} ${(parseInt(w) > 0 && css(value[`border${d}Color`])) || \"transparent\"} !important;`; }).join(\"\")} }`);\n } else if (option === \"src\") {\n if (!value) continue;\n const merged = { ...values.src, ...value };\n const maximum = merged.autoWidth === false ? size(merged.maxWidth) : undefined;\n push(`${selector(\"width\")} { width: ${maximum || \"100%\"} !important; }`);\n push(`${selector(\"max-width\")} { max-width: ${size(maximum || merged.width || \"100%\")} !important; }`);\n } else if (option === \"size\" || option === \"width\") {\n if (!value) continue;\n push(`${selector(\"width\")} { width: ${size(value.width) && !value.autoWidth ? size(value.width) : \"auto\"} !important; }`);\n push(`${selector(\"max-width\")} { max-width: 100% !important; }`);\n } else {\n if (!(value || (option === \"lineHeight\" && `${value}` === \"0\"))) continue;\n const rendered = css(option === \"fontSize\" && typeof value === \"number\" ? `${value}px` : value);\n if (rendered === undefined) continue;\n push(`${selector(property)} { ${property}: ${rendered} !important; }`);\n }\n }\n }\n}\n\nexport function deviceStylesCss(styles: DeviceStyles, mode: RenderMode): string {\n return Object.entries(styles).filter(([, rules]) => rules.length).map(([device, rules]) => {\n const query = device === \"mobile\" ? \"@media (max-width: 480px)\" : `@media (min-width: ${mode === \"document\" ? 1 : 481}px)`;\n return `${query} { ${rules.join(\" \")} }`;\n }).join(\"\\n\");\n}\n\nexport function deviceVisibilityCss(mode: RenderMode): string {\n if (mode === \"document\") return \"\";\n const extra = mode === \"email\" ? \"max-height: 0px; overflow: hidden; \" : \"\";\n const reset = mode === \"email\" ? \"@media (min-width: 0px) { .hide-default__display-block { display: block !important; mso-hide: unset !important; } .hide-default__display-table { display: table !important; mso-hide: unset !important; } }\\n\" : \"\";\n return reset + `@media (max-width: 480px) { .hide-mobile { ${extra}display: none !important; } }\\n` + `@media (min-width: 481px) { .hide-desktop { ${extra}display: none !important; } }`;\n}\n","/**\n * renderToJson — Convert a React element tree to Unlayer's DesignJSON format.\n *\n * Walks the React element tree statically via React.Children and extracts\n * values at each level. No HTML rendering is performed.\n *\n * Produces the { body: { rows, values }, counters, schemaVersion } structure\n * that the Unlayer editor uses, enabling round-tripping: build with React\n * components → export as JSON → load into the Unlayer editor.\n */\n\nimport React from \"react\";\nimport type {\n DesignJSON,\n DesignBody,\n DesignRow,\n DesignColumn,\n DesignContent,\n} from \"@unlayer-internal/shared-elements\";\nimport { mergeValues } from \"@unlayer-internal/shared-elements\";\n// Schema version from the exporters bundle — matches the editor's currentVersion\n// at the time the exporters were generated. This ensures renderToJson output is\n// recognized as current by the editor, skipping unnecessary migrations.\n// Falls back to 24 for older exporters packages that don't export this yet.\nimport { schemaVersion as _schemaVersion } from \"@unlayer/exporters\";\nconst schemaVersion: number = _schemaVersion ?? 24;\nimport { mapSemanticProps } from \"./semantic-props\";\nimport { componentName, getDisplayName, ROOT_NAMES, unwrapRoot, UNWRAP_ADVICE } from \"./unwrap-root\";\nimport { BODY_DEFAULTS, ROW_DEFAULTS, COLUMN_DEFAULTS } from \"./container-defaults\";\nimport { contentSlotWidth, pinImageSrc, type SlotContext } from \"./image-sizing\";\nimport { withRenderScope } from \"./render-scope\";\nimport { KEPT, normalizedChildren, normalizedRoot } from \"./normalize\";\nimport { textDirectionOf, UNLAYER_CONFIG_KEY } from \"./create-component\";\n\n/** Layout context threaded down the walk so an image can be sized against the\n * real column slot (contentWidth × column share, minus paddings/borders). */\ntype LayoutContext = Pick<\n SlotContext,\n \"bodyValues\" | \"rowValues\" | \"rowCells\" | \"columnIndex\" | \"columnValues\"\n>;\n\n// ============================================\n// Tree helpers (inlined)\n// ============================================\n\n\n\n/**\n * Unwrap a user wrapper component (e.g. `renderToJson(<MyEmail/>)`) down to\n * its root element: renderToJson walks the element tree, so the wrapper must\n * be called first. A wrapper that throws (React hooks aren't valid outside a\n * render) gets an actionable message instead of a bare \"Invalid hook call\".\n */\nfunction unwrapForJson(element: React.ReactElement): React.ReactElement {\n try {\n return unwrapRoot(element);\n } catch (cause) {\n const detail = cause instanceof Error ? cause.message : String(cause);\n throw new Error(\n `[Unlayer] renderToJson: could not unwrap <${componentName(element) || \"wrapper\"}>. ${UNWRAP_ADVICE} (${detail})`\n );\n }\n}\n\n/** The element children of a collected (Elements-only) tree. */\nconst collectChildren = (node: React.ReactNode): React.ReactElement[] => React.Children.toArray(node).filter(React.isValidElement);\n\n/**\n * Strip internal/base props from an element's props,\n * returning only the semantic props that should be mapped to values.\n */\nexport function extractSemanticProps(\n props: Record<string, any>,\n extraKeys: string[] = []\n): Record<string, any> {\n const internalKeys = new Set([\n \"children\",\n \"mode\",\n \"className\",\n \"style\",\n \"index\",\n \"colIndex\",\n \"cells\",\n \"bodyValues\",\n \"rowValues\",\n \"_config\",\n \"config\",\n \"previewText\",\n \"fonts\",\n \"lang\",\n \"layout\",\n \"collection\",\n ...extraKeys,\n ]);\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!internalKeys.has(key) && value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\n/** Increment and return counter for a given key. */\nexport function nextCounter(counters: Record<string, number>, key: string): number {\n counters[key] = (counters[key] || 0) + 1;\n return counters[key];\n}\n\n// ============================================\n// Helpers\n// ============================================\n\n/** Map component displayName to Unlayer content type.\n * Paragraph maps to \"text\" (the legacy content type that uses plain HTML\n * values.text) for universal editor compatibility. The newer \"paragraph\"\n * content type uses Lexical textJson which requires specific editor support.\n */\nfunction toContentType(displayName: string): string {\n if (displayName === \"Paragraph\") return \"text\";\n return displayName.toLowerCase();\n}\n\n/** Generate a unique ID like \"u_row_1\", \"u_content_button_2\" */\nfunction makeId(prefix: string, counter: number): string {\n return `${prefix}_${counter}`;\n}\n\n/**\n * Extract plain text/HTML from a textJson string without needing a DOM.\n * Handles both Lexical JSON format and the __html passthrough format.\n */\nfunction extractTextFromTextJson(textJson: string): string {\n try {\n const parsed = JSON.parse(textJson);\n\n // __html passthrough (from htmlToTextJson)\n if (parsed.__html) return parsed.__html;\n\n // Lexical JSON — walk the tree and extract text content\n const root = parsed?.root;\n if (!root?.children) return \"\";\n\n const paragraphs: string[] = [];\n for (const paragraph of root.children) {\n if (!paragraph?.children) continue;\n const parts: string[] = [];\n for (const node of paragraph.children) {\n if (node?.text) parts.push(node.text);\n }\n paragraphs.push(parts.join(\"\"));\n }\n return paragraphs.join(\"\\n\");\n } catch {\n return \"\";\n }\n}\n\n// ============================================\n// Tree processors\n// ============================================\n\nfunction processItem(\n element: React.ReactElement,\n counters: Record<string, number>,\n layout: LayoutContext = {},\n /** The id and class base, when not the item's own (markup kept as an HTML block, named after its component). */\n metaName?: string\n): DesignContent {\n const componentType = element.type as any;\n const config = componentType[UNLAYER_CONFIG_KEY];\n\n if (!config && componentType?.[KEPT]) {\n // Markup a component of the user's own rendered in a Column: an HTML block, numbered as the HTML numbers it.\n return processItem(componentType[KEPT], counters, layout, (componentType.displayName || componentType.name || \"component\").toLowerCase());\n }\n if (!config) {\n const name = componentName(element) || \"Unknown\";\n throw new Error(\n `[Unlayer] renderToJson: <${name}> is not a recognized Unlayer item component. ` +\n `Only components created with createItemComponent are supported.`\n );\n }\n\n const { name, defaultValues, propMapper, slug } = config;\n const contentType = config.contentType ?? toContentType(name);\n // Custom tools use u_content_custom_<slug> as their id/class base\n const metaBase = `u_content_${metaName ?? config.metaName ?? contentType}`;\n const count = nextCounter(counters, metaBase);\n const id = makeId(metaBase, count);\n\n // Map props through the item's own propMapper, then merge with defaults\n const { children, ...restProps } = element.props;\n const mappedValues = propMapper({ children, ...restProps });\n const finalValues = mergeValues(defaultValues, mappedValues);\n\n // Paragraph maps to \"text\" content type — convert textJson to plain text/HTML.\n // Extract text directly from the Lexical JSON structure (no DOM needed).\n if (contentType === \"text\" && finalValues.textJson) {\n finalValues.text = extractTextFromTextJson(finalValues.textJson);\n delete finalValues.textJson;\n }\n\n // Add containerPadding (base content option) and _meta\n const values = {\n containerPadding: \"10px\",\n ...finalValues,\n _meta: {\n htmlID: id,\n htmlClassNames: metaBase,\n ...(finalValues._meta || {}),\n },\n selectable: true,\n draggable: true,\n duplicatable: true,\n deletable: true,\n hideable: true,\n };\n\n // Convert a fixed (px) image pin to a percent of the column slot using the\n // threaded geometry, so the display width survives the JSON round-trip into an\n // editor. Guarded on `src.autoWidth === false`, so only pinned images change.\n const itemSrc = (values as Record<string, any>).src;\n if (itemSrc && typeof itemSrc === \"object\" && itemSrc.autoWidth === false) {\n const availableWidth = contentSlotWidth({\n ...layout,\n containerPadding: (values as Record<string, any>).containerPadding,\n });\n (values as Record<string, any>).src = pinImageSrc(itemSrc, availableWidth);\n }\n\n return slug ? { type: contentType, slug, values } : { type: contentType, values };\n}\n\nfunction processColumn(\n element: React.ReactElement,\n counters: Record<string, number>,\n layout: Omit<LayoutContext, \"columnValues\"> = {}\n): DesignColumn {\n const count = nextCounter(counters, \"u_column\");\n const id = makeId(\"u_column\", count);\n\n // Extract semantic props for column values, then merge with defaults\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, COLUMN_DEFAULTS, \"Column\");\n const values = mergeValues(COLUMN_DEFAULTS, mapped);\n\n // Add _meta\n const valuesWithMeta = {\n ...values,\n _meta: {\n htmlID: id,\n htmlClassNames: \"u_column\",\n ...(values._meta || {}),\n },\n };\n\n // Process item children\n const contents: DesignContent[] = [];\n const children = collectChildren(element.props.children);\n\n const itemLayout: LayoutContext = { ...layout, columnValues: valuesWithMeta };\n for (const child of children) {\n contents.push(processItem(child, counters, itemLayout));\n }\n\n return { contents, values: valuesWithMeta };\n}\n\nfunction processRow(\n element: React.ReactElement,\n counters: Record<string, number>,\n parentLayout: Pick<LayoutContext, \"bodyValues\"> = {}\n): DesignRow {\n const count = nextCounter(counters, \"u_row\");\n const id = makeId(\"u_row\", count);\n\n // Determine cells from layout or cells prop\n const { layout, cells: propsCells } = element.props;\n let cells: number[];\n if (layout) {\n cells = layout.cells;\n } else if (propsCells) {\n cells = propsCells;\n } else {\n // Default: one equal cell per Column child. Count only <Column> children —\n // any stray non-Column child is warned and skipped below, so including it\n // would make `cells` longer than the column list and distort both the row\n // layout and the column-share math used for image sizing.\n const columnCount = Math.max(\n 1,\n collectChildren(element.props.children).filter(\n (child) => getDisplayName(child) === \"Column\"\n ).length\n );\n cells = Array(columnCount).fill(1);\n }\n\n // Extract semantic props for row values, then merge with defaults\n const semanticProps = extractSemanticProps(element.props, [\"layout\"]);\n const mapped = mapSemanticProps(semanticProps, ROW_DEFAULTS, \"Row\");\n const values = mergeValues(ROW_DEFAULTS, mapped);\n\n // Add cells, columns flag, editor flags, and _meta\n const valuesWithMeta = {\n ...values,\n columns: values.columns ?? false,\n cells,\n _meta: {\n htmlID: id,\n htmlClassNames: \"u_row\",\n ...(values._meta || {}),\n },\n selectable: true,\n draggable: true,\n duplicatable: true,\n deletable: true,\n hideable: true,\n };\n\n // Process Column children\n const columns: DesignColumn[] = [];\n const children = collectChildren(element.props.children);\n\n const columnLayout: Omit<LayoutContext, \"columnValues\"> = {\n bodyValues: parentLayout.bodyValues,\n rowValues: valuesWithMeta,\n rowCells: cells,\n };\n let columnIndex = 0;\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Column\") {\n columns.push(\n processColumn(child, counters, { ...columnLayout, columnIndex })\n );\n columnIndex += 1;\n } else {\n console.warn(\n `[Unlayer] renderToJson: <${componentName(child) ?? String(child.type)}> is not a valid Row child. Only <Column> is allowed.`\n );\n }\n }\n\n return { cells, columns, values: valuesWithMeta };\n}\n\nfunction processBody(\n element: React.ReactElement,\n counters: Record<string, number>\n): DesignBody {\n const id = \"u_body\";\n\n // Extract semantic props for body values, then merge with defaults\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, BODY_DEFAULTS, \"Body\");\n const values = mergeValues(BODY_DEFAULTS, mapped);\n // Only ltr, rtl or auto, as in the HTML (a value from a request could carry anything).\n if (\"textDirection\" in values) {\n const direction = textDirectionOf((values as Record<string, unknown>).textDirection);\n if (direction) (values as Record<string, unknown>).textDirection = direction;\n else delete (values as Record<string, unknown>).textDirection;\n }\n\n // `previewText` is the React alias for the schema's `preheaderText`. It is\n // excluded from the mapped values (it drives the email preview HTML at render\n // time), so thread it into the JSON here so it is preserved in the output.\n const previewText = (element.props as { previewText?: string }).previewText;\n if (previewText !== undefined) {\n (values as Record<string, unknown>).preheaderText = previewText;\n }\n\n // Add _meta\n const valuesWithMeta = {\n ...values,\n _meta: {\n htmlID: id,\n htmlClassNames: \"u_body\",\n ...(values._meta || {}),\n },\n };\n\n // Process Row children\n const rows: DesignRow[] = [];\n const children = collectChildren(element.props.children);\n\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Row\") {\n rows.push(processRow(child, counters, { bodyValues: valuesWithMeta }));\n } else {\n console.warn(\n `[Unlayer] renderToJson: <${componentName(child) ?? String(child.type)}> is not a valid Body child. Only <Row> is allowed.`\n );\n }\n }\n\n return {\n rows,\n values: valuesWithMeta,\n } as DesignBody;\n}\n\n// ============================================\n// Public API\n// ============================================\n\n/**\n * Convert a React element tree to Unlayer's DesignJSON format.\n *\n * The root element must be a `<Body>`, `<Email>`, `<Page>`, or `<Document>`.\n * The tree is walked statically — no HTML rendering is performed.\n *\n * @param element - A React element tree with Body > Row > Column > Item structure\n * @returns DesignJSON object compatible with the Unlayer editor\n * @throws {Error} If the root element is not a recognized container component\n *\n * @example\n * ```tsx\n * import { renderToJson, Body, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const design = renderToJson(\n * <Body backgroundColor=\"#ffffff\" contentWidth=\"600px\">\n * <Row>\n * <Column>\n * <Paragraph>Hello World</Paragraph>\n * </Column>\n * </Row>\n * </Body>\n * );\n * ```\n */\n/**\n * Convert a single `<Row>` element to Unlayer's row JSON format.\n *\n * Use this when targeting a Block Editor, which works with individual rows\n * rather than full design JSON. For full designs, use `renderToJson` instead.\n *\n * @param element - A React element tree with Row > Column > Item structure\n * @returns A DesignRow object compatible with the Unlayer block editor\n * @throws {Error} If the element is not a `<Row>`\n *\n * @example\n * ```tsx\n * import { renderRowToJson, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const row = renderRowToJson(\n * <Row>\n * <Column>\n * <Paragraph>Hello World</Paragraph>\n * </Column>\n * </Row>\n * );\n * ```\n */\nexport function renderRowToJson(element: React.ReactElement): DesignRow {\n const displayName = getDisplayName(element);\n\n if (displayName !== \"Row\") {\n throw new Error(\n `[Unlayer] renderRowToJson: Element must be <Row>, ` +\n `but got <${componentName(element) || \"unknown\"}>. ` +\n `For full designs, use renderToJson instead.`\n );\n }\n\n const counters: Record<string, number> = {};\n // A render of its own, as renderToJson's: the same row gives the same ids every time. React renders what's in it.\n return withRenderScope(() => processRow(normalizedChildren(element).find((c): c is React.ReactElement => React.isValidElement(c)) ?? element, counters));\n}\n\nexport function renderToJson(element: React.ReactElement): DesignJSON {\n return withRenderScope(() => designJson(element));\n}\n\nfunction designJson(element: React.ReactElement): DesignJSON {\n // Accept a user wrapper component (e.g. <MyEmail/>) by unwrapping to its root,\n // matching renderToHtml which renders wrappers through React.\n element = unwrapForJson(element);\n const displayName = getDisplayName(element);\n // One React render collects the rows and blocks (as the HTML does).\n if (displayName && ROOT_NAMES.has(displayName)) element = normalizedRoot(element);\n\n if (!displayName || !ROOT_NAMES.has(displayName)) {\n throw new Error(\n `[Unlayer] renderToJson: Root element must be <Body>, <Email>, <Page>, or <Document>, ` +\n `but got <${componentName(element) || \"unknown\"}>. ` +\n `Wrap your content: <Body><Row><Column>...</Column></Row></Body>`\n );\n }\n\n // Email/Page/Document are thin wrappers around Body — for JSON purposes,\n // we treat them identically: extract props directly from the wrapper element.\n // The wrapper's own render function would re-render as Body, but we don't\n // call render — we just walk the element tree.\n\n // For Email/Page/Document, the children and semantic props are on the\n // wrapper element directly, same as Body.\n const counters: Record<string, number> = {};\n const body = processBody(element, counters);\n\n return {\n counters,\n body,\n schemaVersion,\n };\n}\n","/**\n * extractHeadFromTree — Walk a React element tree and collect <head> CSS/JS\n * from the exporters' head functions.\n *\n * Mirrors the editor's extractHead.ts but works with the React element tree\n * instead of the Redux design state. Uses the same pattern as render-to-json.ts\n * to walk Body > Row > Column > Item structure.\n */\n\nimport React from \"react\";\nimport { collectDeviceStyles, deviceStylesCss, deviceVisibilityCss } from \"./device-overrides\";\nimport { heads } from \"@unlayer/exporters\";\nimport { mergeValues } from \"@unlayer-internal/shared-elements\";\nimport type { RenderMode, HeadConfig } from \"@unlayer-internal/shared-elements\";\nimport { mapSemanticProps } from \"./semantic-props\";\nimport { UNLAYER_CONFIG_KEY } from \"./create-component\";\nimport { BODY_DEFAULTS, ROW_DEFAULTS, COLUMN_DEFAULTS } from \"./container-defaults\";\nimport { KEPT, normalizedRoot } from \"./normalize\";\nimport { getDisplayName } from \"./unwrap-root\";\nimport { extractSemanticProps, nextCounter } from \"./render-to-json\";\n\n/** Args every head builder receives: (values, bodyValues, meta). */\ntype HeadArgs = [Record<string, any>, Record<string, any>, Record<string, any>];\n\n/**\n * Local type for a component's head contributions — the optional css/js/tags\n * builders this file invokes to collect the <head> CSS/JS/tags.\n */\ntype ComponentHead = {\n css?: (...args: HeadArgs) => string | undefined;\n js?: (...args: HeadArgs) => string | undefined;\n tags?: (...args: HeadArgs) => string[] | undefined;\n};\n\n// ============================================\n// Inlined helpers\n// ============================================\n\n/** Add _meta fields if not present. */\nfunction ensureMeta(values: any, type: string, index: number = 0): any {\n return {\n ...values,\n _meta: {\n htmlID: `${[\"row\", \"column\"].includes(type) ? \"u\" : \"u_content\"}_${type.toLowerCase()}_${index + 1}`,\n htmlClassNames: `u_content_${type.toLowerCase()}`,\n ...(values._meta || {})\n }\n };\n}\n\n\n/** The element children of a collected (Elements-only) tree. */\nconst collectChildren = (node: React.ReactNode): React.ReactElement[] => React.Children.toArray(node).filter(React.isValidElement);\n\n// ============================================\n// Types\n// ============================================\n\nexport interface ExtractHeadResult {\n /** Combined CSS from all head functions */\n css: string;\n /** Combined JS from all head functions */\n js: string;\n /** Unique HTML tags (meta, link, etc.) from all head functions */\n tags: string[];\n}\n\nexport interface ExtractHeadOptions {\n /** Display mode for rendering */\n displayMode: RenderMode;\n /** Optional head config for feature flags and initial values */\n headConfig?: HeadConfig;\n}\n\n/**\n * Call a head's css/js/tags functions and collect the results.\n */\nfunction callHead(\n head: ComponentHead | undefined,\n values: Record<string, any>,\n bodyValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n styles: string[],\n scripts: string[],\n tags: string[]\n): void {\n if (!head) return;\n\n const headArgs: [Record<string, any>, Record<string, any>, Record<string, any>] = [\n values,\n bodyValues,\n {\n displayMode,\n isViewer: false,\n variant: null,\n type: \"rows\",\n headConfig,\n },\n ];\n\n const css = head.css?.(...headArgs);\n if (css) styles.push(css);\n\n const js = head.js?.(...headArgs);\n if (js) scripts.push(js);\n\n const headTags = head.tags?.(...headArgs);\n if (headTags) tags.push(...headTags);\n}\n\n// ============================================\n// Tree walkers\n// ============================================\n\nfunction walkItem(\n element: React.ReactElement,\n bodyValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n counters: Record<string, number>,\n styles: string[],\n scripts: string[],\n tags: string[],\n deviceStyles: Record<string, string[]>\n): void {\n const componentType = element.type as any;\n const config = componentType[UNLAYER_CONFIG_KEY];\n if (!config) {\n // Markup a component of the user's own rendered in a Column: the HTML numbers it after the component.\n if (componentType?.[KEPT]) nextCounter(counters, `u_content_${(componentType.displayName || componentType.name || \"component\").toLowerCase()}`);\n return;\n }\n\n const { name, defaultValues, propMapper } = config;\n\n // Map and merge values (same as render-to-json and create-component)\n const { children, ...restProps } = element.props;\n const mappedValues = propMapper({ children, ...restProps });\n const finalValues = mergeValues(defaultValues, mappedValues);\n\n // Track component index (same counter pattern as render-to-json.ts)\n const contentType = config.metaName ?? name.toLowerCase();\n const count = nextCounter(counters, `u_content_${contentType}`);\n const valuesWithMeta = ensureMeta(finalValues, contentType, count - 1);\n\n collectDeviceStyles(valuesWithMeta, \"contents\", name, displayMode, deviceStyles);\n\n // The component's own head (custom tools) wins over the registry lookup\n const head =\n (config.head as ComponentHead | undefined) ??\n (heads as Record<string, ComponentHead | undefined>)[name];\n callHead(head, valuesWithMeta, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n}\n\nfunction walkColumn(\n element: React.ReactElement,\n bodyValues: Record<string, any>,\n rowValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n counters: Record<string, number>,\n styles: string[],\n scripts: string[],\n tags: string[],\n deviceStyles: Record<string, string[]>\n): void {\n // Column head\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, COLUMN_DEFAULTS, \"Column\");\n const count = nextCounter(counters, \"u_column\");\n const columnValues = ensureMeta(mergeValues(COLUMN_DEFAULTS, mapped), \"column\", count - 1);\n\n collectDeviceStyles(columnValues, \"columns\", \"Column\", displayMode, deviceStyles);\n\n const columnHead = (heads as Record<string, ComponentHead | undefined>)[\"Column\"];\n callHead(columnHead, columnValues, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n // Walk item children\n const children = collectChildren(element.props.children);\n for (const child of children) {\n walkItem(child, bodyValues, displayMode, headConfig, counters, styles, scripts, tags, deviceStyles);\n }\n}\n\nfunction walkRow(\n element: React.ReactElement,\n bodyValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n counters: Record<string, number>,\n styles: string[],\n scripts: string[],\n tags: string[],\n deviceStyles: Record<string, string[]>\n): void {\n // Row head\n const semanticProps = extractSemanticProps(element.props, [\"layout\"]);\n const mapped = mapSemanticProps(semanticProps, ROW_DEFAULTS, \"Row\");\n const count = nextCounter(counters, \"u_row\");\n const rowValues = ensureMeta(mergeValues(ROW_DEFAULTS, mapped), \"row\", count - 1);\n\n collectDeviceStyles(rowValues, \"rows\", \"Row\", displayMode, deviceStyles);\n\n const rowHead = (heads as Record<string, ComponentHead | undefined>)[\"Row\"];\n callHead(rowHead, rowValues, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n // Walk column children\n const children = collectChildren(element.props.children);\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Column\") {\n walkColumn(child, bodyValues, rowValues, displayMode, headConfig, counters, styles, scripts, tags, deviceStyles);\n }\n }\n}\n\n// ============================================\n// Public API\n// ============================================\n\n/**\n * Extract head CSS/JS/tags from a React element tree.\n *\n * Walks the tree statically (same approach as renderToJson) and calls\n * each component's head function from @unlayer/exporters.\n *\n * @param element - Root element (Body, Email, Page, or Document)\n * @param options - Display mode and optional head config\n * @returns Combined CSS, JS, and tags from all head functions\n */\nexport function extractHeadFromTree(\n element: React.ReactElement,\n options: ExtractHeadOptions\n): ExtractHeadResult {\n // The rows and blocks as the body rendered them (the same collected render).\n element = normalizedRoot(element);\n const { displayMode } = options;\n const headConfig: HeadConfig = {\n hasFeature: options.headConfig?.hasFeature ?? (() => false),\n getInitialValues: options.headConfig?.getInitialValues ?? (() => ({})),\n };\n\n const styles: string[] = [];\n const scripts: string[] = [];\n const tags: string[] = [];\n const counters: Record<string, number> = {};\n const deviceStyles: Record<string, string[]> = {};\n\n // Extract body values\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, BODY_DEFAULTS, \"Body\");\n const bodyValues = ensureMeta(mergeValues(BODY_DEFAULTS, mapped), \"body\", 0);\n\n // Body head\n const bodyHead = (heads as Record<string, ComponentHead | undefined>)[\"Body\"];\n callHead(bodyHead, bodyValues, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n // Walk rows\n const children = collectChildren(element.props.children);\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Row\") {\n walkRow(child, bodyValues, displayMode, headConfig, counters, styles, scripts, tags, deviceStyles);\n }\n }\n\n styles.unshift(deviceVisibilityCss(displayMode));\n const overrides = deviceStylesCss(deviceStyles, displayMode);\n if (overrides) styles.push(overrides);\n\n // Deduplicate tags\n const uniqueTags = [...new Set(tags.filter(Boolean))];\n\n return {\n css: styles.filter(Boolean).join(\"\\n\"),\n js: scripts.filter(Boolean).join(\"\\n\"),\n tags: uniqueTags,\n };\n}\n","/**\n * Document layouts — the per-mode HTML shells renderToHtml wraps the body in.\n *\n * Each layout matches the document shell the Unlayer editor produces when\n * exporting HTML, so a design renders identically whether exported from the\n * editor or rendered from Elements. The golden-template snapshots lock the\n * current output.\n *\n * Layouts only place pre-built pieces — escaping and tag construction stay\n * in render-to-html.tsx.\n */\n\nexport interface DocumentLayoutArgs {\n /** ` lang=\"ar\"` attribute chunk for <html>, or \"\" */\n lang?: string;\n /** ` dir=\"rtl\"` attribute chunk for <html>, or \"\" */\n dir: string;\n /** `<title>...</title>` or \"\" */\n titleTag: string;\n /** Newline-joined head tags from component head functions, or \"\" */\n tagLines: string;\n /** `<style type=\"text/css\">...</style>` or \"\" */\n styleTag: string;\n /** `<script type=\"application/javascript\">...</script>` or \"\" */\n scriptTag: string;\n /** Concatenated `<link rel=\"stylesheet\">` tags for web fonts, or \"\" */\n fontLinks: string;\n /** Rendered body markup (includes <body> in email/document mode, not web) */\n body: string;\n}\n\n/**\n * Email shell — XHTML transitional doctype, VML/Office namespaces, and the\n * MSO conditional comments Outlook needs. The body markup already contains\n * the <body> tag in email mode.\n */\nexport function emailLayout(args: DocumentLayoutArgs): string {\n const { dir, titleTag, tagLines, styleTag, scriptTag, fontLinks, body } = args;\n\n const head = [\n titleTag,\n tagLines,\n styleTag,\n scriptTag,\n fontLinks && `<!--[if !mso]><!-->${fontLinks}<!--<![endif]-->`,\n ]\n .filter(Boolean)\n .join(\"\\n \");\n\n return `<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional //EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html${dir}${args.lang || \"\"} xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">\n<head>\n<!--[if gte mso 9]>\n<xml>\n <o:OfficeDocumentSettings>\n <o:AllowPNG/>\n <o:PixelsPerInch>96</o:PixelsPerInch>\n </o:OfficeDocumentSettings>\n</xml>\n<![endif]-->\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta name=\"x-apple-disable-message-reformatting\">\n <!--[if !mso]><!--><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><!--<![endif]-->\n ${head}\n</head>\n${body}\n</html>\n`;\n}\n\n/**\n * Document (print/PDF) shell — XHTML transitional doctype. The body markup\n * already contains the <body> tag in document mode. Fonts are emitted as\n * <link> tags — PDF renderers that can't fetch should pass no fonts.\n */\nexport function documentLayout(args: DocumentLayoutArgs): string {\n const { dir, titleTag, tagLines, styleTag, scriptTag, fontLinks, body } = args;\n\n const head = [titleTag, tagLines, styleTag, scriptTag, fontLinks]\n .filter(Boolean)\n .join(\"\\n \");\n\n return `<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional //EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html${dir}${args.lang || \"\"} xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n ${head}\n</head>\n${body}\n</html>\n`;\n}\n\n/**\n * Web shell — HTML5 doctype with standard viewport/charset meta tags.\n * The body markup has no <body> tag in web mode, so the shell provides it.\n */\nexport function webLayout(args: DocumentLayoutArgs): string {\n const { dir, titleTag, tagLines, styleTag, scriptTag, fontLinks, body } = args;\n\n const head = [titleTag, fontLinks, tagLines, styleTag, scriptTag]\n .filter(Boolean)\n .join(\"\\n \");\n\n return `<!doctype html>\n<html${dir}${args.lang || \"\"}>\n <head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n <meta name=\"description\" content=\"\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n ${head}\n </head>\n <body>\n${body}\n </body>\n</html>\n`;\n}\n","import React from \"react\";\nimport { renderToStaticMarkup } from \"./server-renderer\";\nimport type { UnlayerConfig } from \"@unlayer-internal/shared-elements\";\nimport { DEFAULT_CONFIG } from \"@unlayer-internal/shared-elements\";\nimport { htmlToPlainText } from \"@unlayer-internal/shared-elements\";\nimport type { RenderMode } from \"@unlayer-internal/shared-elements\";\nimport { extractHeadFromTree } from \"./extract-head\";\nimport { htmlRoot } from \"./unwrap-root\";\nimport { normalizedRoot } from \"./normalize\";\nimport { withRenderScope } from \"./render-scope\";\nimport { textDirectionOf } from \"./create-component\";\nimport {\n emailLayout,\n webLayout,\n documentLayout,\n type DocumentLayoutArgs,\n} from \"./document-layouts\";\n\n// Email/Page/Document lock their render mode internally (they render\n// <Body mode=\"...\">), so the top-level element's own props never carry it.\n// Map wrapper displayName → mode so head extraction and the document layout\n// always match what the body actually rendered as.\nconst MODE_BY_WRAPPER: Record<string, RenderMode> = {\n Email: \"email\",\n Page: \"web\",\n Document: \"document\",\n};\n\n/** A template's direction follows its root props; explicit renderer options still win. */\nfunction resolveConfig(element: React.ReactElement, config?: Partial<UnlayerConfig>): UnlayerConfig {\n const props = element.props as { textDirection?: string; values?: { textDirection?: string } };\n const textDirection = textDirectionOf(props.textDirection ?? props.values?.textDirection);\n return { ...DEFAULT_CONFIG, ...(textDirection !== undefined ? { textDirection } : {}), ...config };\n}\n\n/**\n * Resolve the display mode for a tree: wrapper component type first\n * (Email/Page/Document), then an explicit `mode` prop (Body), then config.\n */\nfunction resolveDisplayMode(\n element: React.ReactElement,\n mergedConfig: Partial<UnlayerConfig>\n): RenderMode {\n const displayName = (element.type as { displayName?: string })?.displayName;\n const wrapperMode = displayName ? MODE_BY_WRAPPER[displayName] : undefined;\n return (\n wrapperMode ??\n (element.props as { mode?: RenderMode }).mode ??\n mergedConfig.mode ??\n \"web\"\n );\n}\n\n/**\n * Render the element tree to body markup (no document shell).\n *\n * - Passes merged config via the `config` prop (no React context — works in\n * Server Components)\n * - Uses `renderToStaticMarkup` — no React hydration markers\n */\nfunction renderBody(\n element: React.ReactElement,\n config?: Partial<UnlayerConfig>,\n name = \"renderToHtml\"\n): string {\n const mergedConfig = resolveConfig(element, config);\n\n try {\n // Pass config via prop (not context) so this works in React Server Components.\n // Body reads `config` prop and threads it as `_config` to children via cloneElement.\n const enriched = React.cloneElement(element, { config: mergedConfig });\n return renderToStaticMarkup(enriched);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `[Unlayer] ${name} failed: ${message}\\n` +\n `Tip: Ensure your tree uses Body > Row > Column > Item structure.`\n );\n }\n}\n\n/**\n * Strip the outer `<div>` wrapper that Body's renderer adds around the\n * exporter output, leaving the raw body markup for document assembly.\n */\nfunction stripOuterDiv(html: string): string {\n const match = html.match(/^\\s*<div[^>]*>([\\s\\S]*)<\\/div>\\s*$/);\n return match ? match[1] : html;\n}\n\n/** Minimal escaping for text interpolated into HTML (title, font URLs). */\nfunction escapeForHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/**\n * Options for renderToHtml — config overrides plus document-level extras.\n */\nexport interface RenderToHtmlOptions extends Partial<UnlayerConfig> {\n /** Document language; overrides the root's `lang` prop. */\n lang?: string;\n /** Document `<title>` */\n title?: string;\n /**\n * Web-font stylesheets to load via `<link rel=\"stylesheet\">` tags.\n * Elements has no font registry, so pass the URLs for any non-system\n * fonts your design uses (e.g. Google Fonts CSS URLs).\n */\n fonts?: Array<{ url: string }>;\n}\n\n/**\n * Renders an Unlayer element tree to a complete HTML document — from\n * `<!DOCTYPE ...>` to `</html>` — matching the editor's exportHtml layouts.\n *\n * Per-mode document shells (mirroring the editor's layout templates):\n * - `email`: XHTML transitional doctype, VML/Office namespaces, and the MSO\n * conditional comments Outlook needs\n * - `web`: HTML5 doctype with standard viewport/charset meta tags\n * - `document`: XHTML transitional doctype for print/PDF pipelines\n *\n * Use {@link renderToHtmlParts} instead when your app owns the document\n * shell and only needs the head/body chunks.\n *\n * @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`), or a\n * template component that returns one (`<Welcome name=\"Ada\" />`, also `memo`/`forwardRef`).\n * A template is called in a render of its own to reach its root (its hooks work); a class\n * component, or one that doesn't return an element, renders without its root's settings,\n * with a warning.\n * @param options - Config overrides (mode, cdnBaseUrl, etc.) plus `title` and `fonts`\n * @returns Complete HTML document string\n * @throws {Error} If rendering fails, with a helpful message\n *\n * @example\n * ```tsx\n * import { renderToHtml, Email, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const html = renderToHtml(\n * <Email><Row><Column><Paragraph>Hello</Paragraph></Column></Row></Email>,\n * { title: \"Welcome\" }\n * );\n * // \"<!DOCTYPE HTML PUBLIC ...><html ...>...</html>\"\n * ```\n */\nexport function renderToHtml(\n element: React.ReactElement,\n options?: RenderToHtmlOptions\n): string {\n return withRenderScope(() => htmlDocument(element, options));\n}\n\n/** CSS for a `<style>` element: a `</style` in it would end the element (CSS escapes the slash). */\nfunction styleText(css: string): string {\n return css.replace(/<\\/(style)/gi, \"<\\\\/$1\");\n}\n\nfunction htmlDocument(element: React.ReactElement, options?: RenderToHtmlOptions): string {\n const { title, lang: optionLang, fonts: optionFonts = [], ...config } = options ?? {};\n // A template component (<Welcome/>) renders as its root, whose settings follow.\n element = htmlRoot(element, \"renderToHtml\");\n // The root's own `fonts` prop, then the option's, each URL once.\n const rootFonts = (element.props as { fonts?: Array<{ url: string }> } | null)?.fonts ?? [];\n const fonts = [...rootFonts, ...optionFonts].filter((font, i, all) => font?.url && all.findIndex((f) => f?.url === font.url) === i);\n\n const lang = optionLang ?? (element.props as { lang?: string }).lang;\n const mergedConfig = resolveConfig(element, config);\n const displayMode = resolveDisplayMode(element, mergedConfig);\n\n // Only Unlayer wrappers (Body/Email/Page/Document) get their renderer's\n // host <div> stripped — for any other root (a bare item, a custom\n // component) the outer div is the element's own markup and must stay.\n const wrapperName = (element.type as { displayName?: string })?.displayName;\n const isUnlayerWrapper =\n wrapperName === \"Body\" || (wrapperName ? wrapperName in MODE_BY_WRAPPER : false);\n const rawBody = renderBody(element, config);\n const body = isUnlayerWrapper ? stripOuterDiv(rawBody) : rawBody;\n const { css, js, tags } = extractHeadFromTree(element, {\n displayMode,\n headConfig: mergedConfig.headConfig,\n });\n\n const layoutArgs: DocumentLayoutArgs = {\n lang: lang ? ` lang=\"${escapeForHtml(String(lang))}\"` : \"\",\n dir: mergedConfig.textDirection\n ? ` dir=\"${escapeForHtml(String(mergedConfig.textDirection))}\"`\n : \"\",\n titleTag: title ? `<title>${escapeForHtml(title.trim())}</title>` : \"\",\n styleTag: css ? `<style type=\"text/css\">\\n${styleText(css)}\\n</style>` : \"\",\n scriptTag: js\n ? `<script type=\"application/javascript\">\\n${js}\\n</script>`\n : \"\",\n tagLines: tags.join(\"\\n\"),\n fontLinks: fonts\n .filter((font) => font?.url)\n .map(\n (font) =>\n `<link href=\"${escapeForHtml(String(font.url))}\" rel=\"stylesheet\" type=\"text/css\">`\n )\n .join(\"\"),\n body,\n };\n\n if (displayMode === \"email\") return emailLayout(layoutArgs);\n if (displayMode === \"document\") return documentLayout(layoutArgs);\n return webLayout(layoutArgs);\n}\n\n/**\n * Renders an Unlayer element tree to a plain text string.\n *\n * Renders the body markup then converts to plain text using\n * `htmlToPlainText`. Useful for generating the text/plain MIME part\n * of multipart emails (critical for deliverability).\n *\n * @param element - A React element tree (e.g. `<Body><Row>...</Row></Body>`)\n * @param config - Optional config overrides (mode, cdnBaseUrl, etc.)\n * @returns Plain text representation of the email\n *\n * @example\n * ```tsx\n * import { renderToPlainText, Body, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const text = renderToPlainText(\n * <Body mode=\"email\"><Row><Column><Paragraph>Hello World</Paragraph></Column></Row></Body>\n * );\n * // \"Hello World\"\n * ```\n */\nexport function renderToPlainText(\n element: React.ReactElement,\n config?: Partial<UnlayerConfig>\n): string {\n // A template component renders as its root, as in renderToHtml (context providers around it included).\n const html = withRenderScope(() => {\n const root = htmlRoot(element, \"renderToPlainText\");\n // Collected first, as renderToHtml's head is: it fails where that does (a component that isn't one), not with\n // empty text (Body leaves out what fails, for a live preview).\n normalizedRoot(root);\n return renderBody(root, config, \"renderToPlainText\");\n });\n return htmlToPlainText(html);\n}\n\n/**\n * Result of renderToHtmlParts — head and body as separate strings.\n */\nexport interface HtmlParts {\n /**\n * Pre-assembled `<head>` content: the css in a `<style>` tag, the js in a\n * `<script>` tag, and the tags — joined and ready to drop into a document.\n * Equivalent to composing the granular fields below yourself.\n */\n head: string;\n /**\n * The rendered body markup, wrapped in the renderer's host `<div>`. In\n * email/document mode it contains the `<body>` tag itself; web mode has\n * none. No doctype/html/head shell — embeddable as-is, or extract the\n * `<body>` tag when composing a full document.\n */\n body: string;\n /** Raw component CSS (no `<style>` wrapper) — e.g. for inlining pipelines */\n css: string;\n /** Raw component JS (no `<script>` wrapper); empty for most email designs */\n js: string;\n /**\n * Individual head tags (`<meta>`, `<link>`, ...) contributed by components.\n * Not part of the editor's documented chunk parameters, but exposed here\n * because `head` can contain them — without this field, reassembling the\n * head from `css` + `js` would silently drop them. Usually empty.\n *\n * There is deliberately no `fonts` chunk: Elements has no font registry to\n * resolve font URLs from — pass stylesheet URLs via renderToHtml's `fonts`\n * option instead.\n */\n tags: string[];\n}\n\n/**\n * Renders an Unlayer element tree to separate head and body HTML strings.\n *\n * Use this when your app owns the document shell — an existing page\n * template, an ESP template with its own meta tags, an iframe srcdoc —\n * and you want to place the `<style>` block and body markup yourself.\n * For a complete ready-to-send document in one call, use\n * {@link renderToHtml}.\n *\n * - `head` contains `<style>` tags with CSS generated by each component's\n * head function (button hover colors, body fonts, link styles, etc.)\n * - `body` is the rendered body markup without any document shell\n *\n * @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`)\n * @param config - Optional config overrides (mode, cdnBaseUrl, etc.)\n * @returns `{ head, body }` — drop these into your HTML document template\n *\n * @example\n * ```tsx\n * import { renderToHtmlParts, Email, Row, Column, Button } from \"@unlayer/react-elements\";\n *\n * const { head, body } = renderToHtmlParts(\n * <Email>\n * <Row><Column><Button>Click</Button></Column></Row>\n * </Email>\n * );\n *\n * const html = `<!DOCTYPE html>\n * <html><head>${head}</head>${body}</html>`;\n * ```\n */\nexport function renderToHtmlParts(\n element: React.ReactElement,\n config?: Partial<UnlayerConfig>\n): HtmlParts {\n return withRenderScope(() => htmlParts(element, config));\n}\n\nfunction htmlParts(element: React.ReactElement, config?: Partial<UnlayerConfig>): HtmlParts {\n element = htmlRoot(element, \"renderToHtmlParts\");\n // Render body markup\n const body = renderBody(element, config, \"renderToHtmlParts\");\n\n // Resolve display mode from the wrapper component, element props, or config\n const mergedConfig = resolveConfig(element, config);\n const displayMode = resolveDisplayMode(element, mergedConfig);\n\n // Extract head CSS/JS/tags by walking the element tree\n const { css, js, tags } = extractHeadFromTree(element, {\n displayMode,\n headConfig: mergedConfig.headConfig,\n });\n\n // Build head string\n const headParts: string[] = [];\n\n if (css) {\n headParts.push(`<style>${styleText(css)}</style>`);\n }\n\n if (js) {\n headParts.push(`<script>${js}</script>`);\n }\n\n if (tags.length > 0) {\n headParts.push(...tags);\n }\n\n return {\n head: headParts.join(\"\\n\"),\n body,\n css,\n js,\n tags,\n };\n}\n","/**\n * registerTool — render the editor's custom tools from code.\n *\n * Accepts the same tool definition object embedders already write for\n * `unlayer.registerTool` (see docs.unlayer.com › Custom Tools) and returns a\n * React component. One definition powers both runtimes:\n *\n * - The Builder uses `label`/`icon`/`options`/`renderer.Viewer`/`validator`\n * for its panel, canvas, and audit — Elements ignores those.\n * - Elements calls `renderer.exporters[mode](values)` to produce HTML and\n * collects `renderer.head` css/js like any built-in component, so code\n * output matches editor exports by construction — it is the same function.\n * - `renderToJson` emits `{ type: \"custom\", slug: <name>, values }`, the\n * shape the editor stores, so designs round-trip into the Builder where\n * the same tool is registered.\n *\n * Sanitization: like editor exports, the tool's HTML output is passed\n * through `toSafeHtml` when one is configured. The default config has NO\n * sanitizer — with untrusted values, configure `toSafeHtml` (same caveat\n * as the `<Html>` component).\n */\n\nimport React from \"react\";\nimport {\n createItemComponent,\n type BaseItemComponentProps,\n} from \"./create-component\";\nimport type { DeviceProps, RenderMode } from \"@unlayer-internal/shared-elements\";\nimport { normalizeLinkValue } from \"@unlayer-internal/shared-elements\";\n\n/** Exporter: `(values) => html`. Extra args mirror built-in exporters and can be ignored. */\nexport type ToolExporter = (values: any, ...args: any[]) => string;\n\n/** One property in an options group — Elements reads only the default. */\ninterface ToolOptionConfig {\n defaultValue?: unknown;\n /** Disabled options contribute no default */\n enabled?: boolean;\n [editorOnly: string]: unknown;\n}\n\n/** A property group: `options.<group>.options.<property>` */\ninterface ToolOptionGroup {\n options?: Record<string, ToolOptionConfig | undefined>;\n [editorOnly: string]: unknown;\n}\n\n/**\n * The subset of the `unlayer.registerTool` config Elements reads. Extra\n * editor-only fields (label, icon, Viewer, validator, transformer, ...)\n * are accepted and ignored, so the same object can be passed to both APIs.\n */\nexport interface ElementsToolConfig {\n /** Unique tool name — becomes the design JSON `slug` */\n name: string;\n /** Initial values for the tool's properties (win over option defaults) */\n values?: Record<string, any>;\n /**\n * Property groups. Real-world tools usually define their defaults here,\n * as each property's `defaultValue` — those seed the initial values,\n * with tool-level `values` taking precedence (the editor's order).\n */\n options?: Record<string, ToolOptionGroup | undefined>;\n renderer: {\n /** Per-mode HTML exporters. `document` falls back to `web`. */\n exporters: Partial<Record<RenderMode, ToolExporter>>;\n /** Optional head contributions collected into the document `<head>` */\n head?: {\n css?: (values: any, ...args: any[]) => string | undefined;\n js?: (values: any, ...args: any[]) => string | undefined;\n tags?: (values: any, ...args: any[]) => string[] | undefined;\n };\n /** Editor-only canvas renderer — ignored by Elements */\n Viewer?: unknown;\n };\n /** React DevTools name (defaults to the tool name) */\n displayName?: string;\n /** Editor-only fields (label, icon, options, validator, ...) — ignored */\n [editorOnly: string]: unknown;\n}\n\n/**\n * Props: the tool's values as flat props, plus a `values` escape hatch. Every prop is the tool's own, as in 0.1.22:\n * a `mobile` or `hideOnMobile` value isn't a device setting (`values._override` sets those).\n */\nexport type ElementsToolProps = Omit<BaseItemComponentProps, keyof DeviceProps> &\n Record<string, any> & { values?: Record<string, any> };\n\n/**\n * Fold each option group's property `defaultValue`s into initial values,\n * skipping disabled properties — the same seeding the editor performs, so\n * tools that keep `values: {}` and define defaults on their widgets (the\n * common real-world shape) render with those defaults.\n */\nfunction initialValuesFromOptions(\n options: ElementsToolConfig[\"options\"]\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const group of Object.values(options ?? {})) {\n for (const [property, option] of Object.entries(group?.options ?? {})) {\n if (!option || option.enabled === false) continue;\n if (typeof option.defaultValue !== \"undefined\") {\n result[property] = option.defaultValue;\n }\n }\n }\n return result;\n}\n\n/**\n * Wrap an exporter so its output is sanitized when the Unlayer config\n * provides a `toSafeHtml` — mirroring how editor exports treat custom tool\n * HTML. The exporter meta (last argument) carries the exporterConfig.\n */\nfunction withSanitizer(exporter: ToolExporter): ToolExporter {\n return (values: any, ...args: any[]) => {\n // Coerce before sanitizing — exporters may return non-strings, and a\n // configured sanitizer must always receive a string.\n const html = String(exporter(values, ...args) ?? \"\");\n const meta = args[args.length - 1];\n const toSafeHtml = meta?.exporterConfig?.toSafeHtml;\n return typeof toSafeHtml === \"function\" ? toSafeHtml(html) : html;\n };\n}\n\n/**\n * Exporters receive link-widget values in render shape (`{ url, target }`),\n * exactly as they do in the editor — tools written for the editor read\n * `values.<option>.url`. Options with `widget: \"link\"` are collected at\n * registration and normalized from the storage shape before each render.\n */\nfunction withLinkNormalization(\n exporter: ToolExporter,\n linkKeys: string[]\n): ToolExporter {\n if (linkKeys.length === 0) return exporter;\n return (values: any, ...args: any[]) => {\n const out = { ...values };\n for (const key of linkKeys) {\n const normalized = normalizeLinkValue(out[key]);\n if (normalized !== undefined) out[key] = normalized;\n }\n return exporter(out, ...args);\n };\n}\n\n/** Option keys declared with the `link` widget across all groups. */\nfunction linkWidgetKeys(options: ElementsToolConfig[\"options\"]): string[] {\n const keys: string[] = [];\n for (const group of Object.values(options ?? {})) {\n for (const [key, option] of Object.entries(group?.options ?? {})) {\n if (option && option.widget === \"link\") keys.push(key);\n }\n }\n return keys;\n}\n\n/**\n * Create a React component from a custom tool definition — a custom tool\n * is the custom component you create: the same term (and the same config)\n * as the editor's `unlayer.registerTool`, so one definition serves both.\n *\n * @example\n * ```tsx\n * const Countdown = registerTool({\n * name: \"countdown\",\n * values: { endTime: \"\", digitColor: \"#404040\" },\n * renderer: {\n * exporters: {\n * web: (values) => `<div style=\"color:${values.digitColor}\">…</div>`,\n * email: (values) => `<table role=\"presentation\">…</table>`,\n * },\n * },\n * });\n *\n * <Email><Row><Column>\n * <Countdown endTime=\"2026-08-01T00:00:00Z\" digitColor=\"#e11d48\" />\n * </Column></Row></Email>\n * ```\n */\nexport function registerTool(\n tool: ElementsToolConfig\n): React.FC<ElementsToolProps> {\n if (!tool?.name || typeof tool.name !== \"string\") {\n throw new Error(\"[Unlayer] registerTool: `name` is required\");\n }\n const exporters = tool.renderer?.exporters;\n if (!exporters || (!exporters.web && !exporters.email)) {\n throw new Error(\n `[Unlayer] registerTool(\"${tool.name}\"): ` +\n \"`renderer.exporters` needs at least a `web` or `email` exporter\"\n );\n }\n\n const linkKeys = linkWidgetKeys(tool.options);\n const sanitized: Partial<Record<RenderMode, ToolExporter>> = {};\n for (const mode of [\"web\", \"email\", \"document\"] as RenderMode[]) {\n const exporter = exporters[mode];\n if (exporter) {\n sanitized[mode] = withSanitizer(withLinkNormalization(exporter, linkKeys));\n }\n }\n // Match the editor's fallback: modes without an exporter render via web,\n // and email-only tools use their email exporter everywhere.\n if (!sanitized.web && sanitized.email) sanitized.web = sanitized.email;\n\n return createItemComponent<Record<string, any>, Record<string, any>>({\n name: tool.name,\n displayName: tool.displayName ?? tool.name,\n // Option-group widget defaults seed the values; tool-level `values`\n // win — the editor's precedence.\n defaultValues: {\n ...initialValuesFromOptions(tool.options),\n ...(tool.values ?? {}),\n },\n // Flat props are the tool's values; `values` is the escape hatch.\n propMapper: ({ children: _children, values, ...rest }) => ({\n ...(values ?? {}),\n ...rest,\n }),\n exporters: sanitized,\n contentType: \"custom\",\n slug: tool.name,\n metaName: `custom_${tool.name}`,\n head: tool.renderer.head,\n });\n}\n\n/** Alias of {@link registerTool}. */\nexport const registerElementsTool = registerTool;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/collect.ts","../src/utils/server-renderer.ts","../src/utils/unwrap-root.ts","../src/utils/record.tsx","../src/utils/image-sizing.ts","../../shared/src/config.ts","../../shared/src/layouts.ts","../../shared/src/utils/lexical-helpers.ts","../../shared/src/utils/merge-values.ts","../../shared/src/utils/css-values.ts","../../shared/src/utils/semantic-props.ts","../../shared/src/utils/html-to-text.ts","../src/utils/create-component.tsx","../src/components/Button.tsx","../src/components/Divider.tsx","../src/components/Heading.tsx","../src/components/Html.tsx","../src/components/Image.tsx","../src/components/Menu.tsx","../src/components/Paragraph.tsx","../src/components/PageBreak.tsx","../src/components/Social.tsx","../src/components/Table.tsx","../src/components/Video.tsx","../src/utils/container-defaults.ts","../src/utils/render-scope.ts","../src/components/Row.tsx","../src/components/Column.tsx","../src/utils/normalize.tsx","../src/components/Body.tsx","../src/components/Email.tsx","../src/components/Page.tsx","../src/components/Document.tsx","../src/context/UnlayerProvider.tsx","../src/utils/device-overrides.ts","../src/utils/render-to-json.ts","../src/utils/extract-head.ts","../src/utils/document-layouts.ts","../src/utils/render-to-html.tsx","../src/utils/register-tool.tsx"],"names":["React","SHARED","element","current","at","collected","parts","childrenHtml","text","componentName","named","jsxs","size","DEFAULT_VALUES","css","jsx","nonce","guarded","markup","Fragment","_schemaVersion","name","collectChildren"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The render that collects a template's Rows, Columns and blocks (see\n * normalize.tsx). While one runs, those components record their props and\n * render markers instead of HTML; React renders everything else (the user's\n * components, Fragments, conditions, Context). A render of Elements' own\n * inside it (a row's HTML, a nested renderToHtml) is under `null`: nothing is\n * collected there. A stack, not React context: Server Components have no\n * context, and a collecting render can start inside another.\n */\nimport React from \"react\";\n\nexport type Recorded =\n | { kind: \"row\" | \"column\"; props: Record<string, any> }\n | { kind: \"block\"; type: React.ComponentType<any>; props: Record<string, any> }\n | { kind: \"boundary\"; element: React.ReactElement };\n\nexport interface Collection {\n /** In each marker, so markup a template writes can't pass for one. */\n nonce: string;\n recorded: Recorded[];\n /** Markup is guarded too, as components are (a render once more after one threw: see normalize.tsx's `collected`). */\n markup?: boolean;\n /**\n * The React Elements' components call isn't the renderer's (a bundler gave them other copies, as Next.js's\n * server layers can): `useId()` can't tell this render from one inside it, so Rows, Columns and blocks record\n * while it's collecting.\n */\n blind?: boolean;\n}\n\n// Shared by every copy of Elements a process loads (a project's ESM and CommonJS builds, a tool's own): a render one\n// copy starts collects the Rows, Columns and blocks another's template uses.\nconst SHARED = Symbol.for(\"@unlayer/react-elements/collecting\");\nconst frames: Array<Collection | null> = ((globalThis as Record<symbol, unknown>)[SHARED] ??= []) as Array<Collection | null>;\n\n/** The collecting render under way, if any (and not a render of Elements' own inside it). */\nexport function collecting(): Collection | 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: Collection | null, run: () => T): T {\n frames.push(frame);\n try {\n return run();\n } finally {\n frames.pop();\n }\n}\n\nexport const MARK = \"unlayer-mark\";\n\n/**\n * On the Rows, Columns and blocks that record themselves while a template is collected (0.2 and later). One of an\n * older copy (0.1.x, from a package still on it) doesn't, and guard records it in its place (see record.tsx).\n */\nexport const RECORDS = Symbol.for(\"@unlayer/react-elements/records\");\n\n/**\n * The collecting render's `identifierPrefix`: React puts it at the start of every `useId()` there (after its\n * opening `:` or `«`), so a Row, Column or block can tell that render from another one started inside it (a\n * component rendering a block to a string with react-dom), where it renders what it renders instead of a\n * marker. React's own ids never hold a \"-\", so none of them starts with it.\n */\nexport const COLLECTING_ID = \"unlayer-collect-\";\n\n/**\n * A marker for what's recorded at `at`: its start (\"o\"), end (\"c\"), a component that failed (\"f\"), or a block.\n * React writes its attributes in this order, which the patterns that find markers in HTML spell out exactly\n * (normalize.tsx): nothing looser, as they run on HTML that holds the template's own.\n */\nexport function marker(collection: Collection, at: number, edge?: \"o\" | \"c\" | \"f\"): React.ReactElement {\n return React.createElement(MARK, { key: `${at}${edge ?? \"\"}`, \"data-n\": collection.nonce, \"data-i\": at, ...(edge ? { \"data-e\": edge } : {}) });\n}\n","/**\n * The server renderer Elements renders with: react-dom/server, as in 0.1.22, loaded the same way and doing nothing\n * when it 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(() => renderToJson(<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(\"@unlayer/react-elements/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 an Elements render collects),\n * it takes another one, which mustn't be rendering either (a third level: it can't). Otherwise (no render under way,\n * the app's streaming render or a client one, or one of Elements' own renders, whose components call no hooks after)\n * it keeps the one it's in.\n */\nexport function withBuild<T>(render: () => T, own = false): T {\n const outer = own ? null : dispatcher();\n let build = current();\n // Elements' own component (Body, rendered by the app's react-dom/server), which calls no hooks after: the module\n // it's in, as in 0.1.22 (a browser bundle has no other).\n const theirs = !own && (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, as 0.1.22 rendered there. The component calling it then can't call a hook after the call\n // (React throws, as it did with 0.1.22's renderToHtml).\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 renderToStaticMarkup: Build[\"renderToStaticMarkup\"] = (element, options) => current().renderToStaticMarkup(element, options);\nexport const renderToString: Build[\"renderToString\"] = (element, options) => current().renderToString(element, options);\n","/**\n * Template components (`<Welcome />`, `memo`, `forwardRef`) unwrapped down to\n * their root element. `renderToJson` walks the element tree and `renderToHtml`\n * reads the root's settings (fonts, language, direction, phone styles) from it,\n * so a wrapper is called first to reach <Email>/<Page>/<Document>/<Body>.\n */\n\nimport React from \"react\";\nimport { renderToStaticMarkup } from \"./server-renderer\";\nimport { UNLAYER_RENDER_KEY } from \"./create-component\";\nimport { RECORDS } from \"./collect\";\n\n/** The root components a design starts from. */\nexport const ROOT_NAMES = new Set([\"Body\", \"Email\", \"Page\", \"Document\"]);\nconst CONTAINER_NAMES = new Set([...ROOT_NAMES, \"Row\", \"Column\"]);\nexport const MEMO = Symbol.for(\"react.memo\");\nexport const FORWARD_REF = Symbol.for(\"react.forward_ref\");\n/** A context's provider: `<Ctx.Provider>` in React 18, `<Ctx>` (and `<Ctx.Provider>`, the same) in React 19. */\nconst PROVIDER = Symbol.for(\"react.provider\");\nconst CONTEXT = Symbol.for(\"react.context\");\n\n/**\n * The Elements component an element is, by the `displayName` Elements gives\n * each of its own: a user function that happens to be named `Email` or `Row`\n * (a template, a wrapper) isn't one, and is called like any component.\n */\nexport function getDisplayName(element: React.ReactElement): string | undefined {\n return (element.type as any)?.displayName;\n}\n\n/** A component's name, for messages. */\nexport function componentName(element: React.ReactElement): string | undefined {\n const type = element.type as any;\n return type?.displayName || type?.name;\n}\n\n/** Whether a component type is an Elements component (a root, a container or a content block). */\nexport function isElementsType(type: any): boolean {\n return !!type?.[UNLAYER_RENDER_KEY] || CONTAINER_NAMES.has(type?.displayName);\n}\n\n/** Whether the element is an Elements component (a root, a container or a content block). */\nfunction isElementsComponent(element: React.ReactElement): boolean {\n return isElementsType(element.type);\n}\n\n/** Thrown for a template that is async or suspends: renderToHtml renders synchronously. */\nconst ASYNC_TEMPLATE =\n \"async and suspending templates aren't supported: load the data first and pass it as props\";\n\nexport const isThenable = (value: unknown): boolean => typeof (value as { then?: unknown } | null)?.then === \"function\";\n\n/** A promise a component gave back, which Elements doesn't wait for: its rejection mustn't end the process. */\nconst settle = (value: unknown): void => {\n if (isThenable(value)) (value as PromiseLike<unknown>).then(undefined, () => {});\n};\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/**\n * Call a template component in a throwaway render of its own. Its hooks run\n * there, never on the component that is rendering when renderToHtml is called\n * (a live preview in `useMemo`), whose hooks they would otherwise corrupt.\n * Components called in renders of their own each need their own `prefix`, or\n * their `useId()` values repeat in the document.\n */\nexport function callIsolated(call: () => unknown, prefix?: string, providers: React.ReactElement[] = []): unknown {\n let result: unknown;\n let error: unknown;\n let ran = false;\n let threw = false;\n let calling = false;\n const Probe = () => {\n // React's development build calls a component again from inside its render, with hooks off, to say where a warning\n // came from (an undefined component, a list without keys): that call fails where the render didn't. A render React\n // starts again (the template set its state while it rendered) counts, as its last one does in React.\n if (calling) return null;\n ran = calling = true;\n threw = false;\n try {\n result = call();\n } catch (cause) {\n threw = true;\n error = cause;\n } finally {\n calling = false;\n }\n return null;\n };\n // Inside the context providers around it, so a template that reads their context gets their values.\n const probe = providers.reduceRight<React.ReactElement>((inside, provider) => React.cloneElement(provider, undefined, inside), React.createElement(Probe));\n renderToStaticMarkup(probe, prefix ? { identifierPrefix: prefix } : undefined);\n settle(error);\n settle(result);\n if (threw) throw isThenable(error) ? new Error(ASYNC_TEMPLATE) : error;\n if (!ran) throw new Error(\"the template wasn't rendered\");\n if (isThenable(result)) throw new Error(ASYNC_TEMPLATE);\n return result;\n}\n\n/**\n * Call wrapper components (plain functions, `memo`, `forwardRef`, nested in any\n * order) until a root element comes out, each in a render of its own (so its\n * hooks work). Returns the element it stops at, which isn't a root when a\n * wrapper can't be called (a class) or doesn't return an element (null, an\n * array). Throws what a wrapper throws, and for an async template.\n */\nexport function unwrapRoot(element: React.ReactElement, why: { unread?: string } = {}): React.ReactElement {\n let current = element;\n // Context providers around the root (`<Theme.Provider value=\"dark\"><Email>…`): the root's content goes in them.\n const providers: React.ReactElement[] = [];\n for (let depth = 0; ; depth++) {\n if (ROOT_NAMES.has(getDisplayName(current) ?? \"\")) break;\n // A Row or block: what it renders is Elements' own, never a root.\n if (elementsOwn(current)) break;\n if (depth === 20) {\n why.unread = \"it wraps more than 20 components\";\n break;\n }\n const type = current.type as any;\n const props = current.props as Record<string, unknown>;\n if (type?.$$typeof === MEMO) {\n current = React.createElement(type.type, props);\n continue;\n }\n if ((type?.$$typeof === PROVIDER || type?.$$typeof === CONTEXT) && \"value\" in props) {\n const inside = React.Children.toArray(props.children as React.ReactNode);\n if (inside.length !== 1 || !React.isValidElement(inside[0])) break;\n providers.push(current);\n current = inside[0];\n continue;\n }\n // A Fragment, StrictMode or Profiler around the template (`<><Welcome /></>`): what's in it, when that's one\n // element. They add nothing to a server render.\n if (type === React.Fragment || type === React.StrictMode || type === React.Profiler) {\n const inside = React.Children.toArray(props.children as React.ReactNode);\n if (inside.length !== 1 || !React.isValidElement(inside[0])) break;\n current = inside[0];\n continue;\n }\n let produced: unknown;\n // Each wrapper renders on its own: one inside another gets its own `useId()` prefix (the first keeps React's).\n const prefix = depth ? `w${depth}-` : undefined;\n if (type?.$$typeof === FORWARD_REF) produced = callIsolated(() => type.render({ ...props }, null), prefix, providers);\n else if (typeof type === \"function\" && !type.prototype?.isReactComponent) produced = callIsolated(() => type({ ...props }), prefix, providers);\n else {\n if (type?.prototype?.isReactComponent) why.unread = `<${componentName(current)}> is a class component, which isn't called to find it`;\n break;\n }\n if (!React.isValidElement(produced)) {\n if (holdsRoot(produced as React.ReactNode)) why.unread = \"it doesn't return a root element\";\n break;\n }\n current = produced;\n }\n if (!providers.length || !ROOT_NAMES.has(getDisplayName(current) ?? \"\")) return current;\n const children = providers.reduceRight<React.ReactNode>((inside, provider) => React.cloneElement(provider, undefined, inside), (current.props as { children?: React.ReactNode }).children);\n return React.cloneElement(current, undefined, children);\n}\n\n/** Elements' own Row, Column or block (not a component of the user's own named like one, which is called). */\nconst elementsOwn = (element: React.ReactElement): boolean => {\n const type = element.type as any;\n return !!(type?.[UNLAYER_RENDER_KEY] || type?.[RECORDS]);\n};\n\n/** Whether a root element is somewhere in `node` (markup, Fragments, arrays, providers), whose settings would go unread. */\nfunction holdsRoot(node: React.ReactNode): boolean {\n if (Array.isArray(node)) return node.some(holdsRoot);\n if (!React.isValidElement(node)) return false;\n return ROOT_NAMES.has(getDisplayName(node) ?? \"\") || (!elementsOwn(node) && holdsRoot((node.props as { children?: React.ReactNode }).children));\n}\n\n/** The advice both render functions give when a wrapper can't be unwrapped. */\nexport const UNWRAP_ADVICE = \"Pass the root element (<Email>…</Email>), or a function component that returns one.\";\n\n/**\n * For renderToHtml: the root a template component unwraps to. An element that\n * is already an Elements component (or plain HTML) is returned as it is. When\n * a wrapper can't be unwrapped it's rendered through React as before, with a\n * warning: its root's settings aren't read.\n */\nexport function htmlRoot(element: React.ReactElement, api: string): React.ReactElement {\n if (typeof element.type === \"string\" || isElementsComponent(element)) return element;\n let reason: string;\n try {\n const why: { unread?: string } = {};\n const root = unwrapRoot(element, why);\n if (ROOT_NAMES.has(getDisplayName(root) ?? \"\")) return root;\n // A template of Rows, or nothing: there's no root whose settings go unread.\n if (!why.unread && !holdsRoot(root)) return element;\n reason = why.unread ?? \"its root is inside other markup\";\n } catch (cause) {\n // An async template can't be rendered through React either: say why.\n if (cause instanceof Error && cause.message === ASYNC_TEMPLATE) throw new Error(`[Unlayer] ${api}: ${ASYNC_TEMPLATE}.`);\n reason = cause instanceof Error ? cause.message : String(cause);\n }\n console.warn(`[Unlayer] ${api}: couldn't unwrap <${componentName(element) || \"wrapper\"}> (${reason}): its root's fonts, lang, dir and phone styles are ignored. ${UNWRAP_ADVICE}`);\n return element;\n}\n","/**\n * What Rows, Columns and blocks render while a template is collected (see\n * collect.ts): they record their props, and render markers around what React\n * renders inside them.\n */\nimport React, { Suspense } from \"react\";\nimport { collecting, COLLECTING_ID, marker, RECORDS, within, type Collection } from \"./collect\";\nimport { isAsyncComponent, isElementsType } from \"./unwrap-root\";\n\n/**\n * Children with each component Elements doesn't know wrapped: markers that\n * say where its output starts and ends, inside a Suspense whose fallback (a\n * marker) stands for it when it throws, suspends or is async, so it's left\n * out and the rest renders. Fragments are kept, their children wrapped too.\n */\nexport function guard(children: React.ReactNode, collection: Collection, inContainer = false): React.ReactNode {\n return React.Children.toArray(children).map((child) => {\n const placed = guarded(child, collection, inContainer);\n // The template's own element, placed in this list: a copy, with the key the list gave it. React 19 warns about an\n // element of a list without keys (`items.map(…)`) wherever it's rendered, on every render, and 0.1.22 never\n // rendered the template's lists: a static render has nothing to match keys for.\n return placed === child && React.isValidElement(child) ? React.cloneElement(child) : placed;\n });\n}\n\n/** One child of `guard`'s list. */\nfunction guarded(child: React.ReactNode, collection: Collection, inContainer: boolean): React.ReactNode {\n if (!React.isValidElement(child)) return child;\n if (isElementsType(child.type)) {\n if ((child.type as unknown as Record<symbol, unknown>)[RECORDS]) return child;\n // A component of the user's own named Row or Column (its displayName): rendered as React renders it.\n if (!olderContainer(child.type)) return bounded(child, collection);\n return recordedForOlder(child, collection, inContainer);\n }\n // No component at all (`undefined` from a broken or circular import): React says so and the render fails, as an\n // email missing a block shouldn't send. Only what can render gets a boundary that leaves it out.\n if (!child.type || (typeof child.type === \"object\" && !(\"$$typeof\" in child.type))) return child;\n if (typeof child.type === \"string\") {\n // Markup with a component of the user's own in it (`<div><Promo /></div>`): that component gets its own too.\n const inside = (child.props as { children?: React.ReactNode }).children;\n const element = inside !== undefined && hasComponent(inside) ? React.cloneElement(child, undefined, guard(inside, collection, inContainer)) : child;\n // Markup React rejects (`<hr style=\"…\">` as a string) throws out of the render: guarded too when it did.\n return collection.markup ? bounded(element, collection) : element;\n }\n if (child.type === React.Fragment) {\n return React.createElement(React.Fragment, { key: child.key }, guard((child.props as { children?: React.ReactNode }).children, collection, inContainer));\n }\n return bounded(child, collection);\n}\n\n/** `child` between markers, in a Suspense whose fallback (a marker) stands for it when it throws or suspends. */\nfunction bounded(child: React.ReactElement, collection: Collection): React.ReactNode {\n const at = collection.recorded.push({ kind: \"boundary\", element: child }) - 1;\n // An async component is left out without calling it: it can't render synchronously, and React 18 leaves\n // the promise it gives back unhandled (its rejection would end the process).\n if (isAsyncComponent(child.type)) return marker(collection, at, \"f\");\n return React.createElement(\n Suspense,\n { key: child.key ?? `b${at}`, fallback: marker(collection, at, \"f\") },\n marker(collection, at, \"o\"),\n child,\n marker(collection, at, \"c\")\n );\n}\n\n/**\n * A Row, Column or block of an older copy of Elements (0.1.x, from a package still on it), which renders its HTML\n * instead of recording itself: recorded here as this copy's would, so it's in the HTML and the design (rendered by\n * this copy's Row and Column, and by the block's own exporter).\n */\n/**\n * Whether a type named Row or Column is an older copy's (0.1.x marks them only by name): their code reads the\n * config Body passes them (`_config`), which a component of the user's own named after one doesn't. Blocks and\n * roots are marked otherwise (`__unlayerRender`, and roots aren't recorded).\n */\nfunction olderContainer(type: unknown): boolean {\n return !/^(Row|Column)$/.test((type as { displayName?: string } | null)?.displayName ?? \"\") || /\\b_config\\b/.test(String(type));\n}\n\nfunction recordedForOlder(child: React.ReactElement, collection: Collection, inContainer: boolean): React.ReactNode {\n const type = child.type as unknown as { displayName?: string; __unlayerRender?: unknown };\n const props = child.props as Record<string, any>;\n if (type.displayName === \"Row\" || type.displayName === \"Column\") {\n const at = collection.recorded.push({ kind: type.displayName === \"Row\" ? \"row\" : \"column\", props }) - 1;\n return (\n <React.Fragment key={child.key ?? `r${at}`}>\n {marker(collection, at, \"o\")}\n {guard(props.children, collection, true)}\n {marker(collection, at, \"c\")}\n </React.Fragment>\n );\n }\n // A root (Email, Page, Document) placed in a Row or Column: left out, as 0.1.22 left it out, saying so. Among the\n // rows (`<Email><Email>…</Email></Email>`) it renders as it renders, as 0.1.22 rendered it.\n if (!type.__unlayerRender && !inContainer) return child;\n if (!type.__unlayerRender) {\n console.warn(`[Unlayer] <${type.displayName}> is a root: it can't be placed in a Row or Column, so it's left out.`);\n return null;\n }\n const at = collection.recorded.push({ kind: \"block\", type: child.type as React.ComponentType<any>, props }) - 1;\n return React.cloneElement(marker(collection, at), { key: child.key ?? `b${at}` });\n}\n\n/** Whether there's a component of the user's own in `children`, in markup or Fragments (not in Elements' own). */\nfunction hasComponent(children: React.ReactNode): boolean {\n return React.Children.toArray(children).some(\n (child) =>\n React.isValidElement(child) &&\n (typeof child.type === \"string\" || child.type === React.Fragment ? hasComponent((child.props as { children?: React.ReactNode }).children) : !isElementsType(child.type))\n );\n}\n\n/**\n * What a Row, Column or block renders while a template is collected: in the collecting render (its ids carry\n * COLLECTING_ID), what `record` gives; in any other render started inside it, what it renders anyway (`real`,\n * called with nothing collecting). When it can't tell, it renders what it renders: a marker never leaves the\n * collecting render.\n */\nfunction Sentinel({ record, real }: { record: () => React.ReactNode; real: () => React.ReactNode }): React.ReactNode {\n // Where ids can't tell (another copy of React: see Collection.blind), it records while collecting: a marker in a\n // render started inside the collecting one is then rendered in its place (normalize.tsx).\n let collected = !!collecting()?.blind;\n if (!collected) {\n try {\n collected = React.useId().slice(1).startsWith(COLLECTING_ID);\n } catch {\n // Not in a render React runs: what it renders.\n }\n }\n return collected ? record() : within(null, real);\n}\n\n/** Sentinel by the name of the component it stands for, which React's warnings name (`Check the render method of Column`). */\nconst named = new Map<string, typeof Sentinel>();\n\n/** A Row, Column or block, while a template is collected (see Sentinel). */\nexport function whileCollecting(record: () => React.ReactNode, real: () => React.ReactNode, name: string): React.ReactElement {\n let type = named.get(name);\n if (!type) named.set(name, (type = Object.assign((props: Parameters<typeof Sentinel>[0]) => Sentinel(props), { displayName: name })));\n return React.createElement(type, { record, real });\n}\n\n/** A Row or Column while collecting: its props, and markers around its children. */\nexport function recordContainer(kind: \"row\" | \"column\", props: Record<string, any>): React.ReactElement {\n const collection = collecting()!;\n const at = collection.recorded.push({ kind, props }) - 1;\n return (\n <>\n {marker(collection, at, \"o\")}\n {guard(props.children, collection, true)}\n {marker(collection, at, \"c\")}\n </>\n );\n}\n\n/** A block while collecting: its props, and a marker in its place. */\nexport function recordBlock(type: React.ComponentType<any>, props: Record<string, any>): React.ReactElement {\n const collection = collecting()!;\n const at = collection.recorded.push({ kind: \"block\", type, props }) - 1;\n return marker(collection, at);\n}\n","/**\n * Image display-width resolution.\n *\n * In Unlayer's value model an image's display size is `autoWidth` + `maxWidth`,\n * kept separate from the natural `src.width`/`height`. A fixed display size is\n * `autoWidth: false` with `maxWidth` as a PERCENT of the column's content slot\n * (e.g. `\"50%\"`) — not the natural-size field. Encoding a fixed width that way\n * keeps it stable when the design JSON is opened in an editor, which treats\n * `src.width`/`height` as the intrinsic dimensions and may refresh them.\n *\n * Authors pass pixels, so a px pin is captured as `{ autoWidth:false,\n * maxWidth:<px> }` and converted here to the equivalent percent using the same\n * available-width geometry the renderers use (contentWidth × column share, minus\n * paddings/borders), so the emitted value renders at the requested on-screen size.\n */\n\n/** Parse a CSS length to px, strictly: a number or a numeric string with an\n * optional px unit (\"12\" / \"12px\"). Non-px units (\"1.5em\", \"calc(…)\") return\n * undefined so the pinning pass leaves them untouched instead of misreading\n * them as px (SizeInput allows non-px CSS strings). */\nfunction toPx(value: unknown): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value !== \"string\") return undefined;\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(value.trim());\n return m ? parseFloat(m[1]) : undefined;\n}\n\n// NOTE: the geometry parsers below use parseFloat on each token, intentionally\n// mirroring the renderer's explodePaddingsOrMargins / explodeBorder (which the\n// image exporter subtracts from the available width). The renderer reads a token\n// like \"10%\" as its numeric value (10), so the slot math must too — switching to\n// strict px parsing here would make the pinned percent diverge from what the\n// editor actually renders. Strict px parsing is only for the display-pin value\n// (toPx, in pinImageSrc), never for the geometry.\n\n/** Left/right edge sizes from a CSS box shorthand (padding/margin), parsed the\n * same way the renderer's explodePaddingsOrMargins does (parseFloat per token). */\nfunction edges(value: unknown): { left: number; right: number } {\n if (value == null) return { left: 0, right: 0 };\n if (typeof value === \"number\") return { left: value, right: value };\n const parts = String(value)\n .trim()\n .split(/\\s+/)\n .map((p) => parseFloat(p) || 0);\n // CSS order: 1 = all; 2 = [v h]; 3 = [t h b]; 4 = [t r b l].\n if (parts.length === 1) return { left: parts[0], right: parts[0] };\n if (parts.length === 2 || parts.length === 3)\n return { left: parts[1], right: parts[1] };\n return { left: parts[3] || 0, right: parts[1] || 0 };\n}\n\n/** Left/right border widths from a per-side border object, parsed the same way\n * the renderer's explodeBorder does (parseFloat per width). */\nfunction borderEdges(border: unknown): { left: number; right: number } {\n if (!border || typeof border !== \"object\") return { left: 0, right: 0 };\n const b = border as Record<string, unknown>;\n const width = (v: unknown) => parseFloat(`${v ?? \"\"}`) || 0;\n return {\n left: width(b.borderLeftWidth),\n right: width(b.borderRightWidth),\n };\n}\n\n/** A body `contentWidth` is \"fixed px\" only when it's a number or a numeric\n * string with an optional px unit (`600`, `\"600px\"`, or `\"600\"`). Percentages\n * and keywords like `\"auto\"` are NOT fixed → `undefined`. */\nfunction fixedContentWidth(contentWidth: unknown): number | undefined {\n if (typeof contentWidth === \"number\")\n return Number.isFinite(contentWidth) ? contentWidth : undefined;\n if (typeof contentWidth === \"string\") {\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(contentWidth.trim());\n if (m) return parseFloat(m[1]);\n }\n return undefined;\n}\n\n/** Unlayer's body content width fallback when `contentWidth` isn't fixed px. */\nconst FALLBACK_BODY_CONTENT_WIDTH = 500;\n/** Unlayer's default content-block padding when a block sets none. */\nexport const DEFAULT_CONTAINER_PADDING = \"10px\";\n\n/**\n * A body `contentWidth` resolved to px: the fixed px value, or `fallback`\n * (500, Unlayer's base width) for non-px values like `\"50%\"` / `\"auto\"`.\n *\n * Shared with Row's grid CSS (`toContentWidthPx`) so the slot geometry here and\n * the renderer's column math agree on what counts as a fixed width — and so a\n * non-px `contentWidth` collapses to the same base everywhere instead of being\n * `parseInt`-ed into a bogus px value (e.g. `\"50%\"` → 50).\n */\nexport function bodyContentWidthPx(\n contentWidth: unknown,\n fallback: number = FALLBACK_BODY_CONTENT_WIDTH\n): number {\n return fixedContentWidth(contentWidth) ?? fallback;\n}\n\nexport interface SlotContext {\n bodyValues?: { contentWidth?: number | string; padding?: unknown; border?: unknown };\n rowValues?: { padding?: unknown; border?: unknown };\n rowCells?: number[];\n columnIndex?: number;\n columnValues?: { padding?: unknown; border?: unknown };\n /** The image block's own containerPadding (defaults to 10px like the editor). */\n containerPadding?: unknown;\n}\n\n/**\n * Width in px available to a content block, mirroring the renderers'\n * available-width math: contentWidth, minus body/row/column/container paddings\n * and borders, scaled by the column's share of the row.\n */\nexport function contentSlotWidth(ctx: SlotContext): number {\n const { bodyValues = {}, rowValues = {}, columnValues = {} } = ctx;\n const rowCells = ctx.rowCells && ctx.rowCells.length ? ctx.rowCells : [1];\n const columnIndex = ctx.columnIndex ?? 0;\n\n const bodyWidth = bodyContentWidthPx(bodyValues.contentWidth);\n\n const bp = edges(bodyValues.padding);\n const bb = borderEdges(bodyValues.border);\n const bodyAvail = bodyWidth - bp.left - bp.right - bb.left - bb.right;\n\n const rp = edges(rowValues.padding);\n const rb = borderEdges(rowValues.border);\n const rowAvail = bodyAvail - rp.left - rp.right - rb.left - rb.right;\n\n const rowSpan = rowCells.reduce((a, b) => a + b, 0) || 1;\n const colSpan = rowCells[columnIndex] || 1;\n const colWidth = (colSpan / rowSpan) * rowAvail;\n\n const cp = edges(columnValues.padding);\n const cb = borderEdges(columnValues.border);\n const colAvail = colWidth - cp.left - cp.right - cb.left - cb.right;\n\n const ip = edges(ctx.containerPadding ?? DEFAULT_CONTAINER_PADDING);\n return colAvail - ip.left - ip.right;\n}\n\nconst PERCENT = /^\\d+(?:\\.\\d+)?%$/;\n\n/** Round to 2 decimals, matching the editor's percent precision. */\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\n/**\n * Convert a px display pin on an image `src` to the editor's canonical percent.\n *\n * Only touches a pinned image (`autoWidth === false`) whose `maxWidth` is a\n * px/number placeholder; a percent `maxWidth` is already canonical and is left\n * as-is, and a responsive image (`autoWidth !== false`) is untouched. A pin\n * wider than the slot clamps to 100%, mirroring the editor.\n */\nexport function pinImageSrc<T extends Record<string, any> | undefined>(\n src: T,\n availableWidth: number | undefined\n): T {\n if (!src || typeof src !== \"object\") return src;\n if ((src as Record<string, any>).autoWidth !== false) return src;\n\n const maxWidth = (src as Record<string, any>).maxWidth;\n if (typeof maxWidth === \"string\" && PERCENT.test(maxWidth.trim())) return src;\n\n const pinPx = toPx(maxWidth);\n if (pinPx == null) return src;\n\n const avail = availableWidth && availableWidth > 0 ? availableWidth : undefined;\n const pct = avail ? (pinPx >= avail ? 100 : round2((pinPx / avail) * 100)) : 100;\n\n return { ...src, autoWidth: false, maxWidth: `${pct}%` } as T;\n}\n","import type { RenderMode } from \"./types\";\n\nexport interface HeadConfig {\n hasFeature?: (featureName: string) => boolean;\n getInitialValues?: (containerType: string) => Record<string, any>;\n}\n\nexport interface UnlayerConfig {\n cdnBaseUrl: string;\n toSafeHtml?: (text: string, options?: any) => string;\n textDirection?: string;\n mergeTagState?: Record<string, any>;\n mode?: RenderMode;\n headConfig?: HeadConfig;\n}\n\nexport const DEFAULT_CONFIG: UnlayerConfig = {\n cdnBaseUrl: \"https://cdn.tools.unlayer.com\",\n mode: \"web\",\n};\n","/**\n * Column Layouts - All 8 supported column combinations from Unlayer Editor\n *\n * These layouts provide a structured and type-safe way to specify column\n * configurations that match exactly what the Unlayer editor supports.\n *\n * Usage:\n * import { ColumnLayouts } from '@unlayer/react-elements';\n * <Row layout={ColumnLayouts.TwoEqual}>\n * <Column>...</Column>\n * <Column>...</Column>\n * </Row>\n */\n\nexport interface ColumnLayout {\n name: string;\n description: string;\n cells: number[];\n expectedColumns: number;\n widths: string[]; // e.g., [\"50%\", \"50%\"]\n}\n\nexport const ColumnLayouts = {\n OneColumn: {\n name: 'OneColumn',\n description: 'One full column (100%)',\n cells: [1],\n expectedColumns: 1,\n widths: ['100%'],\n } as ColumnLayout,\n\n TwoEqual: {\n name: 'TwoEqual',\n description: 'Two equal columns (50% + 50%)',\n cells: [1, 1],\n expectedColumns: 2,\n widths: ['50%', '50%'],\n } as ColumnLayout,\n\n TwoWideNarrow: {\n name: 'TwoWideNarrow',\n description: 'Two columns: wide + narrow (67% + 33%)',\n cells: [2, 1],\n expectedColumns: 2,\n widths: ['66.67%', '33.33%'],\n } as ColumnLayout,\n\n TwoNarrowWide: {\n name: 'TwoNarrowWide',\n description: 'Two columns: narrow + wide (33% + 67%)',\n cells: [1, 2],\n expectedColumns: 2,\n widths: ['33.33%', '66.67%'],\n } as ColumnLayout,\n\n ThreeEqual: {\n name: 'ThreeEqual',\n description: 'Three equal columns (33% + 33% + 33%)',\n cells: [1, 1, 1],\n expectedColumns: 3,\n widths: ['33.33%', '33.33%', '33.33%'],\n } as ColumnLayout,\n\n ThreeNarrowWideNarrow: {\n name: 'ThreeNarrowWideNarrow',\n description: 'Three columns: narrow + wide + narrow (25% + 50% + 25%)',\n cells: [1, 2, 1],\n expectedColumns: 3,\n widths: ['25%', '50%', '25%'],\n } as ColumnLayout,\n\n FourEqual: {\n name: 'FourEqual',\n description: 'Four equal columns (25% + 25% + 25% + 25%)',\n cells: [1, 1, 1, 1],\n expectedColumns: 4,\n widths: ['25%', '25%', '25%', '25%'],\n } as ColumnLayout,\n\n FiveEqual: {\n name: 'FiveEqual',\n description: 'Five equal columns (20% + 20% + 20% + 20% + 20%)',\n cells: [1, 1, 1, 1, 1],\n expectedColumns: 5,\n widths: ['20%', '20%', '20%', '20%', '20%'],\n } as ColumnLayout,\n};\n\n// Export the layout type for strict typing\nexport type ValidColumnLayout = (typeof ColumnLayouts)[keyof typeof ColumnLayouts];\n\n/**\n * Validates that a layout has the correct number of Column components\n */\nexport function validateColumnLayout(layout: ColumnLayout, childrenCount: number): void {\n if (layout.expectedColumns !== childrenCount) {\n throw new Error(`${layout.name} layout expects ${layout.expectedColumns} <Column> components, but got ${childrenCount}. Layout: ${layout.description}. Make sure you have exactly ${layout.expectedColumns} <Column> children.`);\n }\n}\n","/**\n * Lexical Helpers for Text JSON Conversion\n *\n * Utilities to convert between plain text, Lexical JSON, and HTML.\n * HTML generation is done via direct JSON tree walking — no Lexical\n * headless editor or DOM required.\n */\n\n/**\n * Empty Lexical JSON structure (used as fallback).\n * Uses extended-paragraph type for Unlayer editor compatibility.\n */\nexport const EMPTY_TEXT_JSON =\n '{\"root\":{\"children\":[{\"children\":[],\"format\":\"\",\"indent\":0,\"type\":\"extended-paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"}],\"format\":\"\",\"indent\":0,\"type\":\"root\",\"version\":1}}';\n\n/**\n * Create Lexical JSON for plain text.\n *\n * Builds the JSON string directly to match the Unlayer editor's\n * rich-text serialization format.\n *\n * @param text - Plain text string\n * @returns Lexical JSON string\n *\n * @example\n * ```ts\n * const json = textToTextJson(\"Hello world\");\n * ```\n */\nexport function textToTextJson(text: string): string {\n if (!text) return EMPTY_TEXT_JSON;\n\n const escaped = JSON.stringify(text); // handles quotes/newlines in text\n return `{\"root\":{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":${escaped},\"type\":\"extended-text\",\"version\":1}],\"format\":\"\",\"indent\":0,\"type\":\"extended-paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"}],\"format\":\"\",\"indent\":0,\"type\":\"root\",\"version\":1}}`;\n}\n\n// ── Lexical format bitmask → HTML tag mapping ────────────────────────────────\n// Lexical encodes inline formatting in a numeric `format` bitmask on text nodes.\nconst FORMAT_TAGS: Array<[number, string, string]> = [\n [1, \"<strong>\", \"</strong>\"], // bold\n [2, \"<em>\", \"</em>\"], // italic\n [4, \"<s>\", \"</s>\"], // strikethrough\n [8, \"<u>\", \"</u>\"], // underline\n [16, \"<code>\", \"</code>\"], // code\n [32, \"<sub>\", \"</sub>\"], // subscript\n [64, \"<sup>\", \"</sup>\"], // superscript\n];\n\n/**\n * Escape HTML special characters in text content.\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/**\n * Convert a Lexical text node to HTML, applying format bitmask.\n */\nfunction textNodeToHtml(node: any): string {\n let html = escapeHtml(node.text || \"\");\n\n // Apply inline style attribute if present\n const style = node.style;\n\n // Wrap in format tags (innermost first)\n const format = node.format || 0;\n let openTags = \"\";\n let closeTags = \"\";\n for (const [bit, open, close] of FORMAT_TAGS) {\n if (format & bit) {\n openTags += open;\n closeTags = close + closeTags;\n }\n }\n html = openTags + html + closeTags;\n\n // Wrap in <span> if inline style is present\n if (style) {\n html = `<span style=\"${escapeHtml(style)}\">${html}</span>`;\n }\n\n return html;\n}\n\n// Lexical serializes element-node alignment either as a string (\"center\")\n// or, in older payloads, as the in-memory numeric format code.\nconst NUMERIC_ALIGN: Record<number, string> = {\n 1: \"left\",\n 2: \"center\",\n 3: \"right\",\n 4: \"justify\",\n};\n\n/**\n * Build a ` dir=\"...\"` attribute chunk from a node's direction. Only \"ltr\"\n * and \"rtl\" are valid — the editor ignores anything else, and whitelisting\n * also keeps untrusted Lexical JSON from injecting attribute markup.\n */\nfunction dirAttribute(direction: unknown): string {\n return direction === \"ltr\" || direction === \"rtl\"\n ? ` dir=\"${direction}\"`\n : \"\";\n}\n\n/**\n * Resolve a paragraph node's text-align value from its `format` field.\n */\nfunction paragraphAlign(format: unknown): string | undefined {\n if (typeof format === \"string\") {\n return [\"left\", \"center\", \"right\", \"justify\"].includes(format)\n ? format\n : undefined;\n }\n if (typeof format === \"number\") {\n return NUMERIC_ALIGN[format];\n }\n return undefined;\n}\n\n/**\n * Convert a Lexical paragraph node to HTML, matching the markup the\n * Unlayer editor exports for paragraphs.\n */\nfunction paragraphNodeToHtml(node: any, childrenHtml: string): string {\n // Heading/Button textJson from editor round-trips marks its paragraphs as\n // inline tools; those export as <span> with no block styling.\n const isInlineTool = !!node.isInlineTool;\n const tag = isInlineTool ? \"span\" : \"p\";\n\n const dir = dirAttribute(node.direction);\n\n const styleParts: string[] = [];\n\n // Custom paragraph styles (e.g. background-color) come first so the\n // resets below win if they overlap.\n if (node.style) {\n styleParts.push(String(node.style).replace(/;+\\s*$/, \"\"));\n }\n\n if (!isInlineTool) {\n // Reset the browser's default <p> margins so multiple paragraph lines\n // don't gain extra vertical spacing in email clients that strip head\n // resets. Zero both the physical shorthand and the logical block\n // longhands so the reset wins regardless of how a client resolves the\n // logical-vs-physical cascade.\n styleParts.push(\n \"margin: 0px\",\n \"margin-block-start: 0px\",\n \"margin-block-end: 0px\"\n );\n }\n\n const indent = Number(node.indent) || 0;\n if (indent > 0) {\n styleParts.push(`padding-inline-start: ${indent * 40}px`);\n }\n\n const align = paragraphAlign(node.format);\n if (align) {\n styleParts.push(`text-align: ${align}`);\n }\n\n const style =\n styleParts.length > 0\n ? ` style=\"${escapeHtml(styleParts.join(\"; \") + \";\")}\"`\n : \"\";\n\n // Empty paragraphs get a <br> for consistency with the editor\n return `<${tag}${dir}${style}>${childrenHtml || \"<br>\"}</${tag}>`;\n}\n\n/**\n * Convert a Lexical JSON node (and its children) to HTML.\n * Handles: root, paragraph, heading, text, link, list, listitem, linebreak.\n */\nfunction nodeToHtml(node: any): string {\n if (!node || typeof node !== \"object\") return \"\";\n\n const type = node.type;\n\n // Leaf: text node\n if (type === \"text\" || type === \"extended-text\") {\n return textNodeToHtml(node);\n }\n\n // Leaf: line break\n if (type === \"linebreak\") {\n return \"<br>\";\n }\n\n // Recurse into children\n const childrenHtml = (node.children || []).map(nodeToHtml).join(\"\");\n\n switch (type) {\n case \"root\":\n return childrenHtml;\n\n case \"paragraph\":\n case \"extended-paragraph\":\n return paragraphNodeToHtml(node, childrenHtml);\n\n case \"heading\": {\n // Whitelist the tag — it's interpolated into markup\n const tag = /^h[1-6]$/.test(node.tag) ? node.tag : \"h1\";\n const dir = dirAttribute(node.direction);\n return `<${tag}${dir}>${childrenHtml}</${tag}>`;\n }\n\n case \"link\": {\n const href = node.url ? ` href=\"${escapeHtml(node.url)}\"` : \"\";\n const target = node.target ? ` target=\"${escapeHtml(node.target)}\"` : \"\";\n const rel = node.rel ? ` rel=\"${escapeHtml(node.rel)}\"` : \"\";\n return `<a${href}${target}${rel}>${childrenHtml}</a>`;\n }\n\n case \"list\": {\n const tag = node.listType === \"number\" ? \"ol\" : \"ul\";\n return `<${tag}>${childrenHtml}</${tag}>`;\n }\n\n case \"listitem\":\n return `<li>${childrenHtml}</li>`;\n\n default:\n // Unknown node type — pass through children\n return childrenHtml;\n }\n}\n\n/**\n * Convert Lexical JSON to HTML.\n *\n * Walks the JSON tree directly — no Lexical headless editor or DOM required.\n * Works identically in Node.js and browser environments.\n *\n * @param textJson - Lexical JSON string\n * @returns HTML string\n *\n * @example\n * ```ts\n * const html = generateHtmlFromTextJson('{\"root\":...}');\n * ```\n */\nexport function generateHtmlFromTextJson(textJson: string): string {\n if (!textJson) return \"\";\n\n try {\n const parsed = JSON.parse(textJson);\n\n // Raw HTML passthrough (produced by htmlToTextJson)\n if (parsed.__html) return parsed.__html;\n\n // Walk the Lexical JSON tree and produce HTML\n return nodeToHtml(parsed.root);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Convert an HTML string to a textJson-compatible value.\n *\n * Wraps the HTML in a passthrough format that `generateHtmlFromTextJson`\n * detects and returns directly — avoiding the Lexical headless editor\n * round-trip (HTML → Lexical JSON → HTML) which doesn't work reliably\n * in browser environments.\n *\n * Supports any HTML formatting: bold, italic, underline, strikethrough,\n * code, links, lists, etc.\n *\n * @param html - HTML string with formatting (e.g. `\"Hello <b>bold</b>\"`)\n * @returns JSON string compatible with Paragraph's `textJson` prop\n *\n * @example\n * ```ts\n * const json = htmlToTextJson('Hello <b>world</b> and <a href=\"https://example.com\">link</a>');\n * ```\n */\nexport function htmlToTextJson(html: string): string {\n if (!html) return EMPTY_TEXT_JSON;\n return JSON.stringify({ __html: html });\n}\n","/**\n * Deep-merge user values with defaults.\n * Plain objects are merged recursively; arrays and primitives\n * from userValues override the default entirely.\n */\nexport function mergeValues<T extends Record<string, any>>(\n defaults: T,\n userValues?: Partial<T>\n): T {\n if (!userValues) return defaults;\n\n const result: any = { ...defaults };\n\n for (const key of Object.keys(userValues)) {\n const userVal = (userValues as any)[key];\n const defaultVal = (defaults as any)[key];\n\n if (\n userVal !== null &&\n defaultVal !== null &&\n typeof userVal === \"object\" &&\n typeof defaultVal === \"object\" &&\n !Array.isArray(userVal) &&\n !Array.isArray(defaultVal)\n ) {\n // Recursively merge plain objects\n result[key] = mergeValues(defaultVal, userVal);\n } else {\n result[key] = userVal;\n }\n }\n\n return result as T;\n}\n","/**\n * CSS values as the exporters can read them.\n *\n * Props accept any CSS color, but the exporters convert colors for Outlook\n * (bgcolor attributes) assuming hex or `rgba(r, g, b, a)` — the forms the\n * editor's color picker produces — so `rgb(1, 2, 3)` or `rgb(1 2 3)` came out\n * as \"#NaN0203\". And font stacks are written into style=\"\" attributes, so a\n * double-quoted family name ended the attribute early.\n */\n\n/** A channel: a number, maybe a percentage. One way to read each digit, so a long value can't make it backtrack. */\nconst CHANNEL = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%?$/;\n\n/**\n * rgb()/rgba() in any CSS syntax → \"#rrggbb\", or \"rgba(r, g, b, a)\" when translucent. Other values pass through.\n * Read in one pass, token by token (no pattern that could backtrack on a long value from data).\n */\nexport function normalizeColor(value: string): string {\n const text = value.trim();\n const open = text.indexOf(\"(\");\n if (!/^rgba?$/i.test(text.slice(0, open)) || !text.endsWith(\")\")) return value;\n // r g b, r, g, b, or either with an alpha after \"/\" or \",\".\n const [rgb, slashed, extra] = text.slice(open + 1, -1).split(\"/\");\n const channels = rgb.trim().split(/\\s*,\\s*|\\s+/);\n if (slashed !== undefined) channels.push(slashed.trim());\n if (extra !== undefined || channels.length > 4 || channels.length < (slashed === undefined ? 3 : 4) || !channels.every((c) => CHANNEL.test(c))) return value;\n // A number, or a percentage of `full`.\n const num = (text: string, full: number) => (text.endsWith(\"%\") ? (parseFloat(text) / 100) * full : parseFloat(text));\n const [r, g, b] = channels.slice(0, 3).map((text) => Math.max(0, Math.min(255, Math.round(num(text, 255)))));\n const alpha = channels[3] === undefined ? 1 : num(channels[3], 1);\n if (alpha < 1) return `rgba(${r}, ${g}, ${b}, ${Math.max(0, alpha)})`;\n return `#${[r, g, b].map((n) => n.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/**\n * Whether a value can be written into a CSS declaration as it is: nothing that ends the declaration, the rule or\n * the `<style>` element (`16px</style><script>`, `;`, `}`), no comment that hides the rules after it (`/*`), and\n * every bracket closed by its own kind (`calc(12px` or `16px (]` would swallow the rules after it).\n */\nexport function cssValueSafe(text: string): boolean {\n if (/[<>{};]|\\/\\*|\\*\\//.test(text)) return false;\n const open: string[] = [];\n for (const c of text) {\n if (c === \"(\" || c === \"[\") open.push(c === \"(\" ? \")\" : \"]\");\n else if ((c === \")\" || c === \"]\") && open.pop() !== c) return false;\n }\n return !open.length;\n}\n\n/**\n * A device's settings (`_override.mobile`) with each text value that isn't safe in CSS left out: the editor writes\n * them into its export's `<style>` as they are, as Elements' head does with the ones it keeps.\n */\nexport function cssSafeValues<T>(value: T): T {\n if (typeof value === \"string\") return (cssValueSafe(value) ? value : undefined) as T;\n if (Array.isArray(value)) return value.map(cssSafeValues) as T;\n if (!isPlainObject(value)) return value;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n const safe = cssSafeValues(v);\n if (safe !== undefined || v === undefined) out[k] = safe;\n }\n return out as T;\n}\n\n/** A font stack safe inside style=\"\": family names quoted with ' instead of \" (an apostrophe in one escaped). */\nexport function normalizeFontStack(value: string): string {\n return value.replace(/\"([^\"]*)\"?/g, (_, name: string) => `'${name.replace(/'/g, \"\\\\'\")}'`);\n}\n\n/**\n * Normalize color fields and font stacks in a component's values. Returns\n * new objects (values can alias the caller's, e.g. a shared style constant).\n */\nexport function normalizeCssValues<T>(value: T, key?: string): T {\n if (typeof value === \"string\") return (key === \"fontFamily\" ? normalizeFontStack(value) : key === \"color\" || key?.endsWith(\"Color\") ? normalizeColor(value) : value) as T;\n if (Array.isArray(value)) return value.map((item) => normalizeCssValues(item)) as T;\n if (!isPlainObject(value)) return value;\n const out: Record<string, unknown> = {};\n // A fontFamily object ({ label, value }) holds font stacks.\n for (const [k, v] of Object.entries(value)) out[k] = normalizeCssValues(v, key === \"fontFamily\" ? key : k);\n return out as T;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n","/**\n * Universal Semantic Props System\n *\n * Automatically flattens nested properties for ALL components\n * No build-time generation needed - pure TypeScript + runtime detection\n *\n * Example:\n * - ButtonValues has: { buttonColors: { color, backgroundColor }, fontSize }\n * - Users can pass: { color: \"red\", backgroundColor: \"blue\" } OR { buttonColors: { color: \"red\" } }\n * - TypeScript provides autocomplete for ALL properties (flat and nested)\n */\n\nimport type { DeviceProps } from \"../types\";\nimport { cssSafeValues, normalizeCssValues } from \"./css-values\";\nimport { textToTextJson, htmlToTextJson } from \"./lexical-helpers\";\n\n/**\n * Type utility: Extracts all properties from nested objects\n * This provides TypeScript autocomplete for flat props!\n */\ntype FlattenObjectProps<T> = T extends object\n ? {\n [K in keyof T]?: T[K] extends object\n ? T[K] | FlattenObjectProps<T[K]> // Accept nested OR its flattened props\n : T[K];\n } & {\n // Also accept all nested object properties as flat props\n [K in keyof T as T[K] extends object\n ? keyof T[K] extends string\n ? keyof T[K]\n : never\n : never]?: any;\n }\n : T;\n\n/**\n * Semantic props type for any component.\n * Generic TChildren parameter allows each framework to supply its own child type.\n */\nexport type SemanticProps<T, TChildren = any> = Omit<FlattenObjectProps<T>, keyof DeviceProps> & DeviceProps & {\n children?: TChildren;\n values?: T; // Escape hatch for full control\n /** HTML string with inline formatting for Paragraph (e.g. `'Hello <b>bold</b>'`) */\n html?: string;\n};\n\n/**\n * Runtime detection of nested object structures\n * Analyzes default values to identify which properties are nested objects.\n * Results are cached per defaultValues object reference to avoid recomputing\n * on every render.\n */\nconst nestedStructureCache = new WeakMap<object, Map<string, Set<string>>>();\n\nfunction analyzeNestedStructure(defaultValues: any): Map<string, Set<string>> {\n const cached = nestedStructureCache.get(defaultValues);\n if (cached) return cached;\n\n const nestedGroups = new Map<string, Set<string>>();\n\n for (const [key, value] of Object.entries(defaultValues)) {\n // Skip special keys\n if (key === \"_meta\" || key === \"text\" || key === \"textJson\" || key === \"children\") {\n continue;\n }\n\n // Check if this is a nested object (plain object, not array, not null)\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length > 0\n ) {\n const props = new Set(Object.keys(value));\n nestedGroups.set(key, props);\n }\n }\n\n nestedStructureCache.set(defaultValues, nestedGroups);\n return nestedGroups;\n}\n\n/**\n * Coerce CSS-idiom flat prop values to the shapes the exporters expect.\n * Mutates the given props object in place. Each rule fixes a footgun where the\n * natural/CSS form type-checks (flat props are loosely typed) but renders blank\n * or invalid:\n * - `fontFamily: \"Arial\"` → `{ label, value }` (a bare string is otherwise\n * char-spread when merged into the fontFamily group, dropping the font).\n * - `fontWeight: \"700\"` → `700` (numeric string → number; keyword strings like\n * \"bold\"/\"normal\" are valid CSS and left as-is).\n * - `fontSize: 28` → `\"28px\"` (a unitless number is invalid CSS the browser\n * ignores). Same for other bare-number size fields.\n * - `lineHeight: 1.4` → `\"1.4\"` (the field is typed as a string; unitless\n * line-height is valid CSS).\n */\nconst PX_SIZE_KEYS = [\n \"fontSize\",\n \"padding\",\n \"containerPadding\",\n \"borderRadius\",\n \"letterSpacing\",\n] as const;\n\nfunction normalizeCssProps(props: Record<string, any>): void {\n if (typeof props.fontFamily === \"string\") {\n const v = props.fontFamily;\n props.fontFamily = { label: v, value: v };\n }\n if (\n typeof props.fontWeight === \"string\" &&\n /^\\d+$/.test(props.fontWeight.trim())\n ) {\n props.fontWeight = Number(props.fontWeight.trim());\n }\n if (typeof props.lineHeight === \"number\") {\n props.lineHeight = String(props.lineHeight);\n }\n for (const key of PX_SIZE_KEYS) {\n const v = props[key];\n // bare number (28) or a unit-less numeric string (\"0\", \"20\") → \"<n>px\"\n if (typeof v === \"number\") {\n props[key] = `${v}px`;\n } else if (typeof v === \"string\" && /^\\d+$/.test(v.trim())) {\n props[key] = `${v.trim()}px`;\n }\n }\n}\n\nconst ENTITIES: Record<string, string> = { \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" };\n\n/** Text as HTML: `&`, `<` and `>` escaped (and quotes, with `quotes`). */\nexport function escapeText(text: string, quotes?: boolean): string {\n return text.replace(quotes ? /[&<>\"']/g : /[&<>]/g, (c) => ENTITIES[c]);\n}\n\n/**\n * `escapeText`, keeping an email service's `<%name%>` tag (SendGrid's substitution tags) as written, as 0.1.22\n * did in this text: the service fills it in. `<%` can't start an element, so it adds no markup.\n */\nexport function escapeKeepingTags(text: string, quotes?: boolean, escape = (part: string) => escapeText(part, quotes)): string {\n return text\n .split(/(<%[\\w.]+%>)/)\n .map((part, i) => (i % 2 ? part : escape(part)))\n .join(\"\");\n}\n\n/**\n * A Menu item's text in an email, which its exporter writes as HTML (0.1.22 wrote what it was given): markup escaped,\n * an entity reference kept (`→`, ` `), as a single quote (a template's string: `{{ name | default: 'you' }}`);\n * a double quote escaped, also in a template tag: the exporter writes the text in a double-quoted `aria-label` too,\n * which a raw one would end (`{{ \" }} onmouseover=…`).\n */\nconst menuText = (text: string) =>\n escapeKeepingTags(text, false, (part) => part.replace(/&(?!(?:#\\d+|#x[\\da-f]+|[a-z][\\da-z]*);)|[<>\"]/gi, (c) => ENTITIES[c]));\n\n/**\n * Flatten a JSX/ReactNode children tree to its plain text content.\n * Text components store a string (or Lexical JSON derived from one); a raw React\n * element passed as children would otherwise stringify to \"[object Object]\".\n * Duck-types the element shape (`.props.children`) so this stays framework-free.\n * Inline formatting is not preserved — use the `html` prop for rich text.\n */\nfunction flattenChildrenText(node: any, breaks?: boolean): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map((child) => flattenChildrenText(child, breaks)).join(\"\");\n if (typeof node === \"object\" && \"props\" in node) {\n return breaks && node.type === \"br\" ? \"<br/>\" : flattenChildrenText(node.props?.children, breaks);\n }\n return \"\";\n}\n\n/**\n * Heading and Button children as HTML: text, with markup escaped, so a\n * value like a user's name can't inject HTML. A line break stays one,\n * written `<br>` in a string (as it worked before) or as a JSX `<br />`.\n */\nfunction childrenHtml(children: any): string {\n return flattenChildrenText(children, true)\n .split(/(<br\\s*\\/?>)/i)\n .map((part, i) => (i % 2 ? \"<br/>\" : escapeKeepingTags(part)))\n .join(\"\");\n}\n\n/**\n * Universal semantic props mapper\n * Works for ANY component - no configuration needed!\n *\n * @param props - User props (can include flat or nested properties)\n * @param defaultValues - Component default values (used to detect structure)\n * @param componentType - Component name (for special handling like Paragraph)\n * @returns Properly structured values object for exporter\n */\nexport function mapSemanticProps<T extends Record<string, any>>(\n props: SemanticProps<T>,\n defaultValues: T,\n componentType: string\n): T {\n const { children, values, mobile, hideOnMobile: hideMobileProp, hideOnDesktop: hideDesktopProp, ...restProps } = props;\n // The editor hides rows and content on a device, never a column.\n const hideOnMobile = componentType === \"Column\" ? undefined : hideMobileProp;\n const hideOnDesktop = componentType === \"Column\" ? undefined : hideDesktopProp;\n const userProps: any = { ...restProps };\n\n // Start with escape hatch if provided\n const result: any = values ? { ...values } : {};\n\n // Handle children → text/textJson conversion\n // Paragraph uses textJson (Lexical JSON); all others use text (plain string)\n // Note: editor-types codegen renamed text→textJson for Button/Heading but\n // the exporter still uses plain text at runtime via generateHtmlFromTextJson\n if (children !== undefined && !result.text && !result.textJson) {\n const textContent =\n typeof children === \"string\" ? children : flattenChildrenText(children);\n if (componentType === \"Paragraph\") {\n result.textJson = textToTextJson(textContent);\n } else if (componentType === \"Heading\" || componentType === \"Button\") {\n // Children are text, as in React (and as Paragraph's are): markup in them\n // shows as typed, so a value like a user's name can't inject HTML, but a\n // line break stays one. The `text` prop still takes HTML.\n result.text = childrenHtml(children);\n } else {\n result.text = textContent;\n }\n }\n\n // Paragraph: auto-convert `text` → `textJson` (Lexical JSON)\n // This allows Paragraph to accept the same `text` field as Heading/Button,\n // making it a drop-in replacement for the legacy Text component.\n // - values.text (escape hatch) = legacy HTML → use htmlToTextJson (preserves HTML)\n // - text prop (API) = plain text → use textToTextJson (wraps in Lexical JSON)\n const textFromEscapeHatch = result.text;\n const textFromProp = userProps.text;\n const textProp = textFromEscapeHatch || textFromProp;\n if (componentType === \"Paragraph\" && textProp && !result.textJson) {\n result.textJson = textFromEscapeHatch\n ? htmlToTextJson(String(textProp))\n : textToTextJson(String(textProp));\n delete result.text;\n delete userProps.text;\n }\n\n // Paragraph: convert `html` (rich HTML string) → `textJson` (Lexical JSON)\n // Supports both: <Paragraph html=\"...\" /> and <Paragraph values={{ html: \"...\" }} />\n const htmlProp = userProps.html || result.html;\n if (componentType === \"Paragraph\" && htmlProp && !result.textJson) {\n result.textJson = htmlToTextJson(String(htmlProp));\n delete userProps.html;\n delete result.html;\n }\n\n // Canonicalize link/action fields to the schema's storage shape so the rest of\n // the pipeline (mergeValues, renderToJson, AND the editor) sees a consistent\n // type:\n // - `\"https://…\"` string shorthand → `{ name:\"web\", values:{ href, target } }`.\n // - a link placed in `attrs` (the canonical Href type also surfaces\n // `attrs:{ href, target }`) is moved into `values.href`/`target`, where the\n // editor reads it — so the link round-trips into the Builder, not just into\n // renderToHtml. Genuine custom attrs (class, data-*, …) are preserved.\n // Applied to both the flat prop and the `values` escape hatch. (Render-time\n // `normalizeLinkValue` also reads `attrs` as a defensive fallback.)\n const canonicalizeLink = (v: any): any => {\n if (typeof v === \"string\") {\n return { name: \"web\", values: { href: v, target: \"_blank\" } };\n }\n if (v && typeof v === \"object\" && \"name\" in v && v.attrs && typeof v.attrs === \"object\") {\n const { href: attrsHref, target: attrsTarget, ...customAttrs } = v.attrs;\n if (attrsHref !== undefined || attrsTarget !== undefined) {\n const linkValues = { ...(v.values as Record<string, any> | undefined) };\n if (!linkValues.href && attrsHref !== undefined) linkValues.href = attrsHref;\n if (!linkValues.target && attrsTarget !== undefined) linkValues.target = attrsTarget;\n const next: Record<string, any> = { ...v, values: linkValues };\n if (Object.keys(customAttrs).length) next.attrs = customAttrs;\n else delete next.attrs;\n return next;\n }\n }\n return v;\n };\n for (const key of [\"href\", \"action\"] as const) {\n if (userProps[key] !== undefined) userProps[key] = canonicalizeLink(userProps[key]);\n if (result[key] !== undefined) result[key] = canonicalizeLink(result[key]);\n }\n\n // Normalize CSS-idiom prop values to the shapes the exporters expect. Authors\n // (humans and AI) reach for CSS habits — a string `fontFamily`, a numeric\n // `fontSize`, a string `fontWeight` — which type-check (flat props are loose)\n // but otherwise render blank or invalid. Coercing the natural form here makes\n // it render correctly. Applied to flat props only; the `values` escape hatch\n // is the full-control path and is left untouched.\n normalizeCssProps(userProps);\n\n // Analyze default values to detect nested object structure\n const nestedGroups = analyzeNestedStructure(defaultValues);\n\n // Separate flat props from potential nested props\n const nested: Record<string, any> = {};\n const flat: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(userProps)) {\n if (value === undefined) continue;\n\n // Check if user already provided a nested object\n if (nestedGroups.has(key)) {\n // User passed the nested object directly\n nested[key] = value;\n continue;\n }\n\n // Check if this prop belongs to any nested group\n let belongsToGroup = false;\n for (const [groupName, groupProps] of nestedGroups.entries()) {\n if (groupProps.has(key)) {\n // This flat prop should be grouped\n nested[groupName] = nested[groupName] || {};\n nested[groupName][key] = value;\n belongsToGroup = true;\n break;\n }\n }\n\n if (!belongsToGroup) {\n // Regular flat prop\n flat[key] = value;\n }\n }\n\n // Merge everything: escape hatch < flat props < nested groups\n const final: any = {\n ...result,\n ...flat\n };\n\n // Merge nested groups (preserve existing from escape hatch)\n for (const [groupName, groupValues] of Object.entries(nested)) {\n if (Object.keys(groupValues).length > 0) {\n final[groupName] = {\n ...result[groupName],\n ...groupValues\n };\n }\n }\n\n // Some components (e.g. Column) ship an empty `border: {}` default, so the\n // nested-group detector can't see the border sub-keys and flat border-side\n // props (borderTopWidth, …) would land loose and be dropped by the exporter.\n // If the component declares a `border` field, gather them into it.\n if (\n defaultValues &&\n typeof defaultValues === \"object\" &&\n \"border\" in (defaultValues as object)\n ) {\n const borderSideRe = /^border(Top|Right|Bottom|Left)(Width|Style|Color)$/;\n const collected: Record<string, any> = {};\n for (const key of Object.keys(final)) {\n if (borderSideRe.test(key)) {\n collected[key] = final[key];\n delete final[key];\n }\n }\n if (Object.keys(collected).length > 0) {\n final.border = { ...(final.border || {}), ...collected };\n }\n\n // Border widths must carry a unit — `borderTopWidth: 1` would otherwise\n // render `border-top: 1 solid` (invalid CSS the browser drops). The\n // BorderInput type accepts a number, so normalize *Width fields (bare number\n // or unit-less numeric string → px), wherever the border came from.\n if (final.border && typeof final.border === \"object\") {\n // Clone before rewriting: final.border may alias the caller's object (the\n // `values` escape hatch is only a shallow clone, and a nested `border` prop\n // passes through by reference), so mutating in place would be an impure side\n // effect — e.g. a shared `const HAIRLINE = { borderTopWidth: 1 }` would get\n // rewritten to \"1px\" in the caller.\n const b: Record<string, any> = { ...(final.border as Record<string, any>) };\n for (const key of Object.keys(b)) {\n if (!/Width$/.test(key)) continue;\n const v = b[key];\n if (typeof v === \"number\") b[key] = `${v}px`;\n else if (typeof v === \"string\" && /^\\d+(?:\\.\\d+)?$/.test(v.trim())) b[key] = `${v.trim()}px`;\n }\n final.border = b;\n }\n }\n\n if (mobile || hideOnMobile !== undefined || hideOnDesktop !== undefined) {\n const overrides = { ...final._override };\n if (mobile || hideOnMobile !== undefined) {\n const { width, maxWidth, autoWidth, ...phone } = mobile || {};\n const mapped = mapSemanticProps(phone as SemanticProps<T>, defaultValues, componentType) as Record<string, any>;\n if (componentType === \"Image\" && (width !== undefined || maxWidth !== undefined || autoWidth !== undefined)) {\n mapped.src = {\n ...(overrides.mobile?.src || {}),\n ...(autoWidth !== undefined ? { autoWidth } : { autoWidth: false }),\n ...(width !== undefined || maxWidth !== undefined ? { maxWidth: width ?? maxWidth } : {}),\n };\n } else if (width !== undefined || autoWidth !== undefined) {\n const key = componentType === \"Button\" ? \"size\" : \"width\";\n mapped[key] = { autoWidth: autoWidth ?? false, ...(width !== undefined ? { width: typeof width === \"number\" ? `${width}px` : width } : {}) };\n }\n overrides.mobile = { ...overrides.mobile, ...cssSafeValues(mapped), ...(hideOnMobile !== undefined ? { hideMobile: hideOnMobile } : {}) };\n }\n if (hideOnDesktop !== undefined) overrides.desktop = { ...overrides.desktop, hideDesktop: hideOnDesktop };\n final._override = overrides;\n }\n\n // \"Do not stack on mobile\" is a mobile override, as the editor saves it:\n // the exporters read it only there.\n if (componentType === \"Row\" && final.noStackMobile === true) {\n final._override = { ...final._override, mobile: { ...final._override?.mobile, noStackMobile: true } };\n final.noStackMobile = false;\n }\n\n // Colors and font stacks in forms the exporters write correctly.\n return normalizeCssValues(final) as T;\n}\n\n/**\n * Convert any of the three link-shaped inputs into the render-value shape\n * the exporter expects: `{ url, target, ...customAttrs }`.\n *\n * The schema stores links as `{ name, values: { href, target } }`, but\n * exporters (consumed via @unlayer/exporters) expect the editor's render\n * value shape `{ url, target, customAttrs?, class?, onClick? }`. The editor\n * runs this conversion via the link property-editor's `renderValue()` —\n * `normalizeValuesForExporter` (in render-time code) mirrors it so React\n * rendered output matches.\n *\n * Accepted inputs:\n * - `\"https://...\"` (string shorthand)\n * - `{ url, target?, customAttrs?, class?, onClick? }` (already render shape)\n * - `{ name, values: { href, target? }, attrs? }` (storage shape from schema)\n *\n * Returns `undefined` for shapes we don't recognize so the caller can fall\n * back to the original value (avoids silently dropping data).\n *\n * IMPORTANT: this is render-time only. Do NOT apply during renderToJson —\n * JSON output is for round-tripping into the editor, which expects the\n * storage shape.\n */\nexport function normalizeLinkValue(value: unknown): Record<string, any> | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") {\n return { url: value, target: \"_blank\" };\n }\n if (typeof value !== \"object\") return undefined;\n const v = value as Record<string, any>;\n // Already render-shape (has url) — pass through.\n if (\"url\" in v) return v;\n // Storage shape from the schema: { name, values: { href, target }, attrs? }.\n // The canonical Href type also surfaces `attrs: { href, target }`, so authors\n // reasonably put the link there — read href/target from `values` first, then\n // fall back to `attrs`, and spread any remaining `attrs` as custom attributes.\n // (Without this, `{ name, attrs: { href } }` type-checks but renders href=\"\".)\n if (\n \"name\" in v &&\n ((v.values && typeof v.values === \"object\") || (v.attrs && typeof v.attrs === \"object\"))\n ) {\n const inner = v.values && typeof v.values === \"object\" ? (v.values as Record<string, any>) : {};\n const attrs = v.attrs && typeof v.attrs === \"object\" ? (v.attrs as Record<string, any>) : {};\n const { href: attrsHref, target: attrsTarget, ...customAttrs } = attrs;\n // `||` not `??`: the schema default merges in `values: { href: \"\" }`, so an\n // empty `values.href` must fall through to the `attrs` href, not win over it.\n return {\n url: inner.href || attrsHref || \"\",\n target: inner.target || attrsTarget || \"_blank\",\n ...customAttrs,\n };\n }\n return undefined;\n}\n\n/**\n * A link whose URL the exporters write into an `href=\"…\"` as it is: `\"`, `<`\n * and `>`, which a URL can't hold unencoded, are percent-encoded (as a browser\n * would), so a URL can't end the attribute (or Outlook's conditional comment).\n * An email service's placeholder in the form `<%name%>` (SendGrid's\n * `<%asm_group_unsubscribe_raw_url%>`) is kept: the service fills it in as\n * written, and it can end neither.\n */\nfunction safeLink(link: Record<string, any>): Record<string, any> {\n // A URL that isn't a string (an array from a JSON body or `?url[]=`) is written as its text: escaped as one.\n const url = link.url === undefined || link.url === null ? link.url : String(link.url);\n return typeof url === \"string\" ? { ...link, url: url.replace(/<%[\\w.]+%>|[\"<>]/g, (c) => (c.length > 1 ? c : encodeURIComponent(c))) } : link;\n}\n\n/**\n * Normalize all link/action fields on an item's values to the render-value\n * shape the exporter reads. Returns a shallow clone — does not mutate.\n *\n * Knows about the link-bearing paths per component:\n * - top-level `href` (Button, Video)\n * - top-level `action` (Image, Timer)\n * - `menu.items[].link` (Menu), and its items' text\n * - `icons.icons[].url` (Social)\n *\n * Only the bridge between mapper and exporter should call this; renderToJson\n * must NOT, because JSON output preserves storage shape.\n */\nexport function normalizeValuesForExporter<T extends Record<string, any>>(\n values: T,\n componentName: string,\n mode?: string\n): T {\n if (values == null || typeof values !== \"object\") return values;\n\n const out: Record<string, any> = { ...values };\n\n // Top-level link fields used by Button (href), Image (action), Video (href),\n // Timer (action). Cheap to check both keys for every component.\n for (const key of [\"href\", \"action\"]) {\n if (out[key] !== undefined) {\n const normalized = normalizeLinkValue(out[key]);\n if (normalized !== undefined) out[key] = safeLink(normalized);\n }\n }\n\n // The Button exporter unescapes its text before writing it, where the\n // editor's canvas shows the text as the HTML it is. Escaping it once here\n // gives it back as stored: `<b>` shows as text, `<b>` as bold.\n if (componentName === \"Button\" && typeof out.text === \"string\") {\n out.text = escapeKeepingTags(out.text, true);\n }\n\n // Menu items each carry a `link` field, and text the email exporter writes\n // as it is (the web and document exporters escape it).\n if (componentName === \"Menu\" && out.menu && Array.isArray(out.menu.items)) {\n out.menu = {\n ...out.menu,\n items: out.menu.items.map((item: any) => {\n if (!item) return item;\n const next = mode === \"email\" && typeof item.text === \"string\" ? { ...item, text: menuText(item.text) } : item;\n if (next.link === undefined) return next;\n const normalized = normalizeLinkValue(next.link);\n if (normalized === undefined) return next;\n return { ...next, link: safeLink(normalized) };\n }),\n };\n }\n\n // Social icons each carry a `url`, written into an href as it is, and a `name`, which an email writes into its\n // `title`, `alt` and image URL as it is too (a web page or a document escapes it).\n if (componentName === \"Social\" && out.icons && Array.isArray(out.icons.icons)) {\n const named = (icon: any) => (mode === \"email\" && typeof icon.name === \"string\" ? { ...icon, name: escapeText(icon.name, true) } : icon);\n out.icons = { ...out.icons, icons: out.icons.icons.map((icon: any) => (icon && typeof icon === \"object\" ? named(safeLink(icon)) : icon)) };\n }\n\n return out as T;\n}\n","/**\n * HTML to Plain Text Converter\n *\n * Pure regex-based HTML-to-text conversion — no DOM dependency.\n * Works in Node.js, edge runtimes, and browsers.\n *\n * Critical for email deliverability: spam filters penalize HTML-only emails.\n */\n\n/**\n * Common HTML named entity map for decoding.\n *\n * Covers the entities that actually appear in email/marketing content —\n * currency, typographic punctuation, common symbols, and the Latin-1 accented\n * letters used in European names and words. Kept as a curated map (rather than\n * the full HTML5 named-reference set, which is ~2000 entries) so the bundle\n * stays within its size budget. Numeric entities (`{`, ``) are\n * handled separately below, so anything missing here still decodes if written\n * numerically.\n */\nconst HTML_ENTITIES: Record<string, string> = {\n // Core markup + whitespace\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \""\": '\"',\n \"'\": \"'\",\n \"'\": \"'\",\n \" \": \" \",\n // Dashes, quotes, and typographic punctuation\n \"—\": \"—\",\n \"–\": \"–\",\n \"«\": \"«\",\n \"»\": \"»\",\n \"‘\": \"‘\",\n \"’\": \"’\",\n \"“\": \"“\",\n \"”\": \"”\",\n \"•\": \"•\",\n \"·\": \"·\",\n \"…\": \"…\",\n // Currency\n \"¢\": \"¢\",\n \"£\": \"£\",\n \"¥\": \"¥\",\n \"€\": \"€\",\n // Legal / trademark\n \"©\": \"©\",\n \"®\": \"®\",\n \"™\": \"™\",\n \"§\": \"§\",\n \"¶\": \"¶\",\n // Math and misc symbols\n \"°\": \"°\",\n \"±\": \"±\",\n \"×\": \"×\",\n \"÷\": \"÷\",\n \"µ\": \"µ\",\n \"¼\": \"¼\",\n \"½\": \"½\",\n \"¾\": \"¾\",\n // Latin-1 accented letters (common in European names/words)\n \"ß\": \"ß\",\n \"à\": \"à\",\n \"á\": \"á\",\n \"â\": \"â\",\n \"ã\": \"ã\",\n \"ä\": \"ä\",\n \"å\": \"å\",\n \"æ\": \"æ\",\n \"ç\": \"ç\",\n \"è\": \"è\",\n \"é\": \"é\",\n \"ê\": \"ê\",\n \"ë\": \"ë\",\n \"ì\": \"ì\",\n \"í\": \"í\",\n \"î\": \"î\",\n \"ï\": \"ï\",\n \"ñ\": \"ñ\",\n \"ò\": \"ò\",\n \"ó\": \"ó\",\n \"ô\": \"ô\",\n \"õ\": \"õ\",\n \"ö\": \"ö\",\n \"ø\": \"ø\",\n \"ù\": \"ù\",\n \"ú\": \"ú\",\n \"û\": \"û\",\n \"ü\": \"ü\",\n};\n\n/**\n * Decode HTML entities (named and numeric).\n */\nfunction decodeEntities(text: string): string {\n // Named entities\n let result = text.replace(/&\\w+;/g, (match) => HTML_ENTITIES[match] ?? match);\n\n // Numeric entities: { and \n result = result.replace(/&#(\\d+);/g, (_, code) =>\n String.fromCharCode(parseInt(code, 10))\n );\n result = result.replace(/&#x([0-9a-fA-F]+);/g, (_, code) =>\n String.fromCharCode(parseInt(code, 16))\n );\n\n return result;\n}\n\n/**\n * Convert an HTML string to readable plain text.\n *\n * @param html - HTML string to convert\n * @returns Plain text representation\n *\n * @example\n * ```ts\n * import { htmlToPlainText } from \"@unlayer-internal/shared-elements\";\n *\n * const text = htmlToPlainText(\"<h1>Hello</h1><p>World</p>\");\n * // \"HELLO\\nWorld\"\n * ```\n */\nexport function htmlToPlainText(html: string): string {\n if (!html) return \"\";\n\n let text = html;\n\n // 1. Remove elements marked with data-skip-in-text (preview div, etc.)\n text = text.replace(/<[^>]+data-skip-in-text=\"true\"[^>]*>[\\s\\S]*?<\\/[^>]+>/gi, \"\");\n\n // 2. Remove <head>, <style>, <script> blocks entirely\n text = text.replace(/<head[\\s\\S]*?<\\/head>/gi, \"\");\n text = text.replace(/<style[\\s\\S]*?<\\/style>/gi, \"\");\n text = text.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\");\n\n // A line break, first: headings, links and list items keep theirs (\"WELCOME BACK,<br>ADA\").\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n // 3. Convert headings: h1-h2 → UPPERCASE, h3-h6 → as-is\n text = text.replace(/<h[12][^>]*>([\\s\\S]*?)<\\/h[12]>/gi, (_, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n // Entities stay as written, to decode below (`&` uppercased wouldn't).\n const upper = clean.replace(/&#?\\w+;|[^&]+|&/g, (part: string) => (/^&#?\\w+;$/.test(part) ? part : part.toUpperCase()));\n return \"\\n\" + upper + \"\\n\";\n });\n text = text.replace(/<h[3-6][^>]*>([\\s\\S]*?)<\\/h[3-6]>/gi, (_, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n return \"\\n\" + clean + \"\\n\";\n });\n\n // 4. Convert links: <a href=\"url\">text</a> → text (url)\n text = text.replace(/<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n // Skip if link text is the same as URL (avoid duplication)\n if (clean === href || clean === decodeEntities(href)) {\n return clean;\n }\n return `${clean} (${href})`;\n });\n\n // 5. Convert images: <img alt=\"text\"> → [text]\n text = text.replace(/<img[^>]+alt=[\"']([^\"']+)[\"'][^>]*\\/?>/gi, (_, alt) => {\n return `[${alt}]`;\n });\n // Remove images without alt text\n text = text.replace(/<img[^>]*\\/?>/gi, \"\");\n\n // 6. Convert horizontal rules\n text = text.replace(/<hr[^>]*\\/?>/gi, \"\\n---\\n\");\n\n // 7. Convert list items\n text = text.replace(/<li[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, content) => {\n const clean = content.replace(/<[^>]+>/g, \"\").trim();\n return \"- \" + clean + \"\\n\";\n });\n\n // 9. Convert block-level closing tags to newlines\n text = text.replace(/<\\/(?:p|div|tr|blockquote|section|article|header|footer|main|nav|aside)>/gi, \"\\n\");\n text = text.replace(/<\\/(?:ul|ol|table|thead|tbody|tfoot)>/gi, \"\\n\");\n\n // 10. Convert <td> and <th> to tab-separated values\n text = text.replace(/<\\/(?:td|th)>/gi, \"\\t\");\n\n // 11. Remove all remaining HTML tags\n text = text.replace(/<[^>]+>/g, \"\");\n\n // 12. Decode HTML entities\n text = decodeEntities(text);\n\n // 13. Clean up whitespace\n // Replace tabs with spaces\n text = text.replace(/\\t/g, \" \");\n // Collapse multiple spaces (but not newlines) into one\n text = text.replace(/[^\\S\\n]+/g, \" \");\n // Trim each line\n text = text\n .split(\"\\n\")\n .map((line) => line.trim())\n .join(\"\\n\");\n // Collapse 3+ consecutive newlines to 2\n text = text.replace(/\\n{3,}/g, \"\\n\\n\");\n // Trim leading/trailing whitespace\n text = text.trim();\n\n return text;\n}\n","/**\n * Universal Component Factory\n *\n * Eliminates boilerplate by creating components from configuration.\n * This factory handles all the repetitive logic that was duplicated\n * across Button, Heading, Paragraph, etc.\n */\n\nimport React from \"react\";\nimport { collecting, RECORDS } from \"./collect\";\nimport { recordBlock, whileCollecting } from \"./record\";\nimport type { ExporterName } from \"@unlayer/types\";\n\n/** Exporter map keyed by display mode. Defined locally until added to @unlayer/types. */\ntype ItemExporters = Partial<Record<ExporterName, (...args: any[]) => string>>;\nimport type { RenderMode, UnlayerConfig } from \"@unlayer-internal/shared-elements\";\nimport type { DeviceProps, SizeInput } from \"../types\";\nimport { contentSlotWidth, pinImageSrc } from \"./image-sizing\";\nimport {\n mergeValues,\n generateHtmlFromTextJson,\n normalizeValuesForExporter,\n DEFAULT_CONFIG,\n} from \"@unlayer-internal/shared-elements\";\n\n\n/**\n * Static property key for the hook-free render function.\n * Column calls this directly instead of the outer component\n * (which uses hooks and would break when called as a plain function).\n */\nexport const UNLAYER_RENDER_KEY = \"__unlayerRender\";\n\n/**\n * Static property key for the item's config (name, defaultValues, propMapper).\n * Used by renderToJson to extract values without rendering to HTML.\n */\nexport const UNLAYER_CONFIG_KEY = \"__unlayerItemConfig\";\n\n/**\n * Base props that all item components support\n */\nexport interface BaseItemComponentProps extends DeviceProps {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n mode?: RenderMode;\n /** Padding of the content wrapper around this item — a number (→ px) or a CSS\n * string (\"10px\", \"16px 24px\"). Applied by the containing Column. */\n containerPadding?: SizeInput;\n\n // Internal props (for advanced use)\n index?: number;\n /** @internal — content id allocated by the containing Column; keeps the\n * value-level _meta.htmlID unique per instance and aligned with the\n * wrapper id and head/json numbering. */\n _metaHtmlId?: string;\n colIndex?: number;\n cells?: any[];\n bodyValues?: any;\n rowValues?: any;\n /** @internal - this column's values, threaded by Column for width-aware exporters */\n columnValues?: any;\n /** @internal - Unlayer config threaded from UnlayerProvider */\n _config?: UnlayerConfig;\n}\n\n/**\n * Configuration for creating an item component\n */\nexport interface ItemComponentConfig<TValues, TSemanticProps> {\n /** Component name (e.g., 'Button', 'Heading') */\n name: string;\n\n /** Default values for the component */\n defaultValues: TValues;\n\n /** Function to map semantic props to values format */\n propMapper: (\n props: TSemanticProps & { children?: React.ReactNode }\n ) => Partial<TValues>;\n\n /** Display name for React DevTools */\n displayName?: string;\n\n /** Per-component exporters map — enables tree-shaking.\n * Keys are display modes ('web', 'email', 'document'), values are exporter functions. */\n exporters: ItemExporters;\n\n /** Design-JSON content type override (defaults to the lowercased name).\n * Custom tools use \"custom\". */\n contentType?: string;\n\n /** Custom tool name — emitted as the content's `slug` in design JSON. */\n slug?: string;\n\n /** Base name for `_meta.htmlID`/`htmlClassNames`, prefixed with\n * `u_content_` where used (defaults to the lowercased `name`). Custom\n * tools pass `custom_<slug>`, rendering as `u_content_custom_<slug>`. */\n metaName?: string;\n\n /** Head contributions (css/js/tags builders) carried by the component\n * itself instead of looked up in the exporters registry. */\n head?: Record<string, any>;\n\n /** Skip the content-container wrapper when this component's exporter returns\n * an empty string for an unsupported mode. */\n omitEmptyOutput?: boolean;\n}\n\n/**\n * Props type that combines base props with semantic props\n */\nexport type ItemComponentProps<TSemanticProps> = BaseItemComponentProps &\n Omit<TSemanticProps, keyof DeviceProps>;\n\n// ============================================\n// Internal: rendering helpers (merged from render-component.tsx)\n// ============================================\n\ninterface ErrorFallbackProps {\n type: string;\n error: Error;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Error fallback component shown when an exporter throws. */\nconst ErrorFallback: React.FC<ErrorFallbackProps> = ({\n type,\n className,\n style\n}) => (\n <div className={className} style={style}>\n <div\n style={{\n padding: \"20px\",\n backgroundColor: \"#fee\",\n border: \"1px solid #fcc\",\n borderRadius: \"4px\",\n color: \"#c33\",\n textAlign: \"center\",\n fontFamily: \"system-ui, sans-serif\"\n }}\n >\n <strong>{type} failed to render.</strong>\n <br />\n <small>Check console for details.</small>\n </div>\n </div>\n);\n\ninterface RenderConfig<T = any> {\n type: string;\n values: T;\n mode: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n args?: any[];\n /** Column/body context merged into the exporter `meta` (8th arg). */\n metaContext?: Record<string, any>;\n innerHTML?: string;\n _config?: UnlayerConfig;\n exporter: Function;\n}\n\n/**\n * Allocate the next unique HTML id for a prefix, scoped to one render.\n * Counters live on the threaded `_config` (`__ids`), which Body resets per\n * render — so renderToHtml produces unique ids (u_row_1, u_row_2, …) like the\n * editor and like renderToJson, instead of resetting per row. Falls back to\n * `${prefix}_1` when rendered standalone (no _config).\n */\nexport function nextHtmlId(config: any, prefix: string): string {\n if (!config) return `${prefix}_1`;\n const ids: Record<string, number> = (config.__ids ??= {});\n ids[prefix] = (ids[prefix] || 0) + 1;\n return `${prefix}_${ids[prefix]}`;\n}\n\n/**\n * An HTML id (or, with `spaces`, a list of class names) that can't end its attribute: all else stays as 0.1.22 wrote\n * it (`סיכום`, `section.2`, `sm:hidden`). The head's CSS escapes the id it selects (see device-overrides.ts).\n */\nexport function safeName(value: unknown, spaces = false): string {\n const text = String(value ?? \"\");\n // Class names apart on lines or by tabs stay apart, as the browser reads them.\n return spaces ? text.replace(/[\\t\\n\\f\\r]/g, \" \").replace(/[\"'<>&`\\u0000-\\u001f\\u007f]/g, \"\") : text.replace(/[\"'<>&`\\s\\u0000-\\u001f\\u007f]/g, \"\");\n}\n\n/** A block's or row's `_meta` with its id and class names kept to what they can hold (see `safeName`). */\nexport const safeMeta = <T extends { htmlID?: unknown; htmlClassNames?: unknown }>(meta: T) => ({ ...meta, htmlID: safeName(meta.htmlID), htmlClassNames: safeName(meta.htmlClassNames, true) });\n\n/** Add _meta fields if not present. */\nfunction ensureMeta(values: any, type: string, index: number = 0): any {\n return {\n ...values,\n _meta: {\n htmlID: `u_content_${type.toLowerCase()}_${index + 1}`,\n htmlClassNames: `u_content_${type.toLowerCase()}`,\n ...(values._meta || {})\n }\n };\n}\n\n/**\n * Render a component by calling its exporter and wrapping the HTML output.\n * Handles error boundaries, exporterConfig construction, and container vs item calling conventions.\n */\n/** A direction the `dir` attribute takes (ltr, rtl, auto). Anything else is dropped: it's written into markup. */\nexport function textDirectionOf(value: unknown): \"ltr\" | \"rtl\" | \"auto\" | undefined {\n const dir = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n return dir === \"ltr\" || dir === \"rtl\" || dir === \"auto\" ? dir : undefined;\n}\n\nfunction renderComponent<T = any>(config: RenderConfig<T>): JSX.Element {\n const { type, values, mode, className, style, args = [], innerHTML, _config, exporter, metaContext } = config;\n\n try {\n // Build exporterConfig from _config (falls back to defaults)\n const cfg = _config ?? DEFAULT_CONFIG;\n const exporterConfig = {\n generateHtmlFromTextJson,\n toSafeHtml: cfg.toSafeHtml,\n textDirection: textDirectionOf(cfg.textDirection),\n cdnBaseUrl: cfg.cdnBaseUrl,\n };\n\n // Call exporter with appropriate arguments\n let html: string;\n if (innerHTML !== undefined) {\n // Container components (Row, Body) take innerHTML first\n html = exporter(innerHTML, values, ...args);\n } else {\n // Content components take values first\n // Item exporters signature: (values, index, colIndex, cells, bodyValues, rowValues, embeddedValues, meta)\n // Args 2-7 are deprecated positional params; the 8th arg is a meta object with all context\n const meta = {\n exporterConfig,\n mergeTagState: cfg.mergeTagState,\n ...(metaContext ?? {}),\n };\n html = exporter(values, ...args, undefined, meta);\n }\n\n // Ensure string output\n html = typeof html === \"string\" ? html : String(html);\n\n // Return rendered component\n return (\n <div\n className={className}\n style={style}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n } catch (error) {\n console.error(`${type} rendering failed:`, error);\n return (\n <ErrorFallback\n type={type}\n error={error as Error}\n className={className}\n style={style}\n />\n );\n }\n}\n\n// ============================================\n// Public API\n// ============================================\n\n/**\n * Create an item component (Button, Heading, Paragraph, etc.)\n *\n * This factory eliminates the ~100 lines of boilerplate code that was\n * duplicated across every item component.\n *\n * @example\n * ```tsx\n * const Button = createItemComponent({\n * name: \"Button\",\n * defaultValues: BUTTON_DEFAULTS,\n * propMapper: mapButtonProps,\n * displayName: \"Button\"\n * });\n * ```\n */\nexport function createItemComponent<\n TValues extends Record<string, any> = any,\n TSemanticProps = any\n>(\n config: ItemComponentConfig<TValues, TSemanticProps>\n): React.FC<ItemComponentProps<TSemanticProps>> {\n // Inner render function — no hooks, safe to call as a plain function (Column does this)\n function renderFn(\n props: ItemComponentProps<TSemanticProps>\n ): React.ReactElement | null {\n const {\n // Base props\n mode: modeProp,\n className,\n style,\n\n // Internal props\n index = 0,\n _metaHtmlId,\n colIndex = 0,\n cells = [],\n bodyValues = {},\n rowValues = {},\n columnValues = {},\n _config,\n\n // Children\n children,\n\n // Rest are semantic props\n ...restProps\n } = props as ItemComponentProps<TSemanticProps>;\n\n // Resolve mode: explicit prop > _config > default\n const mode: RenderMode = modeProp ?? _config?.mode ?? \"web\";\n\n // 1. Map semantic props to values format (handles dual API)\n const mappedValues = config.propMapper({\n children,\n ...restProps\n } as TSemanticProps & { children?: React.ReactNode });\n\n // 2. Merge with defaults\n const finalValues = mergeValues(config.defaultValues, mappedValues);\n\n // 3. Ensure _meta is present. The Column-allocated id wins so every\n // instance is unique; the index fallback covers standalone renders.\n const metaName = config.metaName ?? config.name.toLowerCase();\n const meta = {\n htmlID: _metaHtmlId ?? `u_content_${metaName}_${index + 1}`,\n htmlClassNames: `u_content_${metaName}`,\n ...((finalValues as Record<string, any>)._meta || {}),\n };\n // An id or class name given in `values` reaches an attribute and the head's CSS selectors: only what they can hold.\n const valuesWithMeta = { ...finalValues, _meta: safeMeta(meta) };\n\n // 4. Ensure bodyValues has a contentWidth. Default to the schema-shaped\n // \"500px\" (matches BodyDefaults.contentWidth and the exporter's image\n // fallback width), so a standalone item (no Body) sizes the same as the\n // editor and the value is a CSS string everywhere it might be consumed.\n const safeBodyValues = {\n contentWidth: \"500px\",\n ...bodyValues\n };\n\n // 5. Resolve link/action fields to the exporter's render-value shape.\n // Skipped on the renderToJson path (which uses propMapper directly)\n // so JSON output preserves the schema's storage shape.\n const valuesForExporter = normalizeValuesForExporter(\n valuesWithMeta as Record<string, any>,\n config.name,\n mode\n );\n\n // 5b. Convert a fixed (px) image pin to the editor's canonical percent now\n // that the column geometry is known (Column threads columnValues/cells/\n // bodyValues). Guarded on `src.autoWidth === false`, so only pinned\n // images are touched; responsive images and non-image blocks pass through.\n const exportSrc = (valuesForExporter as Record<string, any>).src;\n if (exportSrc && typeof exportSrc === \"object\" && exportSrc.autoWidth === false) {\n const availableWidth = contentSlotWidth({\n bodyValues: safeBodyValues,\n rowValues,\n rowCells: cells,\n columnIndex: colIndex,\n columnValues,\n containerPadding:\n (props as { containerPadding?: unknown; values?: { containerPadding?: unknown } })\n .containerPadding ??\n (props as { values?: { containerPadding?: unknown } }).values?.containerPadding,\n });\n (valuesForExporter as Record<string, any>).src = pinImageSrc(exportSrc, availableWidth);\n }\n\n // 6. Resolve exporter for this mode (fallback to web)\n const exporter = (config.exporters[mode] || config.exporters.web)!;\n\n // 7. Render using utility (handles all boilerplate)\n return renderComponent<TValues>({\n type: config.name,\n values: valuesForExporter as TValues,\n mode,\n className,\n style,\n args: [index, colIndex, cells, safeBodyValues, rowValues],\n // The 8th arg the exporters actually read: column/body context for\n // width-aware rendering (Image's available-width calc), mirroring the editor.\n metaContext: {\n columnIndex: colIndex,\n columnValues,\n rowCells: cells,\n rowValues,\n bodyValues: safeBodyValues,\n },\n _config,\n exporter,\n });\n }\n\n // Outer React component — hook-free, works in both Server and Client Components\n const ItemComponent: React.FC<ItemComponentProps<TSemanticProps>> = (\n props\n ) => {\n if (collecting()) return whileCollecting(() => recordBlock(ItemComponent, props as Record<string, any>), () => renderFn(props), ItemComponent.displayName ?? \"Block\");\n return renderFn(props);\n };\n\n // Set display name for React DevTools\n ItemComponent.displayName = config.displayName || config.name;\n\n // Expose hook-free render for Column to call directly\n (ItemComponent as any)[UNLAYER_RENDER_KEY] = renderFn;\n (ItemComponent as any)[RECORDS] = true;\n\n // Expose config for renderToJson to extract values without HTML rendering\n (ItemComponent as any)[UNLAYER_CONFIG_KEY] = {\n name: config.name,\n defaultValues: config.defaultValues,\n propMapper: config.propMapper,\n contentType: config.contentType,\n slug: config.slug,\n metaName: config.metaName,\n head: config.head,\n omitEmptyOutput: config.omitEmptyOutput,\n };\n\n return ItemComponent;\n}\n","import { ButtonExporters, ButtonDefaults } from \"@unlayer/exporters\";\nimport type { ButtonValues, TextStyleProps, SizeInput, BorderInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Button semantic props — agent-friendly text/style types (replacing the loose\n * `any` flat props) plus a CSS-style `width` (number/px pins; \"100%\" full-width).\n */\ntype ButtonSemanticProps = Omit<\n SemanticProps<ButtonValues>,\n keyof TextStyleProps | \"width\" | \"padding\" | \"borderRadius\" | \"border\"\n> &\n TextStyleProps & {\n /** Display width — a number/px pins the button; \"100%\" makes it full-width. */\n width?: SizeInput;\n /** Inner padding — a number (→ px) or CSS string (\"14px 28px\"). */\n padding?: SizeInput;\n /** Corner radius — a number (→ px) or CSS string (\"8px\", \"500px\"). */\n borderRadius?: SizeInput;\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n };\n\n/**\n * Button Component Props\n * Automatically provides autocomplete for ALL properties (flat and nested)\n */\nexport interface ButtonProps extends ItemComponentProps<ButtonSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific additions\nconst DEFAULT_VALUES = {\n ...ButtonDefaults,\n text: \"Button\", // React convenience — not in schema\n} as unknown as ButtonValues;\n\n/**\n * Button - Universal SSR/Client Component with Automatic Semantic Props\n *\n * ✅ TypeScript provides autocomplete for ALL props (flat and nested)\n * ✅ Works for any nested structure - no configuration needed\n * ✅ Escape hatch: values prop for full control\n * ✅ Works on both server and client\n *\n * @example Flat Props (Simple - most common)\n * ```tsx\n * // `href` accepts a plain URL string (the ergonomic form).\n * <Button href=\"https://example.com\" color=\"white\" backgroundColor=\"#3b82f6\" fontSize=\"16px\">\n * Click me\n * </Button>\n * ```\n *\n * @example Advanced (per-side borders)\n * ```tsx\n * <Button\n * backgroundColor=\"blue\"\n * borderTopColor=\"red\"\n * borderTopWidth=\"2px\"\n * borderBottomWidth=\"0px\"\n * >\n * Click me\n * </Button>\n * ```\n *\n * @example Nested Objects (full control)\n * ```tsx\n * <Button\n * buttonColors={{ backgroundColor: \"#3b82f6\", hoverBackgroundColor: \"#2563eb\" }}\n * border={{ borderTopWidth: \"2px\" }}\n * >\n * Click me\n * </Button>\n * ```\n */\nconst Button = createItemComponent<ButtonValues, ButtonSemanticProps>({\n name: \"Button\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const mapped = mapSemanticProps(\n props as SemanticProps<ButtonValues>,\n DEFAULT_VALUES,\n \"Button\"\n );\n // In Unlayer's model a button's display width is size.width, used only when\n // size.autoWidth is false (otherwise the width is auto / content-sized). So a\n // user-provided width sets autoWidth:false. Read the MAPPED size, which\n // already includes the flat prop, the nested prop, AND the `values` escape\n // hatch; mapSemanticProps does not inject the schema default, so a present\n // size.width means the user set it. Honor an explicit autoWidth.\n const size = (mapped as { size?: unknown }).size;\n if (size && typeof size === \"object\" && !Array.isArray(size)) {\n const s = size as { width?: unknown; autoWidth?: unknown };\n // width accepts a number per SizeInput, but the exporter wants a CSS\n // string — coerce a bare number / unit-less numeric string to px.\n if (typeof s.width === \"number\") {\n s.width = `${s.width}px`;\n } else if (typeof s.width === \"string\" && /^\\d+(?:\\.\\d+)?$/.test(s.width.trim())) {\n s.width = `${s.width.trim()}px`;\n }\n if (s.width !== undefined && s.autoWidth === undefined) {\n s.autoWidth = false;\n }\n }\n return mapped;\n },\n displayName: \"Button\",\n exporters: ButtonExporters,\n});\n\nexport default Button;\n","import { DividerExporters, DividerDefaults } from \"@unlayer/exporters\";\nimport type { DividerValues, BorderInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\ntype DividerSemanticProps = Omit<SemanticProps<DividerValues>, \"border\"> & {\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n};\n\nexport interface DividerProps extends ItemComponentProps<DividerSemanticProps> {}\n\n// Defaults from the editor schema\nconst DEFAULT_VALUES = {\n ...DividerDefaults,\n} as unknown as DividerValues;\n\n/**\n * Divider - Universal SSR/Client Component with Automatic Semantic Props\n *\n * @example Flat Props\n * ```tsx\n * <Divider borderTopWidth=\"2px\" borderTopColor=\"#ccc\" width=\"80%\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Divider values={{\n * border: { borderTopWidth: \"2px\", borderTopColor: \"#ccc\" },\n * width: \"80%\"\n * }} />\n * ```\n */\nconst Divider = createItemComponent<DividerValues, DividerSemanticProps>({\n name: \"Divider\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => mapSemanticProps(props as SemanticProps<DividerValues>, DEFAULT_VALUES, \"Divider\"),\n displayName: \"Divider\",\n exporters: DividerExporters,\n});\n\nexport default Divider;\n","import { HeadingExporters, HeadingDefaults } from \"@unlayer/exporters\";\nimport type { HeadingValues, TextStyleProps, HeadingLevel } from \"../types\";\nimport {\n createItemComponent,\n type ItemComponentProps\n} from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Heading semantic props — agent-friendly text/style types (replacing the loose\n * `any` flat props) plus the `level` alias and h1–h6 levels.\n */\ntype HeadingSemanticProps = Omit<\n SemanticProps<HeadingValues>,\n keyof TextStyleProps | \"headingType\"\n> &\n TextStyleProps & {\n /** Heading level h1–h6. */\n headingType?: HeadingLevel;\n /** Alias for `headingType`. */\n level?: HeadingLevel;\n /** Heading text (or use children). */\n text?: string;\n };\n\n/**\n * Heading Component Props\n * Automatically provides autocomplete for ALL properties (flat and nested)\n */\nexport interface HeadingProps extends ItemComponentProps<HeadingSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific additions\nconst DEFAULT_VALUES = {\n ...HeadingDefaults,\n color: \"#000000\", // Not in schema options but used by renderer\n fontWeight: 400, // Not in schema options but used by renderer\n text: \"Heading\", // React convenience — not in schema\n} as unknown as HeadingValues;\n\n/**\n * Heading - Universal SSR/Client Component with Semantic Props API\n *\n * ✅ Semantic flat props (level, color, fontSize, etc.)\n * ✅ Escape hatch: values prop for full control\n * ✅ Works on both server and client\n * ✅ Minimal boilerplate using component factory\n *\n * @example Semantic Props (Recommended)\n * ```tsx\n * <Heading level=\"h1\" color=\"#222\" fontSize=\"32px\">\n * Welcome\n * </Heading>\n * ```\n *\n * @example Full Control via Values\n * ```tsx\n * <Heading values={{ headingType: \"h1\", color: \"#222\" }}>Welcome</Heading>\n * ```\n */\nconst Heading = createItemComponent<HeadingValues, HeadingSemanticProps>({\n name: \"Heading\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { level, ...rest } = props as SemanticProps<HeadingValues> & { level?: HeadingValues[\"headingType\"] };\n const result = mapSemanticProps(rest as SemanticProps<HeadingValues>, DEFAULT_VALUES, \"Heading\");\n // Map level prop to headingType\n if (level && !result.headingType) {\n result.headingType = level;\n }\n return result;\n },\n displayName: \"Heading\",\n exporters: HeadingExporters,\n});\n\nexport default Heading;\n","import { HtmlExporters, HtmlDefaults } from \"@unlayer/exporters\";\nimport type { HtmlValues } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\nexport interface HtmlProps extends ItemComponentProps<SemanticProps<HtmlValues>> {}\n\n// Defaults from the editor schema\nconst DEFAULT_VALUES = {\n ...HtmlDefaults,\n} as unknown as HtmlValues;\n\n/**\n * Html - Universal SSR/Client Component for custom HTML with Automatic Semantic Props\n *\n * ⚠️ Renders the HTML verbatim — it is NOT sanitized by default. Only pass HTML\n * you trust, and make sure it is valid: notably, an inline SVG inside a `url(...)`\n * must be URL-encoded, because a raw `\"` inside a double-quoted `style=\"…\"`\n * closes the attribute and the rest leaks out as text. To sanitize (matching the\n * editor's HTML block, which strips scripts/event handlers), pass a `toSafeHtml`\n * function via the `UnlayerProvider` config.\n *\n * @example Flat Props\n * ```tsx\n * <Html html=\"<div>Custom HTML</div>\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Html values={{ html: \"<div>Custom HTML</div>\" }} />\n * ```\n */\nconst Html = createItemComponent<HtmlValues, SemanticProps<HtmlValues>>({\n name: \"Html\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => mapSemanticProps(props, DEFAULT_VALUES, \"Html\"),\n displayName: \"Html\",\n exporters: HtmlExporters,\n});\n\nexport default Html;\n","import { ImageExporters, ImageDefaults } from \"@unlayer/exporters\";\nimport type { ImageValues, ImageSrcInput, SizeInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Image semantic props — agent-friendly `src` (plain URL string or value object)\n * and CSS-style sizing (number/px pins, \"50%\" sets a percentage), replacing the\n * loose `any` flat props.\n */\ntype ImageSemanticProps = Omit<\n SemanticProps<ImageValues>,\n \"src\" | \"width\" | \"maxWidth\"\n> & {\n /** Alt text (alias for altText) */\n alt?: string;\n /** Image URL string, or the value object `{ url, width?, maxWidth?, ... }`. */\n src?: ImageSrcInput;\n /** Display width — number/px pins the image; \"50%\" sets a percentage width. */\n width?: SizeInput;\n /** Display width as a CSS value (\"50%\", \"300px\"). */\n maxWidth?: SizeInput;\n};\n\nexport interface ImageProps extends ItemComponentProps<ImageSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific overrides.\n// Drop the schema placeholder's `height` so an image with no explicit dimensions\n// doesn't inherit its 4:1 aspect ratio: the email exporter then omits the `height`\n// attribute (height:auto), letting the real image keep its own ratio instead of\n// being letterboxed (Outlook honors the height attribute). `width` is kept — it\n// drives the responsive display width attribute. Real dimensions, when provided\n// via an object `src`, override these.\nconst { height: _placeholderHeight, ...defaultSrc } = ImageDefaults.src as Record<string, unknown>;\nconst DEFAULT_VALUES = {\n ...ImageDefaults,\n src: {\n ...defaultSrc,\n autoWidth: true,\n maxWidth: \"100%\",\n },\n} as unknown as ImageValues;\n\n/**\n * Image - Renders an image element.\n *\n * @example Shorthand\n * ```tsx\n * <Image src=\"https://example.com/photo.jpg\" alt=\"A photo\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Image values={{\n * src: { url: \"https://example.com/image.jpg\", width: 600 },\n * altText: \"Description\"\n * }} />\n * ```\n */\nconst Image = createItemComponent<ImageValues, ImageSemanticProps>({\n name: \"Image\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n // `width`/`maxWidth` are DISPLAY intent — pull them out so mapSemanticProps\n // can't fold them into the natural-size `src.width` field. They drive\n // autoWidth + maxWidth below; the natural dimensions come only from an\n // object `src` / the loaded image.\n const { alt, src, width: widthProp, maxWidth: maxWidthProp, ...rest } = props;\n\n // Normalize a string `values.src` to { url } before mapping. mapSemanticProps\n // merges flat src props onto the src group by spreading; if the escape-hatch\n // src is a string, spreading it character-spreads the URL into numeric keys\n // ({0:\"h\",1:\"t\",…}) and loses the url. Wrapping it first keeps the merge\n // object-to-object.\n const restValues = (rest as { values?: { src?: unknown } }).values;\n const normalizedRest =\n restValues && typeof restValues.src === \"string\"\n ? { ...rest, values: { ...restValues, src: { url: restValues.src } } }\n : rest;\n\n const base: Partial<ImageValues> = mapSemanticProps(\n normalizedRest as SemanticProps<ImageValues>,\n DEFAULT_VALUES,\n \"Image\"\n );\n\n // Map alt → altText\n if (alt !== undefined) {\n base.altText = alt;\n }\n\n // Build the src value. Note: ImageValues.src is typed as string (codegen\n // bug) but the exporter expects { url, autoWidth?, maxWidth?, width?, ... }.\n // Natural src fields come from the `src` prop (string or object) and the\n // `values.src` escape hatch (which lands on `base.src` via mapSemanticProps);\n // the display `width`/`maxWidth` props were pulled out above. Combine the\n // natural fields (defensively, since base.src may be a string or non-object),\n // then apply the display intent.\n const baseSrc = (base as Record<string, any>).src;\n const fromValues: Record<string, any> =\n baseSrc && typeof baseSrc === \"object\" && !Array.isArray(baseSrc)\n ? (baseSrc as Record<string, any>)\n : typeof baseSrc === \"string\"\n ? { url: baseSrc }\n : {};\n const fromProp: Record<string, any> =\n typeof src === \"string\" ? { url: src } : (src ?? {}) as Record<string, any>;\n const userSrc = { ...fromValues, ...fromProp };\n\n if (src !== undefined || baseSrc !== undefined) {\n // A string url (from the `src` prop or `values.src`) carries no\n // dimensions, so it starts responsive with no placeholder size; an object\n // src starts from the schema defaults.\n const isStringUrl =\n typeof src === \"string\" || (src === undefined && typeof baseSrc === \"string\");\n const start = isStringUrl\n ? { autoWidth: true, maxWidth: \"100%\" }\n : { ...DEFAULT_VALUES.src };\n const merged = { ...start, ...userSrc } as Record<string, any>;\n\n // Display size = autoWidth + maxWidth: the default is responsive\n // (autoWidth:true); a fixed display size is autoWidth:false + `maxWidth` as a\n // PERCENT of the column's content slot (see image-sizing.ts for why a\n // percent, not a raw px). A px/number pin is kept here as a placeholder and\n // converted to that percent by the width-aware pass in renderToHtml /\n // renderToJson, where the column geometry is known.\n //\n // A `width` the author provides — the flat `width` prop OR `src.width`\n // (the documented full-control form) — is treated as that display intent and\n // pins. This is the canonical pinned shape the editor stores, so it survives\n // the round-trip; an `autoWidth` set explicitly on `src` is honored as-is.\n const pctRe = /^\\d+(?:\\.\\d+)?%$/;\n const asPercent = (v: unknown): string | undefined =>\n typeof v === \"string\" && pctRe.test(v.trim()) ? v.trim() : undefined;\n const asPx = (v: unknown): number | undefined => {\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v === \"string\") {\n const t = v.trim();\n if (pctRe.test(t)) return undefined;\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(t);\n if (m) return parseFloat(m[1]);\n }\n return undefined;\n };\n\n // Resolve display intent in priority order: flat `width` → flat `maxWidth`\n // → object src `maxWidth` → object src `width`.\n let displayPct: string | undefined;\n let displayPx: number | undefined;\n for (const candidate of [widthProp, maxWidthProp, userSrc.maxWidth, userSrc.width]) {\n if (candidate === undefined) continue;\n const pct = asPercent(candidate);\n if (pct) {\n displayPct = pct;\n break;\n }\n const px = asPx(candidate);\n if (px != null) {\n displayPx = px;\n break;\n }\n }\n\n // An explicit escape-hatch `autoWidth` is honored as-is (its own maxWidth\n // stays); otherwise the display intent decides.\n if (userSrc.autoWidth === undefined) {\n if (displayPct && displayPct !== \"100%\") {\n merged.autoWidth = false;\n merged.maxWidth = displayPct;\n } else if (displayPx != null) {\n merged.autoWidth = false;\n merged.maxWidth = displayPx;\n } else {\n merged.autoWidth = true;\n merged.maxWidth = \"100%\";\n }\n }\n\n base.src = merged as ImageValues[\"src\"];\n }\n\n return base;\n },\n displayName: \"Image\",\n exporters: ImageExporters,\n});\n\nexport default Image;\n","import { MenuExporters, MenuDefaults } from \"@unlayer/exporters\";\nimport type { MenuValues, MenuItem, SizeInput, TextStyleProps } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n// Menu carries fontFamily/fontWeight/fontSize/letterSpacing (but not color or\n// lineHeight) — relax those to the same agent-friendly inputs Heading/Paragraph\n// use, so a string fontFamily or a number/em size type-checks (normalized at\n// render time). It has no `color` field (uses linkColor/textColor).\ntype MenuSemanticProps = Omit<\n SemanticProps<MenuValues>,\n \"padding\" | \"fontFamily\" | \"fontWeight\" | \"fontSize\" | \"letterSpacing\"\n> &\n Omit<TextStyleProps, \"color\" | \"lineHeight\"> & {\n /** Menu items shorthand */\n items?: MenuItem[];\n /** Inner padding — a number (→ px) or CSS string. */\n padding?: SizeInput;\n };\n\nexport interface MenuProps extends ItemComponentProps<MenuSemanticProps> {}\n\n// Defaults from the editor schema\nconst DEFAULT_MENU: NonNullable<MenuValues[\"menu\"]> = MenuDefaults.menu ?? { items: [] };\n\nconst DEFAULT_VALUES = {\n ...MenuDefaults,\n} as unknown as MenuValues;\n\n/**\n * Menu - Renders a navigation menu.\n *\n * @example Shorthand\n * ```tsx\n * <Menu items={[{ text: \"Home\", href: \"/\" }, { text: \"About\", href: \"/about\" }]} />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Menu values={{\n * menu: {\n * items: [\n * { key: \"home\", text: \"Home\", link: { name: \"web\", values: { href: \"/\" } } }\n * ]\n * }\n * }} />\n * ```\n */\nconst Menu = createItemComponent<MenuValues, MenuSemanticProps>({\n name: \"Menu\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { items, ...rest } = props;\n\n if (Array.isArray(items)) {\n const mapped = items.map((item: MenuItem, i: number) => ({\n key: String(i + 1),\n text: item.text,\n link: {\n name: \"web\",\n values: { href: item.href, target: item.target ?? \"_blank\" },\n },\n }));\n const base: Partial<MenuValues> = mapSemanticProps(\n rest as SemanticProps<MenuValues>,\n DEFAULT_VALUES,\n \"Menu\"\n );\n base.menu = { items: mapped };\n return base;\n }\n\n return mapSemanticProps(\n props as SemanticProps<MenuValues>,\n DEFAULT_VALUES,\n \"Menu\"\n );\n },\n displayName: \"Menu\",\n exporters: MenuExporters,\n});\n\nexport default Menu;\n","import { ParagraphExporters, ParagraphDefaults } from \"@unlayer/exporters\";\nimport type { ParagraphValues, TextStyleProps } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n/**\n * Paragraph semantic props — agent-friendly text/style types (replacing the\n * loose `any` flat props) plus the `text` shorthand (converted to textJson).\n */\ntype ParagraphSemanticProps = Omit<\n SemanticProps<ParagraphValues>,\n keyof TextStyleProps\n> &\n TextStyleProps & {\n /** Plain-text content (or use `html` for inline formatting, or children). */\n text?: string;\n };\n\n/**\n * Paragraph Component Props\n * Automatically provides autocomplete for ALL properties (flat and nested)\n */\nexport interface ParagraphProps extends ItemComponentProps<ParagraphSemanticProps> {}\n\n// Defaults from the editor schema, plus React-specific additions\nconst DEFAULT_VALUES = {\n ...ParagraphDefaults,\n color: \"#000000\", // Not in schema options but used by renderer\n} as unknown as ParagraphValues;\n\n/**\n * Paragraph - Universal SSR/Client Component with Semantic Props API\n *\n * ✅ Semantic flat props (color, fontSize, textAlign, etc.)\n * ✅ Escape hatch: values prop for full control\n * ✅ Works on both server and client\n * ✅ Minimal boilerplate using component factory\n *\n * @example Semantic Props (Recommended)\n * ```tsx\n * <Paragraph color=\"#555\" fontSize=\"14px\" lineHeight=\"1.6\">\n * Your paragraph content here with <strong>rich text</strong> support\n * </Paragraph>\n * ```\n *\n * @example Full Control via Values\n * ```tsx\n * <Paragraph values={{ textJson: \"...\", color: \"#555\" }} />\n * ```\n */\nconst Paragraph = createItemComponent<ParagraphValues, ParagraphSemanticProps>({\n name: \"Paragraph\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) =>\n mapSemanticProps(props as SemanticProps<ParagraphValues>, DEFAULT_VALUES, \"Paragraph\"),\n displayName: \"Paragraph\",\n exporters: ParagraphExporters,\n});\n\nexport default Paragraph;\n","import type { PageBreakValues } from \"../types\";\nimport {\n createItemComponent,\n type ItemComponentProps,\n} from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\nexport type PageBreakProps = ItemComponentProps<SemanticProps<PageBreakValues>>;\n\nconst DEFAULT_VALUES = {\n color: \"#6b7280\",\n} as PageBreakValues;\n\nconst pageBreakExporters = {\n // Page breaks are a document-only concept. Keep the unsupported renderers\n // inert so a component rendered outside <Document> does not throw.\n web: () => \"\",\n email: () => \"\",\n document: () => '<div class=\"u-content-page-break\" aria-hidden=\"true\"></div>',\n};\n\nconst pageBreakHead = {\n css: (\n _values: Record<string, unknown>,\n _bodyValues: Record<string, unknown>,\n meta: { displayMode?: string },\n ) =>\n meta.displayMode === \"document\"\n ? `\n .u-content-page-break {\n break-after: page;\n page-break-after: always;\n }\n `\n : undefined,\n};\n\n/**\n * PageBreak - Forces subsequent document content onto a new PDF page.\n *\n * Page breaks render only in document mode. In email and web output they are\n * intentionally inert.\n */\nconst PageBreak = createItemComponent<\n PageBreakValues,\n SemanticProps<PageBreakValues>\n>({\n name: \"PageBreak\",\n contentType: \"page_break\",\n metaName: \"page_break\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => mapSemanticProps(props, DEFAULT_VALUES, \"PageBreak\"),\n displayName: \"PageBreak\",\n exporters: pageBreakExporters,\n head: pageBreakHead,\n omitEmptyOutput: true,\n});\n\nexport default PageBreak;\n","import { SocialExporters, SocialDefaults } from \"@unlayer/exporters\";\nimport type { SocialValues, SocialIcon, SizeInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\n// `iconSize`/`spacing` are pixel counts the exporter does arithmetic on, so they\n// must reach it as numbers. Accept a number or a px string for DX and coerce in\n// the mapper — a raw \"34px\" would otherwise render `max-width:NaNpx`.\ntype SocialSemanticProps = Omit<SemanticProps<SocialValues>, \"iconSize\" | \"spacing\"> & {\n /** Social icons shorthand (array of {name, url}) */\n icons?: SocialIcon[];\n /** Icon shape */\n iconType?: \"circle\" | \"rounded\" | \"squared\";\n /** Icon size in px — a number (34) or px string (\"34px\"). */\n iconSize?: SizeInput;\n /** Gap between icons in px — a number or px string. */\n spacing?: SizeInput;\n};\n\nexport interface SocialProps\n extends Omit<ItemComponentProps<SemanticProps<SocialValues>>, \"icons\" | \"iconSize\" | \"spacing\"> {\n icons?: SocialIcon[] | SocialValues[\"icons\"];\n iconType?: \"circle\" | \"rounded\" | \"squared\";\n iconSize?: SizeInput;\n spacing?: SizeInput;\n}\n\n// Defaults from the editor schema\nconst DEFAULT_ICONS: SocialValues[\"icons\"] = SocialDefaults.icons ?? { iconType: \"circle\", icons: [] };\n\nconst DEFAULT_VALUES = {\n ...SocialDefaults,\n} as unknown as SocialValues;\n\n/**\n * Social - Renders social-media icon links.\n *\n * @example Shorthand\n * ```tsx\n * <Social icons={[{ name: \"Facebook\", url: \"https://facebook.com\" }]} iconType=\"rounded\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Social values={{\n * icons: { icons: [\n * { name: \"Facebook\", url: \"https://facebook.com/...\" },\n * { name: \"Twitter\", url: \"https://twitter.com/...\" }\n * ]}\n * }} />\n * ```\n */\nconst Social = createItemComponent<SocialValues, SocialSemanticProps>({\n name: \"Social\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { icons, iconType, ...rest } = props;\n\n // The exporter does arithmetic on iconSize/spacing (icon box sizing and the\n // container max-width), so coerce a px string or number down to a number.\n const coerceSizes = (base: Partial<SocialValues>): Partial<SocialValues> => {\n for (const key of [\"iconSize\", \"spacing\"] as const) {\n const v = (base as Record<string, unknown>)[key];\n if (typeof v === \"string\") {\n // px count only — a non-px unit (\"50%\", \"1.5em\") is invalid here, so\n // drop it and let mergeValues fall back to the schema default.\n const m = /^(\\d+(?:\\.\\d+)?)(?:px)?$/.exec(v.trim());\n if (m) (base as Record<string, unknown>)[key] = parseFloat(m[1]);\n else delete (base as Record<string, unknown>)[key];\n }\n }\n return base;\n };\n\n // Map shorthand icons array → exporter format\n if (Array.isArray(icons)) {\n const mapped = icons.map((icon: SocialIcon) => ({\n name: icon.name,\n url: icon.url,\n }));\n const base: Partial<SocialValues> = mapSemanticProps(\n rest as SemanticProps<SocialValues>,\n DEFAULT_VALUES,\n \"Social\"\n );\n base.icons = {\n iconType: iconType ?? base.icons?.iconType ?? \"circle\",\n icons: mapped,\n };\n return coerceSizes(base);\n }\n\n // If iconType passed without shorthand icons, thread it into nested group\n if (iconType !== undefined) {\n const base: Partial<SocialValues> = mapSemanticProps(\n rest as SemanticProps<SocialValues>,\n DEFAULT_VALUES,\n \"Social\"\n );\n base.icons = { ...DEFAULT_ICONS, ...base.icons, iconType };\n return coerceSizes(base);\n }\n\n return coerceSizes(\n mapSemanticProps(props as SemanticProps<SocialValues>, DEFAULT_VALUES, \"Social\")\n );\n },\n displayName: \"Social\",\n exporters: SocialExporters,\n});\n\nexport default Social;\n","import { TableExporters, TableDefaults } from \"@unlayer/exporters\";\nimport type { TableValues, SizeInput, BorderInput } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\ntype TableSemanticProps = Omit<SemanticProps<TableValues>, \"padding\" | \"border\"> & {\n /** Column headers as string[] */\n headers?: string[];\n /** Row data as 2D string array */\n data?: string[][];\n /** Inner padding — a number (→ px) or CSS string. */\n padding?: SizeInput;\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n};\n\nexport interface TableProps\n extends Omit<ItemComponentProps<Omit<SemanticProps<TableValues>, \"padding\" | \"border\">>, \"headers\" | \"data\"> {\n headers?: string[];\n data?: string[][];\n /** Inner padding — a number (→ px) or CSS string. */\n padding?: SizeInput;\n /** Per-side border object (width fields accept a number/px string). */\n border?: BorderInput;\n}\n\n// Defaults from the editor schema, plus table data structure\nconst DEFAULT_TABLE: NonNullable<TableValues[\"table\"]> = { headers: [], rows: [], footers: [] };\n\nconst DEFAULT_VALUES = {\n ...TableDefaults,\n table: DEFAULT_TABLE, // Schema doesn't include table data structure\n} as unknown as TableValues;\n\n/**\n * Table - Renders a data table.\n *\n * @example Shorthand\n * ```tsx\n * <Table\n * headers={[\"Name\", \"Email\", \"Role\"]}\n * data={[[\"Alice\", \"alice@co.com\", \"Admin\"], [\"Bob\", \"bob@co.com\", \"User\"]]}\n * />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Table values={{\n * table: {\n * headers: [{ cells: [{ text: \"Name\" }, { text: \"Email\" }] }],\n * rows: [{ cells: [{ text: \"John\" }, { text: \"john@example.com\" }] }]\n * },\n * enableHeader: true\n * }} />\n * ```\n */\nconst Table = createItemComponent<TableValues, TableSemanticProps>({\n name: \"Table\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n // `columns`/`rows` are top-level COUNTS, but the table data lives under the\n // nested `table` group whose keys also include `rows` — so routing the flat\n // `rows` through the generic mapper collides with `table.rows` and makes the\n // exporter iterate a number (crash). Pull them out and handle them here.\n const { headers, data, columns, rows, ...rest } = props as typeof props & {\n columns?: number;\n rows?: number;\n };\n\n if (\n headers ||\n data ||\n typeof columns === \"number\" ||\n typeof rows === \"number\"\n ) {\n const base: Partial<TableValues> = mapSemanticProps(\n rest as SemanticProps<TableValues>,\n DEFAULT_VALUES,\n \"Table\"\n );\n\n const colCount = headers\n ? headers.length\n : typeof columns === \"number\"\n ? columns\n : data?.[0]?.length ?? 0;\n const blankCells = (n: number) =>\n Array.from({ length: n }, () => ({ text: \"\", width: 0 }));\n\n const tableHeaders = headers\n ? [{ cells: headers.map((text: string) => ({ text, width: 0 })), height: 0 }]\n : [];\n\n const tableRows = data\n ? data.map((row: string[]) => ({\n cells: row.map((text: string) => ({ text, width: 0 })),\n height: 0,\n }))\n : typeof rows === \"number\"\n ? // No data: build an empty grid sized by `columns` × `rows`.\n Array.from({ length: rows }, () => ({\n cells: blankCells(colCount),\n height: 0,\n }))\n : [];\n\n base.table = { headers: tableHeaders, rows: tableRows, footers: [] };\n\n if (headers || typeof columns === \"number\") {\n base.columns = colCount;\n }\n if (headers) {\n base.enableHeader = true;\n }\n if (data) {\n base.rows = data.length;\n } else if (typeof rows === \"number\") {\n base.rows = rows;\n }\n\n return base;\n }\n\n return mapSemanticProps(\n props as SemanticProps<TableValues>,\n DEFAULT_VALUES,\n \"Table\"\n );\n },\n displayName: \"Table\",\n exporters: TableExporters,\n});\n\nexport default Table;\n","import { VideoExporters, VideoDefaults } from \"@unlayer/exporters\";\nimport type { VideoValues } from \"../types\";\nimport { createItemComponent, type ItemComponentProps } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\n\ntype VideoSemanticProps = SemanticProps<VideoValues> & {\n /** YouTube/Vimeo URL (auto-parsed) */\n videoUrl?: string;\n};\n\nexport interface VideoProps extends ItemComponentProps<SemanticProps<VideoValues>> {\n videoUrl?: string;\n}\n\n// Defaults from the editor schema, plus React-specific video structure\nconst DEFAULT_VIDEO: NonNullable<VideoValues[\"video\"]> = {\n type: \"youtube\",\n videoId: \"\",\n thumbnail: \"\",\n loading: false,\n ...VideoDefaults.video,\n};\n\nconst DEFAULT_VALUES = {\n ...VideoDefaults,\n video: DEFAULT_VIDEO,\n} as unknown as VideoValues;\n\n/**\n * Parses a YouTube or Vimeo URL and returns exporter-ready video data.\n */\nexport function parseVideoUrl(url: string): { type: \"youtube\" | \"vimeo\"; videoId: string; thumbnail: string } | null {\n // YouTube: youtube.com/watch?v=ID, youtu.be/ID, youtube.com/embed/ID\n const ytMatch = url.match(\n /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/\n );\n if (ytMatch) {\n const videoId = ytMatch[1];\n return {\n type: \"youtube\",\n videoId,\n thumbnail: `https://img.youtube.com/vi/${videoId}/0.jpg`,\n };\n }\n\n // Vimeo: vimeo.com/ID\n const vimeoMatch = url.match(/vimeo\\.com\\/(\\d+)/);\n if (vimeoMatch) {\n return {\n type: \"vimeo\",\n videoId: vimeoMatch[1],\n thumbnail: \"\",\n };\n }\n\n return null;\n}\n\n/**\n * Video - Renders an embedded video player (YouTube/Vimeo).\n *\n * @example Shorthand\n * ```tsx\n * <Video videoUrl=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\" />\n * ```\n *\n * @example Full Control\n * ```tsx\n * <Video values={{\n * video: { type: \"youtube\", videoId: \"dQw4w9WgXcQ\", thumbnail: \"...\" }\n * }} />\n * ```\n */\nconst Video = createItemComponent<VideoValues, VideoSemanticProps>({\n name: \"Video\",\n defaultValues: DEFAULT_VALUES,\n propMapper: (props) => {\n const { videoUrl, ...rest } = props;\n\n if (typeof videoUrl === \"string\") {\n const parsed = parseVideoUrl(videoUrl);\n const base: Partial<VideoValues> = mapSemanticProps(\n rest as SemanticProps<VideoValues>,\n DEFAULT_VALUES,\n \"Video\"\n );\n if (parsed) {\n base.video = { ...DEFAULT_VIDEO, ...parsed };\n }\n return base;\n }\n\n return mapSemanticProps(\n props as SemanticProps<VideoValues>,\n DEFAULT_VALUES,\n \"Video\"\n );\n },\n displayName: \"Video\",\n exporters: VideoExporters,\n});\n\nexport default Video;\n","/**\n * Default values for container components (Body, Row, Column).\n *\n * Runtime values come from @unlayer/exporters (extracted from the editor\n * schema at generation time). Types come from @unlayer/types\n * (generated from the same schema). Both are single source of truth.\n *\n * Imported by both render-to-json.ts and extract-head.ts to ensure the\n * JSON output and head CSS always use consistent defaults.\n */\n\nimport {\n BodyDefaults,\n RowDefaults,\n ColumnDefaults,\n} from \"@unlayer/exporters\";\nimport type { BodyValues, RowValues, ColumnValues } from \"@unlayer-internal/shared-elements\";\n\n// Body defaults from the editor schema.\n// Filter out popup-specific fields that aren't relevant for email/web rendering.\nconst allBodyDefaults = BodyDefaults as Record<string, any>;\nconst {\n popupPosition: _p1,\n popupDisplayDelay: _p2,\n popupWidth: _p3,\n popupHeight: _p4,\n popupBackgroundColor: _p5,\n popupBackgroundImage: _p6,\n popupOverlay_backgroundColor: _p7,\n popupCloseButton_position: _p8,\n popupCloseButton_backgroundColor: _p9,\n popupCloseButton_iconColor: _p10,\n popupCloseButton_borderRadius: _p11,\n popupCloseButton_margin: _p12,\n popupCloseButton_action: _p13,\n ...bodyRest\n} = allBodyDefaults;\n\nexport const BODY_DEFAULTS = bodyRest as BodyValues;\n\nexport const ROW_DEFAULTS = { ...RowDefaults } as RowValues;\n\nexport const COLUMN_DEFAULTS = { ...ColumnDefaults } as ColumnValues;\n","/**\n * One render's scope (renderToHtml, renderToJson, …): what it works out once,\n * like a template's collected render, is reused for the rest of it and never\n * by the next render (an element kept between renders may read other data).\n */\nimport { escapeKeepingTags } from \"@unlayer-internal/shared-elements\";\nimport { within } from \"./collect\";\nimport { withBuild } from \"./server-renderer\";\n\nlet scoped: WeakMap<object, unknown> | undefined;\n\n/** `make()`'s result for `key`, worked out once per render (each time outside one). */\nexport function scopeCache<T>(key: object, make: () => T): T {\n if (!scoped) return make();\n if (!scoped.has(key)) scoped.set(key, make());\n return scoped.get(key) as T;\n}\n\n/**\n * Runs one render with its own scope (a render inside another shares it), apart from a template being\n * collected: called inside a component of one (a block rendered to a string), it renders what it's given.\n */\nexport function withRenderScope<T>(render: () => T, own = false): T {\n // Called in a render (a component of the user's own calling renderToJson in its useMemo, while Elements or the app\n // renders it), it renders with a server build that isn't rendering (see server-renderer.ts).\n const scope = () => {\n if (scoped) return render();\n scoped = new WeakMap();\n try {\n return render();\n } finally {\n scoped = undefined;\n }\n };\n // The build is chosen first: whether a template is being collected tells who calls it.\n // `own`: from Elements' own component, which calls no hooks after (see withBuild).\n return withBuild(() => within(null, scope), own);\n}\n\n/**\n * Text placed straight in a Row or Column, as HTML: escaped, as React shows\n * text (raw HTML goes in an Html block). The editor has no place for it, so\n * the warning says where it belongs.\n */\nconst warnedLoose = new Set<string>();\n\nexport function looseText(child: string | number, container: string): string {\n const text = String(child);\n // Said once per container, not on every render.\n if (text.trim() && !warnedLoose.has(container)) {\n warnedLoose.add(container);\n console.warn(`${container}: text placed straight in a ${container} shows as text and isn't kept in the editor's design. Put it in a <Paragraph>, or HTML in an <Html> block.`);\n }\n // An email service's `<%name%>` tag stays as written, as in other text.\n return escapeKeepingTags(text, true);\n}\n","import React from \"react\";\nimport type { RenderMode, UnlayerConfig, RowValues } from \"@unlayer-internal/shared-elements\";\nimport { validateColumnLayout } from \"@unlayer-internal/shared-elements\";\nimport type { ColumnLayout } from \"@unlayer-internal/shared-elements\";\nimport { RowExporters } from \"@unlayer/exporters\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\nimport { nextHtmlId, safeMeta } from \"../utils/create-component\";\nimport { bodyContentWidthPx } from \"../utils/image-sizing\";\nimport type { DeviceProps, SizeInput } from \"../types\";\nimport { ROW_DEFAULTS, BODY_DEFAULTS } from \"../utils/container-defaults\";\nimport { looseText } from \"../utils/render-scope\";\nimport { collecting, RECORDS } from \"../utils/collect\";\nimport { recordContainer, whileCollecting } from \"../utils/record\";\n\n/**\n * Row - Container for columns in a layout\n *\n * Uses the Row exporter from @unlayer/exporters.\n * Column children call their own exporters.\n *\n * @example\n * ```tsx\n * <Row cells={[1, 1]}>\n * <Column><Button>Click me</Button></Column>\n * <Column><Paragraph>Hello</Paragraph></Column>\n * </Row>\n * ```\n */\n\nconst DEFAULT_VALUES = ROW_DEFAULTS;\n\nconst DEFAULT_BODY_VALUES = BODY_DEFAULTS;\n\nexport type RowProps = Omit<SemanticProps<RowValues>, \"padding\" | keyof DeviceProps> & DeviceProps & {\n children?: React.ReactNode;\n layout?: ColumnLayout;\n cells?: number[];\n mode?: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n index?: number;\n bodyValues?: any;\n collection?: string;\n /** Padding — a CSS string (\"0 48px\", \"20px 40px\") or a number (px). */\n padding?: SizeInput;\n /** @internal - Unlayer config threaded from UnlayerProvider via Body */\n _config?: UnlayerConfig;\n};\n\n// ============================================\n// Grid CSS (inlined from shared/utils/grid-css.ts)\n// ============================================\n\ninterface WidthPercentage {\n value: number;\n className: string;\n}\n\nfunction getWidthPercentages(cells: number[]): WidthPercentage[] {\n if (cells.length === 0) return [];\n const total = cells.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n return cells.map((span) => {\n const value = Math.round((span / total) * 100 * 100) / 100;\n const className = `${value}`.replace(/\\./g, 'p');\n return { value, className };\n });\n}\n\nfunction generateGridCSS(cells: number[], mode: RenderMode, contentWidth: number = 600, mobileBreakpoint: number = 480): string {\n const widths = getWidthPercentages(cells);\n\n if (mode === 'email') {\n const minQuery = `@media only screen and (min-width: ${contentWidth + 20}px)`;\n const maxQuery = `@media only screen and (max-width: ${contentWidth + 20}px)`;\n // Every Row writes this block, so a later row's `.u-row .u-col` rules\n // would override an earlier row's `.no-stack` ones of equal specificity:\n // `.u-row.no-stack` outranks them wherever it comes.\n\n return `\n${minQuery} {\n .u-row { width: ${contentWidth}px !important; }\n .u-row .u-col { vertical-align: top; }\n${widths.map(({ value, className }) => ` .u-row .u-col-${className} { width: ${Math.round((contentWidth * value) / 100)}px !important; }`).join('\\n')}\n}\n\n${maxQuery} {\n .u-row-container { max-width: 100% !important; padding-left: 0px !important; padding-right: 0px !important; }\n .u-row { width: 100% !important; }\n .u-row .u-col { display: block !important; width: 100% !important; min-width: 320px !important; max-width: 100% !important; }\n .u-row .u-col > div { margin: 0 auto; }\n .u-row.no-stack .u-col { min-width: 0 !important; display: table-cell !important; }\n${widths.map(({ value, className }) => ` .u-row.no-stack .u-col-${className} { width: ${value}% !important; }`).join('\\n')}\n}`;\n }\n\n // Web mode\n const baseCSS = `\n.u-row {\n display: flex;\n flex-wrap: nowrap;\n margin-left: 0;\n margin-right: 0;\n}\n.u-row .u-col {\n position: relative;\n width: 100%;\n padding-right: 0;\n padding-left: 0;\n}`;\n\n const columnCSS = widths\n .map(\n ({ value, className }) =>\n `.u-row .u-col.u-col-${className} { flex: 0 0 ${value}%; max-width: ${value}%; }`,\n )\n .join('\\n');\n\n // Flex rows stack by wrapping: below the mobile breakpoint the row allows\n // wrapping and each column's flex-basis grows to the full width. Block or\n // width overrides can't stack flex items — flex-basis governs their size.\n // `.no-stack` rows keep a single line; print/document output never stacks.\n // .container is scoped under .u_row: Elements output embeds into host\n // pages where bare .container (Bootstrap et al.) would collide.\n const responsiveCSS = mode === \"document\" ? \"\" : `\n@media (max-width: ${mobileBreakpoint}px) {\n .u_row .container { max-width: 100% !important; }\n .u-row:not(.no-stack) { flex-wrap: wrap; }\n .u-row:not(.no-stack) .u-col {\n flex: 0 0 100% !important;\n max-width: 100% !important;\n }\n}`;\n\n return baseCSS + '\\n' + columnCSS + '\\n' + responsiveCSS;\n}\n\n// ============================================\n// Row exporter wrapper (inlined from shared/utils/render-container-to-html.ts)\n// ============================================\n\ntype ContainerExporterFunction = (innerHTML: string, values: Record<string, any>, bodyValues?: Record<string, any>, options?: Record<string, any>) => string;\n\n/**\n * Resolve the row's content width (px number) from body values. contentWidth\n * may be \"600px\" (string), 600 (number), or \"600\" (bare numeric string); the\n * grid CSS needs a number. In EMAIL mode this drives the per-column desktop\n * widths and the stacking breakpoint — so without it, multi-column emails were\n * pinned to 600px regardless of <Body contentWidth>. Web mode uses percentages,\n * so this is a no-op there.\n *\n * Uses the same strict px parse as the image slot geometry (a non-px value like\n * \"50%\" → fallback, not a parseInt artifact like 50) so the two stay in sync.\n */\nfunction toContentWidthPx(bodyValues: any, fallback = 500): number {\n return bodyContentWidthPx(bodyValues?.contentWidth, fallback);\n}\n\nfunction renderRowToHtml(innerHTML: string, values: any, bodyValues: any, mode: RenderMode, cells: number[], collection: string = \"rows\"): string {\n const rowExporter = (RowExporters[mode] || RowExporters.web) as ContainerExporterFunction;\n const html = rowExporter(innerHTML, values, bodyValues, {\n collection,\n variant: mode,\n });\n\n const contentWidth = toContentWidthPx(bodyValues);\n const css = generateGridCSS(cells, mode, contentWidth);\n return css ? `<style>${css}</style>${html}` : html;\n}\n\n// ============================================\n// Children processing\n// ============================================\n\nfunction processChildren(\n children: React.ReactNode,\n cells: number[],\n bodyValues: any,\n rowValues: any,\n mode: RenderMode,\n _config?: UnlayerConfig\n): string {\n if (!children) return \"\";\n\n let innerHTML = \"\";\n const childrenArray = React.Children.toArray(children);\n // Each Column's place among the Columns: markup or text beside them (an Outlook comment, a wrapper the Row says\n // isn't a Column) takes none, or the Columns after it got no cell (`width=\"NaN\"`).\n let index = 0;\n\n childrenArray.forEach((child) => {\n if (!React.isValidElement(child)) {\n if (typeof child === \"string\" || typeof child === \"number\") {\n innerHTML += looseText(child, \"Row\");\n }\n return;\n }\n\n const componentType = child.type as any;\n const isColumn =\n componentType?.displayName === \"Column\" ||\n componentType?.name === \"Column\";\n\n if (isColumn && typeof child.type === \"function\") {\n // Call Column component with context props\n const rendered = (child.type as Function)({\n ...child.props,\n index: index++,\n cells,\n bodyValues,\n rowValues,\n mode,\n _config\n });\n\n // Extract HTML from dangerouslySetInnerHTML\n if (rendered?.props?.dangerouslySetInnerHTML?.__html) {\n innerHTML += rendered.props.dangerouslySetInnerHTML.__html;\n }\n } else if (React.isValidElement(child)) {\n const name = (child.type as any)?.displayName || (child.type as any)?.name || \"Unknown\";\n console.warn(\n `Row: <${name}> is not a valid Row child. Only <Column> components can be direct children of <Row>. ` +\n `Wrap it in a <Column>: <Row><Column><${name} /></Column></Row>`\n );\n }\n });\n\n return innerHTML;\n}\n\n// ============================================\n// Component\n// ============================================\n\nfunction renderRow(props: RowProps): React.ReactElement | null {\n const {\n layout,\n cells: propsCells,\n children,\n mode: modeProp,\n className,\n style,\n index = 0,\n bodyValues = {},\n collection = \"rows\",\n _config,\n ...semanticProps\n } = props;\n\n // Resolve mode: explicit prop > _config > default\n const mode: RenderMode = modeProp ?? _config?.mode ?? \"web\";\n\n // Determine cells from layout or props. With neither, default to one equal\n // cell PER <Column> child (mirroring renderToJson) — `[1]` regardless of column\n // count left the 2nd/3rd column with no cell, rendering width=\"NaN\".\n // Its Columns, as React rendered them (see normalize.tsx).\n const columnCount = React.Children.toArray(children).filter(\n (c) => React.isValidElement(c) && /^Column$/.test((c.type as any)?.displayName || (c.type as any)?.name || \"\")\n ).length;\n let cells: number[];\n if (layout) {\n // The Columns as rendered, or as written (a condition's place included, as 0.1.22 counted them): either fits it.\n if (columnCount !== layout.expectedColumns) validateColumnLayout(layout, React.Children.count(children));\n cells = layout.cells;\n } else if (propsCells) {\n cells = propsCells;\n } else {\n cells = Array(Math.max(1, columnCount)).fill(1);\n }\n\n // Merge body values with defaults\n const safeBodyValues = { ...DEFAULT_BODY_VALUES, ...bodyValues };\n\n // Map semantic props to values\n const values = mapSemanticProps<RowValues>(\n semanticProps as SemanticProps<RowValues>,\n DEFAULT_VALUES,\n \"Row\"\n );\n\n const valuesWithMeta = { ...values, cells, _meta: safeMeta({ htmlID: nextHtmlId(_config, \"u_row\"), htmlClassNames: \"u_row\", ...(values._meta || {}) }) };\n\n // Process Column children\n const innerHTML = processChildren(\n children,\n cells,\n safeBodyValues,\n valuesWithMeta,\n mode,\n _config\n );\n\n try {\n const html = renderRowToHtml(innerHTML, valuesWithMeta, safeBodyValues, mode, cells, collection);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={className}\n style={style}\n />\n );\n } catch (error) {\n console.error(\"Row rendering failed:\", error);\n return (\n <div className={className} style={style}>\n {children}\n </div>\n );\n }\n}\n\n// While a template is collected, a Row records itself (see normalize.tsx); then it renders the collected tree.\nconst Row: React.FC<RowProps> = (props) =>\n collecting() ? whileCollecting(() => recordContainer(\"row\", props), () => renderRow(props), \"Row\") : renderRow(props);\n\nRow.displayName = \"Row\";\n(Row as unknown as Record<symbol, boolean>)[RECORDS] = true;\n\nexport default Row;\n","import React from \"react\";\nimport type { RenderMode, UnlayerConfig, ColumnValues } from \"@unlayer-internal/shared-elements\";\nimport { ColumnExporters, ContentExporters } from \"@unlayer/exporters\";\nimport { UNLAYER_RENDER_KEY, UNLAYER_CONFIG_KEY, nextHtmlId, safeName, safeMeta } from \"../utils/create-component\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\nimport type { DeviceProps, SizeInput, BorderInput } from \"../types\";\nimport { COLUMN_DEFAULTS } from \"../utils/container-defaults\";\nimport { looseText } from \"../utils/render-scope\";\nimport { collecting, RECORDS } from \"../utils/collect\";\nimport { recordContainer, whileCollecting } from \"../utils/record\";\nimport { DEFAULT_CONTAINER_PADDING } from \"../utils/image-sizing\";\n\n/** Unlayer's default content-block padding when a block sets none. */\n\n/**\n * Column - Single column in a Row layout\n *\n * Calls the Column exporter from @unlayer/exporters.\n * Must be used inside <Row> component.\n *\n * @example\n * ```tsx\n * <Row cells={[1, 1]}>\n * <Column>\n * <Button>Click me</Button>\n * </Column>\n * <Column>\n * <Paragraph>Hello</Paragraph>\n * </Column>\n * </Row>\n * ```\n */\n\nconst DEFAULT_VALUES = COLUMN_DEFAULTS;\n\n// ============================================\n// Column exporter wrapper (inlined from shared/utils/render-container-to-html.ts)\n// ============================================\n\ntype ColumnExporterFunction = (innerHTML: string, values: Record<string, any>, index: number, cells: number[], bodyValues?: Record<string, any>, rowValues?: Record<string, any>) => string;\n\nfunction renderColumnToHtml(innerHTML: string, values: any, index: number, cells: number[], bodyValues: any, rowValues: any, mode: RenderMode): string {\n const columnExporter = (ColumnExporters[mode] || ColumnExporters.web) as ColumnExporterFunction;\n return columnExporter(innerHTML, values, index, cells, bodyValues, rowValues);\n}\n\n// Canonical content-container wrapper (the `u_content_*` block that carries\n// each item's containerPadding). Signature per mode: (innerHTML, values,\n// bodyValues, meta). Delegating to the exporter keeps padding, classes, and the\n// per-mode div/table structure consistent with the canonical exporter output.\ntype ContentExporterFunction = (innerHTML: string, values: Record<string, any>, bodyValues?: Record<string, any>, meta?: Record<string, any>) => string;\n\nfunction renderContentToHtml(innerHTML: string, values: any, bodyValues: any, mode: RenderMode): string {\n const contentExporter = (ContentExporters[mode] || ContentExporters.web) as ContentExporterFunction;\n return contentExporter(innerHTML, values, bodyValues, {});\n}\n\n// ============================================\n// Component\n// ============================================\n\n// The editor hides rows and content on a device, never a column: no hideOnMobile/hideOnDesktop here.\nexport type ColumnProps = Omit<SemanticProps<ColumnValues>, \"padding\" | \"border\" | \"borderRadius\" | keyof DeviceProps> & Omit<DeviceProps, \"hideOnMobile\" | \"hideOnDesktop\"> & {\n children?: React.ReactNode;\n // Internal props (provided by Row)\n index?: number;\n cells?: number[];\n bodyValues?: any;\n rowValues?: any;\n mode?: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n /** Padding — a CSS string (\"0 24px\", \"10px\") or a number (px). */\n padding?: SizeInput;\n /** Corner radius — a number (→ px) or CSS string (\"8px\"). */\n borderRadius?: SizeInput;\n /** Per-side border object (great for hairline dividers). Width fields accept\n * a number/px string; reuse it as a factored-out const without `as const`. */\n border?: BorderInput;\n /** @internal - Unlayer config threaded from UnlayerProvider via Body/Row */\n _config?: UnlayerConfig;\n};\n\nexport const Column: React.FC<ColumnProps> = (props) => {\n if (collecting()) return whileCollecting(() => recordContainer(\"column\", props), () => Column(props), \"Column\");\n const {\n children,\n index = 0,\n cells = [1],\n bodyValues = {},\n rowValues = {},\n mode: modeProp,\n className,\n style,\n _config,\n ...semanticProps\n } = props;\n\n // Resolve mode: explicit prop > _config > default\n const mode: RenderMode = modeProp ?? _config?.mode ?? \"web\";\n\n // Map semantic props to values\n const values = mapSemanticProps<ColumnValues>(\n semanticProps as SemanticProps<ColumnValues>,\n DEFAULT_VALUES,\n \"Column\"\n );\n\n // Add _meta (an id or class names given in values kept to what they can hold, as for rows and blocks)\n const valuesWithMeta = { ...values, _meta: safeMeta({ htmlID: nextHtmlId(_config, \"u_column\"), htmlClassNames: \"u_column\", ...(values._meta || {}) }) };\n\n // Render children to HTML - extract from dangerouslySetInnerHTML\n let innerHTML = \"\";\n if (children) {\n try {\n const childrenArray = React.Children.toArray(children);\n\n childrenArray.forEach((child, childIndex) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n innerHTML += looseText(child, \"Column\");\n } else if (React.isValidElement(child)) {\n // Call component function to get rendered result\n if (typeof child.type === \"function\") {\n const ComponentType = child.type as any;\n // Use __unlayerRender (hook-free) if available, otherwise call directly\n const renderFn: Function = ComponentType[UNLAYER_RENDER_KEY] || ComponentType;\n // Allocate the content id BEFORE rendering and thread it in, so\n // the value-level _meta.htmlID exporters see (custom tool head\n // css scopes on it) is unique per instance and matches both the\n // wrapper id and the head-extraction/json numbering. Custom\n // tools carry an explicit meta base (custom_<slug>); built-ins\n // derive it from the component name.\n const componentName =\n ComponentType?.[UNLAYER_CONFIG_KEY]?.metaName ??\n (\n ComponentType?.displayName ||\n ComponentType?.name ||\n \"component\"\n ).toLowerCase();\n const contentHtmlId = nextHtmlId(_config, `u_content_${componentName}`);\n // Thread the column/body context so width-aware item exporters (Image)\n // can size against the real available width (contentWidth × column\n // fraction) instead of the fallback. Mirrors the editor, which passes\n // this context to the content exporters.\n const rendered = renderFn({\n ...child.props,\n _config,\n _metaHtmlId: contentHtmlId,\n colIndex: index,\n cells,\n bodyValues,\n rowValues,\n columnValues: valuesWithMeta,\n });\n\n // Extract HTML from dangerouslySetInnerHTML\n if (\n rendered &&\n typeof rendered === \"object\" &&\n rendered.props &&\n rendered.props.dangerouslySetInnerHTML\n ) {\n const componentHTML =\n rendered.props.dangerouslySetInnerHTML.__html;\n\n // Some components intentionally produce no output in unsupported\n // modes. Do not turn that into a padded content wrapper.\n if (\n !componentHTML &&\n ComponentType?.[UNLAYER_CONFIG_KEY]?.omitEmptyOutput\n ) return;\n\n // Resolve the block's OWN containerPadding directly from props.\n // `containerPadding` is a universal base-content prop: it passes\n // straight through mapSemanticProps untouched and is not present in\n // any item's defaultValues, so reading it from props (flat prop +\n // `values` escape hatch) is equivalent to running the item's full\n // value pipeline — without paying for a second propMapper call per\n // child (for Paragraph that re-runs the Lexical textJson convert).\n // Falls back to Unlayer's content default. (Previously this read\n // `child.props.values?.containerPadding` only, which is undefined\n // for the flat-prop API, so every block collapsed to 0px padding.)\n const childProps = child.props as {\n containerPadding?: string | number;\n mobile?: { containerPadding?: string | number };\n hideOnMobile?: boolean;\n hideOnDesktop?: boolean;\n values?: { containerPadding?: string | number; _override?: Record<string, any>; _meta?: Record<string, any> };\n };\n const rawContainerPadding =\n childProps.containerPadding ??\n childProps.values?.containerPadding ??\n DEFAULT_CONTAINER_PADDING;\n // A bare number is treated as px (same idiom as other size props).\n const containerPadding =\n typeof rawContainerPadding === \"number\"\n ? `${rawContainerPadding}px`\n : rawContainerPadding;\n\n // A custom tool's props are its own values, as in 0.1.22: a `hideOnMobile` of its own isn't a device setting.\n const device = ComponentType?.[UNLAYER_CONFIG_KEY]?.contentType === \"custom\" ? {} : childProps;\n\n // Wrap via the canonical content-container exporter for this mode.\n const contentValues = {\n containerPadding,\n _override: {\n ...childProps.values?._override,\n mobile: { ...childProps.values?._override?.mobile,\n ...(device.hideOnMobile !== undefined ? { hideMobile: device.hideOnMobile } : {}),\n },\n desktop: { ...childProps.values?._override?.desktop,\n ...(device.hideOnDesktop !== undefined ? { hideDesktop: device.hideOnDesktop } : {}),\n },\n },\n _meta: {\n htmlID: contentHtmlId,\n htmlClassNames: `u_content_${componentName}`,\n ...(childProps.values?._meta?.htmlID ? { htmlID: safeName(childProps.values._meta.htmlID) } : {}),\n },\n };\n innerHTML += renderContentToHtml(\n componentHTML,\n contentValues,\n bodyValues,\n mode\n );\n } else if (rendered) {\n const name = (child.type as any)?.displayName || (child.type as any)?.name || \"Unknown\";\n console.warn(\n `Column: <${name}> did not produce renderable HTML. ` +\n `Ensure it is an Unlayer component (Button, Text, Image, etc.).`\n );\n }\n }\n }\n });\n } catch (error) {\n console.error(\"Column: Failed to render children:\", error);\n innerHTML = \"\";\n }\n }\n\n try {\n const html = renderColumnToHtml(innerHTML, valuesWithMeta, index, cells, bodyValues, rowValues, mode);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={className}\n style={style}\n />\n );\n } catch (error) {\n console.error(\"Column rendering failed:\", error);\n return (\n <div className={className} style={style}>\n {children}\n </div>\n );\n }\n};\n\nColumn.displayName = \"Column\";\n(Column as unknown as Record<symbol, boolean>)[RECORDS] = true;\n\nexport default Column;\n","/**\n * A template's Rows, Columns and blocks, as React renders them: one render\n * collects them (see collect.ts and record.tsx), with the user's components,\n * Fragments, conditions, hooks and Context handled by React itself. What it\n * gives back is the template as Elements components only (Email > Row >\n * Column > blocks), which the HTML, the head and the design are then made\n * from, so they can't disagree.\n *\n * What a template puts among them that isn't one keeps what it did before:\n * markup among the rows is kept as it is; text in a Row or Column shows as\n * text (with a warning); a component of the user's own that renders markup in\n * a Column is an HTML block named after it; other markup in a Row or Column is\n * left out. A component that throws, suspends or is async is left out, with a\n * message, and the rest renders.\n */\nimport React from \"react\";\nimport { renderToStaticMarkup, renderToString } from \"./server-renderer\";\nimport { COLLECTING_ID, MARK, within, type Collection, type Recorded } from \"./collect\";\nimport { guard } from \"./record\";\nimport { callIsolated, FORWARD_REF, isAsyncComponent, isThenable, MEMO } from \"./unwrap-root\";\nimport { scopeCache } from \"./render-scope\";\nimport Row from \"../components/Row\";\nimport Column from \"../components/Column\";\nimport Html from \"../components/Html\";\n\n/**\n * On markup a component of the user's own rendered in a Column (see `keptMarkup`): the Html block the design\n * keeps it as. The HTML numbers it after the component, and the head counts it so too.\n */\nexport const KEPT = Symbol.for(\"@unlayer/react-elements/kept\");\n\ntype Within = { at: number; children: Node[] };\ntype Node =\n | { kind: \"raw\"; html: string }\n | ({ kind: \"block\" } | { kind: \"failed\" }) & { at: number }\n | ({ kind: \"row\" } | { kind: \"column\" } | { kind: \"boundary\" }) & Within;\n\n/** The markers in a collected render, as a tree; what's between them is kept as raw HTML. */\nfunction parse(html: string, collection: Collection): Node[] {\n const root: Node[] = [];\n const open: Node[][] = [root];\n const pattern = new RegExp(`<${MARK} data-n=\"${collection.nonce}\" data-i=\"(\\\\d+)\"(?: data-e=\"([ocf])\")?></${MARK}>`, \"g\");\n let last = 0;\n for (const match of html.matchAll(pattern)) {\n const into = open[open.length - 1];\n if (match.index! > last) into.push({ kind: \"raw\", html: html.slice(last, match.index) });\n last = match.index! + match[0].length;\n const at = Number(match[1]);\n const edge = match[2];\n if (edge === \"o\") {\n const children: Node[] = [];\n into.push({ kind: collection.recorded[at].kind as \"row\" | \"column\" | \"boundary\", at, children });\n open.push(children);\n } else if (edge === \"c\") open.pop();\n else into.push({ kind: edge === \"f\" ? \"failed\" : \"block\", at });\n }\n if (last < html.length) open[open.length - 1].push({ kind: \"raw\", html: html.slice(last) });\n if (open.length !== 1) throw new Error(\"[Unlayer] a collected render's markers don't pair up\");\n return root;\n}\n\nconst TEXT_ENTITIES: Record<string, string> = { \"&\": \"&\", \"<\": \"<\", \">\": \">\", \""\": '\"', \"'\": \"'\" };\nconst VOID = /^(area|base|br|col|embed|hr|img|input|link|meta|source|track|wbr)$/i;\n\ntype Part = { text: string } | { tag: string; html: string; inner?: string };\n\n/** Raw HTML as React wrote it: text (unescaped) and top-level elements, in order. */\nfunction parts(html: string): Part[] {\n const out: Part[] = [];\n let at = 0;\n const text = (s: string) => s && out.push({ text: s.replace(/&|<|>|"|'/g, (e) => TEXT_ENTITIES[e]) });\n while (at < html.length) {\n const start = html.indexOf(\"<\", at);\n if (start < 0) {\n text(html.slice(at));\n break;\n }\n text(html.slice(at, start));\n const name = /^<([a-zA-Z][\\w:-]*)/.exec(html.slice(start))?.[1];\n if (!name) {\n // Not an element (a comment from a template's own markup): kept with what follows as markup.\n out.push({ tag: \"#\", html: html.slice(start) });\n break;\n }\n const openEnd = html.indexOf(\">\", start);\n if (VOID.test(name) || html[openEnd - 1] === \"/\") {\n out.push({ tag: name, html: html.slice(start, openEnd + 1) });\n at = openEnd + 1;\n continue;\n }\n // Its matching end tag: the same name, nested ones counted.\n const tags = new RegExp(`<(/?)${name}(?=[\\\\s>/])`, \"gi\");\n tags.lastIndex = openEnd + 1;\n let depth = 1;\n let end = -1;\n for (let m = tags.exec(html); m; m = tags.exec(html)) {\n depth += m[1] ? -1 : 1;\n if (depth === 0) {\n end = m.index;\n break;\n }\n }\n if (end < 0) {\n out.push({ tag: \"#\", html: html.slice(start) });\n break;\n }\n const close = html.indexOf(\">\", end) + 1;\n out.push({ tag: name, html: html.slice(start, close), inner: html.slice(openEnd + 1, end) });\n at = close;\n }\n return out;\n}\n\nfunction innerType(type: any): any {\n while (type?.$$typeof === MEMO) type = type.type;\n return type;\n}\n\n/** One render of a root's children, collected. */\ninterface Collected {\n nodes: Node[];\n collection: Collection;\n /** The components left out that were said so (once: the HTML, the head and the design build from the same render). */\n told: Set<number>;\n /** Each component's kept markup, worked out once (asking the component means calling it again). */\n kept?: Map<number, React.ReactElement | undefined>;\n /** A template that isn't one (see tell): every use of this render fails with it, the head's and the design's too. */\n fatal?: unknown;\n}\n\nconst recorded = (c: Collected, node: { at: number }) => c.collection.recorded[node.at] as Recorded & Record<string, any>;\n\nconst nameOf = (element: React.ReactElement): string => {\n if (typeof element.type === \"string\") return element.type;\n const type = innerType(element.type);\n return type?.displayName || type?.name || \"component\";\n};\n\n/** A component that threw, suspended or is async, left out: said once per render. */\nfunction leftOut(c: Collected, node: { at: number }): [] {\n if (c.fatal) throw c.fatal;\n if (!c.told.has(node.at)) {\n c.told.add(node.at);\n try {\n tell(recorded(c, node).element);\n } catch (error) {\n c.fatal = error;\n throw error;\n }\n }\n return [];\n}\n\n/** A function component of the user's own (memo, forwardRef), called once more on its own; undefined for others. */\nfunction calledAgain(element: React.ReactElement<any>): { out: unknown } | undefined {\n const type = innerType(element.type);\n if (type?.$$typeof !== FORWARD_REF && (typeof type !== \"function\" || type.prototype?.isReactComponent)) return undefined;\n const props = { ...element.props };\n for (const key in type.defaultProps) if (props[key] === undefined) props[key] = type.defaultProps[key];\n return { out: callIsolated(() => (type.$$typeof === FORWARD_REF ? type.render(props, null) : type(props))) };\n}\n\n/**\n * Says why a component was left out: it's called once more on its own, and what it renders is collected, so a\n * component in it that fails says so itself.\n */\nfunction tell(element: React.ReactElement<any>): void {\n const type = innerType(element.type);\n const name = nameOf(element);\n const async = () =>\n console.warn(`[Unlayer] <${name}> is async or suspends: Elements renders synchronously, so it's left out. Load its data first and pass it as props.`);\n if (isAsyncComponent(type)) return async();\n try {\n const again = calledAgain(element);\n // A class, lazy, …: React renders it, and throws what it does.\n const inner = again ? collected(again.out as React.ReactNode) : collected(element, false);\n const failed = (nodes: Node[]): Array<{ at: number }> => nodes.flatMap((n) => (n.kind === \"failed\" ? [n] : \"children\" in n ? failed(n.children) : []));\n const found = failed(inner.nodes);\n for (const node of found) tell(recorded(inner, node).element);\n if (!found.length) console.error(`[Unlayer] <${name}> failed while rendering, so it's left out.`);\n } catch (error) {\n const message = String((error as Error)?.message);\n // A template that isn't one (a component that's undefined, from a broken or circular import; an object or a Date\n // as a child) fails the render, wherever it is, as without a component around it: an email missing a block\n // shouldn't send. (React's production build names these by their error numbers, 130 and 31.)\n if (/Element type is invalid|Objects are not valid as a React child|Minified React error #(130|31)\\b/.test(message)) throw error;\n // (React's production build says \"suspended\" as its error #426.)\n if (isThenable(error) || /async and suspending|suspended|Minified React error #426\\b/.test(message)) async();\n else console.error(`[Unlayer] <${name}> threw while rendering, so it's left out:`, error);\n }\n}\n\n/** What a component rendered, when that's markup only (its own components' markup in, those that failed left out). */\nfunction markupOnly(c: Collected, nodes: Node[]): string | undefined {\n let out = \"\";\n for (const node of nodes) {\n if (node.kind === \"raw\") out += node.html;\n else if (node.kind === \"failed\") leftOut(c, node);\n else if (node.kind !== \"boundary\") return undefined;\n else {\n const inner = markupOnly(c, node.children);\n if (inner === undefined) return undefined;\n out += inner;\n }\n }\n return out;\n}\n\n/**\n * A component of the user's own that rendered markup in a Column: an HTML block of it, named after the component\n * (with its props, for its padding and visibility). An element given `dangerouslySetInnerHTML` gives what's in it,\n * as 0.1.22 kept it (the element itself left out), whatever that holds (a `<div/>`, a stray end tag, a comment);\n * other markup, which 0.1.22 left out (a link, a table, an image, elements side by side), is kept as it is.\n */\nfunction keptMarkup(c: Collected, node: Within): React.ReactElement | undefined {\n c.kept ??= new Map();\n if (!c.kept.has(node.at)) c.kept.set(node.at, keptMarkupOnce(c, node));\n return c.kept.get(node.at);\n}\n\nfunction keptMarkupOnce(c: Collected, node: Within): React.ReactElement | undefined {\n const raw = markupOnly(c, node.children);\n if (raw === undefined) return undefined;\n const list = parts(raw);\n // Text alone shows as text (see `elements`).\n if (!list.some((p) => \"tag\" in p)) return undefined;\n const element = recorded(c, node).element as React.ReactElement<any>;\n // One element (what's in it may not pair up as markup): React writes `dangerouslySetInnerHTML` and children\n // alike, so the component is asked which it gave (a <div> when it can't say, as most such are).\n const one = list.length === 1 || list.some((p) => \"tag\" in p && p.tag === \"#\") ? /^<([a-zA-Z][\\w:-]*)\\b[^>]*>([\\s\\S]*)<\\/\\1>$/.exec(raw) : null;\n // Asked only when it matters (one element), as asking calls the component again.\n let given = false;\n if (one) {\n try {\n const out = calledAgain(element)?.out as React.ReactElement<{ dangerouslySetInnerHTML?: unknown }> | undefined;\n given = React.isValidElement(out) && typeof out.type === \"string\" && out.props.dangerouslySetInnerHTML != null;\n } catch {\n given = one[1].toLowerCase() === \"div\";\n }\n }\n const html = one && given ? one[2] : raw;\n const Rendered = () => React.createElement(\"div\", { dangerouslySetInnerHTML: { __html: html } });\n Rendered.displayName = nameOf(element);\n const { containerPadding, hideOnMobile, hideOnDesktop } = (element.props ?? {}) as Record<string, unknown>;\n (Rendered as unknown as Record<symbol, unknown>)[KEPT] = React.createElement(Html, {\n html,\n ...(containerPadding !== undefined ? { containerPadding } : {}),\n ...(hideOnMobile !== undefined ? { hideOnMobile } : {}),\n ...(hideOnDesktop !== undefined ? { hideOnDesktop } : {}),\n } as Record<string, unknown>);\n return React.createElement(Rendered, { ...element.props });\n}\n\n/**\n * A block a component of the template rendered to a string (react-dom's own `renderToStaticMarkup`) while the\n * template is collected comes out as its marker. In a prop (an Html block's `html`) that's what it renders.\n */\nfunction resolvedProps(c: Collected, props: Record<string, any>): Record<string, any> {\n let out = props;\n for (const [key, value] of Object.entries(props)) {\n if (typeof value !== \"string\" || !value.includes(MARK)) continue;\n let html = value;\n try {\n if (value.includes(c.collection.nonce)) html = markup(c, parse(value, c.collection), (block) => within(null, () => renderToStaticMarkup(block)));\n } catch {\n // Markers that don't pair up (part of a string): left for withoutMarkers.\n }\n out = out === props ? { ...props } : out;\n out[key] = withoutMarkers(html, c.collection.nonce);\n }\n return out;\n}\n\n/**\n * A marker that got out of the collecting render (it can't, by the Sentinel: this is the net under it) is\n * taken out, and said, rather than sent in an email: what it stood for can't be told any more. Only this\n * render's markers, whole, as React writes them: this runs on finished HTML, after `toSafeHtml`, and taking\n * out anything else (text shaped like a marker in an attribute) could move where an attribute ends.\n */\nfunction withoutMarkers(html: string, nonce: string): string {\n const left = new RegExp(`<${MARK} data-n=\"${nonce}\" data-i=\"\\\\d+\"(?: data-e=\"[ocf]\")?></${MARK}>`, \"g\");\n if (!html.includes(nonce) || !html.match(left)) return html;\n console.error(`[Unlayer] an Elements block rendered inside a component left a marker behind; it's taken out, and the block it stood for is missing.`);\n return html.replace(left, \"\");\n}\n\n/** Collected nodes as HTML: markup as it is, each row, column or block by `render`. */\nfunction markup(c: Collected, nodes: Node[], render: (element: React.ReactElement) => string): string {\n return nodes\n .map((node) => {\n switch (node.kind) {\n case \"raw\":\n return node.html;\n case \"boundary\":\n return markup(c, node.children, render);\n case \"failed\":\n leftOut(c, node);\n return \"\";\n default:\n return render(element(c, node));\n }\n })\n .join(\"\");\n}\n\n/** A list with keys, as React asks for one it renders (a Row or Column that fails renders its children as they are). */\nconst keyed = (list: React.ReactNode[]): React.ReactNode[] =>\n list.map((child, i) => (React.isValidElement(child) && child.key == null ? React.cloneElement(child, { key: `k${i}` }) : child));\n\n/** A recorded Row, Column or block, as the Elements component it was, with what React rendered in it. */\nfunction element(c: Collected, node: Extract<Node, { kind: \"row\" | \"column\" | \"block\" }>): React.ReactElement {\n const r = recorded(c, node);\n if (node.kind === \"block\") return React.createElement(r.type, resolvedProps(c, r.props));\n if (node.kind === \"column\") return React.createElement(Column, { ...r.props, children: keyed(elements(c, node.children, \"column\")) });\n const props = { ...r.props };\n const children = keyed(elements(c, node.children, \"row\"));\n // A layout counts the Columns as written (a condition's place included) or as rendered (from Fragments and\n // components): either fits it. The rendered Row is then given its cells, which hold no condition's place.\n if (props.layout) {\n const columns = children.filter((child) => React.isValidElement(child) && child.type === Column).length;\n if (columns === props.layout.expectedColumns || React.Children.count(props.children) === props.layout.expectedColumns) {\n props.cells = props.layout.cells;\n delete props.layout;\n }\n }\n return React.createElement(Row, { ...props, children });\n}\n\ntype Place = \"root\" | \"row\" | \"column\";\n\n/**\n * Markup in a Row or Column that a marker cuts in two (`<p>Hello <Name />, welcome back</p>`, a `<div>` around a\n * block): an element whose start and end tags are in different pieces. Each piece of `nodes`, raw HTML cut where\n * such an element starts and ends, with whether it's in one. React writes each element whole, so one that isn't\n * whole in its piece is cut by a marker.\n */\nfunction spanned(nodes: Node[]): { node: Node; inside: boolean }[] {\n const out: { node: Node; inside: boolean }[] = [];\n // The elements open across pieces, outermost first.\n const spans: string[] = [];\n for (const node of nodes) {\n if (node.kind !== \"raw\") {\n out.push({ node, inside: spans.length > 0 });\n continue;\n }\n const html = node.html;\n // Elements opened in this piece and not closed yet; an end tag of one opened in another ends it (and what's open\n // in it); one that ends nothing open is passed over, as the browser does.\n const open: { name: string; at: number }[] = [];\n let closed = spans.length ? -1 : 0;\n for (const m of html.matchAll(/<!--[\\s\\S]*?(?:-->|$)|<(\\/?)([a-zA-Z][\\w:-]*)\\b[^>]*>/g)) {\n if (!m[2]) continue;\n const name = m[2].toLowerCase();\n if (m[1]) {\n const i = open.map((o) => o.name).lastIndexOf(name);\n const across = spans.lastIndexOf(name);\n if (i >= 0) open.length = i;\n else if (across >= 0) {\n spans.length = across;\n open.length = 0;\n if (!spans.length) closed = m.index! + m[0].length;\n }\n } else if (!VOID.test(name) && !m[0].endsWith(\"/>\")) open.push({ name, at: m.index! });\n }\n const piece = (from: number, to: number, inside: boolean) => {\n if (to > from) out.push({ node: { kind: \"raw\", html: html.slice(from, to) }, inside });\n };\n if (closed < 0) piece(0, html.length, true);\n else {\n piece(0, closed, true);\n piece(closed, open[0]?.at ?? html.length, false);\n if (open.length) piece(open[0].at, html.length, true);\n }\n spans.push(...open.map((o) => o.name));\n }\n return out;\n}\n\n/**\n * What's among the rows, or in a Row or a Column, as Elements components. In a Row or Column, markup a marker cuts\n * (see `spanned`) is left out whole, as 0.1.22 left it out, with what's in it (text, markup a component renders\n * there); a Row, Column or block in it is kept, as one beside it is.\n */\nfunction elements(c: Collected, nodes: Node[], place: Place, owner?: React.FC, inMarkup = false): React.ReactNode[] {\n const inColumn = place === \"column\";\n return (place === \"root\" || inMarkup ? nodes.map((node) => ({ node, inside: inMarkup })) : spanned(nodes)).flatMap(({ node, inside }): React.ReactNode[] => {\n switch (node.kind) {\n case \"failed\":\n return leftOut(c, node);\n case \"boundary\": {\n const kept = inColumn && !inside ? keptMarkup(c, node) : undefined;\n if (kept) return [kept];\n // Markup it renders, where it isn't kept, is named after it in the messages that say so.\n const Named = () => null;\n Named.displayName = nameOf(recorded(c, node).element);\n if (inColumn && !inside && !c.told.has(node.at) && node.children.some((n) => n.kind === \"raw\" && parts(n.html).some((p) => \"tag\" in p))) {\n c.told.add(node.at);\n console.warn(`Column: <${Named.displayName}> rendered markup that isn't a block, so it's left out. Put HTML in an <Html> block.`);\n }\n return elements(c, node.children, place, Named, inside);\n }\n case \"raw\":\n // In markup a marker cuts, it's that markup's: a Row says where it starts isn't a Column.\n if (inside) {\n const name = /^<([a-zA-Z][\\w:-]*)/.exec(node.html)?.[1];\n return place === \"row\" && name && !inMarkup ? [React.createElement(owner ?? name)] : [];\n }\n // Text shows as text. Other markup isn't a Column, which a Row says (and leaves it out); in a Column it's left out.\n return parts(node.html).flatMap((p): React.ReactNode[] => (\"text\" in p ? [p.text] : inColumn ? [] : [React.createElement(owner ?? (p.tag === \"#\" ? \"div\" : p.tag))]));\n default:\n return [element(c, node)];\n }\n });\n}\n\n/** A render of `children` that collects them; `guarded`, a component in them that fails is left out. */\nfunction collected(children: React.ReactNode, guarded = true): Collected {\n const once = (markup: boolean): Collected => {\n const collection: Collection = { nonce: nonce(), recorded: [], ...(markup ? { markup } : {}), ...(idsSeen() ? {} : { blind: true }) };\n const html = within(collection, () => renderToStaticMarkup(<>{guarded ? guard(children, collection) : children}</>, { identifierPrefix: COLLECTING_ID }));\n return { nodes: parse(html, collection), collection, told: new Set() };\n };\n try {\n return once(false);\n } catch (error) {\n // Markup React rejects (`<hr style=\"…\">` with a string style, in a JavaScript template) isn't a component, so no\n // boundary catches it and it ends the render. Once more with markup guarded too: it's left out, with a message,\n // and the rest renders, as in 0.1.22. A template that renders doesn't get here, so nothing else changes.\n if (!guarded) throw error;\n return once(true);\n }\n}\n\n/**\n * Whether the React Elements' components call gives them the ids of the render Elements starts (see Sentinel):\n * not where a bundler gave them another copy than react-dom's (Next.js's server layers), where `useId()` throws or\n * gives an outer render's ids.\n */\nfunction idsSeen(): boolean {\n let seen = false;\n const Probe = () => {\n try {\n seen = React.useId().slice(1).startsWith(COLLECTING_ID);\n } catch {\n // another copy: no render it can see\n }\n return null;\n };\n renderToStaticMarkup(<Probe />, { identifierPrefix: COLLECTING_ID });\n return seen;\n}\n\n// Shared by every copy of Elements a process loads, as the collecting stack is (collect.ts): no two renders get one nonce.\nconst RENDERS = Symbol.for(\"@unlayer/react-elements/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 */\nfunction 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/** `children` collected, once per render (the HTML, the head and the design ask for the same). */\nconst collect = (children: React.ReactNode): Collected =>\n children !== null && typeof children === \"object\" ? scopeCache(children, () => collected(children)) : collected(children);\n\n/**\n * A root's children as HTML (what Body puts inside it): markup among the rows as it is, and each row or block\n * rendered by Elements with `place` giving it the root's settings.\n */\nexport function childrenHtml(children: React.ReactNode, place: (child: React.ReactElement) => React.ReactElement): string {\n const c = collect(children);\n return withoutMarkers(markup(c, c.nodes, (child) => within(null, () => renderToString(place(child)))), c.collection.nonce);\n}\n\n/** Children (a root's, or a Row on its own) as Elements components only, for the head and the design. */\nexport function normalizedChildren(children: React.ReactNode): React.ReactNode[] {\n const c = collect(children);\n return elements(c, c.nodes, \"root\");\n}\n\n/** `root` with its children as Elements components only. */\nexport function normalizedRoot(root: React.ReactElement): React.ReactElement {\n return React.cloneElement(root, undefined, ...normalizedChildren((root.props as { children?: React.ReactNode }).children));\n}\n","import React from \"react\";\nimport type { RenderMode, UnlayerConfig, BodyValues } from \"@unlayer-internal/shared-elements\";\nimport { DEFAULT_CONFIG, mergeValues } from \"@unlayer-internal/shared-elements\";\nimport { BodyExporters } from \"@unlayer/exporters\";\nimport { mapSemanticProps, type SemanticProps } from \"../utils/semantic-props\";\nimport { nextHtmlId } from \"../utils/create-component\";\nimport type { SizeInput } from \"../types\";\nimport { BODY_DEFAULTS } from \"../utils/container-defaults\";\nimport { withRenderScope } from \"../utils/render-scope\";\nimport { childrenHtml } from \"../utils/normalize\";\n\nexport type BodyProps = Omit<SemanticProps<BodyValues>, \"padding\" | \"borderRadius\"> & {\n children?: React.ReactNode;\n mode?: RenderMode;\n className?: string;\n style?: React.CSSProperties;\n index?: number;\n /** Optional config (replaces context-based config for Server Component usage) */\n config?: Partial<UnlayerConfig>;\n /** Preview text shown in email client inboxes (email mode only) */\n previewText?: string;\n /** Document text direction, also kept in the design JSON. Renderer options can override it. */\n textDirection?: string;\n /** Language of the rendered document (for example, \"ar\"). */\n lang?: string;\n /**\n * Web font stylesheets the content uses (e.g. a Google Fonts CSS URL).\n * renderToHtml links them in the document head, with any `fonts` option.\n */\n fonts?: Array<{ url: string }>;\n /** Padding — a CSS string (\"0 48px\", \"20px\") or a number (px). */\n padding?: SizeInput;\n /** Corner radius — a number (→ px) or CSS string (\"8px\"). */\n borderRadius?: SizeInput;\n};\n\nconst DEFAULT_VALUES = BODY_DEFAULTS;\n\n// ============================================\n// Preview text (inlined from shared/utils/preview.ts)\n// ============================================\n\nconst MAX_PREVIEW_LENGTH = 150;\n\nconst PADDING_CHARS = [\n \"\\u00A0\", \"\\u200C\", \"\\u200B\", \"\\u200D\", \"\\u200E\", \"\\u200F\", \"\\uFEFF\",\n];\n\n/**\n * previewText is text, as React treats text (it often carries user data, like\n * a name), so it's escaped: markup like `</div>` would end the hidden preview\n * and show whatever follows. The preview is padded with invisible characters\n * below, so it needs no entities.\n */\nfunction escapePreviewText(text: string): string {\n // An email service's `<%name%>` tag (SendGrid's) stays as written, as in 0.1.22, for it to fill in: `<%` can't start an element.\n return text\n .split(/(<%[\\w.]+%>)/)\n .map((part, i) => (i % 2 ? part : part.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\")))\n .join(\"\");\n}\n\nfunction generatePreviewHtml(text: string): string {\n if (!text || text.trim().length === 0) return \"\";\n\n const truncated = text.length > MAX_PREVIEW_LENGTH\n ? text.slice(0, MAX_PREVIEW_LENGTH)\n : text;\n\n const paddingLength = Math.max(0, MAX_PREVIEW_LENGTH - truncated.length);\n let padding = \"\";\n for (let i = 0; i < paddingLength; i++) {\n padding += PADDING_CHARS[i % PADDING_CHARS.length];\n }\n\n return (\n `<div data-skip-in-text=\"true\" style=\"display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">` +\n escapePreviewText(truncated) +\n padding +\n `</div>`\n );\n}\n\n// ============================================\n// Body exporter wrapper (inlined from shared/utils/render-container-to-html.ts)\n// ============================================\n\ntype ContainerExporterFunction = (innerHTML: string, values: Record<string, any>, bodyValues?: Record<string, any>, options?: Record<string, any>) => string;\n\nfunction renderBodyToHtml(innerHTML: string, values: any, mode: RenderMode, previewText?: string): string {\n // Prepend preview text HTML in email mode\n let finalInnerHtml = innerHTML;\n if (mode === \"email\" && previewText) {\n const previewHtml = generatePreviewHtml(previewText);\n if (previewHtml) {\n finalInnerHtml = previewHtml + innerHTML;\n }\n }\n\n const bodyExporter = (BodyExporters[mode] || BodyExporters.web) as ContainerExporterFunction;\n // The email body exporter reads body context (contentWidth, contentAlign)\n // from `arg3.bodyValues` — it drives the Outlook (MSO) container table width.\n // Passing `values` directly left `bodyValues` undefined, pinning the Outlook\n // table to 600px regardless of contentWidth (modern clients were fine via the\n // container max-width, so non-600px emails rendered narrow only in Outlook).\n const raw =\n mode === \"document\"\n ? bodyExporter(finalInnerHtml, values, { type: \"\" })\n : mode === \"email\"\n ? // The email body exporter reads body context (contentWidth,\n // contentAlign) from the `bodyValues` field of its 3rd argument.\n // Passing `values` directly left it undefined, so the Outlook (MSO)\n // table fell back to 600px regardless of contentWidth.\n bodyExporter(finalInnerHtml, values, { bodyValues: values })\n : bodyExporter(finalInnerHtml, values, values);\n\n return raw\n .replace('min-height: 100vh; ', '')\n .replace('min-height: 100vh;', '');\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * Body - Universal Server/Client Component\n *\n * Works in both Server Components and Client Components.\n * In Server Components, pass config as a prop.\n * In Client Components, config can come from UnlayerProvider context or props.\n *\n * @example Server Component\n * ```tsx\n * <Body backgroundColor=\"#F7F8F9\" contentWidth=\"600px\" mode=\"web\">\n * <Row><Column><Paragraph values={{...}} mode=\"web\" /></Column></Row>\n * </Body>\n * ```\n *\n * @example Client Component with Provider\n * ```tsx\n * <UnlayerProvider config={{ mode: \"email\" }}>\n * <Body>...</Body>\n * </UnlayerProvider>\n * ```\n */\nconst Body: React.FC<BodyProps> = (props) => {\n const { children, mode: modeProp, className, style, index = 0, config: configProp, previewText, fonts: _fonts, lang: _lang, ...semanticProps } = props;\n\n // Resolve config: explicit prop > default (no hooks, Server Component safe)\n const resolvedConfig: UnlayerConfig = { ...DEFAULT_CONFIG, ...configProp };\n\n // Resolve mode: explicit prop > config > default\n const mode: RenderMode = modeProp ?? resolvedConfig.mode ?? \"web\";\n\n // Build _config to thread through children. Reset the per-render id counters so\n // unique ids are allocated across the whole tree (shared by reference downward).\n const _config: UnlayerConfig = { ...resolvedConfig, mode };\n (_config as { __ids?: Record<string, number> }).__ids = {};\n\n // Map semantic props, then merge BODY_DEFAULTS on top so the body always\n // carries its full default values (notably contentWidth \"500px\", textColor\n // \"#000000\") before rendering — the same way item components merge their\n // defaults. Without this the body exporter / grid CSS fall back to their own\n // internal defaults (e.g. 600px) instead of the schema default, so the\n // Outlook table, container, and grid CSS disagree. Mapped values win.\n const values = mergeValues<BodyValues>(\n DEFAULT_VALUES,\n mapSemanticProps<BodyValues>(semanticProps as SemanticProps<BodyValues>, DEFAULT_VALUES, \"Body\")\n );\n\n // Ensure _meta\n const valuesWithMeta = {\n ...values,\n _meta: {\n htmlID: nextHtmlId(_config, \"u_body\"),\n htmlClassNames: \"u_body\",\n ...(values._meta || {})\n }\n };\n\n // Clone children with _config AND the body's resolved values so Row/Column\n // inherit body-level context — notably `contentWidth`, which determines the\n // row container max-width (and therefore each column's width) in web mode.\n // Without this, Row falls back to BODY_DEFAULTS.contentWidth (\"500px\") and\n // <Body contentWidth=\"…\"> is silently ignored for layout.\n // Fragments and user components expanded: their rows get the context too.\n let innerHTML = \"\";\n if (children) {\n try {\n // A render of its own when Body is rendered straight through React (not renderToHtml).\n innerHTML = withRenderScope(() => {\n // One React render collects the rows and blocks; each is then rendered with Body's settings.\n return childrenHtml(children, (child) => React.cloneElement(child as React.ReactElement<any>, { _config, bodyValues: values }));\n }, true);\n } catch (error) {\n console.error(\"Body: Failed to render children:\", error);\n innerHTML = \"\";\n }\n }\n\n try {\n const html = renderBodyToHtml(innerHTML, valuesWithMeta, mode, previewText);\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={className}\n style={style}\n />\n );\n } catch (error) {\n console.error(\"Body rendering failed:\", error);\n return (\n <div className={className} style={style}>\n {children}\n </div>\n );\n }\n};\n\nBody.displayName = \"Body\";\n\nexport default Body;\n","import Body, { type BodyProps } from \"./Body\";\n\nexport type EmailProps = Omit<BodyProps, \"mode\">;\n\n/**\n * Email - Renders email-client safe HTML (tables for Outlook, Gmail, Yahoo).\n *\n * Thin wrapper around Body with mode locked to \"email\".\n *\n * @example\n * ```tsx\n * <Email backgroundColor=\"#f4f4f5\" contentWidth=\"560px\" previewText=\"Welcome!\">\n * <Row><Column><Paragraph text=\"Hello\" /></Column></Row>\n * </Email>\n * ```\n */\nexport default function Email(props: EmailProps) {\n return <Body {...props} mode=\"email\" />;\n}\n\nEmail.displayName = \"Email\";\n","import Body, { type BodyProps } from \"./Body\";\n\nexport type PageProps = Omit<BodyProps, \"mode\">;\n\n/**\n * Page - Renders with div/flexbox for responsive web display.\n *\n * Thin wrapper around Body with mode locked to \"web\".\n *\n * @example\n * ```tsx\n * <Page backgroundColor=\"#ffffff\" contentWidth=\"960px\">\n * <Row><Column><Paragraph text=\"Hello\" /></Column></Row>\n * </Page>\n * ```\n */\nexport default function Page(props: PageProps) {\n return <Body {...props} mode=\"web\" />;\n}\n\nPage.displayName = \"Page\";\n","import Body, { type BodyProps } from \"./Body\";\n\nexport type DocumentPageSize =\n | \"A3\"\n | \"A4\"\n | \"A5\"\n | \"Legal\"\n | \"Letter\"\n | \"Tabloid\";\n\nexport type DocumentOrientation = \"portrait\" | \"landscape\";\n\nexport type DocumentProps = Omit<\n BodyProps,\n \"mode\" | \"documentSize\" | \"documentOrientation\" | \"documentMargin\"\n> & {\n documentSize?: DocumentPageSize;\n documentOrientation?: DocumentOrientation;\n};\n\n/**\n * Document - Print-optimized rendering for PDF generation.\n *\n * Thin wrapper around Body with mode locked to \"document\".\n *\n * @example\n * ```tsx\n * <Document\n * backgroundColor=\"#ffffff\"\n * contentWidth=\"700px\"\n * documentSize=\"A4\"\n * documentOrientation=\"portrait\"\n * >\n * <Row><Column><Paragraph text=\"Hello\" /></Column></Row>\n * </Document>\n * ```\n */\nexport default function Document(props: DocumentProps) {\n return <Body {...props} mode=\"document\" />;\n}\n\nDocument.displayName = \"Document\";\n","\"use client\";\n\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type { UnlayerConfig } from \"@unlayer-internal/shared-elements\";\nimport { DEFAULT_CONFIG } from \"@unlayer-internal/shared-elements\";\n\n/**\n * @internal Flag added to context value when a provider is active.\n * Used by item components to detect provider-without-Body usage.\n */\nexport const PROVIDER_ACTIVE_KEY = \"__unlayerProviderActive\";\n\n// Lazy-init: createContext is not available in React Server Component modules.\n// Deferring the call ensures it only runs when UnlayerProvider or\n// useUnlayerConfig is actually invoked (always in a client context).\nlet _UnlayerContext: React.Context<UnlayerConfig> | null = null;\nfunction getUnlayerContext(): React.Context<UnlayerConfig> {\n if (!_UnlayerContext) {\n _UnlayerContext = createContext<UnlayerConfig>(DEFAULT_CONFIG);\n }\n return _UnlayerContext;\n}\n\nexport interface UnlayerProviderProps {\n config: Partial<UnlayerConfig>;\n children: React.ReactNode;\n}\n\nexport const UnlayerProvider: React.FC<UnlayerProviderProps> = ({\n config,\n children,\n}) => {\n const merged = useMemo(\n () => ({ ...DEFAULT_CONFIG, ...config, [PROVIDER_ACTIVE_KEY]: true }),\n [config]\n );\n\n const Context = getUnlayerContext();\n return (\n <Context.Provider value={merged}>\n {children}\n </Context.Provider>\n );\n};\n\nUnlayerProvider.displayName = \"UnlayerProvider\";\n\nexport function useUnlayerConfig(): UnlayerConfig {\n return useContext(getUnlayerContext());\n}\n","import { cssValueSafe, type RenderMode } from \"@unlayer-internal/shared-elements\";\nimport { safeName } from \"./create-component\";\n\ntype DeviceStyles = Record<string, string[]>;\ntype Collection = \"rows\" | \"columns\" | \"contents\";\n\n// Mirrors the Unlayer editor's device-override CSS, including option order.\nconst contentOptions: Record<string, string[]> = {\n Button: [\"size\", \"fontSize\", \"lineHeight\", \"textAlign\", \"padding\"],\n Image: [\"src\", \"textAlign\"],\n Heading: [\"fontSize\", \"textAlign\", \"lineHeight\"],\n Paragraph: [\"fontSize\", \"textAlign\", \"lineHeight\"],\n Menu: [\"fontSize\", \"padding\"],\n Divider: [\"width\", \"textAlign\"],\n};\n\n/**\n * A value as CSS writes it in a declaration, or undefined when it could end the\n * declaration, the rule or the `<style>` element (`16px</style><script>`),\n * start a comment that hides the rules after it (`16px /*`), or leave a\n * bracket open, which swallows the rules after it (`calc(12px + 4px`): a\n * phone setting may come from data, and it's written into the head as is.\n */\nfunction css(value: unknown): string | undefined {\n const text = String(value).trim();\n return text && !/[!\\\\\"'\\n\\r]/.test(text) && cssValueSafe(text) ? text : undefined;\n}\n\n/** An id as a selector writes it, as `CSS.escape` does: `section.2` is `section\\\\.2`, not the id `section` and a class. */\nfunction ident(id: string): string {\n return id.replace(/^-?\\d|^-$|[^\\w\\u0080-\\uffff-]/g, (c) =>\n /\\d/.test(c.slice(-1)) ? `${c.slice(0, -1)}\\\\${c.slice(-1).charCodeAt(0).toString(16)} ` : `\\\\${c}`);\n}\n\nfunction size(value: unknown): string | undefined {\n const number = parseFloat(String(value));\n if (!Number.isFinite(number)) return;\n const rounded = parseFloat(number.toFixed(2));\n if (typeof value === \"number\" || String(value).endsWith(\"px\")) return `${rounded}px`;\n if (String(value).endsWith(\"%\")) return `${rounded}%`;\n}\n\nexport function collectDeviceStyles(values: Record<string, any>, collection: Collection, name: string, mode: RenderMode, styles: DeviceStyles): void {\n // The id the block's HTML has, escaped.\n const given = safeName(values._meta?.htmlID);\n if (!given) return;\n const id = ident(given);\n const options = collection === \"contents\" ? [\"containerPadding\", ...(contentOptions[name] || [])] : collection === \"columns\" ? [\"padding\", \"border\"] : [\"padding\"];\n for (const device of mode === \"document\" ? [\"desktop\"] : [\"desktop\", \"mobile\"]) {\n const overrides = values._override?.[device];\n if (!overrides) continue;\n for (const option of options) {\n if (!(option in overrides)) continue;\n const value = overrides[option];\n const property = option.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n const prefix = collection === \"rows\" ? \"row-\" : collection === \"columns\" ? \"col-\" : \"\";\n const selector = (attribute: string) => `#${id} .v-${prefix}${property === attribute ? property : `${property}-${attribute}`}`;\n const push = (rule: string) => (styles[device] ||= []).push(rule);\n if (option === \"padding\" || option === \"containerPadding\") {\n if (!(value || value === 0) || css(value) === undefined) continue;\n const direct = collection === \"rows\" || (mode === \"web\" && collection === \"contents\" && option === \"containerPadding\");\n const target = direct ? selector(\"padding\").replace(`#${id} `, `#${id}`) : selector(\"padding\");\n push(`${target} { padding: ${css(value)} !important; }`);\n if (mode === \"email\" && collection === \"rows\") {\n const parts = String(value).trim().split(/\\s+/);\n // A length the editor doesn't write (`2em`, a bare `0`) is written as it is.\n const [top, bottom] = [parts[0], parts[2] || parts[0]].map((part) => size(part) ?? css(part));\n if (top !== undefined && bottom !== undefined) push(`${target}--vertical { padding-top: ${top} !important; padding-bottom: ${bottom} !important; }`);\n }\n } else if (option === \"border\") {\n // As the editor's borderToStyle: transparent unless a side has a width.\n if (value) push(`${selector(\"border\")} { ${[\"Top\", \"Left\", \"Right\", \"Bottom\"].map((d) => { const w = css(value[`border${d}Width`] || \"0px\") ?? \"0px\"; return `border-${d.toLowerCase()}: ${w} ${css(value[`border${d}Style`] || \"solid\") ?? \"solid\"} ${(parseInt(w) > 0 && css(value[`border${d}Color`])) || \"transparent\"} !important;`; }).join(\"\")} }`);\n } else if (option === \"src\") {\n if (!value) continue;\n const merged = { ...values.src, ...value };\n const maximum = merged.autoWidth === false ? size(merged.maxWidth) : undefined;\n push(`${selector(\"width\")} { width: ${maximum || \"100%\"} !important; }`);\n push(`${selector(\"max-width\")} { max-width: ${size(maximum || merged.width || \"100%\")} !important; }`);\n } else if (option === \"size\" || option === \"width\") {\n if (!value) continue;\n push(`${selector(\"width\")} { width: ${size(value.width) && !value.autoWidth ? size(value.width) : \"auto\"} !important; }`);\n push(`${selector(\"max-width\")} { max-width: 100% !important; }`);\n } else {\n if (!(value || (option === \"lineHeight\" && `${value}` === \"0\"))) continue;\n const rendered = css(option === \"fontSize\" && typeof value === \"number\" ? `${value}px` : value);\n if (rendered === undefined) continue;\n push(`${selector(property)} { ${property}: ${rendered} !important; }`);\n }\n }\n }\n}\n\nexport function deviceStylesCss(styles: DeviceStyles, mode: RenderMode): string {\n return Object.entries(styles).filter(([, rules]) => rules.length).map(([device, rules]) => {\n const query = device === \"mobile\" ? \"@media (max-width: 480px)\" : `@media (min-width: ${mode === \"document\" ? 1 : 481}px)`;\n return `${query} { ${rules.join(\" \")} }`;\n }).join(\"\\n\");\n}\n\nexport function deviceVisibilityCss(mode: RenderMode): string {\n if (mode === \"document\") return \"\";\n const extra = mode === \"email\" ? \"max-height: 0px; overflow: hidden; \" : \"\";\n const reset = mode === \"email\" ? \"@media (min-width: 0px) { .hide-default__display-block { display: block !important; mso-hide: unset !important; } .hide-default__display-table { display: table !important; mso-hide: unset !important; } }\\n\" : \"\";\n return reset + `@media (max-width: 480px) { .hide-mobile { ${extra}display: none !important; } }\\n` + `@media (min-width: 481px) { .hide-desktop { ${extra}display: none !important; } }`;\n}\n","/**\n * renderToJson — Convert a React element tree to Unlayer's DesignJSON format.\n *\n * Walks the React element tree statically via React.Children and extracts\n * values at each level. No HTML rendering is performed.\n *\n * Produces the { body: { rows, values }, counters, schemaVersion } structure\n * that the Unlayer editor uses, enabling round-tripping: build with React\n * components → export as JSON → load into the Unlayer editor.\n */\n\nimport React from \"react\";\nimport type {\n DesignJSON,\n DesignBody,\n DesignRow,\n DesignColumn,\n DesignContent,\n} from \"@unlayer-internal/shared-elements\";\nimport { mergeValues } from \"@unlayer-internal/shared-elements\";\n// Schema version from the exporters bundle — matches the editor's currentVersion\n// at the time the exporters were generated. This ensures renderToJson output is\n// recognized as current by the editor, skipping unnecessary migrations.\n// Falls back to 24 for older exporters packages that don't export this yet.\nimport { schemaVersion as _schemaVersion } from \"@unlayer/exporters\";\nconst schemaVersion: number = _schemaVersion ?? 24;\nimport { mapSemanticProps } from \"./semantic-props\";\nimport { componentName, getDisplayName, ROOT_NAMES, unwrapRoot, UNWRAP_ADVICE } from \"./unwrap-root\";\nimport { BODY_DEFAULTS, ROW_DEFAULTS, COLUMN_DEFAULTS } from \"./container-defaults\";\nimport { contentSlotWidth, pinImageSrc, type SlotContext } from \"./image-sizing\";\nimport { withRenderScope } from \"./render-scope\";\nimport { KEPT, normalizedChildren, normalizedRoot } from \"./normalize\";\nimport { textDirectionOf, UNLAYER_CONFIG_KEY } from \"./create-component\";\n\n/** Layout context threaded down the walk so an image can be sized against the\n * real column slot (contentWidth × column share, minus paddings/borders). */\ntype LayoutContext = Pick<\n SlotContext,\n \"bodyValues\" | \"rowValues\" | \"rowCells\" | \"columnIndex\" | \"columnValues\"\n>;\n\n// ============================================\n// Tree helpers (inlined)\n// ============================================\n\n\n\n/**\n * Unwrap a user wrapper component (e.g. `renderToJson(<MyEmail/>)`) down to\n * its root element: renderToJson walks the element tree, so the wrapper must\n * be called first. A wrapper that throws (React hooks aren't valid outside a\n * render) gets an actionable message instead of a bare \"Invalid hook call\".\n */\nfunction unwrapForJson(element: React.ReactElement): React.ReactElement {\n try {\n return unwrapRoot(element);\n } catch (cause) {\n const detail = cause instanceof Error ? cause.message : String(cause);\n throw new Error(\n `[Unlayer] renderToJson: could not unwrap <${componentName(element) || \"wrapper\"}>. ${UNWRAP_ADVICE} (${detail})`\n );\n }\n}\n\n/** The element children of a collected (Elements-only) tree. */\nconst collectChildren = (node: React.ReactNode): React.ReactElement[] => React.Children.toArray(node).filter(React.isValidElement);\n\n/**\n * Strip internal/base props from an element's props,\n * returning only the semantic props that should be mapped to values.\n */\nexport function extractSemanticProps(\n props: Record<string, any>,\n extraKeys: string[] = []\n): Record<string, any> {\n const internalKeys = new Set([\n \"children\",\n \"mode\",\n \"className\",\n \"style\",\n \"index\",\n \"colIndex\",\n \"cells\",\n \"bodyValues\",\n \"rowValues\",\n \"_config\",\n \"config\",\n \"previewText\",\n \"fonts\",\n \"lang\",\n \"layout\",\n \"collection\",\n ...extraKeys,\n ]);\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!internalKeys.has(key) && value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\n/** Increment and return counter for a given key. */\nexport function nextCounter(counters: Record<string, number>, key: string): number {\n counters[key] = (counters[key] || 0) + 1;\n return counters[key];\n}\n\n// ============================================\n// Helpers\n// ============================================\n\n/** Map component displayName to Unlayer content type.\n * Paragraph maps to \"text\" (the legacy content type that uses plain HTML\n * values.text) for universal editor compatibility. The newer \"paragraph\"\n * content type uses Lexical textJson which requires specific editor support.\n */\nfunction toContentType(displayName: string): string {\n if (displayName === \"Paragraph\") return \"text\";\n return displayName.toLowerCase();\n}\n\n/** Generate a unique ID like \"u_row_1\", \"u_content_button_2\" */\nfunction makeId(prefix: string, counter: number): string {\n return `${prefix}_${counter}`;\n}\n\n/**\n * Extract plain text/HTML from a textJson string without needing a DOM.\n * Handles both Lexical JSON format and the __html passthrough format.\n */\nfunction extractTextFromTextJson(textJson: string): string {\n try {\n const parsed = JSON.parse(textJson);\n\n // __html passthrough (from htmlToTextJson)\n if (parsed.__html) return parsed.__html;\n\n // Lexical JSON — walk the tree and extract text content\n const root = parsed?.root;\n if (!root?.children) return \"\";\n\n const paragraphs: string[] = [];\n for (const paragraph of root.children) {\n if (!paragraph?.children) continue;\n const parts: string[] = [];\n for (const node of paragraph.children) {\n if (node?.text) parts.push(node.text);\n }\n paragraphs.push(parts.join(\"\"));\n }\n return paragraphs.join(\"\\n\");\n } catch {\n return \"\";\n }\n}\n\n// ============================================\n// Tree processors\n// ============================================\n\nfunction processItem(\n element: React.ReactElement,\n counters: Record<string, number>,\n layout: LayoutContext = {},\n /** The id and class base, when not the item's own (markup kept as an HTML block, named after its component). */\n metaName?: string\n): DesignContent {\n const componentType = element.type as any;\n const config = componentType[UNLAYER_CONFIG_KEY];\n\n if (!config && componentType?.[KEPT]) {\n // Markup a component of the user's own rendered in a Column: an HTML block, numbered as the HTML numbers it.\n return processItem(componentType[KEPT], counters, layout, (componentType.displayName || componentType.name || \"component\").toLowerCase());\n }\n if (!config) {\n const name = componentName(element) || \"Unknown\";\n throw new Error(\n `[Unlayer] renderToJson: <${name}> is not a recognized Unlayer item component. ` +\n `Only components created with createItemComponent are supported.`\n );\n }\n\n const { name, defaultValues, propMapper, slug } = config;\n const contentType = config.contentType ?? toContentType(name);\n // Custom tools use u_content_custom_<slug> as their id/class base\n const metaBase = `u_content_${metaName ?? config.metaName ?? contentType}`;\n const count = nextCounter(counters, metaBase);\n const id = makeId(metaBase, count);\n\n // Map props through the item's own propMapper, then merge with defaults\n const { children, ...restProps } = element.props;\n const mappedValues = propMapper({ children, ...restProps });\n const finalValues = mergeValues(defaultValues, mappedValues);\n\n // Paragraph maps to \"text\" content type — convert textJson to plain text/HTML.\n // Extract text directly from the Lexical JSON structure (no DOM needed).\n if (contentType === \"text\" && finalValues.textJson) {\n finalValues.text = extractTextFromTextJson(finalValues.textJson);\n delete finalValues.textJson;\n }\n\n // Add containerPadding (base content option) and _meta\n const values = {\n containerPadding: \"10px\",\n ...finalValues,\n _meta: {\n htmlID: id,\n htmlClassNames: metaBase,\n ...(finalValues._meta || {}),\n },\n selectable: true,\n draggable: true,\n duplicatable: true,\n deletable: true,\n hideable: true,\n };\n\n // Convert a fixed (px) image pin to a percent of the column slot using the\n // threaded geometry, so the display width survives the JSON round-trip into an\n // editor. Guarded on `src.autoWidth === false`, so only pinned images change.\n const itemSrc = (values as Record<string, any>).src;\n if (itemSrc && typeof itemSrc === \"object\" && itemSrc.autoWidth === false) {\n const availableWidth = contentSlotWidth({\n ...layout,\n containerPadding: (values as Record<string, any>).containerPadding,\n });\n (values as Record<string, any>).src = pinImageSrc(itemSrc, availableWidth);\n }\n\n return slug ? { type: contentType, slug, values } : { type: contentType, values };\n}\n\nfunction processColumn(\n element: React.ReactElement,\n counters: Record<string, number>,\n layout: Omit<LayoutContext, \"columnValues\"> = {}\n): DesignColumn {\n const count = nextCounter(counters, \"u_column\");\n const id = makeId(\"u_column\", count);\n\n // Extract semantic props for column values, then merge with defaults\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, COLUMN_DEFAULTS, \"Column\");\n const values = mergeValues(COLUMN_DEFAULTS, mapped);\n\n // Add _meta\n const valuesWithMeta = {\n ...values,\n _meta: {\n htmlID: id,\n htmlClassNames: \"u_column\",\n ...(values._meta || {}),\n },\n };\n\n // Process item children\n const contents: DesignContent[] = [];\n const children = collectChildren(element.props.children);\n\n const itemLayout: LayoutContext = { ...layout, columnValues: valuesWithMeta };\n for (const child of children) {\n contents.push(processItem(child, counters, itemLayout));\n }\n\n return { contents, values: valuesWithMeta };\n}\n\nfunction processRow(\n element: React.ReactElement,\n counters: Record<string, number>,\n parentLayout: Pick<LayoutContext, \"bodyValues\"> = {}\n): DesignRow {\n const count = nextCounter(counters, \"u_row\");\n const id = makeId(\"u_row\", count);\n\n // Determine cells from layout or cells prop\n const { layout, cells: propsCells } = element.props;\n let cells: number[];\n if (layout) {\n cells = layout.cells;\n } else if (propsCells) {\n cells = propsCells;\n } else {\n // Default: one equal cell per Column child. Count only <Column> children —\n // any stray non-Column child is warned and skipped below, so including it\n // would make `cells` longer than the column list and distort both the row\n // layout and the column-share math used for image sizing.\n const columnCount = Math.max(\n 1,\n collectChildren(element.props.children).filter(\n (child) => getDisplayName(child) === \"Column\"\n ).length\n );\n cells = Array(columnCount).fill(1);\n }\n\n // Extract semantic props for row values, then merge with defaults\n const semanticProps = extractSemanticProps(element.props, [\"layout\"]);\n const mapped = mapSemanticProps(semanticProps, ROW_DEFAULTS, \"Row\");\n const values = mergeValues(ROW_DEFAULTS, mapped);\n\n // Add cells, columns flag, editor flags, and _meta\n const valuesWithMeta = {\n ...values,\n columns: values.columns ?? false,\n cells,\n _meta: {\n htmlID: id,\n htmlClassNames: \"u_row\",\n ...(values._meta || {}),\n },\n selectable: true,\n draggable: true,\n duplicatable: true,\n deletable: true,\n hideable: true,\n };\n\n // Process Column children\n const columns: DesignColumn[] = [];\n const children = collectChildren(element.props.children);\n\n const columnLayout: Omit<LayoutContext, \"columnValues\"> = {\n bodyValues: parentLayout.bodyValues,\n rowValues: valuesWithMeta,\n rowCells: cells,\n };\n let columnIndex = 0;\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Column\") {\n columns.push(\n processColumn(child, counters, { ...columnLayout, columnIndex })\n );\n columnIndex += 1;\n } else {\n console.warn(\n `[Unlayer] renderToJson: <${componentName(child) ?? String(child.type)}> is not a valid Row child. Only <Column> is allowed.`\n );\n }\n }\n\n return { cells, columns, values: valuesWithMeta };\n}\n\nfunction processBody(\n element: React.ReactElement,\n counters: Record<string, number>\n): DesignBody {\n const id = \"u_body\";\n\n // Extract semantic props for body values, then merge with defaults\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, BODY_DEFAULTS, \"Body\");\n const values = mergeValues(BODY_DEFAULTS, mapped);\n // Only ltr, rtl or auto, as in the HTML (a value from a request could carry anything).\n if (\"textDirection\" in values) {\n const direction = textDirectionOf((values as Record<string, unknown>).textDirection);\n if (direction) (values as Record<string, unknown>).textDirection = direction;\n else delete (values as Record<string, unknown>).textDirection;\n }\n\n // `previewText` is the React alias for the schema's `preheaderText`. It is\n // excluded from the mapped values (it drives the email preview HTML at render\n // time), so thread it into the JSON here so it is preserved in the output.\n const previewText = (element.props as { previewText?: string }).previewText;\n if (previewText !== undefined) {\n (values as Record<string, unknown>).preheaderText = previewText;\n }\n\n // Add _meta\n const valuesWithMeta = {\n ...values,\n _meta: {\n htmlID: id,\n htmlClassNames: \"u_body\",\n ...(values._meta || {}),\n },\n };\n\n // Process Row children\n const rows: DesignRow[] = [];\n const children = collectChildren(element.props.children);\n\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Row\") {\n rows.push(processRow(child, counters, { bodyValues: valuesWithMeta }));\n } else {\n console.warn(\n `[Unlayer] renderToJson: <${componentName(child) ?? String(child.type)}> is not a valid Body child. Only <Row> is allowed.`\n );\n }\n }\n\n return {\n rows,\n values: valuesWithMeta,\n } as DesignBody;\n}\n\n// ============================================\n// Public API\n// ============================================\n\n/**\n * Convert a React element tree to Unlayer's DesignJSON format.\n *\n * The root element must be a `<Body>`, `<Email>`, `<Page>`, or `<Document>`.\n * The tree is walked statically — no HTML rendering is performed.\n *\n * @param element - A React element tree with Body > Row > Column > Item structure\n * @returns DesignJSON object compatible with the Unlayer editor\n * @throws {Error} If the root element is not a recognized container component\n *\n * @example\n * ```tsx\n * import { renderToJson, Body, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const design = renderToJson(\n * <Body backgroundColor=\"#ffffff\" contentWidth=\"600px\">\n * <Row>\n * <Column>\n * <Paragraph>Hello World</Paragraph>\n * </Column>\n * </Row>\n * </Body>\n * );\n * ```\n */\n/**\n * Convert a single `<Row>` element to Unlayer's row JSON format.\n *\n * Use this when targeting a Block Editor, which works with individual rows\n * rather than full design JSON. For full designs, use `renderToJson` instead.\n *\n * @param element - A React element tree with Row > Column > Item structure\n * @returns A DesignRow object compatible with the Unlayer block editor\n * @throws {Error} If the element is not a `<Row>`\n *\n * @example\n * ```tsx\n * import { renderRowToJson, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const row = renderRowToJson(\n * <Row>\n * <Column>\n * <Paragraph>Hello World</Paragraph>\n * </Column>\n * </Row>\n * );\n * ```\n */\nexport function renderRowToJson(element: React.ReactElement): DesignRow {\n const displayName = getDisplayName(element);\n\n if (displayName !== \"Row\") {\n throw new Error(\n `[Unlayer] renderRowToJson: Element must be <Row>, ` +\n `but got <${componentName(element) || \"unknown\"}>. ` +\n `For full designs, use renderToJson instead.`\n );\n }\n\n const counters: Record<string, number> = {};\n // A render of its own, as renderToJson's: the same row gives the same ids every time. React renders what's in it.\n return withRenderScope(() => processRow(normalizedChildren(element).find((c): c is React.ReactElement => React.isValidElement(c)) ?? element, counters));\n}\n\nexport function renderToJson(element: React.ReactElement): DesignJSON {\n return withRenderScope(() => designJson(element));\n}\n\nfunction designJson(element: React.ReactElement): DesignJSON {\n // Accept a user wrapper component (e.g. <MyEmail/>) by unwrapping to its root,\n // matching renderToHtml which renders wrappers through React.\n element = unwrapForJson(element);\n const displayName = getDisplayName(element);\n // One React render collects the rows and blocks (as the HTML does).\n if (displayName && ROOT_NAMES.has(displayName)) element = normalizedRoot(element);\n\n if (!displayName || !ROOT_NAMES.has(displayName)) {\n throw new Error(\n `[Unlayer] renderToJson: Root element must be <Body>, <Email>, <Page>, or <Document>, ` +\n `but got <${componentName(element) || \"unknown\"}>. ` +\n `Wrap your content: <Body><Row><Column>...</Column></Row></Body>`\n );\n }\n\n // Email/Page/Document are thin wrappers around Body — for JSON purposes,\n // we treat them identically: extract props directly from the wrapper element.\n // The wrapper's own render function would re-render as Body, but we don't\n // call render — we just walk the element tree.\n\n // For Email/Page/Document, the children and semantic props are on the\n // wrapper element directly, same as Body.\n const counters: Record<string, number> = {};\n const body = processBody(element, counters);\n\n return {\n counters,\n body,\n schemaVersion,\n };\n}\n","/**\n * extractHeadFromTree — Walk a React element tree and collect <head> CSS/JS\n * from the exporters' head functions.\n *\n * Mirrors the editor's extractHead.ts but works with the React element tree\n * instead of the Redux design state. Uses the same pattern as render-to-json.ts\n * to walk Body > Row > Column > Item structure.\n */\n\nimport React from \"react\";\nimport { collectDeviceStyles, deviceStylesCss, deviceVisibilityCss } from \"./device-overrides\";\nimport { heads } from \"@unlayer/exporters\";\nimport { mergeValues } from \"@unlayer-internal/shared-elements\";\nimport type { RenderMode, HeadConfig } from \"@unlayer-internal/shared-elements\";\nimport { mapSemanticProps } from \"./semantic-props\";\nimport { UNLAYER_CONFIG_KEY } from \"./create-component\";\nimport { BODY_DEFAULTS, ROW_DEFAULTS, COLUMN_DEFAULTS } from \"./container-defaults\";\nimport { KEPT, normalizedRoot } from \"./normalize\";\nimport { getDisplayName } from \"./unwrap-root\";\nimport { extractSemanticProps, nextCounter } from \"./render-to-json\";\n\n/** Args every head builder receives: (values, bodyValues, meta). */\ntype HeadArgs = [Record<string, any>, Record<string, any>, Record<string, any>];\n\n/**\n * Local type for a component's head contributions — the optional css/js/tags\n * builders this file invokes to collect the <head> CSS/JS/tags.\n */\ntype ComponentHead = {\n css?: (...args: HeadArgs) => string | undefined;\n js?: (...args: HeadArgs) => string | undefined;\n tags?: (...args: HeadArgs) => string[] | undefined;\n};\n\n// ============================================\n// Inlined helpers\n// ============================================\n\n/** Add _meta fields if not present. */\nfunction ensureMeta(values: any, type: string, index: number = 0): any {\n return {\n ...values,\n _meta: {\n htmlID: `${[\"row\", \"column\"].includes(type) ? \"u\" : \"u_content\"}_${type.toLowerCase()}_${index + 1}`,\n htmlClassNames: `u_content_${type.toLowerCase()}`,\n ...(values._meta || {})\n }\n };\n}\n\n\n/** The element children of a collected (Elements-only) tree. */\nconst collectChildren = (node: React.ReactNode): React.ReactElement[] => React.Children.toArray(node).filter(React.isValidElement);\n\n// ============================================\n// Types\n// ============================================\n\nexport interface ExtractHeadResult {\n /** Combined CSS from all head functions */\n css: string;\n /** Combined JS from all head functions */\n js: string;\n /** Unique HTML tags (meta, link, etc.) from all head functions */\n tags: string[];\n}\n\nexport interface ExtractHeadOptions {\n /** Display mode for rendering */\n displayMode: RenderMode;\n /** Optional head config for feature flags and initial values */\n headConfig?: HeadConfig;\n}\n\n/**\n * Call a head's css/js/tags functions and collect the results.\n */\nfunction callHead(\n head: ComponentHead | undefined,\n values: Record<string, any>,\n bodyValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n styles: string[],\n scripts: string[],\n tags: string[]\n): void {\n if (!head) return;\n\n const headArgs: [Record<string, any>, Record<string, any>, Record<string, any>] = [\n values,\n bodyValues,\n {\n displayMode,\n isViewer: false,\n variant: null,\n type: \"rows\",\n headConfig,\n },\n ];\n\n const css = head.css?.(...headArgs);\n if (css) styles.push(css);\n\n const js = head.js?.(...headArgs);\n if (js) scripts.push(js);\n\n const headTags = head.tags?.(...headArgs);\n if (headTags) tags.push(...headTags);\n}\n\n// ============================================\n// Tree walkers\n// ============================================\n\nfunction walkItem(\n element: React.ReactElement,\n bodyValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n counters: Record<string, number>,\n styles: string[],\n scripts: string[],\n tags: string[],\n deviceStyles: Record<string, string[]>\n): void {\n const componentType = element.type as any;\n const config = componentType[UNLAYER_CONFIG_KEY];\n if (!config) {\n // Markup a component of the user's own rendered in a Column: the HTML numbers it after the component.\n if (componentType?.[KEPT]) nextCounter(counters, `u_content_${(componentType.displayName || componentType.name || \"component\").toLowerCase()}`);\n return;\n }\n\n const { name, defaultValues, propMapper } = config;\n\n // Map and merge values (same as render-to-json and create-component)\n const { children, ...restProps } = element.props;\n const mappedValues = propMapper({ children, ...restProps });\n const finalValues = mergeValues(defaultValues, mappedValues);\n\n // Track component index (same counter pattern as render-to-json.ts)\n const contentType = config.metaName ?? name.toLowerCase();\n const count = nextCounter(counters, `u_content_${contentType}`);\n const valuesWithMeta = ensureMeta(finalValues, contentType, count - 1);\n\n collectDeviceStyles(valuesWithMeta, \"contents\", name, displayMode, deviceStyles);\n\n // The component's own head (custom tools) wins over the registry lookup\n const head =\n (config.head as ComponentHead | undefined) ??\n (heads as Record<string, ComponentHead | undefined>)[name];\n callHead(head, valuesWithMeta, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n}\n\nfunction walkColumn(\n element: React.ReactElement,\n bodyValues: Record<string, any>,\n rowValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n counters: Record<string, number>,\n styles: string[],\n scripts: string[],\n tags: string[],\n deviceStyles: Record<string, string[]>\n): void {\n // Column head\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, COLUMN_DEFAULTS, \"Column\");\n const count = nextCounter(counters, \"u_column\");\n const columnValues = ensureMeta(mergeValues(COLUMN_DEFAULTS, mapped), \"column\", count - 1);\n\n collectDeviceStyles(columnValues, \"columns\", \"Column\", displayMode, deviceStyles);\n\n const columnHead = (heads as Record<string, ComponentHead | undefined>)[\"Column\"];\n callHead(columnHead, columnValues, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n // Walk item children\n const children = collectChildren(element.props.children);\n for (const child of children) {\n walkItem(child, bodyValues, displayMode, headConfig, counters, styles, scripts, tags, deviceStyles);\n }\n}\n\nfunction walkRow(\n element: React.ReactElement,\n bodyValues: Record<string, any>,\n displayMode: RenderMode,\n headConfig: HeadConfig,\n counters: Record<string, number>,\n styles: string[],\n scripts: string[],\n tags: string[],\n deviceStyles: Record<string, string[]>\n): void {\n // Row head\n const semanticProps = extractSemanticProps(element.props, [\"layout\"]);\n const mapped = mapSemanticProps(semanticProps, ROW_DEFAULTS, \"Row\");\n const count = nextCounter(counters, \"u_row\");\n const rowValues = ensureMeta(mergeValues(ROW_DEFAULTS, mapped), \"row\", count - 1);\n\n collectDeviceStyles(rowValues, \"rows\", \"Row\", displayMode, deviceStyles);\n\n const rowHead = (heads as Record<string, ComponentHead | undefined>)[\"Row\"];\n callHead(rowHead, rowValues, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n // Walk column children\n const children = collectChildren(element.props.children);\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Column\") {\n walkColumn(child, bodyValues, rowValues, displayMode, headConfig, counters, styles, scripts, tags, deviceStyles);\n }\n }\n}\n\n// ============================================\n// Public API\n// ============================================\n\n/**\n * Extract head CSS/JS/tags from a React element tree.\n *\n * Walks the tree statically (same approach as renderToJson) and calls\n * each component's head function from @unlayer/exporters.\n *\n * @param element - Root element (Body, Email, Page, or Document)\n * @param options - Display mode and optional head config\n * @returns Combined CSS, JS, and tags from all head functions\n */\nexport function extractHeadFromTree(\n element: React.ReactElement,\n options: ExtractHeadOptions\n): ExtractHeadResult {\n // The rows and blocks as the body rendered them (the same collected render).\n element = normalizedRoot(element);\n const { displayMode } = options;\n const headConfig: HeadConfig = {\n hasFeature: options.headConfig?.hasFeature ?? (() => false),\n getInitialValues: options.headConfig?.getInitialValues ?? (() => ({})),\n };\n\n const styles: string[] = [];\n const scripts: string[] = [];\n const tags: string[] = [];\n const counters: Record<string, number> = {};\n const deviceStyles: Record<string, string[]> = {};\n\n // Extract body values\n const semanticProps = extractSemanticProps(element.props);\n const mapped = mapSemanticProps(semanticProps, BODY_DEFAULTS, \"Body\");\n const bodyValues = ensureMeta(mergeValues(BODY_DEFAULTS, mapped), \"body\", 0);\n\n // Body head\n const bodyHead = (heads as Record<string, ComponentHead | undefined>)[\"Body\"];\n callHead(bodyHead, bodyValues, bodyValues, displayMode, headConfig, styles, scripts, tags);\n\n // Walk rows\n const children = collectChildren(element.props.children);\n for (const child of children) {\n const name = getDisplayName(child);\n if (name === \"Row\") {\n walkRow(child, bodyValues, displayMode, headConfig, counters, styles, scripts, tags, deviceStyles);\n }\n }\n\n styles.unshift(deviceVisibilityCss(displayMode));\n const overrides = deviceStylesCss(deviceStyles, displayMode);\n if (overrides) styles.push(overrides);\n\n // Deduplicate tags\n const uniqueTags = [...new Set(tags.filter(Boolean))];\n\n return {\n css: styles.filter(Boolean).join(\"\\n\"),\n js: scripts.filter(Boolean).join(\"\\n\"),\n tags: uniqueTags,\n };\n}\n","/**\n * Document layouts — the per-mode HTML shells renderToHtml wraps the body in.\n *\n * Each layout matches the document shell the Unlayer editor produces when\n * exporting HTML, so a design renders identically whether exported from the\n * editor or rendered from Elements. The golden-template snapshots lock the\n * current output.\n *\n * Layouts only place pre-built pieces — escaping and tag construction stay\n * in render-to-html.tsx.\n */\n\nexport interface DocumentLayoutArgs {\n /** ` lang=\"ar\"` attribute chunk for <html>, or \"\" */\n lang?: string;\n /** ` dir=\"rtl\"` attribute chunk for <html>, or \"\" */\n dir: string;\n /** `<title>...</title>` or \"\" */\n titleTag: string;\n /** Newline-joined head tags from component head functions, or \"\" */\n tagLines: string;\n /** `<style type=\"text/css\">...</style>` or \"\" */\n styleTag: string;\n /** `<script type=\"application/javascript\">...</script>` or \"\" */\n scriptTag: string;\n /** Concatenated `<link rel=\"stylesheet\">` tags for web fonts, or \"\" */\n fontLinks: string;\n /** Rendered body markup (includes <body> in email/document mode, not web) */\n body: string;\n}\n\n/**\n * Email shell — XHTML transitional doctype, VML/Office namespaces, and the\n * MSO conditional comments Outlook needs. The body markup already contains\n * the <body> tag in email mode.\n */\nexport function emailLayout(args: DocumentLayoutArgs): string {\n const { dir, titleTag, tagLines, styleTag, scriptTag, fontLinks, body } = args;\n\n const head = [\n titleTag,\n tagLines,\n styleTag,\n scriptTag,\n fontLinks && `<!--[if !mso]><!-->${fontLinks}<!--<![endif]-->`,\n ]\n .filter(Boolean)\n .join(\"\\n \");\n\n return `<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional //EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html${dir}${args.lang || \"\"} xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">\n<head>\n<!--[if gte mso 9]>\n<xml>\n <o:OfficeDocumentSettings>\n <o:AllowPNG/>\n <o:PixelsPerInch>96</o:PixelsPerInch>\n </o:OfficeDocumentSettings>\n</xml>\n<![endif]-->\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta name=\"x-apple-disable-message-reformatting\">\n <!--[if !mso]><!--><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><!--<![endif]-->\n ${head}\n</head>\n${body}\n</html>\n`;\n}\n\n/**\n * Document (print/PDF) shell — XHTML transitional doctype. The body markup\n * already contains the <body> tag in document mode. Fonts are emitted as\n * <link> tags — PDF renderers that can't fetch should pass no fonts.\n */\nexport function documentLayout(args: DocumentLayoutArgs): string {\n const { dir, titleTag, tagLines, styleTag, scriptTag, fontLinks, body } = args;\n\n const head = [titleTag, tagLines, styleTag, scriptTag, fontLinks]\n .filter(Boolean)\n .join(\"\\n \");\n\n return `<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional //EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html${dir}${args.lang || \"\"} xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n ${head}\n</head>\n${body}\n</html>\n`;\n}\n\n/**\n * Web shell — HTML5 doctype with standard viewport/charset meta tags.\n * The body markup has no <body> tag in web mode, so the shell provides it.\n */\nexport function webLayout(args: DocumentLayoutArgs): string {\n const { dir, titleTag, tagLines, styleTag, scriptTag, fontLinks, body } = args;\n\n const head = [titleTag, fontLinks, tagLines, styleTag, scriptTag]\n .filter(Boolean)\n .join(\"\\n \");\n\n return `<!doctype html>\n<html${dir}${args.lang || \"\"}>\n <head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n <meta name=\"description\" content=\"\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n ${head}\n </head>\n <body>\n${body}\n </body>\n</html>\n`;\n}\n","import React from \"react\";\nimport { renderToStaticMarkup } from \"./server-renderer\";\nimport type { UnlayerConfig } from \"@unlayer-internal/shared-elements\";\nimport { DEFAULT_CONFIG } from \"@unlayer-internal/shared-elements\";\nimport { htmlToPlainText } from \"@unlayer-internal/shared-elements\";\nimport type { RenderMode } from \"@unlayer-internal/shared-elements\";\nimport { extractHeadFromTree } from \"./extract-head\";\nimport { htmlRoot } from \"./unwrap-root\";\nimport { normalizedRoot } from \"./normalize\";\nimport { withRenderScope } from \"./render-scope\";\nimport { textDirectionOf } from \"./create-component\";\nimport {\n emailLayout,\n webLayout,\n documentLayout,\n type DocumentLayoutArgs,\n} from \"./document-layouts\";\n\n// Email/Page/Document lock their render mode internally (they render\n// <Body mode=\"...\">), so the top-level element's own props never carry it.\n// Map wrapper displayName → mode so head extraction and the document layout\n// always match what the body actually rendered as.\nconst MODE_BY_WRAPPER: Record<string, RenderMode> = {\n Email: \"email\",\n Page: \"web\",\n Document: \"document\",\n};\n\n/** A template's direction follows its root props; explicit renderer options still win. */\nfunction resolveConfig(element: React.ReactElement, config?: Partial<UnlayerConfig>): UnlayerConfig {\n const props = element.props as { textDirection?: string; values?: { textDirection?: string } };\n const textDirection = textDirectionOf(props.textDirection ?? props.values?.textDirection);\n return { ...DEFAULT_CONFIG, ...(textDirection !== undefined ? { textDirection } : {}), ...config };\n}\n\n/**\n * Resolve the display mode for a tree: wrapper component type first\n * (Email/Page/Document), then an explicit `mode` prop (Body), then config.\n */\nfunction resolveDisplayMode(\n element: React.ReactElement,\n mergedConfig: Partial<UnlayerConfig>\n): RenderMode {\n const displayName = (element.type as { displayName?: string })?.displayName;\n const wrapperMode = displayName ? MODE_BY_WRAPPER[displayName] : undefined;\n return (\n wrapperMode ??\n (element.props as { mode?: RenderMode }).mode ??\n mergedConfig.mode ??\n \"web\"\n );\n}\n\n/**\n * Render the element tree to body markup (no document shell).\n *\n * - Passes merged config via the `config` prop (no React context — works in\n * Server Components)\n * - Uses `renderToStaticMarkup` — no React hydration markers\n */\nfunction renderBody(\n element: React.ReactElement,\n config?: Partial<UnlayerConfig>,\n name = \"renderToHtml\"\n): string {\n const mergedConfig = resolveConfig(element, config);\n\n try {\n // Pass config via prop (not context) so this works in React Server Components.\n // Body reads `config` prop and threads it as `_config` to children via cloneElement.\n const enriched = React.cloneElement(element, { config: mergedConfig });\n return renderToStaticMarkup(enriched);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `[Unlayer] ${name} failed: ${message}\\n` +\n `Tip: Ensure your tree uses Body > Row > Column > Item structure.`\n );\n }\n}\n\n/**\n * Strip the outer `<div>` wrapper that Body's renderer adds around the\n * exporter output, leaving the raw body markup for document assembly.\n */\nfunction stripOuterDiv(html: string): string {\n const match = html.match(/^\\s*<div[^>]*>([\\s\\S]*)<\\/div>\\s*$/);\n return match ? match[1] : html;\n}\n\n/** Minimal escaping for text interpolated into HTML (title, font URLs). */\nfunction escapeForHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/**\n * Options for renderToHtml — config overrides plus document-level extras.\n */\nexport interface RenderToHtmlOptions extends Partial<UnlayerConfig> {\n /** Document language; overrides the root's `lang` prop. */\n lang?: string;\n /** Document `<title>` */\n title?: string;\n /**\n * Web-font stylesheets to load via `<link rel=\"stylesheet\">` tags.\n * Elements has no font registry, so pass the URLs for any non-system\n * fonts your design uses (e.g. Google Fonts CSS URLs).\n */\n fonts?: Array<{ url: string }>;\n}\n\n/**\n * Renders an Unlayer element tree to a complete HTML document — from\n * `<!DOCTYPE ...>` to `</html>` — matching the editor's exportHtml layouts.\n *\n * Per-mode document shells (mirroring the editor's layout templates):\n * - `email`: XHTML transitional doctype, VML/Office namespaces, and the MSO\n * conditional comments Outlook needs\n * - `web`: HTML5 doctype with standard viewport/charset meta tags\n * - `document`: XHTML transitional doctype for print/PDF pipelines\n *\n * Use {@link renderToHtmlParts} instead when your app owns the document\n * shell and only needs the head/body chunks.\n *\n * @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`), or a\n * template component that returns one (`<Welcome name=\"Ada\" />`, also `memo`/`forwardRef`).\n * A template is called in a render of its own to reach its root (its hooks work); a class\n * component, or one that doesn't return an element, renders without its root's settings,\n * with a warning.\n * @param options - Config overrides (mode, cdnBaseUrl, etc.) plus `title` and `fonts`\n * @returns Complete HTML document string\n * @throws {Error} If rendering fails, with a helpful message\n *\n * @example\n * ```tsx\n * import { renderToHtml, Email, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const html = renderToHtml(\n * <Email><Row><Column><Paragraph>Hello</Paragraph></Column></Row></Email>,\n * { title: \"Welcome\" }\n * );\n * // \"<!DOCTYPE HTML PUBLIC ...><html ...>...</html>\"\n * ```\n */\nexport function renderToHtml(\n element: React.ReactElement,\n options?: RenderToHtmlOptions\n): string {\n return withRenderScope(() => htmlDocument(element, options));\n}\n\n/** CSS for a `<style>` element: a `</style` in it would end the element (CSS escapes the slash). */\nfunction styleText(css: string): string {\n return css.replace(/<\\/(style)/gi, \"<\\\\/$1\");\n}\n\nfunction htmlDocument(element: React.ReactElement, options?: RenderToHtmlOptions): string {\n const { title, lang: optionLang, fonts: optionFonts = [], ...config } = options ?? {};\n // A template component (<Welcome/>) renders as its root, whose settings follow.\n element = htmlRoot(element, \"renderToHtml\");\n // The root's own `fonts` prop, then the option's, each URL once.\n const rootFonts = (element.props as { fonts?: Array<{ url: string }> } | null)?.fonts ?? [];\n const fonts = [...rootFonts, ...optionFonts].filter((font, i, all) => font?.url && all.findIndex((f) => f?.url === font.url) === i);\n\n const lang = optionLang ?? (element.props as { lang?: string }).lang;\n const mergedConfig = resolveConfig(element, config);\n const displayMode = resolveDisplayMode(element, mergedConfig);\n\n // Only Unlayer wrappers (Body/Email/Page/Document) get their renderer's\n // host <div> stripped — for any other root (a bare item, a custom\n // component) the outer div is the element's own markup and must stay.\n const wrapperName = (element.type as { displayName?: string })?.displayName;\n const isUnlayerWrapper =\n wrapperName === \"Body\" || (wrapperName ? wrapperName in MODE_BY_WRAPPER : false);\n const rawBody = renderBody(element, config);\n const body = isUnlayerWrapper ? stripOuterDiv(rawBody) : rawBody;\n const { css, js, tags } = extractHeadFromTree(element, {\n displayMode,\n headConfig: mergedConfig.headConfig,\n });\n\n const layoutArgs: DocumentLayoutArgs = {\n lang: lang ? ` lang=\"${escapeForHtml(String(lang))}\"` : \"\",\n dir: mergedConfig.textDirection\n ? ` dir=\"${escapeForHtml(String(mergedConfig.textDirection))}\"`\n : \"\",\n titleTag: title ? `<title>${escapeForHtml(title.trim())}</title>` : \"\",\n styleTag: css ? `<style type=\"text/css\">\\n${styleText(css)}\\n</style>` : \"\",\n scriptTag: js\n ? `<script type=\"application/javascript\">\\n${js}\\n</script>`\n : \"\",\n tagLines: tags.join(\"\\n\"),\n fontLinks: fonts\n .filter((font) => font?.url)\n .map(\n (font) =>\n `<link href=\"${escapeForHtml(String(font.url))}\" rel=\"stylesheet\" type=\"text/css\">`\n )\n .join(\"\"),\n body,\n };\n\n if (displayMode === \"email\") return emailLayout(layoutArgs);\n if (displayMode === \"document\") return documentLayout(layoutArgs);\n return webLayout(layoutArgs);\n}\n\n/**\n * Renders an Unlayer element tree to a plain text string.\n *\n * Renders the body markup then converts to plain text using\n * `htmlToPlainText`. Useful for generating the text/plain MIME part\n * of multipart emails (critical for deliverability).\n *\n * @param element - A React element tree (e.g. `<Body><Row>...</Row></Body>`)\n * @param config - Optional config overrides (mode, cdnBaseUrl, etc.)\n * @returns Plain text representation of the email\n *\n * @example\n * ```tsx\n * import { renderToPlainText, Body, Row, Column, Paragraph } from \"@unlayer/react-elements\";\n *\n * const text = renderToPlainText(\n * <Body mode=\"email\"><Row><Column><Paragraph>Hello World</Paragraph></Column></Row></Body>\n * );\n * // \"Hello World\"\n * ```\n */\nexport function renderToPlainText(\n element: React.ReactElement,\n config?: Partial<UnlayerConfig>\n): string {\n // A template component renders as its root, as in renderToHtml (context providers around it included).\n const html = withRenderScope(() => {\n const root = htmlRoot(element, \"renderToPlainText\");\n // Collected first, as renderToHtml's head is: it fails where that does (a component that isn't one), not with\n // empty text (Body leaves out what fails, for a live preview).\n normalizedRoot(root);\n return renderBody(root, config, \"renderToPlainText\");\n });\n return htmlToPlainText(html);\n}\n\n/**\n * Result of renderToHtmlParts — head and body as separate strings.\n */\nexport interface HtmlParts {\n /**\n * Pre-assembled `<head>` content: the css in a `<style>` tag, the js in a\n * `<script>` tag, and the tags — joined and ready to drop into a document.\n * Equivalent to composing the granular fields below yourself.\n */\n head: string;\n /**\n * The rendered body markup, wrapped in the renderer's host `<div>`. In\n * email/document mode it contains the `<body>` tag itself; web mode has\n * none. No doctype/html/head shell — embeddable as-is, or extract the\n * `<body>` tag when composing a full document.\n */\n body: string;\n /** Raw component CSS (no `<style>` wrapper) — e.g. for inlining pipelines */\n css: string;\n /** Raw component JS (no `<script>` wrapper); empty for most email designs */\n js: string;\n /**\n * Individual head tags (`<meta>`, `<link>`, ...) contributed by components.\n * Not part of the editor's documented chunk parameters, but exposed here\n * because `head` can contain them — without this field, reassembling the\n * head from `css` + `js` would silently drop them. Usually empty.\n *\n * There is deliberately no `fonts` chunk: Elements has no font registry to\n * resolve font URLs from — pass stylesheet URLs via renderToHtml's `fonts`\n * option instead.\n */\n tags: string[];\n}\n\n/**\n * Renders an Unlayer element tree to separate head and body HTML strings.\n *\n * Use this when your app owns the document shell — an existing page\n * template, an ESP template with its own meta tags, an iframe srcdoc —\n * and you want to place the `<style>` block and body markup yourself.\n * For a complete ready-to-send document in one call, use\n * {@link renderToHtml}.\n *\n * - `head` contains `<style>` tags with CSS generated by each component's\n * head function (button hover colors, body fonts, link styles, etc.)\n * - `body` is the rendered body markup without any document shell\n *\n * @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`)\n * @param config - Optional config overrides (mode, cdnBaseUrl, etc.)\n * @returns `{ head, body }` — drop these into your HTML document template\n *\n * @example\n * ```tsx\n * import { renderToHtmlParts, Email, Row, Column, Button } from \"@unlayer/react-elements\";\n *\n * const { head, body } = renderToHtmlParts(\n * <Email>\n * <Row><Column><Button>Click</Button></Column></Row>\n * </Email>\n * );\n *\n * const html = `<!DOCTYPE html>\n * <html><head>${head}</head>${body}</html>`;\n * ```\n */\nexport function renderToHtmlParts(\n element: React.ReactElement,\n config?: Partial<UnlayerConfig>\n): HtmlParts {\n return withRenderScope(() => htmlParts(element, config));\n}\n\nfunction htmlParts(element: React.ReactElement, config?: Partial<UnlayerConfig>): HtmlParts {\n element = htmlRoot(element, \"renderToHtmlParts\");\n // Render body markup\n const body = renderBody(element, config, \"renderToHtmlParts\");\n\n // Resolve display mode from the wrapper component, element props, or config\n const mergedConfig = resolveConfig(element, config);\n const displayMode = resolveDisplayMode(element, mergedConfig);\n\n // Extract head CSS/JS/tags by walking the element tree\n const { css, js, tags } = extractHeadFromTree(element, {\n displayMode,\n headConfig: mergedConfig.headConfig,\n });\n\n // Build head string\n const headParts: string[] = [];\n\n if (css) {\n headParts.push(`<style>${styleText(css)}</style>`);\n }\n\n if (js) {\n headParts.push(`<script>${js}</script>`);\n }\n\n if (tags.length > 0) {\n headParts.push(...tags);\n }\n\n return {\n head: headParts.join(\"\\n\"),\n body,\n css,\n js,\n tags,\n };\n}\n","/**\n * registerTool — render the editor's custom tools from code.\n *\n * Accepts the same tool definition object embedders already write for\n * `unlayer.registerTool` (see docs.unlayer.com › Custom Tools) and returns a\n * React component. One definition powers both runtimes:\n *\n * - The Builder uses `label`/`icon`/`options`/`renderer.Viewer`/`validator`\n * for its panel, canvas, and audit — Elements ignores those.\n * - Elements calls `renderer.exporters[mode](values)` to produce HTML and\n * collects `renderer.head` css/js like any built-in component, so code\n * output matches editor exports by construction — it is the same function.\n * - `renderToJson` emits `{ type: \"custom\", slug: <name>, values }`, the\n * shape the editor stores, so designs round-trip into the Builder where\n * the same tool is registered.\n *\n * Sanitization: like editor exports, the tool's HTML output is passed\n * through `toSafeHtml` when one is configured. The default config has NO\n * sanitizer — with untrusted values, configure `toSafeHtml` (same caveat\n * as the `<Html>` component).\n */\n\nimport React from \"react\";\nimport {\n createItemComponent,\n type BaseItemComponentProps,\n} from \"./create-component\";\nimport type { DeviceProps, RenderMode } from \"@unlayer-internal/shared-elements\";\nimport { normalizeLinkValue } from \"@unlayer-internal/shared-elements\";\n\n/** Exporter: `(values) => html`. Extra args mirror built-in exporters and can be ignored. */\nexport type ToolExporter = (values: any, ...args: any[]) => string;\n\n/** One property in an options group — Elements reads only the default. */\ninterface ToolOptionConfig {\n defaultValue?: unknown;\n /** Disabled options contribute no default */\n enabled?: boolean;\n [editorOnly: string]: unknown;\n}\n\n/** A property group: `options.<group>.options.<property>` */\ninterface ToolOptionGroup {\n options?: Record<string, ToolOptionConfig | undefined>;\n [editorOnly: string]: unknown;\n}\n\n/**\n * The subset of the `unlayer.registerTool` config Elements reads. Extra\n * editor-only fields (label, icon, Viewer, validator, transformer, ...)\n * are accepted and ignored, so the same object can be passed to both APIs.\n */\nexport interface ElementsToolConfig {\n /** Unique tool name — becomes the design JSON `slug` */\n name: string;\n /** Initial values for the tool's properties (win over option defaults) */\n values?: Record<string, any>;\n /**\n * Property groups. Real-world tools usually define their defaults here,\n * as each property's `defaultValue` — those seed the initial values,\n * with tool-level `values` taking precedence (the editor's order).\n */\n options?: Record<string, ToolOptionGroup | undefined>;\n renderer: {\n /** Per-mode HTML exporters. `document` falls back to `web`. */\n exporters: Partial<Record<RenderMode, ToolExporter>>;\n /** Optional head contributions collected into the document `<head>` */\n head?: {\n css?: (values: any, ...args: any[]) => string | undefined;\n js?: (values: any, ...args: any[]) => string | undefined;\n tags?: (values: any, ...args: any[]) => string[] | undefined;\n };\n /** Editor-only canvas renderer — ignored by Elements */\n Viewer?: unknown;\n };\n /** React DevTools name (defaults to the tool name) */\n displayName?: string;\n /** Editor-only fields (label, icon, options, validator, ...) — ignored */\n [editorOnly: string]: unknown;\n}\n\n/**\n * Props: the tool's values as flat props, plus a `values` escape hatch. Every prop is the tool's own, as in 0.1.22:\n * a `mobile` or `hideOnMobile` value isn't a device setting (`values._override` sets those).\n */\nexport type ElementsToolProps = Omit<BaseItemComponentProps, keyof DeviceProps> &\n Record<string, any> & { values?: Record<string, any> };\n\n/**\n * Fold each option group's property `defaultValue`s into initial values,\n * skipping disabled properties — the same seeding the editor performs, so\n * tools that keep `values: {}` and define defaults on their widgets (the\n * common real-world shape) render with those defaults.\n */\nfunction initialValuesFromOptions(\n options: ElementsToolConfig[\"options\"]\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const group of Object.values(options ?? {})) {\n for (const [property, option] of Object.entries(group?.options ?? {})) {\n if (!option || option.enabled === false) continue;\n if (typeof option.defaultValue !== \"undefined\") {\n result[property] = option.defaultValue;\n }\n }\n }\n return result;\n}\n\n/**\n * Wrap an exporter so its output is sanitized when the Unlayer config\n * provides a `toSafeHtml` — mirroring how editor exports treat custom tool\n * HTML. The exporter meta (last argument) carries the exporterConfig.\n */\nfunction withSanitizer(exporter: ToolExporter): ToolExporter {\n return (values: any, ...args: any[]) => {\n // Coerce before sanitizing — exporters may return non-strings, and a\n // configured sanitizer must always receive a string.\n const html = String(exporter(values, ...args) ?? \"\");\n const meta = args[args.length - 1];\n const toSafeHtml = meta?.exporterConfig?.toSafeHtml;\n return typeof toSafeHtml === \"function\" ? toSafeHtml(html) : html;\n };\n}\n\n/**\n * Exporters receive link-widget values in render shape (`{ url, target }`),\n * exactly as they do in the editor — tools written for the editor read\n * `values.<option>.url`. Options with `widget: \"link\"` are collected at\n * registration and normalized from the storage shape before each render.\n */\nfunction withLinkNormalization(\n exporter: ToolExporter,\n linkKeys: string[]\n): ToolExporter {\n if (linkKeys.length === 0) return exporter;\n return (values: any, ...args: any[]) => {\n const out = { ...values };\n for (const key of linkKeys) {\n const normalized = normalizeLinkValue(out[key]);\n if (normalized !== undefined) out[key] = normalized;\n }\n return exporter(out, ...args);\n };\n}\n\n/** Option keys declared with the `link` widget across all groups. */\nfunction linkWidgetKeys(options: ElementsToolConfig[\"options\"]): string[] {\n const keys: string[] = [];\n for (const group of Object.values(options ?? {})) {\n for (const [key, option] of Object.entries(group?.options ?? {})) {\n if (option && option.widget === \"link\") keys.push(key);\n }\n }\n return keys;\n}\n\n/**\n * Create a React component from a custom tool definition — a custom tool\n * is the custom component you create: the same term (and the same config)\n * as the editor's `unlayer.registerTool`, so one definition serves both.\n *\n * @example\n * ```tsx\n * const Countdown = registerTool({\n * name: \"countdown\",\n * values: { endTime: \"\", digitColor: \"#404040\" },\n * renderer: {\n * exporters: {\n * web: (values) => `<div style=\"color:${values.digitColor}\">…</div>`,\n * email: (values) => `<table role=\"presentation\">…</table>`,\n * },\n * },\n * });\n *\n * <Email><Row><Column>\n * <Countdown endTime=\"2026-08-01T00:00:00Z\" digitColor=\"#e11d48\" />\n * </Column></Row></Email>\n * ```\n */\nexport function registerTool(\n tool: ElementsToolConfig\n): React.FC<ElementsToolProps> {\n if (!tool?.name || typeof tool.name !== \"string\") {\n throw new Error(\"[Unlayer] registerTool: `name` is required\");\n }\n const exporters = tool.renderer?.exporters;\n if (!exporters || (!exporters.web && !exporters.email)) {\n throw new Error(\n `[Unlayer] registerTool(\"${tool.name}\"): ` +\n \"`renderer.exporters` needs at least a `web` or `email` exporter\"\n );\n }\n\n const linkKeys = linkWidgetKeys(tool.options);\n const sanitized: Partial<Record<RenderMode, ToolExporter>> = {};\n for (const mode of [\"web\", \"email\", \"document\"] as RenderMode[]) {\n const exporter = exporters[mode];\n if (exporter) {\n sanitized[mode] = withSanitizer(withLinkNormalization(exporter, linkKeys));\n }\n }\n // Match the editor's fallback: modes without an exporter render via web,\n // and email-only tools use their email exporter everywhere.\n if (!sanitized.web && sanitized.email) sanitized.web = sanitized.email;\n\n return createItemComponent<Record<string, any>, Record<string, any>>({\n name: tool.name,\n displayName: tool.displayName ?? tool.name,\n // Option-group widget defaults seed the values; tool-level `values`\n // win — the editor's precedence.\n defaultValues: {\n ...initialValuesFromOptions(tool.options),\n ...(tool.values ?? {}),\n },\n // Flat props are the tool's values; `values` is the escape hatch.\n propMapper: ({ children: _children, values, ...rest }) => ({\n ...(values ?? {}),\n ...rest,\n }),\n exporters: sanitized,\n contentType: \"custom\",\n slug: tool.name,\n metaName: `custom_${tool.name}`,\n head: tool.renderer.head,\n });\n}\n\n/** Alias of {@link registerTool}. */\nexport const registerElementsTool = registerTool;\n"]}
|