@broadpaper/core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/template.ts","../src/richtext/model.ts","../src/expr/ast.ts","../src/expr/parser.ts","../src/expr/format.ts","../src/expr/evaluate.ts","../src/expr/typecheck.ts","../src/expr/condition.ts","../src/theme/default-theme.ts","../src/theme/tokens.ts","../src/theme/resolve-style.ts","../src/vnode/h.ts","../src/registry/block-definition.ts","../src/registry/registry.ts","../src/schema/template.schema.ts","../src/schema/ids.ts","../src/schema/migrate.ts","../src/schema/create.ts","../src/data/sample.ts","../src/resolve/describe.ts","../src/resolve/resolve.ts","../src/resolve/resolved.ts","../src/layout/page-geometry.ts","../src/layout/paginate.ts","../src/validate/issues.ts","../src/validate/validate.ts","../src/validate/output.ts","../src/editor/tree.ts","../src/editor/commands.ts","../src/editor/store.ts","../src/render/render-node.ts"],"sourcesContent":["/**\n * BroadPaper document format — schemaVersion 1.\n *\n * These types describe the saved JSON template. They are a public API:\n * every change must be additive or go through a migration in `schema/migrate.ts`.\n *\n * Units: page geometry (size, margins, region heights) is stored in millimetres\n * because that is how people think about paper. All other lengths (font sizes,\n * padding, borders) are CSS pixels at 96 dpi.\n */\n\nimport type { BlockStyle } from \"./style.js\";\n\nexport const CURRENT_SCHEMA_VERSION = 1 as const;\nexport type SchemaVersion = typeof CURRENT_SCHEMA_VERSION;\n\n/** A colour literal (`#RRGGBB`, `rgba(...)`) or a theme token reference (`$colors.primary`). */\nexport type ColorValue = string;\n/** A font family literal (`\"Inter\"`) or a theme token reference (`$typography.headingFont`). */\nexport type FontValue = string;\n/** A theme token reference. Always starts with `$`. */\nexport type TokenRef = `$${string}`;\n\nexport type PageSizeName = \"A4\" | \"A3\" | \"A5\" | \"Letter\" | \"Legal\" | \"Tabloid\";\nexport interface CustomPageSize {\n /** Width in millimetres. */\n width: number;\n /** Height in millimetres. */\n height: number;\n}\nexport type PageSize = PageSizeName | CustomPageSize;\nexport type PageOrientation = \"portrait\" | \"landscape\";\n\nexport interface PageMargins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport interface PageRegionSettings {\n /** Region height in millimetres (0 disables the region). */\n height: number;\n /** Use `header.firstPage` / `footer.firstPage` content on page 1. */\n differentFirstPage: boolean;\n}\n\nexport interface PageSettings {\n size: PageSize;\n orientation: PageOrientation;\n margins: PageMargins;\n header: PageRegionSettings;\n footer: PageRegionSettings;\n background?: ColorValue;\n /** Number of pages to show as the design canvas when the document is empty. */\n minPages?: number;\n}\n\nexport type TextStyleId = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"body\" | \"lead\" | \"caption\" | \"small\" | (string & {});\n\nexport interface TextStyle {\n fontFamily?: FontValue;\n fontSize?: number;\n fontWeight?: number | \"normal\" | \"bold\";\n fontStyle?: \"normal\" | \"italic\";\n lineHeight?: number;\n letterSpacing?: number;\n textTransform?: \"none\" | \"uppercase\" | \"lowercase\" | \"capitalize\";\n color?: ColorValue;\n marginTop?: number;\n marginBottom?: number;\n /** Headings default to keep-with-next. */\n keepWithNext?: boolean;\n}\n\nexport interface TableStyle {\n fontSize?: number;\n headerBackground?: ColorValue;\n headerColor?: ColorValue;\n headerFontWeight?: number | \"normal\" | \"bold\";\n borderColor?: ColorValue;\n borderWidth?: number;\n /** \"all\" draws a grid, \"horizontal\" draws row rules, \"none\" draws no lines. */\n borders?: \"all\" | \"horizontal\" | \"outer\" | \"none\";\n zebraBackground?: ColorValue;\n cellPaddingX?: number;\n cellPaddingY?: number;\n}\n\nexport interface CardStyle {\n background?: ColorValue;\n borderColor?: ColorValue;\n borderWidth?: number;\n borderRadius?: number;\n padding?: number;\n shadow?: boolean;\n}\n\nexport interface DocumentStyles {\n text: Record<TextStyleId, TextStyle>;\n table: TableStyle;\n card: CardStyle;\n link: { color?: ColorValue; underline?: boolean };\n spacing: {\n /** Vertical gap between blocks in px. */\n blockGap: number;\n /** Default section vertical padding in px. */\n sectionPadding: number;\n /** Gap between columns in px. */\n columnGap: number;\n };\n}\n\n/** Structured visibility rule, built by the UI without writing code. */\nexport interface ConditionRule {\n /** Left operand: an expression, usually a data path such as `client.isRetired`. */\n left: string;\n operator:\n | \"eq\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"contains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"in\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"isTrue\"\n | \"isFalse\";\n /** Right operand as a literal (string, number, boolean) or an expression string wrapped in `{{ }}`. */\n right?: string | number | boolean | null;\n}\nexport interface ConditionGroup {\n op: \"and\" | \"or\";\n rules: Array<ConditionRule | ConditionGroup>;\n}\n/** A raw expression string or a structured group. Both compile to the expression language. */\nexport type Condition = string | ConditionGroup;\n\nexport type BreakMode = \"auto\" | \"page\";\n\nexport interface FlowOptions {\n breakBefore?: BreakMode;\n breakAfter?: BreakMode;\n /** Never split this node across pages unless it is taller than a page. */\n keepTogether?: boolean;\n /** Keep this node on the same page as the start of the next sibling. */\n keepWithNext?: boolean;\n /** Minimum lines/rows to leave at the bottom of a page (orphans). */\n minOrphans?: number;\n /** Minimum lines/rows to carry to the next page (widows). */\n minWidows?: number;\n}\n\n/**\n * A node in the document tree. Structural node types are `section`, `row` and\n * `column`; everything else is a block type resolved through the block registry.\n */\nexport interface Node {\n id: string;\n type: string;\n props: Record<string, unknown>;\n style?: BlockStyle;\n children?: Node[];\n visibleWhen?: Condition;\n flow?: FlowOptions;\n /** Human label shown in the layer tree. */\n name?: string;\n /** A locked node cannot be moved or deleted in the editor. */\n locked?: boolean;\n}\n\nexport interface RegionContent {\n default: Node[];\n firstPage?: Node[];\n}\n\nexport interface LibraryItem {\n id: string;\n name: string;\n description?: string;\n category?: string;\n /** A section (or block) subtree to insert. IDs are re-generated on insert. */\n node: Node;\n thumbnail?: string;\n}\n\nexport interface TemplateSettings {\n /** BCP-47 locale used for number/date formatting defaults. */\n locale?: string;\n /** ISO 4217 currency used when `currency` pipe has no explicit code. */\n currency?: string;\n /** IANA time zone used for date formatting. */\n timeZone?: string;\n /** Data source ids this template was designed against. */\n dataSources?: string[];\n}\n\nexport interface TemplateMeta {\n createdAt?: string;\n updatedAt?: string;\n author?: string;\n description?: string;\n tags?: string[];\n /** Free-form host metadata. Never interpreted by BroadPaper. */\n custom?: Record<string, unknown>;\n}\n\nexport interface ReportTemplate {\n schemaVersion: SchemaVersion;\n id: string;\n name: string;\n meta?: TemplateMeta;\n page: PageSettings;\n styles: DocumentStyles;\n header: RegionContent;\n footer: RegionContent;\n /** Top-level content: a list of `section` nodes. */\n body: Node[];\n library?: LibraryItem[];\n settings?: TemplateSettings;\n}\n\n/** A template of any historical schema version. Use `migrateTemplate` before use. */\nexport interface AnyVersionTemplate {\n schemaVersion: number;\n [key: string]: unknown;\n}\n","/**\n * Constrained rich-text model. This is what is stored in the template — never HTML.\n * It is intentionally small: paragraphs and lists containing inline runs with a\n * fixed set of marks, plus inline data tokens.\n */\n\nexport interface TextMarks {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n code?: boolean;\n /** Colour literal or theme token. */\n color?: string;\n /** A hyperlink. Only `http(s):` and `mailto:` are rendered. May contain `{{ }}` tokens. */\n link?: string;\n}\n\nexport interface TextRun {\n type: \"text\";\n text: string;\n marks?: TextMarks;\n}\n\nexport interface TokenRun {\n type: \"token\";\n /** Expression, e.g. `client.firstName | upper`. */\n expr: string;\n marks?: TextMarks;\n /** Filled by the resolver: evaluated display value. */\n value?: string;\n /** Filled by the resolver: human label for design-mode chips. */\n label?: string;\n /** Filled by the resolver: expression depends on `page.*` and is evaluated per page. */\n deferred?: boolean;\n}\n\nexport interface BreakRun {\n type: \"break\";\n}\n\nexport type InlineNode = TextRun | TokenRun | BreakRun;\n\nexport interface Paragraph {\n type: \"paragraph\";\n content: InlineNode[];\n align?: \"left\" | \"center\" | \"right\" | \"justify\";\n}\n\nexport interface ListItem {\n type: \"listItem\";\n content: Paragraph[];\n}\n\nexport interface List {\n type: \"bulletList\" | \"orderedList\";\n content: ListItem[];\n}\n\nexport type BlockNode = Paragraph | List;\n\nexport interface RichTextDoc {\n type: \"doc\";\n content: BlockNode[];\n}\n\nexport function createParagraph(text = \"\", marks?: TextMarks): Paragraph {\n return { type: \"paragraph\", content: text ? [{ type: \"text\", text, ...(marks ? { marks } : {}) }] : [] };\n}\n\nexport function createRichText(text = \"\"): RichTextDoc {\n return { type: \"doc\", content: [createParagraph(text)] };\n}\n\n/** Builds a rich text document from a template string containing `{{ expr }}` tokens. */\nexport function richTextFromTemplate(template: string): RichTextDoc {\n const paragraphs = template.split(/\\n/);\n return {\n type: \"doc\",\n content: paragraphs.map((p) => ({ type: \"paragraph\", content: inlineFromTemplate(p) }))\n };\n}\n\nexport function inlineFromTemplate(text: string): InlineNode[] {\n const out: InlineNode[] = [];\n const re = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) {\n if (m.index > last) out.push({ type: \"text\", text: text.slice(last, m.index) });\n out.push({ type: \"token\", expr: m[1]! });\n last = m.index + m[0].length;\n }\n if (last < text.length) out.push({ type: \"text\", text: text.slice(last) });\n return out;\n}\n\n/** Plain-text projection used for search, validation messages and layer labels. */\nexport function richTextToPlain(doc: RichTextDoc | undefined, tokenText: (expr: string) => string = (e) => `{{${e}}}`): string {\n if (!doc) return \"\";\n const lines: string[] = [];\n for (const block of doc.content) {\n if (block.type === \"paragraph\") lines.push(inlineToPlain(block.content, tokenText));\n else for (const item of block.content) for (const p of item.content) lines.push(inlineToPlain(p.content, tokenText));\n }\n return lines.join(\"\\n\");\n}\n\nexport function inlineToPlain(content: InlineNode[], tokenText: (expr: string) => string): string {\n return content\n .map((n) => (n.type === \"text\" ? n.text : n.type === \"token\" ? tokenText(n.expr) : \"\\n\"))\n .join(\"\");\n}\n\n/** Every token expression used in a rich text document, in order. */\nexport function richTextTokens(doc: RichTextDoc | undefined): string[] {\n const out: string[] = [];\n if (!doc) return out;\n const visitInline = (content: InlineNode[]) => {\n for (const n of content) {\n if (n.type === \"token\") out.push(n.expr);\n if (n.type === \"text\" && n.marks?.link) {\n for (const e of extractTemplateTokens(n.marks.link)) out.push(e);\n }\n }\n };\n for (const block of doc.content) {\n if (block.type === \"paragraph\") visitInline(block.content);\n else for (const item of block.content) for (const p of item.content) visitInline(p.content);\n }\n return out;\n}\n\n/** Extracts `{{ expr }}` expressions from a plain template string. */\nexport function extractTemplateTokens(text: string | undefined): string[] {\n if (!text) return [];\n const out: string[] = [];\n const re = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) out.push(m[1]!);\n return out;\n}\n\nexport function isRichTextDoc(value: unknown): value is RichTextDoc {\n return !!value && typeof value === \"object\" && (value as RichTextDoc).type === \"doc\" && Array.isArray((value as RichTextDoc).content);\n}\n","/**\n * Abstract syntax tree for the BroadPaper expression language.\n *\n * The language is intentionally small and has no way to execute host code:\n * paths client.firstName holdings[0].name item.value\n * literals \"text\" 'text' 12.5 true false null\n * operators == != < <= > >= + - * / % and or not in ?:\n * pipes value | currency:\"GBP\" | default:\"—\"\n * functions sum(holdings.value) count(items) coalesce(a, b)\n */\n\nexport type Expr =\n | { kind: \"literal\"; value: string | number | boolean | null }\n | { kind: \"path\"; segments: PathSegment[] }\n | { kind: \"unary\"; op: \"not\" | \"-\"; arg: Expr }\n | { kind: \"binary\"; op: BinaryOp; left: Expr; right: Expr }\n | { kind: \"conditional\"; test: Expr; then: Expr; else: Expr }\n | { kind: \"call\"; name: string; args: Expr[] }\n | { kind: \"pipe\"; input: Expr; name: string; args: Expr[] }\n | { kind: \"array\"; items: Expr[] };\n\nexport type PathSegment = { kind: \"prop\"; name: string } | { kind: \"index\"; index: number };\n\nexport type BinaryOp = \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"and\" | \"or\" | \"in\";\n\nexport function pathToString(segments: PathSegment[]): string {\n let s = \"\";\n for (const seg of segments) {\n if (seg.kind === \"prop\") s += s ? `.${seg.name}` : seg.name;\n else s += `[${seg.index}]`;\n }\n return s;\n}\n\n/** Serialises an AST back to canonical source text. */\nexport function exprToString(e: Expr): string {\n switch (e.kind) {\n case \"literal\":\n return typeof e.value === \"string\" ? JSON.stringify(e.value) : String(e.value);\n case \"path\":\n return pathToString(e.segments);\n case \"unary\":\n return e.op === \"not\" ? `not ${wrap(e.arg)}` : `-${wrap(e.arg)}`;\n case \"binary\":\n return `${wrap(e.left)} ${e.op} ${wrap(e.right)}`;\n case \"conditional\":\n return `${wrap(e.test)} ? ${wrap(e.then)} : ${wrap(e.else)}`;\n case \"call\":\n return `${e.name}(${e.args.map(exprToString).join(\", \")})`;\n case \"pipe\":\n return `${exprToString(e.input)} | ${e.name}${e.args.length ? \":\" + e.args.map(exprToString).join(\":\") : \"\"}`;\n case \"array\":\n return `[${e.items.map(exprToString).join(\", \")}]`;\n }\n}\n\nfunction wrap(e: Expr): string {\n const s = exprToString(e);\n return e.kind === \"binary\" || e.kind === \"conditional\" || e.kind === \"pipe\" ? `(${s})` : s;\n}\n\n/** Collects every path referenced by an expression (for validation and dependency tracking). */\nexport function collectPaths(e: Expr, out: PathSegment[][] = []): PathSegment[][] {\n switch (e.kind) {\n case \"path\":\n out.push(e.segments);\n break;\n case \"unary\":\n collectPaths(e.arg, out);\n break;\n case \"binary\":\n collectPaths(e.left, out);\n collectPaths(e.right, out);\n break;\n case \"conditional\":\n collectPaths(e.test, out);\n collectPaths(e.then, out);\n collectPaths(e.else, out);\n break;\n case \"call\":\n case \"array\":\n for (const a of e.kind === \"call\" ? e.args : e.items) collectPaths(a, out);\n break;\n case \"pipe\":\n collectPaths(e.input, out);\n for (const a of e.args) collectPaths(a, out);\n break;\n }\n return out;\n}\n","import type { BinaryOp, Expr, PathSegment } from \"./ast.js\";\n\nexport class ExpressionError extends Error {\n constructor(\n message: string,\n public readonly position: number,\n public readonly source: string\n ) {\n super(message);\n this.name = \"ExpressionError\";\n }\n}\n\ntype Token =\n | { type: \"num\"; value: number; pos: number }\n | { type: \"str\"; value: string; pos: number }\n | { type: \"ident\"; value: string; pos: number }\n | { type: \"op\"; value: string; pos: number }\n | { type: \"eof\"; pos: number };\n\nconst MAX_LENGTH = 2000;\nconst MAX_DEPTH = 32;\nconst KEYWORDS = new Set([\"and\", \"or\", \"not\", \"in\", \"true\", \"false\", \"null\"]);\nconst MULTI_OPS = [\"==\", \"!=\", \"<=\", \">=\"];\nconst SINGLE_OPS = new Set(\"+-*/%<>()[]|:?,.\".split(\"\"));\n\nexport function tokenize(src: string): Token[] {\n if (src.length > MAX_LENGTH) throw new ExpressionError(`Expression is too long (max ${MAX_LENGTH} characters)`, 0, src);\n const tokens: Token[] = [];\n let i = 0;\n while (i < src.length) {\n const ch = src[i]!;\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n const pos = i;\n if (/[0-9]/.test(ch) || (ch === \".\" && /[0-9]/.test(src[i + 1] ?? \"\"))) {\n let j = i;\n while (j < src.length && /[0-9_]/.test(src[j]!)) j++;\n if (src[j] === \".\" && /[0-9]/.test(src[j + 1] ?? \"\")) {\n j++;\n while (j < src.length && /[0-9]/.test(src[j]!)) j++;\n }\n if ((src[j] === \"e\" || src[j] === \"E\") && /[0-9+-]/.test(src[j + 1] ?? \"\")) {\n j += 2;\n while (j < src.length && /[0-9]/.test(src[j]!)) j++;\n }\n tokens.push({ type: \"num\", value: Number(src.slice(i, j).replace(/_/g, \"\")), pos });\n i = j;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n let j = i + 1;\n let out = \"\";\n while (j < src.length && src[j] !== ch) {\n if (src[j] === \"\\\\\" && j + 1 < src.length) {\n const n = src[j + 1]!;\n out += n === \"n\" ? \"\\n\" : n === \"t\" ? \"\\t\" : n;\n j += 2;\n } else {\n out += src[j];\n j++;\n }\n }\n if (j >= src.length) throw new ExpressionError(\"Unterminated string\", pos, src);\n tokens.push({ type: \"str\", value: out, pos });\n i = j + 1;\n continue;\n }\n if (/[A-Za-z_$]/.test(ch)) {\n let j = i;\n while (j < src.length && /[A-Za-z0-9_$]/.test(src[j]!)) j++;\n tokens.push({ type: \"ident\", value: src.slice(i, j), pos });\n i = j;\n continue;\n }\n const two = src.slice(i, i + 2);\n if (MULTI_OPS.includes(two)) {\n tokens.push({ type: \"op\", value: two, pos });\n i += 2;\n continue;\n }\n if (ch === \"=\" && src[i + 1] !== \"=\") {\n // Be forgiving: a single \"=\" reads as equality.\n tokens.push({ type: \"op\", value: \"==\", pos });\n i++;\n continue;\n }\n if (ch === \"&\" && src[i + 1] === \"&\") {\n tokens.push({ type: \"ident\", value: \"and\", pos });\n i += 2;\n continue;\n }\n if (ch === \"|\" && src[i + 1] === \"|\") {\n tokens.push({ type: \"ident\", value: \"or\", pos });\n i += 2;\n continue;\n }\n if (ch === \"!\" ) {\n tokens.push({ type: \"ident\", value: \"not\", pos });\n i++;\n continue;\n }\n if (SINGLE_OPS.has(ch)) {\n tokens.push({ type: \"op\", value: ch, pos });\n i++;\n continue;\n }\n throw new ExpressionError(`Unexpected character \"${ch}\"`, pos, src);\n }\n tokens.push({ type: \"eof\", pos: src.length });\n return tokens;\n}\n\n/**\n * Pratt parser. Precedence (low → high):\n * pipe |\n * conditional ?:\n * or\n * and\n * not (prefix)\n * == != in\n * < <= > >=\n * + -\n * * / %\n * unary -\n * postfix . [ (\n */\nclass Parser {\n private i = 0;\n private depth = 0;\n constructor(\n private readonly tokens: Token[],\n private readonly src: string\n ) {}\n\n parse(): Expr {\n const e = this.parsePipe();\n if (this.peek().type !== \"eof\") this.fail(`Unexpected \"${this.describe(this.peek())}\"`);\n return e;\n }\n\n private peek(): Token {\n return this.tokens[this.i]!;\n }\n private next(): Token {\n return this.tokens[this.i++]!;\n }\n private isOp(v: string): boolean {\n const t = this.peek();\n return t.type === \"op\" && t.value === v;\n }\n private isKw(v: string): boolean {\n const t = this.peek();\n return t.type === \"ident\" && t.value === v;\n }\n private expectOp(v: string) {\n if (!this.isOp(v)) this.fail(`Expected \"${v}\" but found \"${this.describe(this.peek())}\"`);\n this.next();\n }\n private describe(t: Token): string {\n return t.type === \"eof\" ? \"end of expression\" : t.type === \"str\" ? `\"${t.value}\"` : String(t.value);\n }\n private fail(msg: string): never {\n throw new ExpressionError(msg, this.peek().pos, this.src);\n }\n private enter() {\n if (++this.depth > MAX_DEPTH) this.fail(\"Expression is nested too deeply\");\n }\n private leave() {\n this.depth--;\n }\n\n private parsePipe(): Expr {\n let e = this.parseConditional();\n while (this.isOp(\"|\")) {\n this.next();\n const nameTok = this.next();\n if (nameTok.type !== \"ident\") this.fail(\"Expected a formatter name after |\");\n const args: Expr[] = [];\n while (this.isOp(\":\")) {\n this.next();\n args.push(this.parseConditional());\n }\n e = { kind: \"pipe\", input: e, name: nameTok.value, args };\n }\n return e;\n }\n\n private parseConditional(): Expr {\n const test = this.parseOr();\n if (this.isOp(\"?\")) {\n this.enter();\n this.next();\n const then = this.parseConditional();\n this.expectOp(\":\");\n const els = this.parseConditional();\n this.leave();\n return { kind: \"conditional\", test, then, else: els };\n }\n return test;\n }\n\n private parseOr(): Expr {\n let left = this.parseAnd();\n while (this.isKw(\"or\")) {\n this.next();\n left = { kind: \"binary\", op: \"or\", left, right: this.parseAnd() };\n }\n return left;\n }\n\n private parseAnd(): Expr {\n let left = this.parseNot();\n while (this.isKw(\"and\")) {\n this.next();\n left = { kind: \"binary\", op: \"and\", left, right: this.parseNot() };\n }\n return left;\n }\n\n private parseNot(): Expr {\n if (this.isKw(\"not\")) {\n this.enter();\n this.next();\n const arg = this.parseNot();\n this.leave();\n return { kind: \"unary\", op: \"not\", arg };\n }\n return this.parseEquality();\n }\n\n private parseEquality(): Expr {\n let left = this.parseComparison();\n for (;;) {\n if (this.isOp(\"==\") || this.isOp(\"!=\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseComparison() };\n } else if (this.isKw(\"in\")) {\n this.next();\n left = { kind: \"binary\", op: \"in\", left, right: this.parseComparison() };\n } else return left;\n }\n }\n\n private parseComparison(): Expr {\n let left = this.parseAdditive();\n while (this.isOp(\"<\") || this.isOp(\"<=\") || this.isOp(\">\") || this.isOp(\">=\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseAdditive() };\n }\n return left;\n }\n\n private parseAdditive(): Expr {\n let left = this.parseMultiplicative();\n while (this.isOp(\"+\") || this.isOp(\"-\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseMultiplicative() };\n }\n return left;\n }\n\n private parseMultiplicative(): Expr {\n let left = this.parseUnary();\n while (this.isOp(\"*\") || this.isOp(\"/\") || this.isOp(\"%\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseUnary() };\n }\n return left;\n }\n\n private parseUnary(): Expr {\n if (this.isOp(\"-\")) {\n this.enter();\n this.next();\n const arg = this.parseUnary();\n this.leave();\n if (arg.kind === \"literal\" && typeof arg.value === \"number\") return { kind: \"literal\", value: -arg.value };\n return { kind: \"unary\", op: \"-\", arg };\n }\n return this.parsePostfix();\n }\n\n private parsePostfix(): Expr {\n let e = this.parsePrimary();\n for (;;) {\n if (this.isOp(\".\")) {\n this.next();\n const t = this.next();\n if (t.type !== \"ident\") this.fail(\"Expected a property name after .\");\n e = appendSegment(e, { kind: \"prop\", name: t.value }, () => this.fail(\"Property access is only allowed on data paths\"));\n } else if (this.isOp(\"[\")) {\n this.next();\n const t = this.next();\n if (t.type !== \"num\" || !Number.isInteger(t.value) || t.value < 0) this.fail(\"Index must be a non-negative integer\");\n this.expectOp(\"]\");\n e = appendSegment(e, { kind: \"index\", index: t.value }, () => this.fail(\"Indexing is only allowed on data paths\"));\n } else return e;\n }\n }\n\n private parsePrimary(): Expr {\n const t = this.next();\n switch (t.type) {\n case \"num\":\n return { kind: \"literal\", value: t.value };\n case \"str\":\n return { kind: \"literal\", value: t.value };\n case \"ident\": {\n if (t.value === \"true\") return { kind: \"literal\", value: true };\n if (t.value === \"false\") return { kind: \"literal\", value: false };\n if (t.value === \"null\") return { kind: \"literal\", value: null };\n if (KEYWORDS.has(t.value)) this.fail(`Unexpected keyword \"${t.value}\"`);\n if (this.isOp(\"(\")) {\n this.enter();\n this.next();\n const args: Expr[] = [];\n if (!this.isOp(\")\")) {\n args.push(this.parsePipe());\n while (this.isOp(\",\")) {\n this.next();\n args.push(this.parsePipe());\n }\n }\n this.expectOp(\")\");\n this.leave();\n return { kind: \"call\", name: t.value, args };\n }\n return { kind: \"path\", segments: [{ kind: \"prop\", name: t.value }] };\n }\n case \"op\":\n if (t.value === \"(\") {\n this.enter();\n const e = this.parsePipe();\n this.expectOp(\")\");\n this.leave();\n return e;\n }\n if (t.value === \"[\") {\n this.enter();\n const items: Expr[] = [];\n if (!this.isOp(\"]\")) {\n items.push(this.parsePipe());\n while (this.isOp(\",\")) {\n this.next();\n items.push(this.parsePipe());\n }\n }\n this.expectOp(\"]\");\n this.leave();\n return { kind: \"array\", items };\n }\n this.fail(`Unexpected \"${t.value}\"`);\n // eslint-disable-next-line no-fallthrough\n case \"eof\":\n this.fail(\"Unexpected end of expression\");\n }\n }\n}\n\nfunction appendSegment(e: Expr, seg: PathSegment, fail: () => never): Expr {\n if (e.kind !== \"path\") return fail();\n return { kind: \"path\", segments: [...e.segments, seg] };\n}\n\nconst cache = new Map<string, Expr>();\n\n/** Parses an expression. Results are cached; the AST must be treated as immutable. */\nexport function parseExpression(src: string): Expr {\n const key = src.trim();\n const hit = cache.get(key);\n if (hit) return hit;\n if (key.length === 0) throw new ExpressionError(\"Expression is empty\", 0, src);\n const ast = new Parser(tokenize(key), key).parse();\n if (cache.size > 5000) cache.clear();\n cache.set(key, ast);\n return ast;\n}\n\n/** Returns the parse error for an expression, or null if it parses. */\nexport function checkExpressionSyntax(src: string): ExpressionError | null {\n try {\n parseExpression(src);\n return null;\n } catch (e) {\n return e instanceof ExpressionError ? e : new ExpressionError(String(e), 0, src);\n }\n}\n","/**\n * Formatting pipes. Every pipe is a pure function of (value, args, context).\n * They never throw for bad input: unformattable values pass through as text so\n * a report never fails to render because one field was unexpectedly empty.\n */\n\nexport interface FormatContext {\n locale: string;\n currency: string;\n timeZone?: string;\n /** Fixed \"now\" for deterministic output (tests, reproducible PDFs). */\n now?: Date;\n}\n\nexport type PipeFn = (value: unknown, args: unknown[], ctx: FormatContext) => unknown;\n\nexport interface PipeDefinition {\n name: string;\n description: string;\n /** Output type used by the static type checker. \"same\" keeps the input type. */\n returns: \"string\" | \"number\" | \"boolean\" | \"same\" | \"array\";\n /** Argument descriptions shown in the editor. */\n args?: Array<{ name: string; type: \"string\" | \"number\" | \"boolean\" | \"any\"; optional?: boolean; description?: string }>;\n /** Input types this pipe is meant for (documentation and editor suggestions only). */\n accepts?: string[];\n fn: PipeFn;\n}\n\nconst intlNumberCache = new Map<string, Intl.NumberFormat>();\nconst intlDateCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction numberFormat(locale: string, opts: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = locale + JSON.stringify(opts);\n let f = intlNumberCache.get(key);\n if (!f) {\n try {\n f = new Intl.NumberFormat(locale, opts);\n } catch {\n f = new Intl.NumberFormat(\"en-GB\", { ...opts, currency: opts.currency ?? \"GBP\" });\n }\n intlNumberCache.set(key, f);\n }\n return f;\n}\n\nfunction dateFormat(locale: string, opts: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = locale + JSON.stringify(opts);\n let f = intlDateCache.get(key);\n if (!f) {\n try {\n f = new Intl.DateTimeFormat(locale, opts);\n } catch {\n f = new Intl.DateTimeFormat(\"en-GB\", opts);\n }\n intlDateCache.set(key, f);\n }\n return f;\n}\n\nexport function toNumber(value: unknown): number | null {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value.replace(/[,\\s]/g, \"\"));\n return Number.isFinite(n) ? n : null;\n }\n if (typeof value === \"boolean\") return value ? 1 : 0;\n return null;\n}\n\nexport function toDate(value: unknown): Date | null {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\n if (typeof value === \"number\") return new Date(value);\n if (typeof value === \"string\" && value.trim()) {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value as object).length === 0;\n return false;\n}\n\nexport function toDisplayString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (value instanceof Date) return value.toISOString();\n if (Array.isArray(value)) return value.map(toDisplayString).join(\", \");\n return \"\";\n}\n\n/**\n * Date pattern tokens (a pragmatic subset of Unicode/date-fns tokens):\n * yyyy yy MMMM MMM MM M dd d EEEE EEE HH H hh h mm ss a\n */\nexport function formatDatePattern(date: Date, pattern: string, ctx: FormatContext): string {\n const parts = (opts: Intl.DateTimeFormatOptions) => {\n const o: Intl.DateTimeFormatOptions = { ...opts };\n if (ctx.timeZone) o.timeZone = ctx.timeZone;\n return dateFormat(ctx.locale, o).formatToParts(date);\n };\n const get = (opts: Intl.DateTimeFormatOptions, type: string) => parts(opts).find((p) => p.type === type)?.value ?? \"\";\n const pad = (s: string, n: number) => s.padStart(n, \"0\");\n const numeric = parts({ year: \"numeric\", month: \"numeric\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\", hour12: false });\n const num = (type: string) => numeric.find((p) => p.type === type)?.value ?? \"\";\n const hour24 = Number(num(\"hour\")) % 24;\n const hour12 = hour24 % 12 === 0 ? 12 : hour24 % 12;\n\n return pattern.replace(/yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE|HH|H|hh|h|mm|ss|a|'[^']*'/g, (tok) => {\n switch (tok) {\n case \"yyyy\":\n return num(\"year\");\n case \"yy\":\n return num(\"year\").slice(-2);\n case \"MMMM\":\n return get({ month: \"long\" }, \"month\");\n case \"MMM\":\n return get({ month: \"short\" }, \"month\");\n case \"MM\":\n return pad(num(\"month\"), 2);\n case \"M\":\n return num(\"month\");\n case \"dd\":\n return pad(num(\"day\"), 2);\n case \"d\":\n return num(\"day\");\n case \"EEEE\":\n return get({ weekday: \"long\" }, \"weekday\");\n case \"EEE\":\n return get({ weekday: \"short\" }, \"weekday\");\n case \"HH\":\n return pad(String(hour24), 2);\n case \"H\":\n return String(hour24);\n case \"hh\":\n return pad(String(hour12), 2);\n case \"h\":\n return String(hour12);\n case \"mm\":\n return pad(num(\"minute\"), 2);\n case \"ss\":\n return pad(num(\"second\"), 2);\n case \"a\":\n return hour24 < 12 ? \"AM\" : \"PM\";\n default:\n return tok.startsWith(\"'\") ? tok.slice(1, -1) : tok;\n }\n });\n}\n\nconst NAMED_DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: \"short\" },\n medium: { dateStyle: \"medium\" },\n long: { dateStyle: \"long\" },\n full: { dateStyle: \"full\" }\n};\n\nexport function formatDate(value: unknown, pattern: string | undefined, ctx: FormatContext, withTime = false): string {\n const d = toDate(value);\n if (!d) return toDisplayString(value);\n if (pattern && NAMED_DATE_STYLES[pattern]) {\n const opts: Intl.DateTimeFormatOptions = { ...NAMED_DATE_STYLES[pattern] };\n if (withTime) opts.timeStyle = \"short\";\n if (ctx.timeZone) opts.timeZone = ctx.timeZone;\n return dateFormat(ctx.locale, opts).format(d);\n }\n if (pattern) return formatDatePattern(d, pattern, ctx);\n const opts: Intl.DateTimeFormatOptions = withTime ? { dateStyle: \"medium\", timeStyle: \"short\" } : { dateStyle: \"medium\" };\n if (ctx.timeZone) opts.timeZone = ctx.timeZone;\n return dateFormat(ctx.locale, opts).format(d);\n}\n\nexport function formatCurrency(value: unknown, currency: string | undefined, decimals: number | undefined, ctx: FormatContext): string {\n const n = toNumber(value);\n if (n === null) return toDisplayString(value);\n const code = (currency && String(currency).toUpperCase()) || ctx.currency;\n const opts: Intl.NumberFormatOptions = { style: \"currency\", currency: code };\n if (decimals !== undefined) {\n opts.minimumFractionDigits = decimals;\n opts.maximumFractionDigits = decimals;\n }\n return numberFormat(ctx.locale, opts).format(n);\n}\n\nexport function formatNumber(value: unknown, decimals: number | undefined, ctx: FormatContext): string {\n const n = toNumber(value);\n if (n === null) return toDisplayString(value);\n const opts: Intl.NumberFormatOptions = {};\n if (decimals !== undefined) {\n opts.minimumFractionDigits = decimals;\n opts.maximumFractionDigits = decimals;\n } else opts.maximumFractionDigits = 2;\n return numberFormat(ctx.locale, opts).format(n);\n}\n\nexport function formatPercent(value: unknown, decimals: number | undefined, ctx: FormatContext, alreadyScaled = false): string {\n const n = toNumber(value);\n if (n === null) return toDisplayString(value);\n const opts: Intl.NumberFormatOptions = { style: \"percent\" };\n const d = decimals ?? 1;\n opts.minimumFractionDigits = d;\n opts.maximumFractionDigits = d;\n return numberFormat(ctx.locale, opts).format(alreadyScaled ? n / 100 : n);\n}\n\nfunction arg<T>(args: unknown[], i: number): T | undefined {\n return args[i] as T | undefined;\n}\n\nexport const PIPES: Record<string, PipeDefinition> = {\n currency: {\n name: \"currency\",\n description: \"Format as money\",\n returns: \"string\",\n accepts: [\"number\", \"currency\"],\n args: [\n { name: \"code\", type: \"string\", optional: true, description: \"ISO currency code, e.g. GBP\" },\n { name: \"decimals\", type: \"number\", optional: true }\n ],\n fn: (v, a, ctx) => formatCurrency(v, arg<string>(a, 0), toNumber(a[1]) ?? undefined, ctx)\n },\n number: {\n name: \"number\",\n description: \"Format with thousands separators\",\n returns: \"string\",\n accepts: [\"number\"],\n args: [{ name: \"decimals\", type: \"number\", optional: true }],\n fn: (v, a, ctx) => formatNumber(v, toNumber(a[0]) ?? undefined, ctx)\n },\n percent: {\n name: \"percent\",\n description: \"Format a fraction (0.25) as a percentage (25%)\",\n returns: \"string\",\n accepts: [\"number\", \"percent\"],\n args: [\n { name: \"decimals\", type: \"number\", optional: true },\n { name: \"scaled\", type: \"boolean\", optional: true, description: \"Set true when the value is already 0–100\" }\n ],\n fn: (v, a, ctx) => formatPercent(v, toNumber(a[0]) ?? undefined, ctx, a[1] === true)\n },\n date: {\n name: \"date\",\n description: \"Format a date\",\n returns: \"string\",\n accepts: [\"date\", \"datetime\"],\n args: [{ name: \"pattern\", type: \"string\", optional: true, description: \"e.g. dd MMM yyyy, or short/medium/long/full\" }],\n fn: (v, a, ctx) => formatDate(v, arg<string>(a, 0), ctx, false)\n },\n datetime: {\n name: \"datetime\",\n description: \"Format a date with time\",\n returns: \"string\",\n accepts: [\"date\", \"datetime\"],\n args: [{ name: \"pattern\", type: \"string\", optional: true }],\n fn: (v, a, ctx) => formatDate(v, arg<string>(a, 0), ctx, true)\n },\n boolean: {\n name: \"boolean\",\n description: \"Show a boolean as text\",\n returns: \"string\",\n accepts: [\"boolean\"],\n args: [\n { name: \"yes\", type: \"string\", optional: true },\n { name: \"no\", type: \"string\", optional: true }\n ],\n fn: (v, a) => (v === true || v === \"true\" || v === 1 ? arg<string>(a, 0) ?? \"Yes\" : arg<string>(a, 1) ?? \"No\")\n },\n upper: { name: \"upper\", description: \"UPPERCASE\", returns: \"string\", fn: (v) => toDisplayString(v).toUpperCase() },\n lower: { name: \"lower\", description: \"lowercase\", returns: \"string\", fn: (v) => toDisplayString(v).toLowerCase() },\n title: {\n name: \"title\",\n description: \"Title Case\",\n returns: \"string\",\n fn: (v) => toDisplayString(v).replace(/\\b\\p{L}/gu, (c) => c.toUpperCase())\n },\n default: {\n name: \"default\",\n description: \"Fallback when the value is empty\",\n returns: \"same\",\n args: [{ name: \"fallback\", type: \"any\" }],\n fn: (v, a) => (isEmptyValue(v) ? a[0] : v)\n },\n join: {\n name: \"join\",\n description: \"Join a list into text\",\n returns: \"string\",\n accepts: [\"array\"],\n args: [{ name: \"separator\", type: \"string\", optional: true }],\n fn: (v, a) => (Array.isArray(v) ? v.map(toDisplayString).join(arg<string>(a, 0) ?? \", \") : toDisplayString(v))\n },\n truncate: {\n name: \"truncate\",\n description: \"Limit length with an ellipsis\",\n returns: \"string\",\n args: [{ name: \"length\", type: \"number\" }],\n fn: (v, a) => {\n const s = toDisplayString(v);\n const n = toNumber(a[0]) ?? 50;\n return s.length > n ? s.slice(0, Math.max(0, n - 1)).trimEnd() + \"…\" : s;\n }\n },\n round: {\n name: \"round\",\n description: \"Round to N decimals\",\n returns: \"number\",\n accepts: [\"number\"],\n args: [{ name: \"decimals\", type: \"number\", optional: true }],\n fn: (v, a) => {\n const n = toNumber(v);\n if (n === null) return v;\n const d = toNumber(a[0]) ?? 0;\n const m = 10 ** d;\n return Math.round(n * m) / m;\n }\n },\n abs: { name: \"abs\", description: \"Absolute value\", returns: \"number\", accepts: [\"number\"], fn: (v) => (toNumber(v) === null ? v : Math.abs(toNumber(v)!)) },\n pluralize: {\n name: \"pluralize\",\n description: \"Choose singular/plural word by count\",\n returns: \"string\",\n args: [\n { name: \"singular\", type: \"string\" },\n { name: \"plural\", type: \"string\" }\n ],\n fn: (v, a) => (toNumber(v) === 1 ? arg<string>(a, 0) ?? \"\" : arg<string>(a, 1) ?? `${arg<string>(a, 0) ?? \"\"}s`)\n },\n length: { name: \"length\", description: \"Number of items or characters\", returns: \"number\", fn: (v) => (Array.isArray(v) ? v.length : toDisplayString(v).length) },\n first: { name: \"first\", description: \"First item\", returns: \"same\", accepts: [\"array\"], fn: (v) => (Array.isArray(v) ? v[0] : v) },\n last: { name: \"last\", description: \"Last item\", returns: \"same\", accepts: [\"array\"], fn: (v) => (Array.isArray(v) ? v[v.length - 1] : v) },\n sortBy: {\n name: \"sortBy\",\n description: \"Sort a list by a field\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [\n { name: \"field\", type: \"string\" },\n { name: \"direction\", type: \"string\", optional: true, description: \"asc or desc\" }\n ],\n fn: (v, a) => {\n if (!Array.isArray(v)) return v;\n const field = arg<string>(a, 0) ?? \"\";\n const dir = (arg<string>(a, 1) ?? \"asc\").toLowerCase() === \"desc\" ? -1 : 1;\n return [...v].sort((x, y) => compareValues(getField(x, field), getField(y, field)) * dir);\n }\n },\n take: {\n name: \"take\",\n description: \"First N items\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [{ name: \"count\", type: \"number\" }],\n fn: (v, a) => (Array.isArray(v) ? v.slice(0, Math.max(0, toNumber(a[0]) ?? 0)) : v)\n },\n filter: {\n name: \"filter\",\n description: \"Keep items whose field equals a value\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [\n { name: \"field\", type: \"string\" },\n { name: \"value\", type: \"any\" }\n ],\n fn: (v, a) => (Array.isArray(v) ? v.filter((x) => looseEquals(getField(x, arg<string>(a, 0) ?? \"\"), a[1])) : v)\n },\n pluck: {\n name: \"pluck\",\n description: \"Extract one field from each item\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [{ name: \"field\", type: \"string\" }],\n fn: (v, a) => (Array.isArray(v) ? v.map((x) => getField(x, arg<string>(a, 0) ?? \"\")) : getField(v, arg<string>(a, 0) ?? \"\"))\n },\n initials: {\n name: \"initials\",\n description: \"Initials of a name\",\n returns: \"string\",\n fn: (v) =>\n toDisplayString(v)\n .split(/\\s+/)\n .filter(Boolean)\n .map((w) => w[0]!.toUpperCase())\n .join(\"\")\n }\n};\n\nexport function getField(obj: unknown, path: string): unknown {\n if (obj === null || obj === undefined) return undefined;\n let cur: unknown = obj;\n for (const part of path.split(\".\")) {\n if (!part) continue;\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n if (!Object.prototype.hasOwnProperty.call(cur, part)) return undefined;\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\nexport function compareValues(a: unknown, b: unknown): number {\n const na = toNumber(a);\n const nb = toNumber(b);\n if (na !== null && nb !== null && typeof a !== \"string\" && typeof b !== \"string\") return na - nb;\n const da = toDate(a);\n const db = toDate(b);\n if (da && db && (a instanceof Date || typeof a === \"string\") && (b instanceof Date || typeof b === \"string\") && /\\d{4}-\\d{2}/.test(String(a))) return da.getTime() - db.getTime();\n const sa = toDisplayString(a);\n const sb = toDisplayString(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n}\n\nexport function looseEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || a === undefined || b === null || b === undefined) return (a ?? null) === (b ?? null);\n if (typeof a === \"number\" || typeof b === \"number\") {\n const na = toNumber(a);\n const nb = toNumber(b);\n if (na !== null && nb !== null) return na === nb;\n }\n if (typeof a === \"boolean\" || typeof b === \"boolean\") return String(a) === String(b);\n return toDisplayString(a) === toDisplayString(b);\n}\n","import type { Expr, PathSegment } from \"./ast.js\";\nimport { parseExpression } from \"./parser.js\";\nimport { PIPES, compareValues, isEmptyValue, looseEquals, toDisplayString, toNumber, type FormatContext } from \"./format.js\";\n\n/**\n * A lexical scope chain. Lookups walk from the innermost scope outwards, so a\n * repeater's `item` shadows a data source called `item` (and we warn about that\n * in validation).\n */\nexport class Scope {\n constructor(\n private readonly vars: Record<string, unknown>,\n private readonly parent?: Scope\n ) {}\n\n lookup(name: string): { found: boolean; value: unknown } {\n if (Object.prototype.hasOwnProperty.call(this.vars, name)) return { found: true, value: this.vars[name] };\n if (this.parent) return this.parent.lookup(name);\n return { found: false, value: undefined };\n }\n\n child(vars: Record<string, unknown>): Scope {\n return new Scope(vars, this);\n }\n\n /** Names visible in this scope (innermost first, deduplicated). */\n names(): string[] {\n const out: string[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let s: Scope | undefined = this;\n while (s) {\n for (const k of Object.keys(s.vars)) if (!out.includes(k)) out.push(k);\n s = s.parent;\n }\n return out;\n }\n}\n\nexport interface EvalContext {\n scope: Scope;\n format: FormatContext;\n /** Optional sink for non-fatal problems encountered during evaluation. */\n onWarning?: (message: string, expr?: string) => void;\n}\n\nconst FUNCTIONS: Record<string, (args: unknown[], ctx: EvalContext) => unknown> = {\n sum: ([list]) => numbers(list).reduce((a, b) => a + b, 0),\n count: ([list]) => (Array.isArray(list) ? list.length : isEmptyValue(list) ? 0 : 1),\n avg: ([list]) => {\n const ns = numbers(list);\n return ns.length ? ns.reduce((a, b) => a + b, 0) / ns.length : null;\n },\n min: ([list, ...rest]) => {\n const ns = rest.length ? numbers([list, ...rest]) : numbers(list);\n return ns.length ? Math.min(...ns) : null;\n },\n max: ([list, ...rest]) => {\n const ns = rest.length ? numbers([list, ...rest]) : numbers(list);\n return ns.length ? Math.max(...ns) : null;\n },\n first: ([list]) => (Array.isArray(list) ? list[0] : list),\n last: ([list]) => (Array.isArray(list) ? list[list.length - 1] : list),\n length: ([v]) => (Array.isArray(v) ? v.length : toDisplayString(v).length),\n coalesce: (args) => args.find((a) => !isEmptyValue(a)) ?? null,\n isEmpty: ([v]) => isEmptyValue(v),\n isNotEmpty: ([v]) => !isEmptyValue(v),\n contains: ([hay, needle]) =>\n Array.isArray(hay) ? hay.some((x) => looseEquals(x, needle)) : toDisplayString(hay).toLowerCase().includes(toDisplayString(needle).toLowerCase()),\n startsWith: ([s, p]) => toDisplayString(s).toLowerCase().startsWith(toDisplayString(p).toLowerCase()),\n endsWith: ([s, p]) => toDisplayString(s).toLowerCase().endsWith(toDisplayString(p).toLowerCase()),\n concat: (args) => args.map(toDisplayString).join(\"\"),\n round: ([v, d]) => {\n const n = toNumber(v);\n if (n === null) return null;\n const m = 10 ** (toNumber(d) ?? 0);\n return Math.round(n * m) / m;\n },\n abs: ([v]) => {\n const n = toNumber(v);\n return n === null ? null : Math.abs(n);\n },\n number: ([v]) => toNumber(v),\n string: ([v]) => toDisplayString(v),\n if: ([c, a, b]) => (truthy(c) ? a : b),\n now: (_args, ctx) => ctx.format.now ?? new Date(),\n year: ([v]) => dateOf(v)?.getFullYear() ?? null,\n daysBetween: ([a, b]) => {\n const da = dateOf(a);\n const db = dateOf(b);\n return da && db ? Math.round((db.getTime() - da.getTime()) / 86_400_000) : null;\n }\n};\n\nexport const FUNCTION_NAMES = Object.keys(FUNCTIONS);\n\nfunction dateOf(v: unknown): Date | null {\n if (v instanceof Date) return v;\n if (typeof v === \"string\" || typeof v === \"number\") {\n const d = new Date(v);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction numbers(list: unknown): number[] {\n if (!Array.isArray(list)) {\n const n = toNumber(list);\n return n === null ? [] : [n];\n }\n const out: number[] = [];\n for (const v of list) {\n const n = toNumber(v);\n if (n !== null) out.push(n);\n }\n return out;\n}\n\nexport function truthy(v: unknown): boolean {\n if (v === null || v === undefined || v === false || v === 0 || v === \"\") return false;\n if (typeof v === \"string\") return ![\"false\", \"no\", \"0\", \"off\"].includes(v.trim().toLowerCase());\n if (Array.isArray(v)) return v.length > 0;\n return true;\n}\n\n/**\n * Safe property access: only own enumerable data properties, never prototype\n * members, never functions, never symbols.\n */\nexport function readProperty(obj: unknown, name: string): unknown {\n if (obj === null || obj === undefined) return undefined;\n if (typeof obj === \"string\" && name === \"length\") return obj.length;\n if (typeof obj !== \"object\") return undefined;\n if (Array.isArray(obj)) {\n if (name === \"length\") return obj.length;\n // Implicit projection: holdings.value → [h.value for h in holdings]\n const projected = obj.map((x) => readProperty(x, name));\n return projected.every((v) => v === undefined) ? undefined : projected;\n }\n if (!Object.prototype.hasOwnProperty.call(obj, name)) return undefined;\n const v = (obj as Record<string, unknown>)[name];\n return typeof v === \"function\" ? undefined : v;\n}\n\nexport function resolvePath(segments: PathSegment[], scope: Scope): { found: boolean; value: unknown } {\n const first = segments[0];\n if (!first || first.kind !== \"prop\") return { found: false, value: undefined };\n const root = scope.lookup(first.name);\n if (!root.found) return { found: false, value: undefined };\n let cur = root.value;\n for (let i = 1; i < segments.length; i++) {\n const seg = segments[i]!;\n if (seg.kind === \"prop\") cur = readProperty(cur, seg.name);\n else cur = Array.isArray(cur) ? cur[seg.index] : undefined;\n if (cur === undefined) return { found: true, value: undefined };\n }\n return { found: true, value: cur };\n}\n\nexport function evaluateAst(e: Expr, ctx: EvalContext): unknown {\n switch (e.kind) {\n case \"literal\":\n return e.value;\n case \"path\": {\n const r = resolvePath(e.segments, ctx.scope);\n return r.value;\n }\n case \"unary\": {\n const v = evaluateAst(e.arg, ctx);\n if (e.op === \"not\") return !truthy(v);\n const n = toNumber(v);\n return n === null ? null : -n;\n }\n case \"binary\":\n return evaluateBinary(e.op, e.left, e.right, ctx);\n case \"conditional\":\n return truthy(evaluateAst(e.test, ctx)) ? evaluateAst(e.then, ctx) : evaluateAst(e.else, ctx);\n case \"call\": {\n const fn = FUNCTIONS[e.name];\n if (!fn) {\n ctx.onWarning?.(`Unknown function \"${e.name}\"`);\n return null;\n }\n return fn(\n e.args.map((a) => evaluateAst(a, ctx)),\n ctx\n );\n }\n case \"pipe\": {\n const input = evaluateAst(e.input, ctx);\n const pipe = PIPES[e.name];\n if (!pipe) {\n ctx.onWarning?.(`Unknown formatter \"${e.name}\"`);\n return input;\n }\n return pipe.fn(\n input,\n e.args.map((a) => evaluateAst(a, ctx)),\n ctx.format\n );\n }\n case \"array\":\n return e.items.map((i) => evaluateAst(i, ctx));\n }\n}\n\nfunction evaluateBinary(op: string, leftE: Expr, rightE: Expr, ctx: EvalContext): unknown {\n if (op === \"and\") return truthy(evaluateAst(leftE, ctx)) ? truthy(evaluateAst(rightE, ctx)) : false;\n if (op === \"or\") return truthy(evaluateAst(leftE, ctx)) ? true : truthy(evaluateAst(rightE, ctx));\n const l = evaluateAst(leftE, ctx);\n const r = evaluateAst(rightE, ctx);\n switch (op) {\n case \"==\":\n return looseEquals(l, r);\n case \"!=\":\n return !looseEquals(l, r);\n case \"<\":\n return compareOrNull(l, r, (c) => c < 0);\n case \"<=\":\n return compareOrNull(l, r, (c) => c <= 0);\n case \">\":\n return compareOrNull(l, r, (c) => c > 0);\n case \">=\":\n return compareOrNull(l, r, (c) => c >= 0);\n case \"in\":\n return Array.isArray(r) ? r.some((x) => looseEquals(x, l)) : toDisplayString(r).includes(toDisplayString(l));\n case \"+\": {\n const nl = toNumber(l);\n const nr = toNumber(r);\n if (nl !== null && nr !== null && typeof l !== \"string\" && typeof r !== \"string\") return nl + nr;\n if (typeof l === \"string\" || typeof r === \"string\") return toDisplayString(l) + toDisplayString(r);\n return nl !== null && nr !== null ? nl + nr : null;\n }\n case \"-\":\n case \"*\":\n case \"/\":\n case \"%\": {\n const nl = toNumber(l);\n const nr = toNumber(r);\n if (nl === null || nr === null) return null;\n if (op === \"-\") return nl - nr;\n if (op === \"*\") return nl * nr;\n if (op === \"/\") return nr === 0 ? null : nl / nr;\n return nr === 0 ? null : nl % nr;\n }\n }\n return null;\n}\n\nfunction compareOrNull(l: unknown, r: unknown, test: (c: number) => boolean): boolean {\n if (l === null || l === undefined || r === null || r === undefined) return false;\n return test(compareValues(l, r));\n}\n\n/** Evaluates an expression string in a scope. Never throws for runtime data problems. */\nexport function evaluate(src: string, ctx: EvalContext): unknown {\n return evaluateAst(parseExpression(src), ctx);\n}\n\n/** Evaluates to a boolean using report truthiness rules. */\nexport function evaluateCondition(src: string, ctx: EvalContext): boolean {\n return truthy(evaluate(src, ctx));\n}\n\n/** Evaluates to display text. */\nexport function evaluateText(src: string, ctx: EvalContext): string {\n return toDisplayString(evaluate(src, ctx));\n}\n\nexport interface TemplateSegment {\n kind: \"text\" | \"token\";\n text: string;\n /** Present for tokens: the expression source. */\n expr?: string;\n}\n\n/** Splits `Hello {{ client.firstName }}` into text/token segments. */\nexport function splitTemplate(template: string): TemplateSegment[] {\n const out: TemplateSegment[] = [];\n const re = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(template))) {\n if (m.index > last) out.push({ kind: \"text\", text: template.slice(last, m.index) });\n out.push({ kind: \"token\", text: m[0], expr: m[1]! });\n last = m.index + m[0].length;\n }\n if (last < template.length) out.push({ kind: \"text\", text: template.slice(last) });\n return out;\n}\n\n/** Interpolates `{{ expr }}` tokens in a string. */\nexport function interpolate(template: string, ctx: EvalContext): string {\n if (!template.includes(\"{{\")) return template;\n return splitTemplate(template)\n .map((s) => {\n if (s.kind === \"text\") return s.text;\n try {\n return evaluateText(s.expr!, ctx);\n } catch {\n ctx.onWarning?.(`Invalid expression \"${s.expr}\"`, s.expr);\n return \"\";\n }\n })\n .join(\"\");\n}\n","import type { Expr, PathSegment } from \"./ast.js\";\nimport { pathToString } from \"./ast.js\";\nimport { parseExpression, ExpressionError } from \"./parser.js\";\nimport { PIPES } from \"./format.js\";\nimport { FUNCTION_NAMES } from \"./evaluate.js\";\nimport type { DataSource, FieldSchema, FieldType } from \"../types/data.js\";\n\nexport type ValueType = FieldType | \"any\" | \"null\" | \"unknown\";\n\nexport interface TypeIssue {\n code: \"unknown-root\" | \"unknown-field\" | \"unknown-pipe\" | \"unknown-function\" | \"syntax\" | \"type-mismatch\" | \"not-a-list\" | \"not-an-object\";\n message: string;\n /** Character offset when known. */\n position?: number;\n}\n\nexport interface TypeResult {\n type: ValueType;\n schema?: FieldSchema;\n issues: TypeIssue[];\n}\n\n/**\n * A static scope describing what names are visible and their schemas.\n * Mirrors the runtime `Scope` chain.\n */\nexport class SchemaScope {\n constructor(\n private readonly vars: Record<string, FieldSchema>,\n private readonly parent?: SchemaScope\n ) {}\n\n lookup(name: string): FieldSchema | undefined {\n if (Object.prototype.hasOwnProperty.call(this.vars, name)) return this.vars[name];\n return this.parent?.lookup(name);\n }\n\n child(vars: Record<string, FieldSchema>): SchemaScope {\n return new SchemaScope(vars, this);\n }\n\n entries(): Array<{ name: string; schema: FieldSchema; depth: number }> {\n const out: Array<{ name: string; schema: FieldSchema; depth: number }> = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let s: SchemaScope | undefined = this;\n let depth = 0;\n while (s) {\n for (const [name, schema] of Object.entries(s.vars)) if (!out.some((e) => e.name === name)) out.push({ name, schema, depth });\n s = s.parent;\n depth++;\n }\n return out;\n }\n}\n\nexport const GLOBAL_SCHEMAS: Record<string, FieldSchema> = {\n page: {\n type: \"object\",\n label: \"Page\",\n fields: {\n number: { type: \"number\", label: \"Page number\" },\n total: { type: \"number\", label: \"Total pages\" }\n }\n },\n now: { type: \"datetime\", label: \"Generated at\" },\n theme: {\n type: \"object\",\n label: \"Theme\",\n fields: {\n name: { type: \"string\", label: \"Theme name\" },\n logo: { type: \"image\", label: \"Logo\" },\n colors: { type: \"object\", label: \"Colours\", fields: {} },\n typography: { type: \"object\", label: \"Typography\", fields: {} },\n meta: { type: \"object\", label: \"Brand details\", fields: {} }\n }\n }\n};\n\nexport function dataSourceSchemas(sources: DataSource[]): Record<string, FieldSchema> {\n const out: Record<string, FieldSchema> = {};\n for (const s of sources) out[s.id] = { type: \"object\", label: s.label, description: s.description, fields: s.schema };\n return out;\n}\n\nexport function createSchemaScope(sources: DataSource[], extraGlobals: Record<string, FieldSchema> = {}): SchemaScope {\n return new SchemaScope({ ...GLOBAL_SCHEMAS, ...extraGlobals }).child(dataSourceSchemas(sources));\n}\n\n/** Resolves a path through a schema scope, returning the field schema when known. */\nexport function resolvePathSchema(segments: PathSegment[], scope: SchemaScope): { schema?: FieldSchema; issue?: TypeIssue } {\n const first = segments[0];\n if (!first || first.kind !== \"prop\") return { issue: { code: \"unknown-root\", message: \"Expression must start with a name\" } };\n const root = scope.lookup(first.name);\n if (!root) return { issue: { code: \"unknown-root\", message: `Unknown data source or variable \"${first.name}\"` } };\n let cur: FieldSchema = root;\n let projected = false;\n for (let i = 1; i < segments.length; i++) {\n const seg = segments[i]!;\n const soFar = pathToString(segments.slice(0, i));\n if (seg.kind === \"index\") {\n if (cur.type !== \"array\") return { issue: { code: \"not-a-list\", message: `\"${soFar}\" is not a list and cannot be indexed` } };\n cur = cur.itemSchema ?? { type: \"any\" as FieldType };\n continue;\n }\n if (cur.type === \"array\") {\n // Implicit projection over a list: holdings.value\n if (!cur.itemSchema) return { schema: { type: \"array\" } };\n if (cur.itemSchema.type !== \"object\" || !cur.itemSchema.fields) return { issue: { code: \"not-an-object\", message: `Items of \"${soFar}\" have no field \"${seg.name}\"` } };\n const f: FieldSchema | undefined = cur.itemSchema.fields[seg.name];\n if (!f) return { issue: { code: \"unknown-field\", message: `Items of \"${soFar}\" have no field \"${seg.name}\"` } };\n projected = true;\n cur = { type: \"array\", itemSchema: f, label: f.label };\n continue;\n }\n if ((cur.type as string) === \"any\") return { schema: { type: \"any\" as FieldType } };\n if (cur.type !== \"object\") return { issue: { code: \"not-an-object\", message: `\"${soFar}\" is a ${cur.type} and has no field \"${seg.name}\"` } };\n if (cur.fields && Object.keys(cur.fields).length === 0 && [\"colors\", \"typography\", \"meta\"].includes(segments[i - 1]!.kind === \"prop\" ? (segments[i - 1] as { name: string }).name : \"\")) {\n // Open theme objects: any key is allowed.\n return { schema: { type: \"string\" } };\n }\n const f: FieldSchema | undefined = cur.fields?.[seg.name];\n if (!f) return { issue: { code: \"unknown-field\", message: `\"${soFar}\" has no field \"${seg.name}\"` } };\n cur = f;\n }\n void projected;\n return { schema: cur };\n}\n\nfunction typeOfSchema(s: FieldSchema | undefined): ValueType {\n return (s?.type as ValueType) ?? \"unknown\";\n}\n\n/** Statically type-checks an expression against a schema scope. */\nexport function typeCheckAst(e: Expr, scope: SchemaScope): TypeResult {\n const issues: TypeIssue[] = [];\n const type = check(e, scope, issues);\n return { type: type.type, schema: type.schema, issues };\n}\n\nfunction check(e: Expr, scope: SchemaScope, issues: TypeIssue[]): { type: ValueType; schema?: FieldSchema } {\n switch (e.kind) {\n case \"literal\":\n return { type: e.value === null ? \"null\" : (typeof e.value as ValueType) };\n case \"path\": {\n const r = resolvePathSchema(e.segments, scope);\n if (r.issue) {\n issues.push(r.issue);\n return { type: \"unknown\" };\n }\n return { type: typeOfSchema(r.schema), schema: r.schema };\n }\n case \"unary\": {\n const t = check(e.arg, scope, issues);\n return { type: e.op === \"not\" ? \"boolean\" : t.type === \"unknown\" ? \"unknown\" : \"number\" };\n }\n case \"binary\": {\n const l = check(e.left, scope, issues);\n const r = check(e.right, scope, issues);\n switch (e.op) {\n case \"and\":\n case \"or\":\n case \"==\":\n case \"!=\":\n case \"<\":\n case \"<=\":\n case \">\":\n case \">=\":\n case \"in\":\n return { type: \"boolean\" };\n case \"+\":\n return { type: l.type === \"string\" || r.type === \"string\" ? \"string\" : \"number\" };\n default:\n return { type: \"number\" };\n }\n }\n case \"conditional\": {\n check(e.test, scope, issues);\n const a = check(e.then, scope, issues);\n check(e.else, scope, issues);\n return a;\n }\n case \"call\": {\n if (!FUNCTION_NAMES.includes(e.name)) issues.push({ code: \"unknown-function\", message: `Unknown function \"${e.name}\"` });\n for (const a of e.args) check(a, scope, issues);\n const numeric = [\"sum\", \"count\", \"avg\", \"min\", \"max\", \"length\", \"round\", \"abs\", \"number\", \"year\", \"daysBetween\"];\n if (numeric.includes(e.name)) return { type: \"number\" };\n if ([\"isEmpty\", \"isNotEmpty\", \"contains\", \"startsWith\", \"endsWith\"].includes(e.name)) return { type: \"boolean\" };\n if ([\"concat\", \"string\"].includes(e.name)) return { type: \"string\" };\n if (e.name === \"now\") return { type: \"datetime\" };\n if ([\"first\", \"last\"].includes(e.name) && e.args[0]) {\n const t = check(e.args[0], scope, issues);\n return t.schema?.type === \"array\" ? { type: typeOfSchema(t.schema.itemSchema), schema: t.schema.itemSchema } : t;\n }\n return { type: \"any\" };\n }\n case \"pipe\": {\n const input = check(e.input, scope, issues);\n for (const a of e.args) check(a, scope, issues);\n const def = PIPES[e.name];\n if (!def) {\n issues.push({ code: \"unknown-pipe\", message: `Unknown formatter \"${e.name}\"` });\n return input;\n }\n if (def.returns === \"same\") return input;\n if (def.returns === \"array\") return { type: \"array\", schema: input.schema?.type === \"array\" ? input.schema : undefined };\n if (def.accepts && input.type !== \"unknown\" && input.type !== \"any\" && input.type !== \"null\" && !def.accepts.includes(input.type)) {\n const compat = (def.accepts.includes(\"number\") && (input.type === \"currency\" || input.type === \"percent\")) || (def.accepts.includes(\"array\") && input.type === \"array\");\n if (!compat) issues.push({ code: \"type-mismatch\", message: `Formatter \"${e.name}\" expects ${def.accepts.join(\" or \")} but received ${input.type}` });\n }\n return { type: def.returns };\n }\n case \"array\":\n for (const i of e.items) check(i, scope, issues);\n return { type: \"array\" };\n }\n}\n\n/** Parses and type-checks an expression string. Syntax errors are returned as issues. */\nexport function typeCheck(src: string, scope: SchemaScope): TypeResult {\n try {\n return typeCheckAst(parseExpression(src), scope);\n } catch (err) {\n const pos = err instanceof ExpressionError ? err.position : undefined;\n return { type: \"unknown\", issues: [{ code: \"syntax\", message: (err as Error).message, position: pos }] };\n }\n}\n","import type { Condition, ConditionGroup, ConditionRule } from \"../types/template.js\";\n\n/**\n * Compiles a structured condition (built by the UI) to expression source.\n * Raw string conditions are returned unchanged.\n */\nexport function compileCondition(condition: Condition | undefined): string | null {\n if (condition === undefined || condition === null) return null;\n if (typeof condition === \"string\") return condition.trim() || null;\n const src = compileGroup(condition);\n return src || null;\n}\n\nfunction compileGroup(group: ConditionGroup): string {\n const parts = group.rules\n .map((r) => (\"op\" in r ? compileGroup(r) : compileRule(r)))\n .filter((s): s is string => !!s);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0]!;\n return parts.map((p) => `(${p})`).join(group.op === \"and\" ? \" and \" : \" or \");\n}\n\nfunction literal(v: ConditionRule[\"right\"]): string {\n if (v === null || v === undefined) return \"null\";\n if (typeof v === \"string\") {\n const m = /^\\{\\{\\s*(.+?)\\s*\\}\\}$/.exec(v);\n if (m) return m[1]!;\n return JSON.stringify(v);\n }\n return String(v);\n}\n\nfunction compileRule(rule: ConditionRule): string {\n const left = rule.left.trim();\n if (!left) return \"\";\n switch (rule.operator) {\n case \"eq\":\n return `${left} == ${literal(rule.right)}`;\n case \"neq\":\n return `${left} != ${literal(rule.right)}`;\n case \"gt\":\n return `${left} > ${literal(rule.right)}`;\n case \"gte\":\n return `${left} >= ${literal(rule.right)}`;\n case \"lt\":\n return `${left} < ${literal(rule.right)}`;\n case \"lte\":\n return `${left} <= ${literal(rule.right)}`;\n case \"contains\":\n return `contains(${left}, ${literal(rule.right)})`;\n case \"startsWith\":\n return `startsWith(${left}, ${literal(rule.right)})`;\n case \"endsWith\":\n return `endsWith(${left}, ${literal(rule.right)})`;\n case \"in\":\n return `${left} in ${Array.isArray(rule.right) ? JSON.stringify(rule.right) : literal(rule.right)}`;\n case \"isEmpty\":\n return `isEmpty(${left})`;\n case \"isNotEmpty\":\n return `isNotEmpty(${left})`;\n case \"isTrue\":\n return `${left} == true`;\n case \"isFalse\":\n return `not ${left}`;\n }\n}\n\nexport const CONDITION_OPERATORS: Array<{ value: ConditionRule[\"operator\"]; label: string; needsValue: boolean; types?: string[] }> = [\n { value: \"eq\", label: \"equals\", needsValue: true },\n { value: \"neq\", label: \"does not equal\", needsValue: true },\n { value: \"gt\", label: \"is greater than\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"gte\", label: \"is at least\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"lt\", label: \"is less than\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"lte\", label: \"is at most\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"contains\", label: \"contains\", needsValue: true, types: [\"string\", \"array\"] },\n { value: \"startsWith\", label: \"starts with\", needsValue: true, types: [\"string\"] },\n { value: \"endsWith\", label: \"ends with\", needsValue: true, types: [\"string\"] },\n { value: \"isEmpty\", label: \"is empty\", needsValue: false },\n { value: \"isNotEmpty\", label: \"is not empty\", needsValue: false },\n { value: \"isTrue\", label: \"is true\", needsValue: false, types: [\"boolean\"] },\n { value: \"isFalse\", label: \"is false\", needsValue: false, types: [\"boolean\"] }\n];\n","import type { Theme } from \"../types/theme.js\";\nimport type { DocumentStyles } from \"../types/template.js\";\n\n/** The built-in fallback theme. Any missing host theme value falls back to this. */\nexport const DEFAULT_THEME: Theme = {\n id: \"default\",\n name: \"Default\",\n typography: {\n headingFont: \"Inter, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n bodyFont: \"Inter, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n monoFont: \"'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n baseFontSize: 11,\n headingScale: 1.25,\n headingWeight: 600,\n bodyWeight: 400,\n lineHeight: 1.5,\n headingLetterSpacing: -0.01\n },\n colors: {\n primary: \"#1F3A5F\",\n secondary: \"#4A6FA5\",\n accent: \"#E0B04B\",\n text: \"#1A1D21\",\n mutedText: \"#6B7280\",\n surface: \"#FFFFFF\",\n background: \"#F5F6F8\",\n border: \"#E2E5EA\",\n success: \"#1E8E5A\",\n warning: \"#C77D0A\",\n danger: \"#C0392B\",\n chart: [\"#1F3A5F\", \"#4A6FA5\", \"#E0B04B\", \"#7FB3D5\", \"#A9CCE3\", \"#F4D03F\", \"#6C7A89\", \"#B0BEC5\"]\n },\n radius: 6,\n table: {\n headerBackground: \"#F3F4F6\",\n headerColor: \"#1A1D21\",\n zebraBackground: \"#FAFAFB\",\n borderColor: \"#E2E5EA\"\n }\n};\n\n/** Document styles used by `createTemplate()`. Everything references theme tokens. */\nexport function defaultDocumentStyles(): DocumentStyles {\n return {\n text: {\n h1: { fontFamily: \"$typography.headingFont\", fontSize: 26, fontWeight: 600, lineHeight: 1.2, letterSpacing: -0.02, color: \"$colors.primary\", marginTop: 0, marginBottom: 8, keepWithNext: true },\n h2: { fontFamily: \"$typography.headingFont\", fontSize: 18, fontWeight: 600, lineHeight: 1.25, letterSpacing: -0.01, color: \"$colors.primary\", marginTop: 12, marginBottom: 6, keepWithNext: true },\n h3: { fontFamily: \"$typography.headingFont\", fontSize: 14, fontWeight: 600, lineHeight: 1.3, color: \"$colors.text\", marginTop: 8, marginBottom: 4, keepWithNext: true },\n h4: { fontFamily: \"$typography.headingFont\", fontSize: 12, fontWeight: 600, lineHeight: 1.35, color: \"$colors.text\", textTransform: \"uppercase\", letterSpacing: 0.04, marginTop: 8, marginBottom: 4, keepWithNext: true },\n body: { fontFamily: \"$typography.bodyFont\", fontSize: 11, fontWeight: 400, lineHeight: 1.5, color: \"$colors.text\", marginTop: 0, marginBottom: 0 },\n lead: { fontFamily: \"$typography.bodyFont\", fontSize: 13, fontWeight: 400, lineHeight: 1.55, color: \"$colors.text\", marginTop: 0, marginBottom: 0 },\n caption: { fontFamily: \"$typography.bodyFont\", fontSize: 9, fontWeight: 400, lineHeight: 1.4, color: \"$colors.mutedText\", marginTop: 0, marginBottom: 0 },\n small: { fontFamily: \"$typography.bodyFont\", fontSize: 8, fontWeight: 400, lineHeight: 1.4, color: \"$colors.mutedText\", marginTop: 0, marginBottom: 0 }\n },\n table: {\n fontSize: 10,\n headerBackground: \"$table.headerBackground\",\n headerColor: \"$table.headerColor\",\n headerFontWeight: 600,\n borderColor: \"$table.borderColor\",\n borderWidth: 1,\n borders: \"horizontal\",\n zebraBackground: \"$table.zebraBackground\",\n cellPaddingX: 8,\n cellPaddingY: 6\n },\n card: {\n background: \"$colors.surface\",\n borderColor: \"$colors.border\",\n borderWidth: 1,\n borderRadius: 6,\n padding: 16,\n shadow: false\n },\n link: { color: \"$colors.secondary\", underline: true },\n spacing: { blockGap: 8, sectionPadding: 0, columnGap: 16 }\n };\n}\n","import type { Theme } from \"../types/theme.js\";\nimport { DEFAULT_THEME } from \"./default-theme.js\";\n\nexport function isTokenRef(value: unknown): value is `$${string}` {\n return typeof value === \"string\" && value.startsWith(\"$\") && value.length > 1;\n}\n\n/**\n * Resolves a theme token such as `$colors.primary`, `$typography.headingFont`,\n * `$table.headerBackground` or `$logo`. Returns `undefined` when the token does\n * not exist in either the theme or the default theme.\n */\nexport function resolveToken(token: string, theme: Theme): string | undefined {\n const path = token.slice(1).split(\".\");\n const fromTheme = walk(theme, path);\n if (typeof fromTheme === \"string\") return fromTheme;\n const fromDefault = walk(DEFAULT_THEME, path);\n return typeof fromDefault === \"string\" ? fromDefault : undefined;\n}\n\nfunction walk(obj: unknown, path: string[]): unknown {\n let cur: unknown = obj;\n for (const p of path) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n if (!Object.prototype.hasOwnProperty.call(cur, p)) return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\n/** Returns a concrete value: token references resolved, literals passed through. */\nexport function resolveValue(value: string | undefined, theme: Theme, fallback: string): string {\n if (value === undefined || value === null || value === \"\") return fallback;\n if (isTokenRef(value)) return resolveToken(value, theme) ?? fallback;\n return value;\n}\n\nexport interface ThemeTokenInfo {\n token: `$${string}`;\n label: string;\n value: string;\n group: \"colors\" | \"typography\" | \"table\" | \"brand\";\n}\n\n/** Every token a theme exposes, for pickers in the editor. */\nexport function listThemeTokens(theme: Theme): ThemeTokenInfo[] {\n const merged: Theme = mergeTheme(theme);\n const out: ThemeTokenInfo[] = [];\n for (const [k, v] of Object.entries(merged.colors)) if (typeof v === \"string\") out.push({ token: `$colors.${k}`, label: humanize(k), value: v, group: \"colors\" });\n for (const [k, v] of Object.entries(merged.typography)) if (typeof v === \"string\") out.push({ token: `$typography.${k}`, label: humanize(k), value: v, group: \"typography\" });\n for (const [k, v] of Object.entries(merged.table ?? {})) if (typeof v === \"string\") out.push({ token: `$table.${k}`, label: humanize(k), value: v, group: \"table\" });\n if (merged.logo) out.push({ token: \"$logo\", label: \"Logo\", value: merged.logo, group: \"brand\" });\n if (merged.logoDark) out.push({ token: \"$logoDark\", label: \"Logo (dark)\", value: merged.logoDark, group: \"brand\" });\n return out;\n}\n\nexport function humanize(key: string): string {\n return key.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/^./, (c) => c.toUpperCase());\n}\n\n/** Merges a partial host theme over the default theme so every value is present. */\nexport function mergeTheme(theme: Partial<Theme> | undefined): Theme {\n if (!theme) return DEFAULT_THEME;\n return {\n ...DEFAULT_THEME,\n ...theme,\n typography: { ...DEFAULT_THEME.typography, ...(theme.typography ?? {}) },\n colors: { ...DEFAULT_THEME.colors, ...(theme.colors ?? {}), chart: theme.colors?.chart?.length ? theme.colors.chart : DEFAULT_THEME.colors.chart },\n table: { ...DEFAULT_THEME.table, ...(theme.table ?? {}) },\n fonts: theme.fonts ?? [],\n meta: theme.meta ?? {}\n };\n}\n\n/** Reports which theme values the host left undefined (validation warning source). */\nexport function missingThemeValues(theme: Partial<Theme>): string[] {\n const missing: string[] = [];\n const required: Array<keyof Theme[\"colors\"]> = [\"primary\", \"secondary\", \"accent\", \"text\", \"mutedText\", \"surface\", \"background\", \"border\"];\n for (const k of required) if (!theme.colors?.[k]) missing.push(`colors.${k}`);\n if (!theme.typography?.headingFont) missing.push(\"typography.headingFont\");\n if (!theme.typography?.bodyFont) missing.push(\"typography.bodyFont\");\n return missing;\n}\n\n/** Simple relative-luminance check used to pick readable text on coloured surfaces. */\nexport function isDarkColor(hex: string): boolean {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) return false;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n const lum = 0.2126 * srgb(r) + 0.7152 * srgb(g) + 0.0722 * srgb(b);\n return lum < 0.4;\n}\n\nfunction srgb(c: number): number {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;\n}\n\n/**\n * What to call a text style where a person will read it.\n *\n * The ids are the contract — `h1` is what a template stores and what a block\n * references — but nobody thinks in `h1`. The inspector already spelled these\n * out inline in one place; naming them once means the style dropdown, the\n * document panel and the block inspector cannot drift apart. An id the built-in\n * set does not know about is humanised rather than guessed at, so a host that\n * adds `pullQuote` gets \"Pull quote\" instead of \"Heading ullQuote\".\n */\nconst TEXT_STYLE_NAMES: Record<string, string> = {\n h1: \"Heading 1\",\n h2: \"Heading 2\",\n h3: \"Heading 3\",\n h4: \"Heading 4\",\n h5: \"Heading 5\",\n h6: \"Heading 6\",\n body: \"Body text\",\n lead: \"Lead paragraph\",\n caption: \"Caption\",\n small: \"Small print\"\n};\n\nexport function textStyleLabel(id: string): string {\n return TEXT_STYLE_NAMES[id] ?? humanize(id);\n}\n","import type { BlockStyle, ResolvedStyle, Spacing } from \"../types/style.js\";\nimport type { DocumentStyles, TextStyle } from \"../types/template.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport { resolveValue } from \"./tokens.js\";\n\nexport interface StyleCascadeInput {\n theme: Theme;\n styles: DocumentStyles;\n /** Document text style to inherit from. Defaults to \"body\". */\n textStyle?: string;\n /** Block definition defaults (lowest priority above document styles). */\n defaults?: BlockStyle;\n /** Instance overrides (highest priority). */\n overrides?: BlockStyle;\n /** When false, instance overrides are ignored (host permission). */\n allowOverrides?: boolean;\n}\n\nfunction spacing(base: Required<Spacing>, ...layers: Array<Spacing | undefined>): Required<Spacing> {\n const out = { ...base };\n for (const l of layers) {\n if (!l) continue;\n if (l.top !== undefined) out.top = l.top;\n if (l.right !== undefined) out.right = l.right;\n if (l.bottom !== undefined) out.bottom = l.bottom;\n if (l.left !== undefined) out.left = l.left;\n }\n return out;\n}\n\n/**\n * Resolves the style cascade for one block:\n * theme defaults → document text style → block definition defaults → instance overrides.\n * Output contains only concrete values; renderers never see tokens.\n */\nexport function resolveStyle(input: StyleCascadeInput): ResolvedStyle {\n const { theme, styles } = input;\n const text: TextStyle = styles.text[input.textStyle ?? \"body\"] ?? styles.text.body ?? {};\n const d = input.defaults ?? {};\n const o = input.allowOverrides === false ? {} : input.overrides ?? {};\n\n const typo = theme.typography;\n const fontFamily = resolveValue(o.fontFamily ?? d.fontFamily ?? text.fontFamily, theme, typo.bodyFont);\n const fontSize = o.fontSize ?? d.fontSize ?? text.fontSize ?? typo.baseFontSize ?? 11;\n const fontWeight = o.fontWeight ?? d.fontWeight ?? text.fontWeight ?? typo.bodyWeight ?? 400;\n const lineHeight = o.lineHeight ?? d.lineHeight ?? text.lineHeight ?? typo.lineHeight ?? 1.5;\n\n const border = o.border || d.border\n ? {\n width: o.border?.width ?? d.border?.width ?? 1,\n style: o.border?.style ?? d.border?.style ?? \"solid\",\n color: resolveValue(o.border?.color ?? d.border?.color, theme, theme.colors.border),\n radius: o.border?.radius ?? d.border?.radius ?? 0,\n sides: o.border?.sides ?? d.border?.sides ?? [\"top\", \"right\", \"bottom\", \"left\"]\n }\n : undefined;\n\n const background = resolveOptional(o.background ?? d.background, theme);\n\n return {\n fontFamily,\n fontSize,\n fontWeight,\n fontStyle: o.fontStyle ?? d.fontStyle ?? text.fontStyle ?? \"normal\",\n lineHeight,\n letterSpacing: o.letterSpacing ?? d.letterSpacing ?? text.letterSpacing ?? 0,\n textTransform: o.textTransform ?? d.textTransform ?? text.textTransform ?? \"none\",\n textAlign: o.textAlign ?? d.textAlign ?? \"left\",\n verticalAlign: o.verticalAlign ?? d.verticalAlign ?? \"top\",\n color: resolveValue(o.color ?? d.color ?? text.color, theme, theme.colors.text),\n background,\n padding: spacing({ top: 0, right: 0, bottom: 0, left: 0 }, d.padding, o.padding),\n margin: spacing({ top: text.marginTop ?? 0, right: 0, bottom: text.marginBottom ?? 0, left: 0 }, d.margin, o.margin),\n border,\n width: o.width ?? d.width,\n height: o.height ?? d.height,\n align: o.align ?? d.align,\n opacity: o.opacity ?? d.opacity\n };\n}\n\nfunction resolveOptional(value: string | undefined, theme: Theme): string | undefined {\n if (!value || value === \"transparent\" || value === \"none\") return undefined;\n return resolveValue(value, theme, \"\");\n}\n\n/** Converts a resolved style to inline CSS declarations (used by every renderer). */\nexport function styleToCss(s: ResolvedStyle, opts: { text?: boolean; box?: boolean } = { text: true, box: true }): Record<string, string> {\n const css: Record<string, string> = {};\n if (opts.text !== false) {\n css[\"font-family\"] = s.fontFamily;\n css[\"font-size\"] = `${s.fontSize}px`;\n css[\"font-weight\"] = String(s.fontWeight);\n css[\"font-style\"] = s.fontStyle;\n css[\"line-height\"] = String(s.lineHeight);\n if (s.letterSpacing) css[\"letter-spacing\"] = `${s.letterSpacing}em`;\n if (s.textTransform !== \"none\") css[\"text-transform\"] = s.textTransform;\n css[\"text-align\"] = s.textAlign;\n css[\"color\"] = s.color;\n }\n if (opts.box !== false) {\n if (s.background) css[\"background\"] = s.background;\n const p = s.padding;\n if (p.top || p.right || p.bottom || p.left) css[\"padding\"] = `${p.top}px ${p.right}px ${p.bottom}px ${p.left}px`;\n const m = s.margin;\n if (m.top || m.right || m.bottom || m.left) css[\"margin\"] = `${m.top}px ${m.right}px ${m.bottom}px ${m.left}px`;\n if (s.border && s.border.width > 0 && s.border.style !== \"none\") {\n const decl = `${s.border.width}px ${s.border.style} ${s.border.color}`;\n if (s.border.sides.length === 4) css[\"border\"] = decl;\n else for (const side of s.border.sides) css[`border-${side}`] = decl;\n }\n if (s.border?.radius) css[\"border-radius\"] = `${s.border.radius}px`;\n if (s.width !== undefined) css[\"width\"] = typeof s.width === \"number\" ? `${s.width}px` : s.width;\n if (s.height !== undefined) css[\"height\"] = `${s.height}px`;\n if (s.opacity !== undefined && s.opacity < 1) css[\"opacity\"] = String(s.opacity);\n }\n return css;\n}\n\nexport function cssText(css: Record<string, string | number | undefined>): string {\n return Object.entries(css)\n .filter(([, v]) => v !== undefined && v !== \"\")\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n}\n","/**\n * A tiny virtual node model. Block renderers return VNodes so the same render\n * code produces DOM in the editor, DOM in the preview, DOM in the PDF service,\n * and HTML strings in tests — without any framework.\n */\n\nexport type VChild = VNode | string | number | null | undefined | false | VChild[];\n\nexport interface VNode {\n tag: string;\n props: VProps;\n children: Array<VNode | string>;\n /** \"svg\" for SVG namespace elements. Inferred from the tag when omitted. */\n ns?: \"svg\";\n}\n\nexport interface VProps {\n class?: string | Array<string | false | null | undefined>;\n style?: string | Record<string, string | number | undefined>;\n /** Data attributes are passed as `data-*` keys. */\n [attr: string]: string | number | boolean | undefined | null | Array<string | false | null | undefined> | Record<string, string | number | undefined>;\n}\n\nconst SVG_TAGS = new Set([\n \"svg\", \"g\", \"path\", \"rect\", \"circle\", \"ellipse\", \"line\", \"polyline\", \"polygon\", \"text\", \"tspan\", \"defs\", \"clipPath\", \"linearGradient\", \"radialGradient\", \"stop\", \"use\", \"symbol\", \"mask\", \"pattern\", \"title\", \"desc\", \"foreignObject\"\n]);\n\nexport function h(tag: string, props?: VProps | null, ...children: VChild[]): VNode {\n const node: VNode = { tag, props: props ?? {}, children: [] };\n if (SVG_TAGS.has(tag)) node.ns = \"svg\";\n appendChildren(node.children, children);\n return node;\n}\n\nfunction appendChildren(out: Array<VNode | string>, children: VChild[]) {\n for (const c of children) {\n if (c === null || c === undefined || c === false || c === \"\") continue;\n if (Array.isArray(c)) appendChildren(out, c);\n else if (typeof c === \"number\") out.push(String(c));\n else out.push(c);\n }\n}\n\nexport function isVNode(v: unknown): v is VNode {\n return !!v && typeof v === \"object\" && typeof (v as VNode).tag === \"string\" && Array.isArray((v as VNode).children);\n}\n\nexport function classNames(value: VProps[\"class\"]): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n return value.filter(Boolean).join(\" \");\n}\n\nexport function styleString(value: VProps[\"style\"]): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n return Object.entries(value)\n .filter(([, v]) => v !== undefined && v !== \"\" && v !== null)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n}\n\nconst ESC: Record<string, string> = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" };\nexport function escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nconst VOID = new Set([\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"link\", \"meta\", \"source\", \"track\", \"wbr\"]);\n\n/** Serialises a VNode tree to an HTML string. Attribute values are always escaped. */\nexport function toHtml(node: VNode | string | Array<VNode | string>): string {\n if (Array.isArray(node)) return node.map(toHtml).join(\"\");\n if (typeof node === \"string\") return escapeHtml(node);\n const attrs: string[] = [];\n for (const [k, v] of Object.entries(node.props)) {\n if (v === undefined || v === null || v === false) continue;\n if (k === \"class\") {\n const c = classNames(v as VProps[\"class\"]);\n if (c) attrs.push(`class=\"${escapeHtml(c)}\"`);\n } else if (k === \"style\") {\n const s = styleString(v as VProps[\"style\"]);\n if (s) attrs.push(`style=\"${escapeHtml(s)}\"`);\n } else if (v === true) attrs.push(escapeHtml(k));\n else attrs.push(`${escapeHtml(k)}=\"${escapeHtml(String(v))}\"`);\n }\n const open = `<${node.tag}${attrs.length ? \" \" + attrs.join(\" \") : \"\"}>`;\n if (VOID.has(node.tag)) return open;\n return `${open}${node.children.map(toHtml).join(\"\")}</${node.tag}>`;\n}\n\n/** Depth-first walk. Return false from the visitor to stop descending. */\nexport function walkVNodes(node: VNode, visit: (n: VNode) => boolean | void): void {\n if (visit(node) === false) return;\n for (const c of node.children) if (typeof c !== \"string\") walkVNodes(c, visit);\n}\n","import type { BlockStyle, ResolvedStyle } from \"../types/style.js\";\nimport type { DocumentStyles, FlowOptions, Node } from \"../types/template.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { DataSource, FieldSchema, FieldType, PageContext } from \"../types/data.js\";\nimport type { VChild, VNode, VProps, h as hyperscript } from \"../vnode/h.js\";\nimport type { FormatContext } from \"../expr/format.js\";\nimport type { SchemaScope } from \"../expr/typecheck.js\";\nimport type { ResolvedNode } from \"../resolve/resolved.js\";\nimport type { Scope } from \"../expr/evaluate.js\";\nimport type { Issue } from \"../validate/issues.js\";\n\nexport type BlockCategory = \"content\" | \"layout\" | \"data\" | \"visualisation\" | \"custom\" | \"structure\";\nexport type LicenseTier = \"community\" | \"pro\" | \"enterprise\";\nexport type SplitMode = \"none\" | \"lines\" | \"rows\" | \"children\";\nexport type RenderMode = \"design\" | \"preview\";\n\n/* ------------------------------------------------------------------ */\n/* Inspector (properties panel) schema */\n/* ------------------------------------------------------------------ */\n\nexport interface InspectorFieldBase {\n /** Property name on `props` this field edits. Supports dot paths (`series.color`). */\n prop: string;\n label: string;\n /**\n * Help text under the control. A function when the useful wording depends on\n * the block's other settings — a table's row alias is named by the designer,\n * so \"use it like `row.name`\" is wrong for every table that renamed it.\n */\n description?: string | ((props: Record<string, unknown>) => string);\n /** Show only when the predicate passes. */\n when?: (props: Record<string, unknown>) => boolean;\n /** Take a full row in a two-column inspector grid. */\n fullWidth?: boolean;\n}\n\nexport type SelectOption = { value: string | number | boolean; label: string; icon?: string; description?: string };\n\nexport type InspectorField =\n | (InspectorFieldBase & { kind: \"text\"; placeholder?: string; allowTokens?: boolean })\n | (InspectorFieldBase & { kind: \"textarea\"; placeholder?: string; rows?: number; allowTokens?: boolean })\n | (InspectorFieldBase & { kind: \"richtext\" })\n | (InspectorFieldBase & { kind: \"number\"; min?: number; max?: number; step?: number; unit?: string })\n | (InspectorFieldBase & { kind: \"toggle\" })\n | (InspectorFieldBase & { kind: \"select\"; options?: SelectOption[]; optionsFrom?: (props: Record<string, unknown>) => SelectOption[] })\n | (InspectorFieldBase & { kind: \"segmented\"; options: SelectOption[] })\n | (InspectorFieldBase & { kind: \"color\"; allowTransparent?: boolean })\n | (InspectorFieldBase & { kind: \"font\" })\n | (InspectorFieldBase & { kind: \"textStyle\" })\n | (InspectorFieldBase & { kind: \"binding\"; valueType?: FieldType | FieldType[]; placeholder?: string })\n | (InspectorFieldBase & { kind: \"collection\"; placeholder?: string })\n | (InspectorFieldBase & { kind: \"expression\"; placeholder?: string })\n | (InspectorFieldBase & { kind: \"image\"; allowBinding?: boolean })\n | (InspectorFieldBase & { kind: \"condition\" })\n | (InspectorFieldBase & { kind: \"columns\" })\n | (InspectorFieldBase & { kind: \"series\" })\n | (InspectorFieldBase & { kind: \"keyValues\" })\n | (InspectorFieldBase & {\n kind: \"list\";\n itemLabel?: string;\n fields: InspectorField[];\n /**\n * One line describing a collapsed item. Without it the list falls back to\n * whatever field looks like a name, which for a table's conditional\n * formatting rules meant showing the column id — \"c5\" — to a person who\n * has never seen a column id and has no way to look one up.\n */\n itemSummary?: (item: Record<string, unknown>, index: number, props: Record<string, unknown>) => string;\n })\n | (InspectorFieldBase & { kind: \"custom\"; component: InspectorComponent });\n\n/**\n * Framework-neutral mount adapter for custom inspector UIs. `@broadpaper/react`\n * and `@broadpaper/angular` provide helpers that produce one from a component.\n */\nexport interface InspectorComponent {\n mount(element: HTMLElement, api: InspectorApi): void;\n update?(api: InspectorApi): void;\n unmount?(element: HTMLElement): void;\n}\n\nexport interface InspectorApi {\n value: unknown;\n props: Record<string, unknown>;\n node: Node;\n setValue(value: unknown): void;\n setProps(patch: Record<string, unknown>): void;\n dataSources: DataSource[];\n schemaScope: SchemaScope;\n theme: Theme;\n}\n\nexport interface InspectorSection {\n title: string;\n fields: InspectorField[];\n collapsed?: boolean;\n when?: (props: Record<string, unknown>) => boolean;\n}\n\n/** Which built-in style groups the inspector shows for a block. */\nexport type StyleGroup = \"textStyle\" | \"typography\" | \"alignment\" | \"spacing\" | \"border\" | \"background\" | \"size\" | \"flow\";\n\n/* ------------------------------------------------------------------ */\n/* Bindings */\n/* ------------------------------------------------------------------ */\n\nexport type BindingKind =\n /** A single expression yielding a value. */\n | \"value\"\n /** An expression yielding an array. */\n | \"collection\"\n /** A plain string that may contain `{{ }}` tokens. */\n | \"template\"\n /** A rich text document containing inline tokens. */\n | \"richtext\"\n /** A structured or string condition. */\n | \"condition\"\n /** A list of objects that contain nested bindings (see `items`). Not evaluated itself. */\n | \"list\";\n\nexport interface BindingSpec {\n prop: string;\n kind: BindingKind;\n valueType?: FieldType | FieldType[];\n /** Nested bindings inside list props (e.g. table columns). */\n items?: BindingSpec[];\n /** For collections: props on this block that are evaluated per item (e.g. table column values). */\n scoped?: BindingSpec[];\n /** Prop holding the alias name introduced into scope for per-item bindings. */\n alias?: string;\n /**\n * The expression is evaluated per item of the block's collection by the block's\n * own `resolve` hook (e.g. table column values). The resolver leaves it alone;\n * validation checks it in the item scope.\n */\n perItem?: boolean;\n}\n\nexport interface BindingInfo {\n prop: string;\n kind: BindingKind;\n expr: string;\n /** Human label such as \"Client › First name\". */\n label: string;\n type?: FieldType | \"unknown\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Containers */\n/* ------------------------------------------------------------------ */\n\nexport interface ContainerSpec {\n /** What children this node accepts: block types, or a wildcard group. */\n accepts: Array<string | \"@blocks\" | \"@rows\" | \"@columns\" | \"@sections\">;\n min?: number;\n max?: number;\n /** Repeat children once per item of the collection in `collectionProp`. */\n repeat?: { collectionProp: string; aliasProp?: string; keepItemTogetherProp?: string; emptyMessageProp?: string; limitProp?: string };\n /** Show children only when the condition in `conditionProp` holds. */\n conditional?: { conditionProp: string; elseChildrenProp?: string };\n /** Direction children are laid out in. Default \"column\". */\n direction?: \"column\" | \"row\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Contexts */\n/* ------------------------------------------------------------------ */\n\nexport interface ResolveHookContext<P> {\n props: P;\n node: Node;\n scope: Scope;\n mode: RenderMode;\n theme: Theme;\n format: FormatContext;\n evaluate(expr: string): unknown;\n evaluateIn(expr: string, vars: Record<string, unknown>): unknown;\n warn(message: string): void;\n}\n\nexport interface RenderContext<P = Record<string, unknown>> {\n node: ResolvedNode;\n props: P;\n style: ResolvedStyle;\n /** Inline CSS for the block root: text + box (padding, border, background). Margin/width are applied by the wrapper. */\n css: Record<string, string>;\n theme: Theme;\n styles: DocumentStyles;\n mode: RenderMode;\n h: typeof hyperscript;\n /** Rendered child nodes (containers only). */\n children: VNode[];\n page: PageContext;\n /** Available width in px. */\n width: number;\n format: FormatContext;\n registry: BlockRegistryLike;\n /** Renders an interpolated string prop; tokens become chips in design mode. */\n text(prop: string, fallback?: string): VChild[];\n /** Renders a rich text prop. */\n richText(prop: string): VChild[];\n /** Renders a plain string value that may contain tokens (already resolved in preview). */\n textValue(value: string | undefined): VChild[];\n /** Metadata about a bound prop (for badges/chips). */\n binding(prop: string): BindingInfo | undefined;\n /** Standard attributes for a sub-element the editor should be able to target. */\n partAttrs(part: string, extra?: VProps): VProps;\n /** Placeholder shown in design mode for empty content. */\n placeholder(text: string, extra?: VProps): VNode;\n}\n\nexport interface ValidateContext<P> {\n props: P;\n node: Node;\n schemaScope: SchemaScope;\n dataSources: DataSource[];\n theme: Theme;\n /** Type-checks an expression and returns its issues (already prefixed with the node). */\n checkExpression(expr: string, prop: string): Issue[];\n}\n\nexport interface BlockRegistryLike {\n get(type: string): BlockDefinition | undefined;\n has(type: string): boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Definition */\n/* ------------------------------------------------------------------ */\n\nexport interface BlockDefinition<P extends Record<string, unknown> = Record<string, unknown>> {\n /** Unique type id. Custom blocks should be namespaced: \"acme.risk-profile\". */\n type: string;\n name: string;\n description?: string;\n category: BlockCategory;\n /** Lucide icon name (e.g. \"heading\") or an inline `<svg>` string. */\n icon?: string;\n keywords?: string[];\n /**\n * The tier **the host** sells this block in, badged in the palette and\n * reported by validation when the host has not enabled it.\n *\n * It exists so an embedder can put their own blocks behind their own plans.\n * BroadPaper's built-in blocks never set it, and must not: the two BroadPaper\n * licences unlock identical software, and nothing in this SDK reads an\n * entitlement to decide what to allow. Chart, Table and Repeater carried\n * `\"pro\"` for a while, which said the opposite of what we sell.\n */\n license?: LicenseTier;\n /** Do not show in the block palette (structural nodes, deprecated types). */\n hidden?: boolean;\n /** Version of the props shape. Bump and implement `migrate` when it changes. */\n version?: number;\n\n defaultProps: P | (() => P);\n defaultStyle?: BlockStyle;\n defaultFlow?: FlowOptions;\n /** Document text style to inherit from (\"body\", \"h1\", ...). */\n defaultTextStyle?: string;\n\n inspector?: InspectorSection[];\n styleGroups?: StyleGroup[];\n /** Declares props holding expressions. Derived from `inspector` when omitted. */\n bindings?: BindingSpec[];\n\n container?: ContainerSpec;\n /** How the paginator may split this node. Containers default to \"children\", leaves to \"none\". */\n split?: SplitMode;\n /**\n * What the measurer should inspect: \"text\" reads line boxes, \"table\" reads rows.\n * Derived from `split` when omitted.\n */\n measure?: \"text\" | \"table\" | \"none\";\n\n /** Adjust resolved props after binding resolution (compute derived data, sort, etc.). */\n resolve?(ctx: ResolveHookContext<P>): P | void;\n render(ctx: RenderContext<P>): VNode | null;\n validate?(ctx: ValidateContext<P>): Issue[];\n migrate?(props: Record<string, unknown>, fromVersion: number): P;\n\n canvas?: {\n /** Enables inline editing of a prop directly on the canvas. */\n inlineEdit?: { prop: string; kind: \"richtext\" | \"text\" };\n /** Layer-tree label. */\n label?: (props: P) => string;\n /** Minimum height in px for the empty design-mode placeholder. */\n minHeight?: number;\n };\n}\n\n/** Identity helper that gives full type inference for custom blocks. */\nexport function defineBlock<P extends Record<string, unknown>>(def: BlockDefinition<P>): BlockDefinition<P> {\n if (!def.type || !/^[a-z0-9][a-z0-9._-]*$/i.test(def.type)) {\n throw new Error(`Invalid block type \"${def.type}\". Use letters, digits, dots, dashes and underscores.`);\n }\n return def;\n}\n\nexport function resolveDefaultProps<P extends Record<string, unknown>>(def: BlockDefinition<P>): P {\n const d = def.defaultProps;\n return typeof d === \"function\" ? structuredClone((d as () => P)()) : structuredClone(d);\n}\n\nexport type { FieldSchema };\n","import type { BlockDefinition, BindingSpec, InspectorField, LicenseTier } from \"./block-definition.js\";\n\nexport interface RegistryOptions {\n /** Licence tiers that are enabled. Blocks above the enabled tier are still rendered but flagged. */\n enabledTiers?: LicenseTier[];\n}\n\nconst TIER_RANK: Record<LicenseTier, number> = { community: 0, pro: 1, enterprise: 2 };\n\n/**\n * The block registry. Built-in blocks and host custom blocks are registered the\n * same way; there is no privileged path.\n */\nexport class BlockRegistry {\n private readonly defs = new Map<string, BlockDefinition<any>>();\n private readonly listeners = new Set<() => void>();\n private readonly enabledTiers: Set<LicenseTier>;\n\n constructor(defs: Array<BlockDefinition<any>> = [], opts: RegistryOptions = {}) {\n this.enabledTiers = new Set(opts.enabledTiers ?? [\"community\", \"pro\", \"enterprise\"]);\n for (const d of defs) this.register(d);\n }\n\n register<P extends Record<string, unknown>>(def: BlockDefinition<P>): this {\n if (this.defs.has(def.type)) throw new Error(`Block type \"${def.type}\" is already registered`);\n this.defs.set(def.type, def);\n this.emit();\n return this;\n }\n\n /** Replaces an existing definition (used for hot-swapping custom blocks in dev). */\n replace<P extends Record<string, unknown>>(def: BlockDefinition<P>): this {\n this.defs.set(def.type, def);\n this.emit();\n return this;\n }\n\n unregister(type: string): this {\n this.defs.delete(type);\n this.emit();\n return this;\n }\n\n get(type: string): BlockDefinition | undefined {\n return this.defs.get(type);\n }\n\n has(type: string): boolean {\n return this.defs.has(type);\n }\n\n require(type: string): BlockDefinition {\n const d = this.defs.get(type);\n if (!d) throw new Error(`Unknown block type \"${type}\"`);\n return d;\n }\n\n list(): BlockDefinition[] {\n return [...this.defs.values()];\n }\n\n /** Blocks shown in the palette, grouped by category, honouring `hidden`. */\n palette(): BlockDefinition[] {\n return this.list().filter((d) => !d.hidden && d.category !== \"structure\");\n }\n\n isTierEnabled(tier: LicenseTier | undefined): boolean {\n return this.enabledTiers.has(tier ?? \"community\");\n }\n\n /** The highest tier required by a set of block types. */\n requiredTier(types: Iterable<string>): LicenseTier {\n let best: LicenseTier = \"community\";\n for (const t of types) {\n const tier = this.defs.get(t)?.license ?? \"community\";\n if (TIER_RANK[tier] > TIER_RANK[best]) best = tier;\n }\n return best;\n }\n\n /** Effective binding specs for a block: explicit `bindings`, else derived from the inspector. */\n bindingsOf(type: string): BindingSpec[] {\n const def = this.defs.get(type);\n if (!def) return [];\n return bindingSpecsFor(def);\n }\n\n /** Whether `childType` may be placed inside `parentType`. */\n accepts(parentType: string, childType: string): boolean {\n const parent = this.defs.get(parentType);\n const child = this.defs.get(childType);\n if (!parent?.container) return false;\n for (const rule of parent.container.accepts) {\n if (rule === childType) return true;\n if (rule === \"@blocks\" && child && child.category !== \"structure\") return true;\n if (rule === \"@rows\" && childType === \"row\") return true;\n if (rule === \"@columns\" && childType === \"column\") return true;\n if (rule === \"@sections\" && childType === \"section\") return true;\n }\n return false;\n }\n\n subscribe(fn: () => void): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n private emit() {\n for (const l of this.listeners) l();\n }\n}\n\nconst bindingCache = new WeakMap<BlockDefinition<any>, BindingSpec[]>();\n\nexport function bindingSpecsFor(def: BlockDefinition<any>): BindingSpec[] {\n const hit = bindingCache.get(def);\n if (hit) return hit;\n let specs: BindingSpec[];\n if (def.bindings) specs = def.bindings;\n else {\n specs = [];\n const visit = (fields: InspectorField[]) => {\n for (const f of fields) {\n switch (f.kind) {\n case \"binding\":\n specs.push({ prop: f.prop, kind: \"value\", valueType: f.valueType });\n break;\n case \"collection\":\n specs.push({ prop: f.prop, kind: \"collection\" });\n break;\n case \"expression\":\n specs.push({ prop: f.prop, kind: \"value\" });\n break;\n case \"richtext\":\n specs.push({ prop: f.prop, kind: \"richtext\" });\n break;\n case \"condition\":\n specs.push({ prop: f.prop, kind: \"condition\" });\n break;\n case \"text\":\n case \"textarea\":\n if (f.allowTokens !== false) specs.push({ prop: f.prop, kind: \"template\" });\n break;\n case \"image\":\n if (f.allowBinding !== false) specs.push({ prop: f.prop, kind: \"template\" });\n break;\n case \"list\":\n visit(f.fields);\n break;\n default:\n break;\n }\n }\n };\n for (const s of def.inspector ?? []) visit(s.fields);\n }\n bindingCache.set(def, specs);\n return specs;\n}\n","import { z } from \"zod\";\nimport { CURRENT_SCHEMA_VERSION } from \"../types/template.js\";\n\nconst color = z.string().min(1);\nconst spacing = z.object({ top: z.number().optional(), right: z.number().optional(), bottom: z.number().optional(), left: z.number().optional() }).partial();\n\nconst borderSpec = z\n .object({\n width: z.number().min(0).optional(),\n style: z.enum([\"solid\", \"dashed\", \"dotted\", \"none\"]).optional(),\n color: color.optional(),\n radius: z.number().min(0).optional(),\n sides: z.array(z.enum([\"top\", \"right\", \"bottom\", \"left\"])).optional()\n })\n .partial();\n\nexport const blockStyleSchema = z\n .object({\n textStyle: z.string().optional(),\n fontFamily: z.string().optional(),\n fontSize: z.number().positive().optional(),\n fontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional(),\n lineHeight: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n textTransform: z.enum([\"none\", \"uppercase\", \"lowercase\", \"capitalize\"]).optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\", \"justify\"]).optional(),\n verticalAlign: z.enum([\"top\", \"middle\", \"bottom\"]).optional(),\n color: color.optional(),\n background: color.optional(),\n padding: spacing.optional(),\n margin: spacing.optional(),\n border: borderSpec.optional(),\n width: z.union([z.number(), z.string()]).optional(),\n height: z.number().optional(),\n align: z.enum([\"left\", \"center\", \"right\"]).optional(),\n opacity: z.number().min(0).max(1).optional()\n })\n .partial();\n\nconst conditionRule = z.object({\n left: z.string(),\n operator: z.enum([\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\", \"contains\", \"startsWith\", \"endsWith\", \"in\", \"isEmpty\", \"isNotEmpty\", \"isTrue\", \"isFalse\"]),\n right: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional()\n});\n\nexport const conditionGroupSchema: z.ZodType<import(\"../types/template.js\").ConditionGroup> = z.lazy(() =>\n z.object({ op: z.enum([\"and\", \"or\"]), rules: z.array(z.union([conditionRule, conditionGroupSchema])) })\n);\n\nconst conditionSchema = z.union([z.string(), conditionGroupSchema]);\n\nconst flowSchema = z\n .object({\n breakBefore: z.enum([\"auto\", \"page\"]).optional(),\n breakAfter: z.enum([\"auto\", \"page\"]).optional(),\n keepTogether: z.boolean().optional(),\n keepWithNext: z.boolean().optional(),\n minOrphans: z.number().int().min(0).optional(),\n minWidows: z.number().int().min(0).optional()\n })\n .partial();\n\nexport const nodeSchema: z.ZodType<import(\"../types/template.js\").Node> = z.lazy(() =>\n z.object({\n id: z.string().min(1),\n type: z.string().min(1),\n props: z.record(z.unknown()),\n style: blockStyleSchema.optional(),\n children: z.array(nodeSchema).optional(),\n visibleWhen: conditionSchema.optional(),\n flow: flowSchema.optional(),\n name: z.string().optional(),\n locked: z.boolean().optional()\n })\n);\n\nconst textStyleSchema = z\n .object({\n fontFamily: z.string().optional(),\n fontSize: z.number().positive().optional(),\n fontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional(),\n lineHeight: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n textTransform: z.enum([\"none\", \"uppercase\", \"lowercase\", \"capitalize\"]).optional(),\n color: color.optional(),\n marginTop: z.number().optional(),\n marginBottom: z.number().optional(),\n keepWithNext: z.boolean().optional()\n })\n .partial();\n\nconst pageRegion = z.object({ height: z.number().min(0), differentFirstPage: z.boolean() });\n\nexport const pageSettingsSchema = z.object({\n size: z.union([z.enum([\"A4\", \"A3\", \"A5\", \"Letter\", \"Legal\", \"Tabloid\"]), z.object({ width: z.number().positive(), height: z.number().positive() })]),\n orientation: z.enum([\"portrait\", \"landscape\"]),\n margins: z.object({ top: z.number().min(0), right: z.number().min(0), bottom: z.number().min(0), left: z.number().min(0) }),\n header: pageRegion,\n footer: pageRegion,\n background: color.optional(),\n minPages: z.number().int().min(1).optional()\n});\n\nexport const documentStylesSchema = z.object({\n text: z.record(textStyleSchema),\n table: z\n .object({\n fontSize: z.number().optional(),\n headerBackground: color.optional(),\n headerColor: color.optional(),\n headerFontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n borderColor: color.optional(),\n borderWidth: z.number().optional(),\n borders: z.enum([\"all\", \"horizontal\", \"outer\", \"none\"]).optional(),\n zebraBackground: color.optional(),\n cellPaddingX: z.number().optional(),\n cellPaddingY: z.number().optional()\n })\n .partial(),\n card: z\n .object({\n background: color.optional(),\n borderColor: color.optional(),\n borderWidth: z.number().optional(),\n borderRadius: z.number().optional(),\n padding: z.number().optional(),\n shadow: z.boolean().optional()\n })\n .partial(),\n link: z.object({ color: color.optional(), underline: z.boolean().optional() }).partial(),\n spacing: z.object({ blockGap: z.number(), sectionPadding: z.number(), columnGap: z.number() })\n});\n\nconst regionContent = z.object({ default: z.array(nodeSchema), firstPage: z.array(nodeSchema).optional() });\n\nexport const templateSchema = z.object({\n schemaVersion: z.literal(CURRENT_SCHEMA_VERSION),\n id: z.string().min(1),\n name: z.string(),\n meta: z\n .object({\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n author: z.string().optional(),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n custom: z.record(z.unknown()).optional()\n })\n .partial()\n .optional(),\n page: pageSettingsSchema,\n styles: documentStylesSchema,\n header: regionContent,\n footer: regionContent,\n body: z.array(nodeSchema),\n library: z\n .array(\n z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n category: z.string().optional(),\n node: nodeSchema,\n thumbnail: z.string().optional()\n })\n )\n .optional(),\n settings: z\n .object({\n locale: z.string().optional(),\n currency: z.string().optional(),\n timeZone: z.string().optional(),\n dataSources: z.array(z.string()).optional()\n })\n .partial()\n .optional()\n});\n\nexport type TemplateSchemaInput = z.input<typeof templateSchema>;\n\nexport interface ParseResult {\n ok: boolean;\n template?: import(\"../types/template.js\").ReportTemplate;\n errors: Array<{ path: string; message: string }>;\n}\n\n/** Validates the JSON shape of a template (after migration). */\nexport function parseTemplate(json: unknown): ParseResult {\n const r = templateSchema.safeParse(json);\n if (r.success) return { ok: true, template: r.data as import(\"../types/template.js\").ReportTemplate, errors: [] };\n return { ok: false, errors: r.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message })) };\n}\n","const ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\nfunction randomBytes(n: number): Uint8Array {\n const out = new Uint8Array(n);\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (c?.getRandomValues) c.getRandomValues(out);\n else for (let i = 0; i < n; i++) out[i] = Math.floor(Math.random() * 256);\n return out;\n}\n\nlet counter = 0;\nlet deterministic: string | null = null;\n\n/** Generates a short, URL-safe unique id. */\nexport function createId(prefix = \"n\"): string {\n if (deterministic !== null) return `${prefix}_${deterministic}${(++counter).toString(36)}`;\n const bytes = randomBytes(10);\n let s = \"\";\n for (const b of bytes) s += ALPHABET[b % ALPHABET.length];\n return `${prefix}_${s}`;\n}\n\n/** Tests: makes ids predictable. Pass null to restore random ids. */\nexport function setDeterministicIds(seed: string | null): void {\n deterministic = seed;\n counter = 0;\n}\n","import { CURRENT_SCHEMA_VERSION, type AnyVersionTemplate, type ReportTemplate } from \"../types/template.js\";\n\nexport interface Migration {\n from: number;\n to: number;\n description: string;\n migrate(template: AnyVersionTemplate): AnyVersionTemplate;\n}\n\n/**\n * Ordered list of migrations. Each is a pure function from version N to N+1.\n * Never edit a shipped migration; add a new one.\n */\nexport const MIGRATIONS: Migration[] = [\n {\n from: 0,\n to: 1,\n description: \"Pre-release drafts: normalise `content` → `body`, add page regions and styles\",\n migrate(t) {\n const out: AnyVersionTemplate = { ...t, schemaVersion: 1 };\n if (Array.isArray(t.content) && !t.body) {\n out.body = t.content;\n delete out.content;\n }\n out.header ??= { default: [] };\n out.footer ??= { default: [] };\n return out;\n }\n }\n];\n\nexport interface MigrationResult {\n template: ReportTemplate;\n /** Migrations that were applied, in order. */\n applied: Migration[];\n fromVersion: number;\n}\n\nexport class MigrationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MigrationError\";\n }\n}\n\n/**\n * Brings a template of any supported version up to the current schema.\n * Throws `MigrationError` for future versions or missing migration steps.\n */\nexport function migrateTemplate(input: AnyVersionTemplate | ReportTemplate): MigrationResult {\n const fromVersion = typeof input.schemaVersion === \"number\" ? input.schemaVersion : 0;\n if (fromVersion > CURRENT_SCHEMA_VERSION) {\n throw new MigrationError(`Template schemaVersion ${fromVersion} is newer than this version of BroadPaper supports (${CURRENT_SCHEMA_VERSION}). Upgrade the SDK.`);\n }\n let current: AnyVersionTemplate = structuredClone(input) as AnyVersionTemplate;\n const applied: Migration[] = [];\n let v = fromVersion;\n while (v < CURRENT_SCHEMA_VERSION) {\n const step = MIGRATIONS.find((m) => m.from === v);\n if (!step) throw new MigrationError(`No migration from schemaVersion ${v} to ${v + 1}`);\n current = step.migrate(current);\n current.schemaVersion = step.to;\n applied.push(step);\n v = step.to;\n }\n return { template: current as unknown as ReportTemplate, applied, fromVersion };\n}\n\nexport function needsMigration(input: { schemaVersion?: number }): boolean {\n return (input.schemaVersion ?? 0) < CURRENT_SCHEMA_VERSION;\n}\n","import type { Node, PageSettings, ReportTemplate, ConditionGroup, FlowOptions } from \"../types/template.js\";\nimport type { BlockStyle } from \"../types/style.js\";\nimport { CURRENT_SCHEMA_VERSION } from \"../types/template.js\";\nimport { defaultDocumentStyles } from \"../theme/default-theme.js\";\nimport { createId } from \"./ids.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport { resolveDefaultProps } from \"../registry/block-definition.js\";\n\nexport function defaultPageSettings(overrides: Partial<PageSettings> = {}): PageSettings {\n return {\n size: \"A4\",\n orientation: \"portrait\",\n margins: { top: 18, right: 18, bottom: 18, left: 18 },\n header: { height: 14, differentFirstPage: false },\n footer: { height: 12, differentFirstPage: false },\n ...overrides\n };\n}\n\nexport interface CreateTemplateOptions {\n id?: string;\n name?: string;\n page?: Partial<PageSettings>;\n locale?: string;\n currency?: string;\n /** Start with an empty first section. Default true. */\n withEmptySection?: boolean;\n}\n\n/** Creates a new, valid, empty template. */\nexport function createTemplate(opts: CreateTemplateOptions = {}): ReportTemplate {\n const now = new Date().toISOString();\n return {\n schemaVersion: CURRENT_SCHEMA_VERSION,\n id: opts.id ?? createId(\"tpl\"),\n name: opts.name ?? \"Untitled report\",\n meta: { createdAt: now, updatedAt: now },\n page: defaultPageSettings(opts.page),\n styles: defaultDocumentStyles(),\n header: { default: [] },\n footer: { default: [] },\n body: opts.withEmptySection === false ? [] : [createSection()],\n settings: { locale: opts.locale ?? \"en-GB\", currency: opts.currency ?? \"GBP\" }\n };\n}\n\nexport interface CreateNodeOptions {\n id?: string;\n props?: Record<string, unknown>;\n style?: BlockStyle;\n children?: Node[];\n flow?: FlowOptions;\n visibleWhen?: string | ConditionGroup;\n name?: string;\n}\n\n/** Creates a node of a registered block type with its default props. */\nexport function createNode(registry: BlockRegistry, type: string, opts: CreateNodeOptions = {}): Node {\n const def = registry.get(type);\n const props = { ...(def ? resolveDefaultProps(def) : {}), ...(opts.props ?? {}) };\n const node: Node = { id: opts.id ?? createId(), type, props };\n if (opts.style) node.style = opts.style;\n if (def?.container || opts.children) node.children = opts.children ?? [];\n if (opts.flow) node.flow = opts.flow;\n if (opts.visibleWhen !== undefined) node.visibleWhen = opts.visibleWhen;\n if (opts.name) node.name = opts.name;\n return node;\n}\n\nexport function createSection(opts: CreateNodeOptions = {}): Node {\n return { id: opts.id ?? createId(\"sec\"), type: \"section\", props: { padding: 0, ...(opts.props ?? {}) }, children: opts.children ?? [], ...(opts.style ? { style: opts.style } : {}), ...(opts.flow ? { flow: opts.flow } : {}), ...(opts.name ? { name: opts.name } : {}) };\n}\n\nexport function createColumn(span: number, children: Node[] = [], id?: string): Node {\n return { id: id ?? createId(\"col\"), type: \"column\", props: { span }, children };\n}\n\n/** Creates a row with the given twelfths layout, e.g. [6, 6] or [4, 8]. */\nexport function createRow(layout: number[], columns?: Node[][], opts: CreateNodeOptions = {}): Node {\n const total = layout.reduce((a, b) => a + b, 0);\n if (total !== 12) throw new Error(`Row layout must sum to 12, got ${total} from [${layout.join(\", \")}]`);\n return {\n id: opts.id ?? createId(\"row\"),\n type: \"row\",\n props: { layout, ...(opts.props ?? {}) },\n children: layout.map((span, i) => createColumn(span, columns?.[i] ?? [])),\n ...(opts.style ? { style: opts.style } : {}),\n ...(opts.flow ? { flow: opts.flow } : {}),\n ...(opts.name ? { name: opts.name } : {})\n };\n}\n\nexport const ROW_LAYOUTS: Array<{ id: string; label: string; layout: number[] }> = [\n { id: \"12\", label: \"Full width\", layout: [12] },\n { id: \"6-6\", label: \"Two columns\", layout: [6, 6] },\n { id: \"4-4-4\", label: \"Three columns\", layout: [4, 4, 4] },\n { id: \"3-3-3-3\", label: \"Four columns\", layout: [3, 3, 3, 3] },\n { id: \"8-4\", label: \"Wide left\", layout: [8, 4] },\n { id: \"4-8\", label: \"Wide right\", layout: [4, 8] },\n { id: \"9-3\", label: \"Sidebar right\", layout: [9, 3] },\n { id: \"3-9\", label: \"Sidebar left\", layout: [3, 9] }\n];\n\n/** Deep-clones a subtree assigning fresh ids (for duplicate/paste/library insert). */\nexport function cloneWithNewIds(node: Node): Node {\n const prefix = node.type === \"section\" ? \"sec\" : node.type === \"row\" ? \"row\" : node.type === \"column\" ? \"col\" : \"n\";\n return {\n ...structuredClone(node),\n id: createId(prefix),\n children: node.children?.map(cloneWithNewIds)\n };\n}\n","import type { DataSource, FieldSchema, ReportData } from \"../types/data.js\";\nimport type { PathSegment } from \"../expr/ast.js\";\nimport type { SchemaScope } from \"../expr/typecheck.js\";\nimport { resolvePathSchema } from \"../expr/typecheck.js\";\n\n/**\n * Synthesises plausible sample data from a schema. Used in design mode when the\n * host provides no sample data so tables, charts and KPIs still show something.\n */\nexport function synthesizeSampleData(sources: DataSource[], opts: { arrayLength?: number; now?: Date } = {}): ReportData {\n const out: ReportData = {};\n for (const s of sources) out[s.id] = synthesizeObject(s.schema, opts, 0);\n return out;\n}\n\nexport function synthesizeValue(schema: FieldSchema, opts: { arrayLength?: number; now?: Date } = {}, depth = 0, index = 0): unknown {\n if (schema.example !== undefined) return schema.example;\n if (schema.enum?.length) return schema.enum[index % schema.enum.length];\n const now = opts.now ?? new Date();\n switch (schema.type) {\n case \"string\":\n return schema.label ?? \"Sample text\";\n case \"number\":\n return [1240, 875, 2310, 1580, 990, 1870][index % 6];\n case \"currency\":\n return [125000, 48200.5, 231000, 15800, 99000, 187500][index % 6];\n case \"percent\":\n return [0.125, 0.082, 0.31, 0.058, 0.196, 0.229][index % 6];\n case \"date\":\n case \"datetime\": {\n const d = new Date(now);\n d.setMonth(d.getMonth() - index);\n return d.toISOString();\n }\n case \"boolean\":\n return index % 2 === 0;\n case \"image\":\n return undefined;\n case \"url\":\n return \"https://example.com\";\n case \"richtext\":\n return \"Sample rich text\";\n case \"object\":\n return depth > 6 ? {} : synthesizeObject(schema.fields ?? {}, opts, depth + 1);\n case \"array\": {\n const n = opts.arrayLength ?? 4;\n const item = schema.itemSchema ?? { type: \"string\" as const };\n return depth > 6 ? [] : Array.from({ length: n }, (_, i) => synthesizeValue(item, opts, depth + 1, i));\n }\n default:\n return undefined;\n }\n}\n\nfunction synthesizeObject(fields: Record<string, FieldSchema>, opts: { arrayLength?: number; now?: Date }, depth: number): Record<string, unknown> {\n const o: Record<string, unknown> = {};\n let i = 0;\n for (const [k, f] of Object.entries(fields)) o[k] = synthesizeValue(f, opts, depth, i++);\n return o;\n}\n\n/** Human label for a data path, e.g. \"Client › First name\". */\nexport function labelForPath(segments: PathSegment[], scope: SchemaScope): string {\n const parts: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i]!;\n if (seg.kind === \"index\") {\n parts[parts.length - 1] = `${parts[parts.length - 1] ?? \"\"} #${seg.index + 1}`;\n continue;\n }\n const r = resolvePathSchema(segments.slice(0, i + 1), scope);\n parts.push(r.schema?.label ?? humanizeKey(seg.name));\n }\n return parts.join(\" › \");\n}\n\nexport function humanizeKey(key: string): string {\n return key\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/^./, (c) => c.toUpperCase());\n}\n","import type { BindingInfo } from \"../registry/block-definition.js\";\nimport type { SchemaScope } from \"../expr/typecheck.js\";\nimport { typeCheckAst } from \"../expr/typecheck.js\";\nimport { parseExpression } from \"../expr/parser.js\";\nimport { collectPaths } from \"../expr/ast.js\";\nimport { labelForPath } from \"../data/sample.js\";\n\n/**\n * How an expression should be written where a person is going to read it:\n * `portfolio.allocation` as \"Portfolio › Asset allocation\", a piped value with\n * the filter named after it, a computed one marked with an ƒ.\n *\n * The canvas has always drawn its token chips this way. Sharing the same\n * function with the layer tree, the breadcrumb and the inspector is what stops\n * one part of the editor calling a thing \"Asset allocation\" while another calls\n * it \"portfolio.allocation\" — the raw path stays available as a tooltip, which\n * is the right place for it.\n */\nexport function describeExpression(expr: string, scope: SchemaScope): { label: string; type: BindingInfo[\"type\"] } {\n try {\n const ast = parseExpression(expr);\n const tc = typeCheckAst(ast, scope);\n const type = tc.issues.length ? \"unknown\" : (tc.type as BindingInfo[\"type\"]);\n const paths = collectPaths(ast);\n if (ast.kind === \"path\") return { label: labelForPath(ast.segments, scope), type };\n if (ast.kind === \"pipe\" && ast.input.kind === \"path\") return { label: `${labelForPath(ast.input.segments, scope)} · ${ast.name}`, type };\n // Anything computed — a conditional that omits an optional clause, a sum, a\n // fallback — is named after the fields it reads. Falling through to the raw\n // source printed `adviser.qualifications ? \", \" + adv…` into a chip on the\n // page, which is the expression's text and not its meaning.\n const names = [...new Set(paths.map((p) => labelForPath(p, scope)))];\n if (names.length === 1) return { label: `ƒ ${names[0]}`, type };\n if (names.length > 1) return { label: `ƒ ${names.slice(0, 2).join(\", \")}${names.length > 2 ? \"…\" : \"\"}`, type };\n return { label: expr, type };\n } catch {\n return { label: expr, type: \"unknown\" };\n }\n}\n\n/**\n * Rewrites the readable parts of a label written by a block: `{{ tokens }}` and\n * bare dotted paths become the names a person would use. Anything that does not\n * resolve is left exactly as it was, so an unknown path still shows itself\n * rather than turning into a guess.\n */\nexport function humaniseLabel(text: string, scope: SchemaScope): string {\n const described = (expr: string) => {\n const { label } = describeExpression(expr.trim(), scope);\n return label;\n };\n return text\n .replace(/\\{\\{([^}]+)\\}\\}/g, (_, expr: string) => described(expr))\n .replace(/\\b[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)+\\b/g, (path) => {\n const label = described(path);\n return label === path ? path : label;\n });\n}\n","import type { ReportTemplate, Node, FlowOptions } from \"../types/template.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { DataSource, ReportData, FieldSchema } from \"../types/data.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport { bindingSpecsFor } from \"../registry/registry.js\";\nimport type { BindingInfo, BindingSpec, BlockDefinition, RenderMode, ResolveHookContext } from \"../registry/block-definition.js\";\nimport { resolveDefaultProps } from \"../registry/block-definition.js\";\nimport { Scope, evaluate, evaluateCondition, splitTemplate, type EvalContext } from \"../expr/evaluate.js\";\nimport { toDisplayString } from \"../expr/format.js\";\nconst display = toDisplayString;\nimport type { FormatContext } from \"../expr/format.js\";\nimport { parseExpression, checkExpressionSyntax } from \"../expr/parser.js\";\nimport { collectPaths } from \"../expr/ast.js\";\nimport { SchemaScope, createSchemaScope, resolvePathSchema, typeCheckAst } from \"../expr/typecheck.js\";\nimport { compileCondition } from \"../expr/condition.js\";\nimport { resolveStyle } from \"../theme/resolve-style.js\";\nimport { mergeTheme } from \"../theme/tokens.js\";\nimport { isRichTextDoc, type RichTextDoc, type InlineNode, type Paragraph } from \"../richtext/model.js\";\nimport { synthesizeSampleData, synthesizeValue } from \"../data/sample.js\";\nimport { describeExpression } from \"./describe.js\";\nimport type { ResolvedDocument, ResolvedFlow, ResolvedNode, ResolvedRegion, ResolvedSegment } from \"./resolved.js\";\n\nexport interface ResolveOptions {\n template: ReportTemplate;\n registry: BlockRegistry;\n theme?: Partial<Theme>;\n dataSources?: DataSource[];\n /** Runtime data (preview / PDF). */\n data?: ReportData;\n /** Sample data used in design mode when `data` is absent. */\n sampleData?: ReportData;\n mode?: RenderMode;\n /** Fixed clock for deterministic output. */\n now?: Date;\n locale?: string;\n currency?: string;\n timeZone?: string;\n /** Iterations shown per repeater in design mode. */\n designIterations?: number;\n /** Hard cap on repeater iterations (safety). */\n maxIterations?: number;\n /** Whether per-block style overrides are honoured. */\n allowStyleOverrides?: boolean;\n /** Design mode: still show nodes whose condition is false (marked as hidden). */\n designShowHidden?: boolean;\n}\n\ninterface Ctx {\n registry: BlockRegistry;\n theme: Theme;\n template: ReportTemplate;\n mode: RenderMode;\n format: FormatContext;\n warnings: ResolvedDocument[\"warnings\"];\n designIterations: number;\n maxIterations: number;\n allowStyleOverrides: boolean;\n designShowHidden: boolean;\n dataSources: DataSource[];\n}\n\n/**\n * Resolves a template into a `ResolvedDocument`: evaluates every binding,\n * expands repeaters, decides conditionals and cascades styles.\n */\nexport function resolveTemplate(opts: ResolveOptions): ResolvedDocument {\n const mode: RenderMode = opts.mode ?? \"preview\";\n const theme = mergeTheme(opts.theme);\n const template = opts.template;\n const dataSources = opts.dataSources ?? [];\n const now = opts.now ?? new Date();\n const format: FormatContext = {\n locale: opts.locale ?? template.settings?.locale ?? \"en-GB\",\n currency: opts.currency ?? template.settings?.currency ?? \"GBP\",\n timeZone: opts.timeZone ?? template.settings?.timeZone,\n now\n };\n const warnings: ResolvedDocument[\"warnings\"] = [];\n\n let data: ReportData;\n if (mode === \"preview\") data = opts.data ?? opts.sampleData ?? {};\n else data = opts.data ?? opts.sampleData ?? synthesizeSampleData(dataSources, { now });\n if (mode === \"design\") {\n // Fill any sources the sample omitted so the canvas never shows holes.\n const synth = synthesizeSampleData(dataSources, { now });\n data = { ...synth, ...data };\n }\n\n const globals: Record<string, unknown> = {\n page: { number: 1, total: 1 },\n now,\n theme: { name: theme.name, logo: theme.logo, logoDark: theme.logoDark, colors: theme.colors, typography: theme.typography, meta: theme.meta ?? {} }\n };\n const scope = new Scope(globals).child(data);\n const schemaScope = createSchemaScope(dataSources);\n\n const ctx: Ctx = {\n registry: opts.registry,\n theme,\n template,\n mode,\n format,\n warnings,\n designIterations: Math.max(1, opts.designIterations ?? 1),\n maxIterations: opts.maxIterations ?? 5000,\n allowStyleOverrides: opts.allowStyleOverrides ?? true,\n designShowHidden: opts.designShowHidden ?? true,\n dataSources\n };\n\n const resolveList = (nodes: Node[] | undefined) => (nodes ?? []).flatMap((n) => resolveNode(ctx, n, scope, schemaScope, \"\", \"section\"));\n\n const header: ResolvedRegion = { default: resolveList(template.header?.default) };\n if (template.page.header.differentFirstPage) header.firstPage = resolveList(template.header?.firstPage);\n const footer: ResolvedRegion = { default: resolveList(template.footer?.default) };\n if (template.page.footer.differentFirstPage) footer.firstPage = resolveList(template.footer?.firstPage);\n\n return { body: resolveList(template.body), header, footer, warnings, mode };\n}\n\nfunction isPageDependent(expr: string): boolean {\n try {\n return collectPaths(parseExpression(expr)).some((p) => p[0]?.kind === \"prop\" && p[0].name === \"page\");\n } catch {\n return false;\n }\n}\n\nfunction evalCtx(ctx: Ctx, scope: Scope, nodeId: string): EvalContext {\n return {\n scope,\n format: ctx.format,\n onWarning: (message, expr) => ctx.warnings.push({ message, nodeId, expr })\n };\n}\n\nfunction safeEvaluate(ctx: Ctx, scope: Scope, nodeId: string, expr: string): unknown {\n try {\n return evaluate(expr, evalCtx(ctx, scope, nodeId));\n } catch (e) {\n ctx.warnings.push({ message: `Invalid expression: ${(e as Error).message}`, nodeId, expr });\n return undefined;\n }\n}\n\nconst labelFor = describeExpression;\n\nfunction resolveSegments(ctx: Ctx, scope: Scope, schemaScope: SchemaScope, nodeId: string, value: string): { segments: ResolvedSegment[]; text: string; pageDependent: boolean } {\n const segments: ResolvedSegment[] = [];\n let pageDependent = false;\n for (const s of splitTemplate(value)) {\n if (s.kind === \"text\") {\n segments.push(s);\n continue;\n }\n const expr = s.expr!;\n const { label } = labelFor(expr, schemaScope);\n if (isPageDependent(expr)) {\n pageDependent = true;\n segments.push({ ...s, label, deferred: true });\n continue;\n }\n const v = safeEvaluate(ctx, scope, nodeId, expr);\n segments.push({ ...s, label, value: display(v) });\n }\n const text = segments.map((s) => (s.kind === \"text\" ? s.text : s.value ?? \"\")).join(\"\");\n return { segments, text, pageDependent };\n}\n\nfunction resolveRichText(ctx: Ctx, scope: Scope, schemaScope: SchemaScope, nodeId: string, doc: RichTextDoc): { doc: RichTextDoc; pageDependent: boolean } {\n let pageDependent = false;\n const inline = (content: InlineNode[]): InlineNode[] =>\n content.map((n) => {\n if (n.type !== \"token\") {\n if (n.type === \"text\" && n.marks?.link?.includes(\"{{\")) {\n const r = resolveSegments(ctx, scope, schemaScope, nodeId, n.marks.link);\n return { ...n, marks: { ...n.marks, link: r.text } };\n }\n return n;\n }\n const { label } = labelFor(n.expr, schemaScope);\n if (isPageDependent(n.expr)) {\n pageDependent = true;\n return { ...n, label, deferred: true };\n }\n return { ...n, label, value: display(safeEvaluate(ctx, scope, nodeId, n.expr)) };\n });\n const para = (p: Paragraph): Paragraph => ({ ...p, content: inline(p.content) });\n const out: RichTextDoc = {\n type: \"doc\",\n content: doc.content.map((b) => (b.type === \"paragraph\" ? para(b) : { ...b, content: b.content.map((li) => ({ ...li, content: li.content.map(para) })) }))\n };\n return { doc: out, pageDependent };\n}\n\nfunction getPath(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const p of parts) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\nfunction setPath(obj: Record<string, unknown>, path: string, value: unknown) {\n const parts = path.split(\".\");\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const p = parts[i]!;\n if (typeof cur[p] !== \"object\" || cur[p] === null) cur[p] = {};\n cur = cur[p] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]!] = value;\n}\n\nfunction resolveFlow(def: BlockDefinition | undefined, node: Node, textStyleKeepWithNext: boolean | undefined): ResolvedFlow {\n const d: FlowOptions = def?.defaultFlow ?? {};\n const n: FlowOptions = node.flow ?? {};\n const isContainer = !!def?.container;\n const split = def?.split ?? (isContainer ? \"children\" : \"none\");\n return {\n breakBefore: n.breakBefore ?? d.breakBefore ?? \"auto\",\n breakAfter: n.breakAfter ?? d.breakAfter ?? \"auto\",\n keepTogether: n.keepTogether ?? d.keepTogether ?? false,\n keepWithNext: n.keepWithNext ?? d.keepWithNext ?? textStyleKeepWithNext ?? false,\n split,\n minOrphans: n.minOrphans ?? d.minOrphans ?? 2,\n minWidows: n.minWidows ?? d.minWidows ?? 2\n };\n}\n\nfunction roleOf(type: string): ResolvedNode[\"role\"] {\n return type === \"section\" || type === \"row\" || type === \"column\" ? type : \"block\";\n}\n\n/**\n * Resolves a single template node into zero or more resolved nodes (zero when\n * hidden by a condition in preview mode).\n */\nexport function resolveNode(ctx: Ctx, node: Node, scope: Scope, schemaScope: SchemaScope, keyPrefix: string, _parentRole: ResolvedNode[\"role\"]): ResolvedNode[] {\n const def = ctx.registry.get(node.type);\n const key = keyPrefix + node.id;\n const nodeId = node.id;\n\n // Visibility\n let hiddenByCondition = false;\n const cond = compileCondition(node.visibleWhen);\n if (cond) {\n const syntax = checkExpressionSyntax(cond);\n if (syntax) ctx.warnings.push({ message: `Invalid condition: ${syntax.message}`, nodeId, expr: cond });\n else {\n let visible = true;\n try {\n visible = evaluateCondition(cond, evalCtx(ctx, scope, nodeId));\n } catch (e) {\n ctx.warnings.push({ message: `Condition failed: ${(e as Error).message}`, nodeId, expr: cond });\n }\n if (!visible) {\n if (ctx.mode === \"preview\" || !ctx.designShowHidden) return [];\n hiddenByCondition = true;\n }\n }\n }\n\n if (!def) {\n ctx.warnings.push({ message: `Unknown block type \"${node.type}\"`, nodeId });\n return [\n {\n key,\n nodeId,\n type: node.type,\n role: roleOf(node.type),\n props: { ...node.props, __unknown: true },\n raw: node.props,\n style: resolveStyle({ theme: ctx.theme, styles: ctx.template.styles }),\n flow: resolveFlow(undefined, node, undefined),\n children: [],\n bindings: {},\n textSegments: {},\n richText: {},\n label: node.name ?? node.type,\n locked: node.locked\n }\n ];\n }\n\n const defaults = resolveDefaultProps(def);\n const raw: Record<string, unknown> = { ...defaults, ...node.props };\n const props: Record<string, unknown> = structuredClone(raw);\n const bindings: Record<string, BindingInfo> = {};\n const textSegments: Record<string, ResolvedSegment[]> = {};\n const richText: Record<string, RichTextDoc> = {};\n let pageDependent = false;\n\n const applySpec = (spec: BindingSpec, target: Record<string, unknown>, propPrefix: string) => {\n const propPath = propPrefix + spec.prop;\n const value = getPath(target, spec.prop);\n switch (spec.kind) {\n case \"value\": {\n if (typeof value !== \"string\" || value.trim() === \"\") return;\n const { label, type } = labelFor(value, schemaScope);\n bindings[propPath] = { prop: propPath, kind: \"value\", expr: value, label, type };\n if (isPageDependent(value)) {\n pageDependent = true;\n setPath(target, spec.prop, undefined);\n return;\n }\n setPath(target, spec.prop, safeEvaluate(ctx, scope, nodeId, value));\n return;\n }\n case \"collection\": {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n setPath(target, spec.prop, []);\n return;\n }\n const { label, type } = labelFor(value, schemaScope);\n bindings[propPath] = { prop: propPath, kind: \"collection\", expr: value, label, type };\n const v = safeEvaluate(ctx, scope, nodeId, value);\n setPath(target, spec.prop, Array.isArray(v) ? v : v === undefined || v === null ? [] : [v]);\n return;\n }\n case \"template\": {\n if (typeof value !== \"string\") return;\n if (!value.includes(\"{{\")) {\n textSegments[propPath] = [{ kind: \"text\", text: value }];\n return;\n }\n const r = resolveSegments(ctx, scope, schemaScope, nodeId, value);\n if (r.pageDependent) pageDependent = true;\n textSegments[propPath] = r.segments;\n const tokens = r.segments.filter((s) => s.kind === \"token\");\n if (tokens.length === 1 && r.segments.length === 1) {\n const { label, type } = labelFor(tokens[0]!.expr!, schemaScope);\n bindings[propPath] = { prop: propPath, kind: \"template\", expr: tokens[0]!.expr!, label, type };\n }\n setPath(target, spec.prop, r.text);\n return;\n }\n case \"richtext\": {\n if (!isRichTextDoc(value)) return;\n const r = resolveRichText(ctx, scope, schemaScope, nodeId, value);\n if (r.pageDependent) pageDependent = true;\n richText[propPath] = r.doc;\n return;\n }\n case \"condition\":\n case \"list\":\n return;\n }\n };\n\n for (const spec of bindingSpecsFor(def)) {\n if (spec.perItem) continue;\n if (spec.items) {\n const list = getPath(props, spec.prop);\n if (Array.isArray(list)) list.forEach((item, i) => item && typeof item === \"object\" && spec.items!.forEach((s) => !s.perItem && applySpec(s, item as Record<string, unknown>, `${spec.prop}.${i}.`)));\n continue;\n }\n applySpec(spec, props, \"\");\n }\n\n // Block-level resolve hook\n if (def.resolve) {\n const hookCtx: ResolveHookContext<Record<string, unknown>> = {\n props,\n node,\n scope,\n mode: ctx.mode,\n theme: ctx.theme,\n format: ctx.format,\n evaluate: (expr) => safeEvaluate(ctx, scope, nodeId, expr),\n evaluateIn: (expr, vars) => safeEvaluate(ctx, scope.child(vars), nodeId, expr),\n warn: (message) => ctx.warnings.push({ message, nodeId })\n };\n try {\n const out = def.resolve(hookCtx);\n if (out && typeof out === \"object\") Object.assign(props, out);\n } catch (e) {\n ctx.warnings.push({ message: `Block \"${def.name}\" failed to resolve: ${(e as Error).message}`, nodeId });\n }\n }\n\n // Style + flow\n const textStyleId = node.style?.textStyle ?? def.defaultTextStyle;\n const style = resolveStyle({\n theme: ctx.theme,\n styles: ctx.template.styles,\n textStyle: textStyleId,\n defaults: def.defaultStyle,\n overrides: node.style,\n allowOverrides: ctx.allowStyleOverrides\n });\n const textStyleDef = textStyleId ? ctx.template.styles.text[textStyleId] : undefined;\n const flow = resolveFlow(def, node, textStyleDef?.keepWithNext);\n\n // Children\n let children: ResolvedNode[] = [];\n let iterationInfo: ResolvedNode[\"iteration\"] | undefined;\n let placeholder = false;\n const c = def.container;\n if (c?.repeat) {\n const listValue = props[c.repeat.collectionProp];\n const alias = (props[c.repeat.aliasProp ?? \"alias\"] as string) || \"item\";\n const collectionExpr = raw[c.repeat.collectionProp];\n let items = Array.isArray(listValue) ? listValue : [];\n const limit = c.repeat.limitProp ? Number(props[c.repeat.limitProp]) || undefined : undefined;\n if (limit) items = items.slice(0, limit);\n if (items.length > ctx.maxIterations) {\n ctx.warnings.push({ message: `Repeater truncated to ${ctx.maxIterations} items`, nodeId });\n items = items.slice(0, ctx.maxIterations);\n }\n let itemSchema: FieldSchema | undefined;\n if (typeof collectionExpr === \"string\" && collectionExpr.trim()) {\n try {\n let ast = parseExpression(collectionExpr);\n while (ast.kind === \"pipe\") ast = ast.input;\n const r = ast.kind === \"path\" ? resolvePathSchema(ast.segments, schemaScope) : {};\n itemSchema = r.schema?.type === \"array\" ? r.schema.itemSchema : undefined;\n } catch {\n itemSchema = undefined;\n }\n }\n if (ctx.mode === \"design\") {\n if (items.length === 0) {\n items = itemSchema ? [synthesizeValue(itemSchema, { now: ctx.format.now }, 0, 0)] : [{}];\n placeholder = true;\n }\n items = items.slice(0, ctx.designIterations);\n }\n const keepItem = c.repeat.keepItemTogetherProp ? !!props[c.repeat.keepItemTogetherProp] : false;\n const count = items.length;\n const childSchemaScope = schemaScope.child({\n [alias]: itemSchema ?? { type: \"object\", label: alias, fields: {} },\n index: { type: \"number\", label: \"Index\" },\n first: { type: \"boolean\", label: \"Is first\" },\n last: { type: \"boolean\", label: \"Is last\" },\n count: { type: \"number\", label: \"Count\" }\n });\n children = items.map((item, index) => {\n const iterScope = scope.child({ [alias]: item, item, index: index + 1, first: index === 0, last: index === count - 1, count });\n const iterKey = `${key}@${index}`;\n const iterChildren = (node.children ?? []).flatMap((ch) => resolveNode(ctx, ch, iterScope, childSchemaScope, `${iterKey}/`, \"block\"));\n const iteration: ResolvedNode = {\n key: iterKey,\n nodeId,\n type: \"repeater-item\",\n role: \"block\",\n props: { index, count },\n raw: {},\n style: resolveStyle({ theme: ctx.theme, styles: ctx.template.styles }),\n flow: { breakBefore: \"auto\", breakAfter: \"auto\", keepTogether: keepItem, keepWithNext: false, split: \"children\", minOrphans: 1, minWidows: 1 },\n children: iterChildren,\n bindings: {},\n textSegments: {},\n richText: {},\n iteration: { index, count, alias },\n label: `${alias} ${index + 1}`\n };\n return iteration;\n });\n iterationInfo = undefined;\n props.__itemCount = Array.isArray(listValue) ? listValue.length : 0;\n } else if (c?.conditional) {\n const condValue = compileCondition(raw[c.conditional.conditionProp] as never);\n let show = true;\n if (condValue) {\n const syntax = checkExpressionSyntax(condValue);\n if (syntax) ctx.warnings.push({ message: `Invalid condition: ${syntax.message}`, nodeId, expr: condValue });\n else {\n try {\n show = evaluateCondition(condValue, evalCtx(ctx, scope, nodeId));\n } catch (e) {\n ctx.warnings.push({ message: `Condition failed: ${(e as Error).message}`, nodeId, expr: condValue });\n }\n }\n }\n props.__conditionResult = show;\n if (show || ctx.mode === \"design\") {\n children = (node.children ?? []).flatMap((ch) => resolveNode(ctx, ch, scope, schemaScope, keyPrefix, \"block\"));\n }\n } else if (c) {\n children = (node.children ?? []).flatMap((ch) => resolveNode(ctx, ch, scope, schemaScope, keyPrefix, roleOf(node.type)));\n }\n\n const resolved: ResolvedNode = {\n key,\n nodeId,\n type: node.type,\n role: roleOf(node.type),\n props,\n raw,\n style,\n flow,\n children,\n bindings,\n textSegments,\n richText,\n label: node.name ?? def.canvas?.label?.(props) ?? def.name,\n locked: node.locked,\n pageDependent: pageDependent || undefined,\n placeholder: placeholder || undefined,\n iteration: iterationInfo\n };\n if (hiddenByCondition) resolved.props.__hiddenByCondition = true;\n if (node.type === \"row\") {\n const layout = Array.isArray(props.layout) ? (props.layout as number[]) : children.map(() => 12 / Math.max(1, children.length));\n resolved.layout = { columns: layout };\n children.forEach((col, i) => {\n col.span = layout[i] ?? 12 / Math.max(1, children.length);\n });\n }\n return [resolved];\n}\n\n/** Convenience for tests and tooling: resolves and returns display text of an expression. */\nexport function evaluateToText(expr: string, data: ReportData, format?: Partial<FormatContext>): string {\n const scope = new Scope({ now: format?.now ?? new Date() }).child(data);\n return toDisplayString(\n evaluate(expr, {\n scope,\n format: { locale: \"en-GB\", currency: \"GBP\", ...format }\n })\n );\n}\n","import type { ResolvedStyle } from \"../types/style.js\";\nimport type { BindingInfo, SplitMode } from \"../registry/block-definition.js\";\nimport type { PageContext } from \"../types/data.js\";\nimport type { RichTextDoc } from \"../richtext/model.js\";\nimport type { TemplateSegment } from \"../expr/evaluate.js\";\n\nexport type ResolvedRole = \"section\" | \"row\" | \"column\" | \"block\";\n\nexport interface ResolvedFlow {\n breakBefore: \"auto\" | \"page\";\n breakAfter: \"auto\" | \"page\";\n keepTogether: boolean;\n keepWithNext: boolean;\n split: SplitMode;\n minOrphans: number;\n minWidows: number;\n}\n\n/**\n * A node after resolution: every expression evaluated, every repeater expanded,\n * every conditional decided, every style concrete. This is what the measurer,\n * paginator and renderers consume. It is plain data and fully serialisable\n * (which is how the PDF service receives it).\n */\nexport interface ResolvedNode {\n /** Unique instance key. Repeater iterations get `${nodeId}@${index}` suffixes. */\n key: string;\n /** Template node id this instance came from. */\n nodeId: string;\n type: string;\n role: ResolvedRole;\n /** Evaluated props (binding props replaced by their values). */\n props: Record<string, unknown>;\n /** Original template props (for design-mode chips and inline editing). */\n raw: Record<string, unknown>;\n style: ResolvedStyle;\n flow: ResolvedFlow;\n children: ResolvedNode[];\n bindings: Record<string, BindingInfo>;\n /** Interpolated `template` props as segments (design mode renders tokens as chips). */\n textSegments: Record<string, ResolvedSegment[]>;\n /** Resolved rich text props. */\n richText: Record<string, RichTextDoc>;\n /** For rows: column spans in twelfths. */\n layout?: { columns: number[] };\n /** For columns: span in twelfths. */\n span?: number;\n /** Repeater metadata for iterations. */\n iteration?: { index: number; count: number; alias: string };\n /** Human label for the layer tree / breadcrumbs. */\n label?: string;\n /** True in design mode for placeholder content (e.g. an empty repeater). */\n placeholder?: boolean;\n /** Node is locked in the editor. */\n locked?: boolean;\n /** True if any prop references `page.*` (rendered per page). */\n pageDependent?: boolean;\n}\n\nexport interface ResolvedSegment extends TemplateSegment {\n /** Evaluated value for tokens (undefined when page-dependent). */\n value?: string;\n /** Human label for the chip. */\n label?: string;\n /** Deferred: evaluated at render time with the page context. */\n deferred?: boolean;\n}\n\nexport interface ResolvedRegion {\n /** Sections for regular pages. */\n default: ResolvedNode[];\n /** Sections for the first page (only when differentFirstPage). */\n firstPage?: ResolvedNode[];\n}\n\nexport interface ResolvedDocument {\n body: ResolvedNode[];\n header: ResolvedRegion;\n footer: ResolvedRegion;\n /** Warnings collected during resolution (unknown fields, bad expressions...). */\n warnings: Array<{ message: string; nodeId?: string; expr?: string }>;\n mode: \"design\" | \"preview\";\n}\n\nexport const DEFAULT_PAGE_CONTEXT: PageContext = { number: 1, total: 1 };\n","import type { PageSettings, PageSize, PageSizeName } from \"../types/template.js\";\n\n/** CSS pixels per millimetre at 96 dpi. */\nexport const PX_PER_MM = 96 / 25.4;\n\nexport const PAGE_SIZES_MM: Record<PageSizeName, { width: number; height: number }> = {\n A3: { width: 297, height: 420 },\n A4: { width: 210, height: 297 },\n A5: { width: 148, height: 210 },\n Letter: { width: 215.9, height: 279.4 },\n Legal: { width: 215.9, height: 355.6 },\n Tabloid: { width: 279.4, height: 431.8 }\n};\n\nexport function mmToPx(mm: number): number {\n return Math.round(mm * PX_PER_MM * 100) / 100;\n}\n\nexport function pxToMm(px: number): number {\n return Math.round((px / PX_PER_MM) * 100) / 100;\n}\n\nexport function pageSizeMm(size: PageSize): { width: number; height: number } {\n return typeof size === \"string\" ? PAGE_SIZES_MM[size] ?? PAGE_SIZES_MM.A4 : size;\n}\n\n/** Concrete page geometry in CSS px. */\nexport interface PageGeometry {\n width: number;\n height: number;\n margins: { top: number; right: number; bottom: number; left: number };\n headerHeight: number;\n footerHeight: number;\n /** Width of the content column (page width minus horizontal margins). */\n contentWidth: number;\n /** Height available for body content on a regular page. */\n contentHeight: number;\n /** Y offset of the body content box from the page top. */\n contentTop: number;\n /** Y offset of the header region from the page top. */\n headerTop: number;\n /** Y offset of the footer region from the page top. */\n footerTop: number;\n}\n\nexport function computePageGeometry(page: PageSettings): PageGeometry {\n const size = pageSizeMm(page.size);\n const portrait = page.orientation !== \"landscape\";\n const width = mmToPx(portrait ? size.width : size.height);\n const height = mmToPx(portrait ? size.height : size.width);\n const margins = {\n top: mmToPx(page.margins.top),\n right: mmToPx(page.margins.right),\n bottom: mmToPx(page.margins.bottom),\n left: mmToPx(page.margins.left)\n };\n const headerHeight = mmToPx(Math.max(0, page.header.height));\n const footerHeight = mmToPx(Math.max(0, page.footer.height));\n const contentTop = margins.top + headerHeight;\n const footerTop = height - margins.bottom - footerHeight;\n return {\n width,\n height,\n margins,\n headerHeight,\n footerHeight,\n contentWidth: Math.max(0, width - margins.left - margins.right),\n contentHeight: Math.max(0, footerTop - contentTop),\n contentTop,\n headerTop: margins.top,\n footerTop\n };\n}\n","import type { ResolvedDocument, ResolvedNode } from \"../resolve/resolved.js\";\nimport type { GeometryMap, NodeGeometry, SectionGeometry } from \"./geometry.js\";\nimport type { PageGeometry } from \"./page-geometry.js\";\n\n/* ------------------------------------------------------------------ */\n/* Output model */\n/* ------------------------------------------------------------------ */\n\nexport interface RepeatedHeader {\n tableKey: string;\n height: number;\n left: number;\n width: number;\n}\n\n/**\n * A clip window over a section's full render, placed on a page.\n * `[from, to)` are y coordinates in the section's own coordinate space.\n */\nexport interface PageFragment {\n sectionKey: string;\n from: number;\n to: number;\n /** Table headers to repeat above the clipped content (tables cut at `from`). */\n repeatHeaders: RepeatedHeader[];\n /** Y position of the fragment within the page content box. */\n y: number;\n /** Rendered height: (to - from) + repeated header heights. */\n height: number;\n /** True when this fragment continues a section started on an earlier page. */\n continued: boolean;\n /** True when the section continues on a later page. */\n continues: boolean;\n}\n\nexport interface Page {\n index: number;\n number: number;\n fragments: PageFragment[];\n /** Whether page 1 variants of header/footer apply. */\n first: boolean;\n}\n\nexport interface LayoutWarning {\n code: \"forced-split\" | \"region-overflow\" | \"oversized-header\" | \"empty-document\" | \"no-op-break\";\n message: string;\n nodeId?: string;\n sectionKey?: string;\n page?: number;\n}\n\nexport interface PagedDocument {\n pages: Page[];\n totalPages: number;\n geometry: PageGeometry;\n warnings: LayoutWarning[];\n}\n\nexport interface PaginateOptions {\n document: ResolvedDocument;\n geometry: GeometryMap;\n page: PageGeometry;\n /** Show at least this many pages (design canvas). */\n minPages?: number;\n /** Geometry for header/footer sections (for overflow warnings). */\n regionGeometry?: GeometryMap;\n}\n\n/* ------------------------------------------------------------------ */\n/* Break finding */\n/* ------------------------------------------------------------------ */\n\ninterface BreakCtx {\n geom: SectionGeometry;\n pageHeight: number;\n}\n\nfunction g(ctx: BreakCtx, node: ResolvedNode): NodeGeometry {\n return ctx.geom.nodes[node.key] ?? { top: 0, height: 0, left: 0, width: 0 };\n}\n\nconst EPS = 0.01;\n\n/**\n * Largest valid break position y with minY < y <= limit inside a list of\n * siblings, or null if none exists.\n */\nexport function bestBreak(ctx: BreakCtx, list: ResolvedNode[], limit: number, minY: number): number | null {\n // Keep-with-next means \"stay with the next thing the reader can see\". A\n // sibling that draws nothing — a conditional whose rule is false, an empty\n // repeater — must not satisfy it, or a heading is left stranded at the foot\n // of a page while its content starts the next one.\n const visible = (from: number, step: -1 | 1): ResolvedNode | undefined => {\n for (let j = from; j >= 0 && j < list.length; j += step) {\n const s = list[j]!;\n if (g(ctx, s).height > EPS) return s;\n }\n return undefined;\n };\n\n for (let i = list.length - 1; i >= 0; i--) {\n const child = list[i]!;\n const cg = g(ctx, child);\n const top = cg.top;\n const bottom = cg.top + cg.height;\n if (top > limit + EPS) continue;\n // A child that draws nothing is not a break site of its own: breaking after\n // it is the same as breaking before the next visible child, and letting it\n // offer a break here would strand the heading it sits behind.\n if (cg.height <= EPS) continue;\n\n const next = visible(i + 1, 1);\n if (bottom > limit + EPS) {\n // Child straddles the limit: try to split it. A break at the child's very\n // top is really a break *before* it and must respect keep-with-next below.\n const inner = breakInside(ctx, child, limit, minY);\n if (inner !== null && inner > minY + EPS && inner > top + EPS) return inner;\n } else {\n // Child ends above the limit: break after it (keep the gap on this page).\n const candidate = next ? Math.min(g(ctx, next).top, limit) : Math.min(bottom, limit);\n const blocked = child.flow.keepWithNext && !!next;\n if (!blocked && candidate > minY + EPS) return candidate;\n if (!blocked) return null;\n }\n\n // Break before this child.\n const prev = visible(i - 1, -1);\n const prevBlocks = !!prev && prev.flow.keepWithNext;\n if (!prevBlocks && top > minY + EPS) return top;\n if (!prevBlocks) return null;\n // Previous sibling insists on staying with us: keep walking back so the\n // break lands before it (or inside it if it is splittable).\n }\n return null;\n}\n\nfunction breakInside(ctx: BreakCtx, node: ResolvedNode, limit: number, minY: number): number | null {\n const ng = g(ctx, node);\n const fitsOnFreshPage = ng.height <= ctx.pageHeight + EPS;\n if (node.flow.keepTogether && fitsOnFreshPage) return null;\n\n if (node.role === \"row\" && node.children.length > 1) {\n const allowSplit = node.props.allowSplit === true;\n if (!allowSplit && fitsOnFreshPage) return null;\n return columnsAgree(ctx, node.children, limit, minY);\n }\n\n switch (node.flow.split) {\n case \"none\":\n return null;\n case \"lines\": {\n const lines = ng.lines;\n if (!lines || lines.length < 2) return null;\n const minOrphans = Math.max(1, node.flow.minOrphans);\n const minWidows = Math.max(1, node.flow.minWidows);\n for (let i = lines.length - 2; i >= 0; i--) {\n const y = lines[i]!;\n if (y > limit + EPS) continue;\n const before = i + 1;\n const after = lines.length - before;\n if (before < minOrphans) return null;\n if (after < minWidows) continue;\n return y > minY + EPS ? y : null;\n }\n return null;\n }\n case \"rows\": {\n const rows = ng.rows;\n if (!rows || rows.length === 0) return null;\n const body = rows.filter((r) => r.kind === \"body\");\n if (body.length < 2) return null;\n const minOrphans = Math.max(1, node.flow.minOrphans);\n const minWidows = Math.max(1, node.flow.minWidows);\n for (let i = body.length - 2; i >= 0; i--) {\n const r = body[i]!;\n const y = r.top + r.height;\n if (y > limit + EPS) continue;\n const before = i + 1;\n const after = body.length - before;\n if (before < minOrphans) return null;\n if (after < minWidows) continue;\n return y > minY + EPS ? y : null;\n }\n return null;\n }\n case \"children\":\n return bestBreak(ctx, node.children, limit, minY);\n }\n}\n\n/** Finds a y that is a valid break in every column simultaneously. */\nfunction columnsAgree(ctx: BreakCtx, columns: ResolvedNode[], limit: number, minY: number): number | null {\n let y = limit;\n for (let iter = 0; iter < 64; iter++) {\n let yNext = y;\n for (const col of columns) {\n const kids = col.children;\n if (kids.length === 0) continue;\n const first = g(ctx, kids[0]!).top;\n const lastG = g(ctx, kids[kids.length - 1]!);\n const last = lastG.top + lastG.height;\n if (y <= first + EPS || y >= last - EPS) continue;\n const b = bestBreak(ctx, kids, y, minY);\n if (b === null) return null;\n if (b < yNext) yNext = b;\n }\n if (Math.abs(yNext - y) < EPS) return y > minY + EPS ? y : null;\n y = yNext;\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Section helpers */\n/* ------------------------------------------------------------------ */\n\nfunction collectTables(node: ResolvedNode, out: ResolvedNode[] = []): ResolvedNode[] {\n if (node.flow.split === \"rows\") out.push(node);\n for (const c of node.children) collectTables(c, out);\n return out;\n}\n\nfunction repeatedHeadersAt(geom: SectionGeometry, tables: ResolvedNode[], from: number): RepeatedHeader[] {\n const out: RepeatedHeader[] = [];\n for (const t of tables) {\n const tg = geom.nodes[t.key];\n if (!tg?.rows) continue;\n const headerRows = tg.rows.filter((r) => r.kind === \"header\");\n if (headerRows.length === 0) continue;\n const bottom = tg.top + tg.height;\n if (tg.top < from - EPS && from < bottom - EPS) {\n const height = headerRows.reduce((a, r) => a + r.height, 0);\n out.push({ tableKey: t.key, height, left: tg.left, width: tg.width });\n }\n }\n return out;\n}\n\n/**\n * Offsets inside a section at which a page break was explicitly asked for.\n *\n * A \"page break\" block, or any block whose flow says `breakBefore`/`breakAfter:\n * \"page\"`, is an instruction rather than a preference: unlike keep-together it\n * is never traded away to make content fit. Section-level breaks are handled by\n * the page loop; these are the ones nested inside a section's own content.\n */\ninterface ForcedBreaks {\n /** Offsets strictly inside the section's content, where it must be split. */\n inside: number[];\n /** A break before the first thing in the section: it starts a page. */\n atStart: boolean;\n /** A break after the last thing in the section: what follows starts a page. */\n atEnd: boolean;\n}\n\nfunction forcedBreaks(section: ResolvedNode, geom: SectionGeometry): ForcedBreaks {\n const offsets = new Set<number>();\n let contentTop = Number.POSITIVE_INFINITY;\n let contentBottom = 0;\n const visit = (n: ResolvedNode) => {\n const g = geom.nodes[n.key];\n if (g) {\n if (n.flow.breakBefore === \"page\") offsets.add(g.top);\n if (n.flow.breakAfter === \"page\") offsets.add(g.top + g.height);\n }\n n.children.forEach(visit);\n };\n for (const child of section.children) {\n const g = geom.nodes[child.key];\n if (g) {\n contentTop = Math.min(contentTop, g.top);\n contentBottom = Math.max(contentBottom, g.top + g.height);\n }\n visit(child);\n }\n if (!Number.isFinite(contentTop)) contentTop = 0;\n\n // A break at either edge of the content is not a split — it is a statement\n // about the section itself, the same thing `breakBefore`/`breakAfter` says.\n // Measured against the content rather than the section box, so a section's\n // own padding does not turn the break into a page of whitespace.\n return {\n inside: [...offsets].filter((y) => y > contentTop + EPS && y < contentBottom - EPS).sort((a, b) => a - b),\n atStart: [...offsets].some((y) => y <= contentTop + EPS),\n atEnd: [...offsets].some((y) => y >= contentBottom - EPS)\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Pagination */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pure, deterministic pagination. Given resolved sections and their measured\n * geometry, assigns clip-window fragments to pages.\n */\nexport function paginate(opts: PaginateOptions): PagedDocument {\n const { document, geometry, page } = opts;\n const pageHeight = page.contentHeight;\n const warnings: LayoutWarning[] = [];\n const pages: Page[] = [];\n\n let current: Page = { index: 0, number: 1, fragments: [], first: true };\n let y = 0;\n let pendingBreak = false;\n\n const newPage = () => {\n pages.push(current);\n current = { index: pages.length, number: pages.length + 1, fragments: [], first: false };\n y = 0;\n pendingBreak = false;\n };\n\n for (const section of document.body) {\n const geom = geometry[section.key];\n if (!geom) {\n warnings.push({ code: \"forced-split\", message: \"Section was not measured\", sectionKey: section.key, nodeId: section.nodeId });\n continue;\n }\n const H = geom.height;\n const ctx: BreakCtx = { geom, pageHeight };\n const tables = collectTables(section);\n const forced = forcedBreaks(section, geom);\n const contentBottom = section.children.reduce((m, c) => {\n const cg = geom.nodes[c.key];\n return cg ? Math.max(m, cg.top + cg.height) : m;\n }, 0);\n\n if ((pendingBreak || section.flow.breakBefore === \"page\" || forced.atStart) && y > 0) newPage();\n if (section.flow.keepTogether && H > pageHeight - y + EPS && H <= pageHeight + EPS && y > 0) newPage();\n\n if (H <= EPS) {\n // Empty section: still occupies nothing but keeps its order.\n continue;\n }\n\n let from = 0;\n let guard = 0;\n while (from < H - EPS) {\n if (++guard > 10_000) {\n warnings.push({ code: \"forced-split\", message: \"Pagination aborted after too many fragments\", sectionKey: section.key, nodeId: section.nodeId });\n break;\n }\n const avail = pageHeight - y;\n const headers = repeatedHeadersAt(geom, tables, from);\n const extra = headers.reduce((a, h) => a + h.height, 0);\n // This pass may not run past an explicit break, whatever else would fit.\n const stop = forced.inside.find((f) => f > from + EPS) ?? H;\n const lastPass = stop >= H - EPS;\n const remaining = stop - from;\n\n if (remaining + extra <= avail + EPS) {\n current.fragments.push({ sectionKey: section.key, from, to: stop, repeatHeaders: headers, y, height: remaining + extra, continued: from > 0, continues: !lastPass });\n y += remaining + extra;\n from = stop;\n if (lastPass) break;\n newPage();\n continue;\n }\n\n const limit = Math.min(from + avail - extra, stop);\n let to: number | null = null;\n if (limit > from + EPS) {\n // Section-level keep rules are handled above; break inside the section body.\n to = section.flow.split === \"children\" ? bestBreak(ctx, section.children, limit, from) : null;\n if (to !== null && to <= from + EPS) to = null;\n if (to !== null && to > limit + EPS) to = null;\n // Only trailing section padding remains: absorb it rather than orphaning whitespace.\n if (lastPass && to !== null && to >= contentBottom - EPS) {\n current.fragments.push({ sectionKey: section.key, from, to: H, repeatHeaders: headers, y, height: Math.min(H - from + extra, avail), continued: from > 0, continues: false });\n y += Math.min(H - from + extra, avail);\n from = H;\n break;\n }\n }\n\n if (to === null) {\n if (y > 0 || current.fragments.length > 0) {\n // Nothing fits in the remaining space: start a fresh page and try again.\n newPage();\n continue;\n }\n // Fresh page and still no valid break: force a raw clip so we always progress.\n if (limit <= from + EPS) {\n warnings.push({ code: \"oversized-header\", message: \"A repeated table header is taller than the page\", sectionKey: section.key, nodeId: section.nodeId, page: current.number });\n to = Math.min(H, from + Math.max(1, pageHeight));\n } else {\n to = Math.min(H, limit);\n warnings.push({ code: \"forced-split\", message: \"Content taller than a page had to be cut at an arbitrary position\", sectionKey: section.key, nodeId: section.nodeId, page: current.number });\n }\n }\n\n current.fragments.push({ sectionKey: section.key, from, to, repeatHeaders: headers, y, height: to - from + extra, continued: from > 0, continues: true });\n from = to;\n newPage();\n }\n\n if (section.flow.breakAfter === \"page\" || forced.atEnd) pendingBreak = true;\n }\n\n pages.push(current);\n\n // Trim a trailing empty page created by a final break/newPage.\n while (pages.length > 1 && pages[pages.length - 1]!.fragments.length === 0) pages.pop();\n // A break after the last content has nothing to push onto a new page, and a\n // report that ends on a blank page looks broken. Say so rather than doing\n // nothing silently, which reads as the break being ignored.\n if (pendingBreak) {\n warnings.push({ code: \"no-op-break\", message: \"A page break after the last content has nothing to move to a new page\", page: pages.length });\n }\n\n const minPages = Math.max(1, opts.minPages ?? 1);\n while (pages.length < minPages) pages.push({ index: pages.length, number: pages.length + 1, fragments: [], first: pages.length === 0 });\n\n if (document.body.length === 0) warnings.push({ code: \"empty-document\", message: \"The document has no content\" });\n\n // Region overflow warnings\n if (opts.regionGeometry) {\n const check = (sections: ResolvedNode[] | undefined, limit: number, region: string) => {\n if (!sections) return;\n const total = sections.reduce((a, s) => a + (opts.regionGeometry![s.key]?.height ?? 0), 0);\n if (total > limit + 0.5) warnings.push({ code: \"region-overflow\", message: `${region} content (${Math.round(total)}px) is taller than the ${region.toLowerCase()} region (${Math.round(limit)}px) and will be clipped` });\n };\n check(document.header.default, page.headerHeight, \"Header\");\n check(document.header.firstPage, page.headerHeight, \"First-page header\");\n check(document.footer.default, page.footerHeight, \"Footer\");\n check(document.footer.firstPage, page.footerHeight, \"First-page footer\");\n }\n\n return { pages, totalPages: pages.length, geometry: page, warnings };\n}\n","export type IssueSeverity = \"error\" | \"warning\" | \"info\";\n\nexport type IssueCode =\n | \"schema-invalid\"\n | \"unknown-block\"\n | \"license-required\"\n | \"unknown-binding\"\n | \"invalid-expression\"\n | \"type-mismatch\"\n | \"invalid-condition\"\n | \"missing-collection\"\n | \"missing-required\"\n | \"missing-theme-token\"\n | \"missing-theme-value\"\n | \"unsupported-font\"\n | \"invalid-url\"\n | \"invalid-image\"\n | \"empty-content\"\n | \"empty-value\"\n | \"region-overflow\"\n | \"layout-invalid\"\n | \"scope-shadowing\"\n | \"custom\";\n\n/**\n * Which question an issue answers.\n *\n * `template` issues are defects in the design itself: they are true for every\n * client the report is ever run for, and the designer has to fix them.\n * `output` issues are true only of the data in front of you — a field this\n * particular client has not filled in. Both matter, but conflating them makes\n * the first kind unfindable and the second kind look like the designer's fault.\n */\nexport type IssueSource = \"template\" | \"output\";\n\nexport interface Issue {\n severity: IssueSeverity;\n code: IssueCode;\n message: string;\n /** Defaults to \"template\". */\n source?: IssueSource;\n /** Node id the issue belongs to, when applicable. */\n nodeId?: string;\n /** Prop path on that node. */\n prop?: string;\n /** Region: body, header, footer, library. */\n region?: \"body\" | \"header\" | \"footer\" | \"library\" | \"document\";\n /** Optional machine-readable detail. */\n detail?: Record<string, unknown>;\n}\n\nexport function issue(severity: IssueSeverity, code: IssueCode, message: string, extra: Partial<Issue> = {}): Issue {\n return { severity, code, message, ...extra };\n}\n","import type { ReportTemplate, Node } from \"../types/template.js\";\nimport type { DataSource, FieldSchema } from \"../types/data.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport { bindingSpecsFor } from \"../registry/registry.js\";\nimport type { BindingSpec, ValidateContext } from \"../registry/block-definition.js\";\nimport { createSchemaScope, resolvePathSchema, typeCheck, SchemaScope } from \"../expr/typecheck.js\";\nimport { parseExpression } from \"../expr/parser.js\";\nimport { compileCondition } from \"../expr/condition.js\";\nimport { extractTemplateTokens, isRichTextDoc, richTextTokens } from \"../richtext/model.js\";\nimport { isTokenRef, missingThemeValues, resolveToken, mergeTheme } from \"../theme/tokens.js\";\nimport { parseTemplate } from \"../schema/template.schema.js\";\nimport { issue, type Issue } from \"./issues.js\";\nimport type { RegionId } from \"../editor/tree.js\";\nimport { computePageGeometry } from \"../layout/page-geometry.js\";\n\nexport interface ValidateOptions {\n template: ReportTemplate;\n registry: BlockRegistry;\n dataSources?: DataSource[];\n theme?: Partial<Theme>;\n /** Font families the host guarantees are available (theme fonts are added automatically). */\n availableFonts?: string[];\n /** Skip the JSON shape check (already parsed). */\n skipSchema?: boolean;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n issues: Issue[];\n errors: Issue[];\n warnings: Issue[];\n}\n\n/**\n * Statically analyses a template against a registry, data schemas and a theme.\n * Runs without data and without a DOM, so it can be used server-side before\n * accepting a template for storage.\n */\nexport function validateTemplate(opts: ValidateOptions): ValidationResult {\n const issues: Issue[] = [];\n const { template, registry } = opts;\n const dataSources = opts.dataSources ?? [];\n const theme = mergeTheme(opts.theme);\n\n if (!opts.skipSchema) {\n const parsed = parseTemplate(template);\n for (const e of parsed.errors) issues.push(issue(\"error\", \"schema-invalid\", `${e.path}: ${e.message}`, { region: \"document\" }));\n }\n\n if (opts.theme) for (const m of missingThemeValues(opts.theme)) issues.push(issue(\"warning\", \"missing-theme-value\", `Theme \"${opts.theme.name ?? opts.theme.id ?? \"\"}\" has no value for ${m}; the default is used`, { region: \"document\" }));\n\n const rootScope = createSchemaScope(dataSources);\n const sourceIds = new Set(dataSources.map((s) => s.id));\n for (const id of template.settings?.dataSources ?? []) if (!sourceIds.has(id)) issues.push(issue(\"warning\", \"unknown-binding\", `Template was designed against data source \"${id}\" which is not provided`, { region: \"document\" }));\n\n const fonts = new Set<string>([...(opts.availableFonts ?? []), ...(theme.fonts ?? []).map((f) => f.family), ...splitFonts(theme.typography.headingFont), ...splitFonts(theme.typography.bodyFont), ...splitFonts(theme.typography.monoFont ?? \"\")]);\n const checkFont = (value: string | undefined, where: Partial<Issue>) => {\n if (!value || isTokenRef(value) || !opts.availableFonts) return;\n const families = splitFonts(value);\n if (!families.some((f) => fonts.has(f) || GENERIC_FONTS.has(f.toLowerCase()))) issues.push(issue(\"warning\", \"unsupported-font\", `Font \"${value}\" is not available; the theme body font will be used`, where));\n };\n const checkColor = (value: string | undefined, where: Partial<Issue>) => {\n if (!value || !isTokenRef(value)) return;\n if (resolveToken(value, theme) === undefined) issues.push(issue(\"warning\", \"missing-theme-token\", `Theme token \"${value}\" does not exist`, where));\n };\n\n for (const [id, ts] of Object.entries(template.styles.text)) {\n checkFont(ts.fontFamily, { region: \"document\", prop: `styles.text.${id}.fontFamily` });\n checkColor(ts.color, { region: \"document\", prop: `styles.text.${id}.color` });\n }\n\n const geometry = computePageGeometry(template.page);\n if (geometry.contentHeight < 100) issues.push(issue(\"error\", \"layout-invalid\", \"Page margins, header and footer leave less than 100px for content\", { region: \"document\" }));\n if (geometry.contentWidth < 100) issues.push(issue(\"error\", \"layout-invalid\", \"Page margins leave less than 100px of width for content\", { region: \"document\" }));\n\n const regionOf = (r: RegionId): Issue[\"region\"] => (r === \"body\" ? \"body\" : r.startsWith(\"header\") ? \"header\" : \"footer\");\n\n const visitNode = (node: Node, region: RegionId, parent: Node | null, scope: SchemaScope) => {\n const where: Partial<Issue> = { nodeId: node.id, region: regionOf(region) };\n const def = registry.get(node.type);\n if (!def) {\n issues.push(issue(\"error\", \"unknown-block\", `Block type \"${node.type}\" is not registered${node.type.includes(\".\") ? \" (custom block unavailable)\" : \"\"}`, where));\n return;\n }\n if (!registry.isTierEnabled(def.license)) issues.push(issue(\"warning\", \"license-required\", `\"${def.name}\" requires the ${def.license} tier`, where));\n\n if (parent) {\n if (!registry.accepts(parent.type, node.type)) issues.push(issue(\"error\", \"layout-invalid\", `\"${def.name}\" cannot be placed inside \"${registry.get(parent.type)?.name ?? parent.type}\"`, where));\n } else if (node.type !== \"section\") issues.push(issue(\"error\", \"layout-invalid\", `Top-level nodes must be sections, found \"${node.type}\"`, where));\n\n if (node.type === \"row\") {\n const layout = node.props.layout as number[] | undefined;\n const total = (layout ?? []).reduce((a, b) => a + b, 0);\n if (!layout || total !== 12) issues.push(issue(\"error\", \"layout-invalid\", `Row layout must sum to 12 (got ${total})`, where));\n else if ((node.children?.length ?? 0) !== layout.length) issues.push(issue(\"error\", \"layout-invalid\", `Row has ${node.children?.length ?? 0} columns but a ${layout.length}-column layout`, where));\n }\n\n if (node.style) {\n checkFont(node.style.fontFamily, { ...where, prop: \"style.fontFamily\" });\n checkColor(node.style.color, { ...where, prop: \"style.color\" });\n checkColor(node.style.background, { ...where, prop: \"style.background\" });\n checkColor(node.style.border?.color, { ...where, prop: \"style.border.color\" });\n if (node.style.textStyle && !template.styles.text[node.style.textStyle]) issues.push(issue(\"warning\", \"missing-theme-token\", `Text style \"${node.style.textStyle}\" is not defined in the document styles`, { ...where, prop: \"style.textStyle\" }));\n }\n\n const cond = compileCondition(node.visibleWhen);\n if (cond) checkExpr(cond, \"visibleWhen\", \"condition\");\n\n const props = { ...(typeof def.defaultProps === \"function\" ? def.defaultProps() : def.defaultProps), ...node.props } as Record<string, unknown>;\n\n function checkExpr(expr: string, prop: string, kind: BindingSpec[\"kind\"], s: SchemaScope = scope, expected?: FieldSchema[\"type\"] | FieldSchema[\"type\"][]): Issue[] {\n const out: Issue[] = [];\n const r = typeCheck(expr, s);\n for (const i of r.issues) {\n const code = i.code === \"syntax\" ? \"invalid-expression\" : i.code === \"type-mismatch\" ? \"type-mismatch\" : \"unknown-binding\";\n out.push(issue(i.code === \"syntax\" ? \"error\" : \"warning\", kind === \"condition\" && code !== \"unknown-binding\" ? \"invalid-condition\" : code, `${i.message} in \"${expr}\"`, { ...where, prop }));\n }\n if (kind === \"collection\" && r.issues.length === 0 && r.type !== \"array\" && r.type !== \"any\" && r.type !== \"unknown\") out.push(issue(\"error\", \"missing-collection\", `\"${expr}\" is a ${r.type}, not a list`, { ...where, prop }));\n if (expected && r.issues.length === 0 && r.type !== \"unknown\" && r.type !== \"any\" && r.type !== \"null\") {\n const list = Array.isArray(expected) ? expected : [expected];\n const numeric = [\"number\", \"currency\", \"percent\"];\n const compatible = list.includes(r.type as FieldSchema[\"type\"]) || (list.some((t) => numeric.includes(t)) && numeric.includes(r.type)) || (list.includes(\"string\") && r.type !== \"array\" && r.type !== \"object\");\n if (!compatible) out.push(issue(\"warning\", \"type-mismatch\", `\"${expr}\" is a ${r.type}; expected ${list.join(\" or \")}`, { ...where, prop }));\n }\n issues.push(...out);\n return out;\n }\n\n const runSpec = (spec: BindingSpec, target: Record<string, unknown>, prefix: string, s: SchemaScope) => {\n const value = getPath(target, spec.prop);\n const prop = prefix + spec.prop;\n switch (spec.kind) {\n case \"value\":\n if (typeof value === \"string\" && value.trim()) checkExpr(value, prop, \"value\", s, spec.valueType);\n break;\n case \"collection\":\n if (typeof value === \"string\" && value.trim()) checkExpr(value, prop, \"collection\", s);\n else if (def.container?.repeat?.collectionProp === spec.prop) issues.push(issue(\"warning\", \"missing-collection\", `\"${def.name}\" has no list to repeat over`, { ...where, prop }));\n else if (def.type === \"table\" || def.type === \"chart\") issues.push(issue(\"warning\", \"missing-collection\", `\"${def.name}\" is not bound to a list`, { ...where, prop }));\n break;\n case \"template\":\n if (typeof value === \"string\") for (const e of extractTemplateTokens(value)) checkExpr(e, prop, \"value\", s);\n break;\n case \"richtext\":\n if (isRichTextDoc(value)) for (const e of richTextTokens(value)) checkExpr(e, prop, \"value\", s);\n break;\n case \"condition\": {\n const c = compileCondition(value as never);\n if (c) checkExpr(c, prop, \"condition\", s);\n break;\n }\n case \"list\":\n break;\n }\n };\n\n // Scope for scoped bindings (per-item expressions such as table columns)\n let itemScope = scope;\n let childScope = scope;\n const specs = bindingSpecsFor(def);\n // Establish the item scope from collection specs first so per-item bindings can use it regardless of declaration order.\n for (const spec of specs) {\n if (spec.kind !== \"collection\") continue;\n const collectionExpr = props[spec.prop];\n const itemSchema = typeof collectionExpr === \"string\" && collectionExpr.trim() ? itemSchemaOf(collectionExpr, scope) : undefined;\n const alias = (spec.alias && (props[spec.alias] as string)) || \"item\";\n if (dataSources.some((d) => d.id === alias)) issues.push(issue(\"warning\", \"scope-shadowing\", `Repeater alias \"${alias}\" hides the data source with the same name`, where));\n const vars: Record<string, FieldSchema> = {\n [alias]: itemSchema ?? { type: \"object\", label: alias, fields: {} },\n item: itemSchema ?? { type: \"object\", label: \"Item\", fields: {} },\n row: itemSchema ?? { type: \"object\", label: \"Row\", fields: {} },\n index: { type: \"number\" },\n first: { type: \"boolean\" },\n last: { type: \"boolean\" },\n count: { type: \"number\" }\n };\n itemScope = scope.child(vars);\n if (def.container?.repeat?.collectionProp === spec.prop) childScope = itemScope;\n }\n for (const spec of specs) {\n if (spec.perItem) {\n runSpec(spec, props, \"\", itemScope);\n continue;\n }\n if (spec.items) {\n const list = getPath(props, spec.prop);\n if (Array.isArray(list)) list.forEach((item, i) => item && typeof item === \"object\" && spec.items!.forEach((sub) => runSpec(sub, item as Record<string, unknown>, `${spec.prop}.${i}.`, sub.perItem ? itemScope : scope)));\n continue;\n }\n runSpec(spec, props, \"\", scope);\n if (spec.kind === \"collection\") for (const sub of spec.scoped ?? []) runSpec(sub, props, \"\", itemScope);\n }\n if (def.validate) {\n const vctx: ValidateContext<Record<string, unknown>> = {\n props,\n node,\n schemaScope: itemScope,\n dataSources,\n theme,\n checkExpression: (expr, prop) => checkExpr(expr, prop, \"value\", itemScope)\n };\n try {\n const extra = def.validate(vctx);\n for (const i of extra) issues.push({ ...i, nodeId: i.nodeId ?? node.id, region: i.region ?? where.region });\n } catch (e) {\n issues.push(issue(\"warning\", \"custom\", `Validation for \"${def.name}\" failed: ${(e as Error).message}`, where));\n }\n }\n\n for (const child of node.children ?? []) visitNode(child, region, node, childScope);\n };\n\n const visitRegion = (nodes: Node[], region: RegionId) => nodes.forEach((n) => visitNode(n, region, null, rootScope));\n visitRegion(template.body, \"body\");\n visitRegion(template.header.default, \"header\");\n visitRegion(template.header.firstPage ?? [], \"header:first\");\n visitRegion(template.footer.default, \"footer\");\n visitRegion(template.footer.firstPage ?? [], \"footer:first\");\n\n if (template.body.every((s) => (s.children?.length ?? 0) === 0)) issues.push(issue(\"info\", \"empty-content\", \"The document has no content yet\", { region: \"body\" }));\n\n const errors = issues.filter((i) => i.severity === \"error\");\n const warnings = issues.filter((i) => i.severity === \"warning\");\n return { ok: errors.length === 0, issues, errors, warnings };\n}\n\nconst GENERIC_FONTS = new Set([\"serif\", \"sans-serif\", \"monospace\", \"system-ui\", \"ui-sans-serif\", \"ui-serif\", \"ui-monospace\", \"cursive\", \"fantasy\", \"inherit\"]);\n\nfunction splitFonts(value: string): string[] {\n return value\n .split(\",\")\n .map((f) => f.trim().replace(/^['\"]|['\"]$/g, \"\"))\n .filter(Boolean);\n}\n\nfunction getPath(obj: Record<string, unknown>, path: string): unknown {\n let cur: unknown = obj;\n for (const p of path.split(\".\")) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\nexport function itemSchemaOf(collectionExpr: string, scope: SchemaScope): FieldSchema | undefined {\n try {\n const ast = parseExpression(collectionExpr);\n const base = ast.kind === \"pipe\" ? unwrapPipes(ast) : ast;\n if (base.kind !== \"path\") return undefined;\n const r = resolvePathSchema(base.segments, scope);\n return r.schema?.type === \"array\" ? r.schema.itemSchema : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction unwrapPipes(e: import(\"../expr/ast.js\").Expr): import(\"../expr/ast.js\").Expr {\n let cur = e;\n while (cur.kind === \"pipe\") cur = cur.input;\n return cur;\n}\n\n/** URL safety check shared by validation and renderers. */\nexport function isSafeUrl(url: string | undefined, opts: { allowData?: boolean } = {}): boolean {\n if (!url) return false;\n const u = url.trim();\n if (/^https?:\\/\\//i.test(u)) return true;\n if (/^mailto:/i.test(u)) return true;\n if (u.startsWith(\"/\") && !u.startsWith(\"//\")) return true;\n if (u.startsWith(\"./\") || u.startsWith(\"../\")) return true;\n if (opts.allowData && /^data:image\\/(png|jpe?g|gif|webp|svg\\+xml)[;,]/i.test(u)) {\n // Only SVG is markup, and only markup can carry script: a PNG or a JPEG is\n // decoded by the image pipeline and never parsed as a document. Returning\n // here also keeps the scan off the large payloads, which are always raster.\n if (!/^data:image\\/svg\\+xml/i.test(u)) return true;\n\n const comma = u.indexOf(\",\");\n const payload = comma === -1 ? \"\" : u.slice(comma + 1);\n let decoded: string;\n if (/;base64/i.test(u.slice(0, comma === -1 ? u.length : comma))) {\n // This branch used to be missing, and it is the one that matters:\n // `FileReader.readAsDataURL` — how every uploaded file arrives — always\n // produces base64, so scanning the undecoded text found nothing and a\n // scripted SVG was declared safe. The percent-encoded form was rejected\n // correctly all along, which is what made it easy to miss.\n decoded = decodeBase64(payload);\n } else {\n try {\n decoded = decodeURIComponent(payload);\n } catch {\n decoded = payload;\n }\n }\n // Deliberately the whole payload, not a prefix. A cap only decides how far\n // into the file an attacker has to put the script.\n return !/<script|javascript:|on[a-z]+\\s*=|<foreignObject/i.test(decoded);\n }\n return false;\n}\n\n/** Base64 to text, in whichever runtime this is: browsers, workers and Node all differ. */\nfunction decodeBase64(value: string): string {\n const b64 = value.trim();\n try {\n const g = globalThis as { atob?: (s: string) => string; Buffer?: { from(s: string, enc: string): { toString(enc: string): string } } };\n if (typeof g.atob === \"function\") return g.atob(b64);\n if (g.Buffer) return g.Buffer.from(b64, \"base64\").toString(\"utf8\");\n } catch {\n /* malformed base64 falls through */\n }\n // Undecodable means unverifiable, and an image that cannot be checked is not\n // one to declare safe.\n return \"<script\";\n}\n","import type { BlockRegistry } from \"../registry/registry.js\";\nimport type { ResolvedDocument, ResolvedNode } from \"../resolve/resolved.js\";\nimport type { InlineNode, RichTextDoc } from \"../richtext/model.js\";\nimport type { Expr } from \"../expr/ast.js\";\nimport { parseExpression } from \"../expr/parser.js\";\nimport { issue, type Issue } from \"./issues.js\";\n\nexport interface OutputCheckOptions {\n /** A document resolved in preview mode against the data you intend to ship. */\n resolved: ResolvedDocument;\n registry: BlockRegistry;\n /** Names the data set in the messages, e.g. \"Edge case\". */\n dataLabel?: string;\n /** Cap on issues returned, so a broken data set cannot flood the UI. */\n limit?: number;\n}\n\n/**\n * Reports what this particular data set does to the report: fields that come out\n * blank, blocks that render nothing, sections with no content at all.\n *\n * This is deliberately separate from `validateTemplate`, which asks whether the\n * design is sound and never looks at data. A template can be perfectly valid and\n * still produce \"Values as at .\" for a client whose review has no end date, and\n * only one of those two checks can ever tell you so.\n *\n * Three things it does not complain about, because complaining would train\n * people to ignore it:\n *\n * - Content hidden by a false condition. A preview resolution has already\n * dropped those nodes, so they cannot be reached from here at all.\n * - An expression that already handles the empty case — a `default:` fallback\n * or a conditional. Warning about those would be warning about the fix.\n * - Zero, false and empty-but-intended lists. `0` is a value; a table with an\n * empty message is a designed outcome, not an accident.\n * - Page-dependent tokens, which have no value until the paginator runs.\n */\nexport function checkOutput(opts: OutputCheckOptions): Issue[] {\n const { resolved, registry } = opts;\n const limit = opts.limit ?? 60;\n const out: Issue[] = [];\n const seen = new Set<string>();\n const suffix = opts.dataLabel ? ` in “${opts.dataLabel}”` : \" in this data set\";\n\n const push = (i: Issue) => {\n const key = `${i.nodeId ?? \"\"}|${i.prop ?? \"\"}|${i.message}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push(i);\n };\n\n // A document nobody has put anything in yet is not a data problem. The\n // structural pass already greets it with \"The document has no content yet\";\n // warning again, once per empty section and once per sample set, tells the\n // designer twice over about the blank page they are looking at.\n const blankDocument = resolved.body.every((s) => s.children.length === 0);\n\n const regions: Array<[ResolvedNode[], Issue[\"region\"]]> = [\n [resolved.body, \"body\"],\n [resolved.header.default, \"header\"],\n [resolved.header.firstPage ?? [], \"header\"],\n [resolved.footer.default, \"footer\"],\n [resolved.footer.firstPage ?? [], \"footer\"]\n ];\n\n for (const [nodes, region] of regions) for (const n of nodes) visit(n, region);\n\n return out.slice(0, limit);\n\n function visit(node: ResolvedNode, region: Issue[\"region\"]) {\n // Repeater iterations all come from one template node; reporting the first\n // is enough to get the designer to the block, and `seen` collapses the rest.\n if (!node.placeholder) inspect(node, region);\n for (const c of node.children) visit(c, region);\n }\n\n function inspect(node: ResolvedNode, region: Issue[\"region\"]) {\n const def = registry.get(node.type);\n const name = node.label || def?.name || node.type;\n const where = { nodeId: node.nodeId, region, source: \"output\" as const };\n\n // 1. A whole prop bound to a single field that came back with nothing.\n for (const [prop, b] of Object.entries(node.bindings)) {\n if (b.kind !== \"value\" && b.kind !== \"template\") continue;\n if (node.textSegments[prop]?.some((s) => s.deferred)) continue;\n if (handlesEmpty(b.expr)) continue;\n const value = getPath(node.props, prop);\n if (!isBlank(value)) continue;\n // Say what is actually missing. One empty optional field — a signature\n // block with no qualifications line, a KPI with no caption — is a gap in\n // the block, not the block coming out blank, and reporting it as the\n // latter sends the designer looking for a problem that is not there. The\n // block is only blank when this field was all it had to draw.\n const blank = !drawsWithout(node, prop);\n push(\n issue(\n \"warning\",\n \"empty-value\",\n blank ? `“${b.label}” has no value${suffix}, so ${name} renders blank` : `“${b.label}” has no value${suffix} and is left out of ${name}`,\n { ...where, prop }\n )\n );\n }\n\n // 2. A token inside a sentence, where the sentence survives and the value\n // does not. This is what produces \"Values as at .\" and \"contact X on or\".\n for (const [prop, segments] of Object.entries(node.textSegments)) {\n if (node.bindings[prop]) continue; // already reported whole, above\n for (const s of segments) {\n if (s.kind !== \"token\" || s.deferred || !s.expr) continue;\n if (s.value === undefined || !isBlank(s.value)) continue;\n if (handlesEmpty(s.expr)) continue;\n push(issue(\"warning\", \"empty-value\", `“${s.label ?? short(s.expr)}” is empty${suffix}, leaving a gap in ${name}`, { ...where, prop }));\n }\n }\n\n // 3. The same, for tokens inside rich text.\n for (const [prop, doc] of Object.entries(node.richText)) {\n for (const inline of inlinesOf(doc)) {\n if (inline.type !== \"token\" || inline.deferred) continue;\n if (inline.value === undefined || !isBlank(inline.value)) continue;\n if (handlesEmpty(inline.expr)) continue;\n push(issue(\"warning\", \"empty-value\", `“${inline.label ?? short(inline.expr)}” is empty${suffix}, leaving a gap in ${name}`, { ...where, prop }));\n }\n }\n\n // 4. A block that carries text and ends up with none of it. Only where it\n // has no children: a card with an empty title and three paragraphs in it\n // is a card with an empty title, not an empty card.\n if (node.children.length === 0 && !hasOwnContent(node) && carriesText(node)) {\n push(issue(\"warning\", \"empty-content\", `${name} renders nothing${suffix}`, where));\n }\n\n // 5. A section that contains nothing a reader would see. Worth its own\n // message because the heading it should have had is missing too.\n if (node.role === \"section\" && !blankDocument && !subtreeHasContent(node)) {\n push(issue(\"warning\", \"empty-content\", `Section “${name}” has no visible content${suffix}`, where));\n }\n }\n\n /**\n * Text this node renders itself, ignoring its children. `skip` leaves one\n * prop out, which is how a missing field is told apart from a blank block.\n */\n function ownText(node: ResolvedNode, skip?: string): string {\n let text = \"\";\n for (const [prop, segments] of Object.entries(node.textSegments)) {\n if (prop === skip) continue;\n for (const s of segments) text += s.kind === \"text\" ? s.text : s.deferred ? \"1\" : s.value ?? \"\";\n }\n for (const [prop, doc] of Object.entries(node.richText)) {\n if (prop === skip) continue;\n // Tokens count as the value they resolved to, not as their expression:\n // the question is what the reader ends up seeing.\n for (const inline of inlinesOf(doc)) text += inline.type === \"token\" ? (inline.deferred ? \"1\" : inline.value ?? \"\") : inline.type === \"text\" ? inline.text : \"\";\n }\n for (const [prop, b] of Object.entries(node.bindings)) {\n if (prop === skip) continue;\n if (b.kind === \"value\") text += String(getPath(node.props, prop) ?? \"\");\n else if (b.kind === \"collection\") {\n const v = getPath(node.props, prop);\n if (Array.isArray(v) && v.length) text += \"1\";\n }\n }\n return text.trim();\n }\n\n /** Does this block still draw something with `prop` left out of it? */\n function drawsWithout(node: ResolvedNode, prop: string): boolean {\n if (ownText(node, prop) !== \"\") return true;\n // Anything the block draws that is not words counts too: a signature block\n // is still a signature block with a rule and a date on it.\n return node.children.some(subtreeHasContent) || staticProps(node, prop);\n }\n\n /**\n * Props a block draws that are not bound to data — a fixed label, a caption\n * typed by the designer. They are not in `textSegments` once they carry no\n * token, so the plain prop values are what says the block is not empty.\n */\n function staticProps(node: ResolvedNode, skip: string): boolean {\n for (const [prop, value] of Object.entries(node.props)) {\n if (prop === skip || prop.startsWith(\"__\")) continue;\n if (node.bindings[prop]) continue;\n if (typeof value === \"string\" && value.trim() !== \"\") return true;\n }\n return false;\n }\n\n function hasOwnContent(node: ResolvedNode): boolean {\n return ownText(node) !== \"\";\n }\n\n /** Does this block have any prop whose whole job is to carry words? */\n function carriesText(node: ResolvedNode): boolean {\n return Object.keys(node.textSegments).length > 0 || Object.keys(node.richText).length > 0;\n }\n\n function subtreeHasContent(node: ResolvedNode): boolean {\n if (DECORATION.has(node.type)) return false;\n const def = registry.get(node.type);\n // Charts and images say something without saying words.\n if (def?.category === \"visualisation\" && !DECORATION.has(node.type)) return true;\n if (node.type === \"image\" || node.type === \"logo\" || node.type === \"signature\") return true;\n if (hasOwnContent(node)) return true;\n return node.children.some(subtreeHasContent);\n }\n}\n\n/** Every inline node in a rich text document, paragraphs and list items alike. */\nfunction inlinesOf(doc: RichTextDoc): InlineNode[] {\n const out: InlineNode[] = [];\n for (const block of doc.content) {\n const paras = block.type === \"paragraph\" ? [block] : block.content.flatMap((li) => li.content);\n for (const p of paras) out.push(...p.content);\n }\n return out;\n}\n\n/** Blocks that occupy space without carrying information. */\nconst DECORATION = new Set([\"spacer\", \"divider\", \"pageBreak\"]);\n\n/**\n * Whether an expression has already dealt with the value being missing.\n *\n * `{{ periodEnd ? \"as at \" + periodEnd : \"\" }}` evaluating to nothing is the\n * author's intent, not a hole; so is a `default:` fallback. Reporting those\n * would mean the check fires precisely when someone has fixed the problem,\n * which is the fastest way to teach people to ignore a panel.\n */\nfunction handlesEmpty(expr: string): boolean {\n try {\n return guards(parseExpression(expr));\n } catch {\n return false;\n }\n}\n\nfunction guards(node: Expr): boolean {\n switch (node.kind) {\n case \"conditional\":\n return true;\n case \"pipe\":\n return node.name === \"default\" || guards(node.input);\n case \"binary\":\n // `a or b` and `a and b` are the same intent written shorter.\n return node.op === \"or\" || node.op === \"and\" || guards(node.left) || guards(node.right);\n case \"call\":\n return node.name === \"coalesce\" || node.name === \"default\";\n default:\n return false;\n }\n}\n\n/** Expressions belong in a tooltip, not mid-sentence; keep the message readable. */\nfunction short(expr: string): string {\n return expr.length > 48 ? `${expr.slice(0, 47)}…` : expr;\n}\n\n/** Empty means absent or blank — never `0` and never `false`. */\nfunction isBlank(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n return false;\n}\n\nfunction getPath(obj: Record<string, unknown>, path: string): unknown {\n let cur: unknown = obj;\n for (const p of path.split(\".\")) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n","import type { Node, ReportTemplate } from \"../types/template.js\";\n\nexport type RegionId = \"body\" | \"header\" | \"header:first\" | \"footer\" | \"footer:first\";\nexport const REGION_IDS: RegionId[] = [\"body\", \"header\", \"header:first\", \"footer\", \"footer:first\"];\n\nexport function getRegion(template: ReportTemplate, region: RegionId): Node[] {\n switch (region) {\n case \"body\":\n return template.body;\n case \"header\":\n return template.header.default;\n case \"header:first\":\n return (template.header.firstPage ??= []);\n case \"footer\":\n return template.footer.default;\n case \"footer:first\":\n return (template.footer.firstPage ??= []);\n }\n}\n\nexport function readRegion(template: ReportTemplate, region: RegionId): Node[] {\n switch (region) {\n case \"body\":\n return template.body;\n case \"header\":\n return template.header.default;\n case \"header:first\":\n return template.header.firstPage ?? [];\n case \"footer\":\n return template.footer.default;\n case \"footer:first\":\n return template.footer.firstPage ?? [];\n }\n}\n\nexport interface NodeLocation {\n region: RegionId;\n /** Index path from the region root to the node. */\n path: number[];\n}\n\nexport interface NodeEntry {\n node: Node;\n parent: Node | null;\n region: RegionId;\n path: number[];\n depth: number;\n index: number;\n}\n\nexport type NodeIndex = Map<string, NodeEntry>;\n\n/** Builds an id → entry index over the whole template. */\nexport function indexTemplate(template: ReportTemplate): NodeIndex {\n const index: NodeIndex = new Map();\n const visit = (nodes: Node[], parent: Node | null, region: RegionId, path: number[]) => {\n nodes.forEach((node, i) => {\n const p = [...path, i];\n index.set(node.id, { node, parent, region, path: p, depth: p.length - 1, index: i });\n if (node.children) visit(node.children, node, region, p);\n });\n };\n for (const r of REGION_IDS) visit(readRegion(template, r), null, r, []);\n return index;\n}\n\nexport function findNode(template: ReportTemplate, id: string): NodeEntry | undefined {\n return indexTemplate(template).get(id);\n}\n\n/** Returns the list that contains the node at `location` and the node's index in it. */\nexport function listAt(template: ReportTemplate, location: NodeLocation): { list: Node[]; index: number } {\n let list = getRegion(template, location.region);\n for (let i = 0; i < location.path.length - 1; i++) {\n const n = list[location.path[i]!];\n if (!n) throw new Error(\"Invalid node path\");\n n.children ??= [];\n list = n.children;\n }\n return { list, index: location.path[location.path.length - 1] ?? 0 };\n}\n\nexport function nodeAt(template: ReportTemplate, location: NodeLocation): Node | undefined {\n const { list, index } = listAt(template, location);\n return list[index];\n}\n\n/** Ancestor chain from the region root down to (and including) the node. */\nexport function ancestors(index: NodeIndex, id: string): NodeEntry[] {\n const chain: NodeEntry[] = [];\n let cur = index.get(id);\n while (cur) {\n chain.unshift(cur);\n cur = cur.parent ? index.get(cur.parent.id) : undefined;\n }\n return chain;\n}\n\nexport function isDescendant(index: NodeIndex, ancestorId: string, id: string): boolean {\n let cur = index.get(id);\n while (cur?.parent) {\n if (cur.parent.id === ancestorId) return true;\n cur = index.get(cur.parent.id);\n }\n return false;\n}\n\n/** Depth-first walk over every node in the template. */\nexport function walkTemplate(template: ReportTemplate, visit: (node: Node, region: RegionId, parent: Node | null) => void): void {\n const rec = (nodes: Node[], region: RegionId, parent: Node | null) => {\n for (const n of nodes) {\n visit(n, region, parent);\n if (n.children) rec(n.children, region, n);\n }\n };\n for (const r of REGION_IDS) rec(readRegion(template, r), r, null);\n}\n\nexport function countNodes(template: ReportTemplate): number {\n let n = 0;\n walkTemplate(template, () => n++);\n return n;\n}\n\n/** Collects all block types used in the template. */\nexport function usedBlockTypes(template: ReportTemplate): Set<string> {\n const s = new Set<string>();\n walkTemplate(template, (n) => s.add(n.type));\n return s;\n}\n","import { current, isDraft, type Draft } from \"immer\";\nimport type { ReportTemplate, Node, PageSettings, DocumentStyles, TextStyle, Condition, FlowOptions, LibraryItem } from \"../types/template.js\";\nimport type { BlockStyle } from \"../types/style.js\";\nimport { getRegion, indexTemplate, listAt, type NodeLocation, type RegionId } from \"./tree.js\";\nimport { cloneWithNewIds, createColumn } from \"../schema/create.js\";\nimport { createId } from \"../schema/ids.js\";\n\n/**\n * Commands are plain data. Each is applied by a reducer that mutates an immer\n * draft; immer turns the mutation into immutable structural sharing + patches.\n */\nexport type Command =\n | { type: \"insertNode\"; node: Node; at: NodeLocation }\n | { type: \"insertNodes\"; nodes: Node[]; at: NodeLocation }\n | { type: \"removeNodes\"; ids: string[] }\n | { type: \"moveNode\"; id: string; to: NodeLocation }\n | { type: \"duplicateNode\"; id: string; newId?: string }\n | { type: \"setProps\"; id: string; patch: Record<string, unknown> }\n | { type: \"setProp\"; id: string; path: string; value: unknown }\n | { type: \"setStyle\"; id: string; patch: BlockStyle | null }\n | { type: \"setFlow\"; id: string; patch: FlowOptions }\n | { type: \"setVisibleWhen\"; id: string; condition: Condition | undefined }\n | { type: \"setName\"; id: string; name: string | undefined }\n | { type: \"setLocked\"; id: string; locked: boolean }\n | { type: \"setRowLayout\"; id: string; layout: number[] }\n | { type: \"wrapNodes\"; ids: string[]; wrapper: Node }\n | { type: \"replaceNode\"; id: string; node: Node }\n | { type: \"setPage\"; patch: Partial<PageSettings> }\n | { type: \"setDocumentStyles\"; patch: Partial<DocumentStyles> }\n | { type: \"setTextStyle\"; id: string; patch: TextStyle | null }\n | { type: \"setTemplateName\"; name: string }\n | { type: \"setSettings\"; patch: NonNullable<ReportTemplate[\"settings\"]> }\n | { type: \"setRegionFirstPage\"; region: \"header\" | \"footer\"; enabled: boolean }\n | { type: \"addLibraryItem\"; item: LibraryItem }\n | { type: \"removeLibraryItem\"; id: string }\n | { type: \"replaceTemplate\"; template: ReportTemplate };\n\nexport class CommandError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CommandError\";\n }\n}\n\nfunction setDeep(obj: Record<string, unknown>, path: string, value: unknown) {\n const parts = path.split(\".\");\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const p = parts[i]!;\n const next = cur[p];\n if (Array.isArray(next)) cur = next as unknown as Record<string, unknown>;\n else if (next && typeof next === \"object\") cur = next as Record<string, unknown>;\n else {\n cur[p] = {};\n cur = cur[p] as Record<string, unknown>;\n }\n }\n const last = parts[parts.length - 1]!;\n if (value === undefined) delete cur[last];\n else cur[last] = value;\n}\n\n/** Applies a command to a template draft. Throws `CommandError` for invalid operations. */\nexport function applyCommand(draft: Draft<ReportTemplate>, cmd: Command): void {\n const t = draft as ReportTemplate;\n switch (cmd.type) {\n case \"insertNode\": {\n const { list, index } = listAt(t, cmd.at);\n list.splice(Math.min(index, list.length), 0, cmd.node);\n return;\n }\n case \"insertNodes\": {\n const { list, index } = listAt(t, cmd.at);\n list.splice(Math.min(index, list.length), 0, ...cmd.nodes);\n return;\n }\n case \"removeNodes\": {\n const index = indexTemplate(t);\n // Remove deepest-first so parent removals do not invalidate indices.\n const entries = cmd.ids.map((id) => index.get(id)).filter((e): e is NonNullable<typeof e> => !!e);\n entries.sort((a, b) => b.depth - a.depth || b.index - a.index);\n for (const e of entries) {\n const list = e.parent ? (e.parent.children ??= []) : getRegion(t, e.region);\n const i = list.findIndex((n) => n.id === e.node.id);\n if (i >= 0) list.splice(i, 1);\n }\n return;\n }\n case \"moveNode\": {\n const index = indexTemplate(t);\n const entry = index.get(cmd.id);\n if (!entry) throw new CommandError(`Node ${cmd.id} not found`);\n // Refuse to move a node into its own subtree.\n const target = listAt(t, cmd.to);\n let probe: Node | undefined = target.list === entry.node.children ? entry.node : undefined;\n if (probe) throw new CommandError(\"Cannot move a node inside itself\");\n const containerPath = cmd.to.path.slice(0, -1);\n let cur = getRegion(t, cmd.to.region);\n for (const i of containerPath) {\n const n: Node | undefined = cur[i];\n if (!n) break;\n if (n.id === cmd.id) throw new CommandError(\"Cannot move a node inside itself\");\n cur = n.children ?? [];\n }\n void probe;\n const sourceList = entry.parent ? (entry.parent.children ??= []) : getRegion(t, entry.region);\n const sourceIndex = sourceList.indexOf(entry.node);\n const [node] = sourceList.splice(sourceIndex, 1);\n const dest = listAt(t, cmd.to);\n let destIndex = dest.index;\n if (dest.list === sourceList && sourceIndex < destIndex) destIndex--;\n dest.list.splice(Math.min(destIndex, dest.list.length), 0, node!);\n return;\n }\n case \"duplicateNode\": {\n const index = indexTemplate(t);\n const entry = index.get(cmd.id);\n if (!entry) throw new CommandError(`Node ${cmd.id} not found`);\n const list = entry.parent ? (entry.parent.children ??= []) : getRegion(t, entry.region);\n const copy = cloneWithNewIds(isDraft(entry.node) ? current(entry.node) : entry.node);\n if (cmd.newId) copy.id = cmd.newId;\n list.splice(entry.index + 1, 0, copy);\n return;\n }\n case \"setProps\": {\n const n = requireNode(t, cmd.id);\n for (const [k, v] of Object.entries(cmd.patch)) {\n if (v === undefined) delete n.props[k];\n else n.props[k] = v;\n }\n return;\n }\n case \"setProp\": {\n const n = requireNode(t, cmd.id);\n setDeep(n.props, cmd.path, cmd.value);\n return;\n }\n case \"setStyle\": {\n const n = requireNode(t, cmd.id);\n if (cmd.patch === null) {\n delete n.style;\n return;\n }\n n.style ??= {};\n mergeStyle(n.style, cmd.patch);\n if (Object.keys(n.style).length === 0) delete n.style;\n return;\n }\n case \"setFlow\": {\n const n = requireNode(t, cmd.id);\n n.flow = { ...(n.flow ?? {}), ...cmd.patch };\n for (const k of Object.keys(n.flow) as Array<keyof FlowOptions>) if (n.flow[k] === undefined) delete n.flow[k];\n if (Object.keys(n.flow).length === 0) delete n.flow;\n return;\n }\n case \"setVisibleWhen\": {\n const n = requireNode(t, cmd.id);\n if (cmd.condition === undefined || cmd.condition === \"\") delete n.visibleWhen;\n else n.visibleWhen = cmd.condition;\n return;\n }\n case \"setName\": {\n const n = requireNode(t, cmd.id);\n if (cmd.name) n.name = cmd.name;\n else delete n.name;\n return;\n }\n case \"setLocked\": {\n const n = requireNode(t, cmd.id);\n if (cmd.locked) n.locked = true;\n else delete n.locked;\n return;\n }\n case \"setRowLayout\": {\n const row = requireNode(t, cmd.id);\n if (row.type !== \"row\") throw new CommandError(\"setRowLayout requires a row\");\n const total = cmd.layout.reduce((a, b) => a + b, 0);\n if (total !== 12) throw new CommandError(\"Row layout must sum to 12\");\n row.children ??= [];\n const columns = row.children;\n // Shrink: move orphaned children into the last surviving column.\n while (columns.length > cmd.layout.length) {\n const removed = columns.pop()!;\n const target = columns[columns.length - 1]!;\n target.children ??= [];\n target.children.push(...(removed.children ?? []));\n }\n while (columns.length < cmd.layout.length) columns.push(createColumn(cmd.layout[columns.length]!));\n columns.forEach((c, i) => {\n c.props.span = cmd.layout[i]!;\n });\n row.props.layout = [...cmd.layout];\n return;\n }\n case \"wrapNodes\": {\n const index = indexTemplate(t);\n const entries = cmd.ids.map((id) => index.get(id)).filter((e): e is NonNullable<typeof e> => !!e);\n if (entries.length === 0) return;\n const first = entries[0]!;\n const list = first.parent ? (first.parent.children ??= []) : getRegion(t, first.region);\n const nodes = entries.map((e) => e.node);\n const startIndex = list.indexOf(first.node);\n for (const n of nodes) {\n const i = list.indexOf(n);\n if (i >= 0) list.splice(i, 1);\n }\n const wrapper = { ...cmd.wrapper, children: [...(cmd.wrapper.children ?? []), ...nodes.map((n) => (isDraft(n) ? current(n) : n))] };\n list.splice(Math.min(startIndex, list.length), 0, wrapper);\n return;\n }\n case \"replaceNode\": {\n const index = indexTemplate(t);\n const entry = index.get(cmd.id);\n if (!entry) throw new CommandError(`Node ${cmd.id} not found`);\n const list = entry.parent ? (entry.parent.children ??= []) : getRegion(t, entry.region);\n list[entry.index] = cmd.node;\n return;\n }\n case \"setPage\": {\n Object.assign(t.page, structuredClone(cmd.patch));\n return;\n }\n case \"setDocumentStyles\": {\n const p = cmd.patch;\n if (p.text) for (const [id, s] of Object.entries(p.text)) t.styles.text[id] = { ...(t.styles.text[id] ?? {}), ...s };\n if (p.table) Object.assign(t.styles.table, p.table);\n if (p.card) Object.assign(t.styles.card, p.card);\n if (p.link) Object.assign(t.styles.link, p.link);\n if (p.spacing) Object.assign(t.styles.spacing, p.spacing);\n return;\n }\n case \"setTextStyle\": {\n if (cmd.patch === null) {\n delete t.styles.text[cmd.id];\n return;\n }\n const existing = t.styles.text[cmd.id] ?? {};\n for (const [k, v] of Object.entries(cmd.patch)) {\n if (v === undefined) delete (existing as Record<string, unknown>)[k];\n else (existing as Record<string, unknown>)[k] = v;\n }\n t.styles.text[cmd.id] = existing;\n return;\n }\n case \"setTemplateName\": {\n t.name = cmd.name;\n return;\n }\n case \"setSettings\": {\n t.settings = { ...(t.settings ?? {}), ...cmd.patch };\n return;\n }\n case \"setRegionFirstPage\": {\n t.page[cmd.region].differentFirstPage = cmd.enabled;\n if (cmd.enabled && !t[cmd.region].firstPage) t[cmd.region].firstPage = (isDraft(t[cmd.region].default) ? current(t[cmd.region].default) : t[cmd.region].default).map(cloneWithNewIds);\n return;\n }\n case \"addLibraryItem\": {\n t.library ??= [];\n t.library.push({ ...cmd.item, id: cmd.item.id || createId(\"lib\") });\n return;\n }\n case \"removeLibraryItem\": {\n t.library = (t.library ?? []).filter((l) => l.id !== cmd.id);\n return;\n }\n case \"replaceTemplate\": {\n const fresh = structuredClone(cmd.template);\n for (const k of Object.keys(t) as Array<keyof ReportTemplate>) delete (t as unknown as Record<string, unknown>)[k];\n Object.assign(t, fresh);\n return;\n }\n }\n}\n\nfunction requireNode(t: ReportTemplate, id: string): Node {\n const e = indexTemplate(t).get(id);\n if (!e) throw new CommandError(`Node ${id} not found`);\n return e.node;\n}\n\nfunction mergeStyle(target: BlockStyle, patch: BlockStyle) {\n for (const [k, v] of Object.entries(patch) as Array<[keyof BlockStyle, unknown]>) {\n if (v === undefined || v === null) {\n delete target[k];\n continue;\n }\n if ((k === \"padding\" || k === \"margin\" || k === \"border\") && typeof v === \"object\") {\n const merged = { ...((target[k] as Record<string, unknown>) ?? {}), ...(v as Record<string, unknown>) };\n for (const key of Object.keys(merged)) if (merged[key] === undefined) delete merged[key];\n if (Object.keys(merged).length === 0) delete target[k];\n else (target as Record<string, unknown>)[k] = merged;\n continue;\n }\n (target as Record<string, unknown>)[k] = v;\n }\n}\n\nexport type { NodeLocation, RegionId };\n","import { produceWithPatches, applyPatches, enablePatches, type Patch } from \"immer\";\nimport type { ReportTemplate, Node } from \"../types/template.js\";\nimport { applyCommand, type Command } from \"./commands.js\";\nimport { indexTemplate, type NodeIndex, type NodeLocation, type RegionId } from \"./tree.js\";\n\nenablePatches();\n\nexport interface HistoryEntry {\n label: string;\n patches: Patch[];\n inversePatches: Patch[];\n selectionBefore: string[];\n selectionAfter: string[];\n at: number;\n /** Consecutive entries with the same merge key within `mergeWindowMs` are coalesced. */\n mergeKey?: string;\n}\n\nexport interface EditorState {\n template: ReportTemplate;\n selection: string[];\n hoverId: string | null;\n /** The node being edited inline (rich text), if any. */\n editingId: string | null;\n mode: \"design\" | \"preview\";\n zoom: number;\n activeRegion: RegionId;\n dirty: boolean;\n /** Monotonic counter incremented on every document change. */\n version: number;\n}\n\nexport interface DispatchOptions {\n label?: string;\n /** Coalesce with the previous history entry sharing this key (typing, slider drags). */\n mergeKey?: string;\n /** Do not record in history (e.g. transient drag previews). */\n skipHistory?: boolean;\n}\n\nexport interface EditorStoreOptions {\n template: ReportTemplate;\n maxHistory?: number;\n mergeWindowMs?: number;\n /** Called after every change, with the new template. */\n onChange?: (template: ReportTemplate, entry: HistoryEntry | null) => void;\n}\n\ntype Listener = (state: EditorState, prev: EditorState) => void;\n\n/**\n * Framework-agnostic editor store. The document is immutable; every change goes\n * through `dispatch(command)` and is recorded as immer patches for undo/redo.\n */\nexport class EditorStore {\n private state: EditorState;\n private undoStack: HistoryEntry[] = [];\n private redoStack: HistoryEntry[] = [];\n private listeners = new Set<Listener>();\n private txDepth = 0;\n private txPatches: Patch[] = [];\n private txInverse: Patch[] = [];\n private txLabel = \"\";\n private txSelectionBefore: string[] = [];\n private txSkipHistory = false;\n private indexCache: { version: number; index: NodeIndex } | null = null;\n /**\n * The history entry that was on top of the undo stack when the document was\n * last saved, so that undoing back to it reports clean again. Identity is the\n * whole test: undo pops, redo pushes, and a new edit pushes something else.\n */\n private savedEntry: HistoryEntry | null = null;\n /** A change that bypassed history, which no amount of undoing can take back. */\n private unhistoried = false;\n private readonly maxHistory: number;\n private readonly mergeWindowMs: number;\n private readonly onChange?: EditorStoreOptions[\"onChange\"];\n\n constructor(opts: EditorStoreOptions) {\n this.state = {\n template: opts.template,\n selection: [],\n hoverId: null,\n editingId: null,\n mode: \"design\",\n zoom: 1,\n activeRegion: \"body\",\n dirty: false,\n version: 0\n };\n this.maxHistory = opts.maxHistory ?? 200;\n this.mergeWindowMs = opts.mergeWindowMs ?? 800;\n this.onChange = opts.onChange;\n }\n\n /* ----------------------------- reading ----------------------------- */\n\n getState(): EditorState {\n return this.state;\n }\n\n get template(): ReportTemplate {\n return this.state.template;\n }\n\n /** Cached id → node index for the current document version. */\n index(): NodeIndex {\n if (!this.indexCache || this.indexCache.version !== this.state.version) {\n this.indexCache = { version: this.state.version, index: indexTemplate(this.state.template) };\n }\n return this.indexCache.index;\n }\n\n getNode(id: string): Node | undefined {\n return this.index().get(id)?.node;\n }\n\n locationOf(id: string): NodeLocation | undefined {\n const e = this.index().get(id);\n return e ? { region: e.region, path: e.path } : undefined;\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private setState(next: Partial<EditorState>) {\n const prev = this.state;\n this.state = { ...prev, ...next };\n for (const l of this.listeners) l(this.state, prev);\n }\n\n /* ------------------------------ UI state --------------------------- */\n\n select(ids: string[] | string | null): void {\n const selection = ids === null ? [] : Array.isArray(ids) ? ids : [ids];\n if (sameIds(selection, this.state.selection)) return;\n this.setState({ selection, editingId: selection.length === 1 && this.state.editingId === selection[0] ? this.state.editingId : null });\n }\n\n toggleSelect(id: string): void {\n const has = this.state.selection.includes(id);\n this.select(has ? this.state.selection.filter((s) => s !== id) : [...this.state.selection, id]);\n }\n\n hover(id: string | null): void {\n if (id !== this.state.hoverId) this.setState({ hoverId: id });\n }\n\n setEditing(id: string | null): void {\n if (id !== this.state.editingId) this.setState({ editingId: id, selection: id ? [id] : this.state.selection });\n }\n\n setMode(mode: EditorState[\"mode\"]): void {\n if (mode !== this.state.mode) this.setState({ mode, editingId: null });\n }\n\n setZoom(zoom: number): void {\n const z = Math.min(3, Math.max(0.25, Math.round(zoom * 100) / 100));\n if (z !== this.state.zoom) this.setState({ zoom: z });\n }\n\n setActiveRegion(region: RegionId): void {\n if (region !== this.state.activeRegion) this.setState({ activeRegion: region });\n }\n\n markClean(): void {\n this.savedEntry = this.undoStack[this.undoStack.length - 1] ?? null;\n this.unhistoried = false;\n if (this.state.dirty) this.setState({ dirty: false });\n }\n\n /** Whether the document differs from the last saved state. */\n private isDirty(): boolean {\n if (this.unhistoried) return true;\n return (this.undoStack[this.undoStack.length - 1] ?? null) !== this.savedEntry;\n }\n\n /* ------------------------------ commands --------------------------- */\n\n /** Applies one command. Inside a transaction, patches accumulate into one history entry. */\n dispatch(command: Command, opts: DispatchOptions = {}): void {\n const [next, patches, inverse] = produceWithPatches(this.state.template, (draft) => {\n applyCommand(draft, command);\n });\n if (patches.length === 0) return;\n\n if (this.txDepth > 0) {\n this.txPatches.push(...patches);\n this.txInverse.unshift(...inverse);\n if (opts.skipHistory) this.txSkipHistory = true;\n this.commitTemplate(next, null);\n return;\n }\n\n const selectionBefore = this.state.selection;\n const entry: HistoryEntry = {\n label: opts.label ?? labelFor(command),\n patches,\n inversePatches: inverse,\n selectionBefore,\n selectionAfter: selectionBefore,\n at: Date.now(),\n mergeKey: opts.mergeKey\n };\n if (opts.skipHistory) this.unhistoried = true;\n else this.pushHistory(entry);\n this.commitTemplate(next, opts.skipHistory ? null : entry);\n }\n\n /**\n * Groups every dispatch inside `fn` into a single undo step. Nested\n * transactions join the outermost one. If `fn` throws, all changes roll back.\n */\n transaction<T>(label: string, fn: () => T): T {\n if (this.txDepth === 0) {\n this.txPatches = [];\n this.txInverse = [];\n this.txLabel = label;\n this.txSelectionBefore = this.state.selection;\n this.txSkipHistory = false;\n }\n this.txDepth++;\n const before = this.state.template;\n let result: T;\n try {\n result = fn();\n } catch (e) {\n this.txDepth--;\n if (this.txDepth === 0) {\n this.commitTemplate(before, null);\n this.txPatches = [];\n this.txInverse = [];\n }\n throw e;\n }\n this.txDepth--;\n if (this.txDepth === 0 && this.txPatches.length > 0) {\n const entry: HistoryEntry = {\n label: this.txLabel,\n patches: this.txPatches,\n inversePatches: this.txInverse,\n selectionBefore: this.txSelectionBefore,\n selectionAfter: this.state.selection,\n at: Date.now()\n };\n if (this.txSkipHistory) this.unhistoried = true;\n else this.pushHistory(entry);\n // The per-dispatch commits inside the transaction ran before the entry\n // existed, so the dirty flag they set was a guess. Settle it now.\n this.setState({ dirty: this.isDirty() });\n this.onChange?.(this.state.template, entry);\n this.txPatches = [];\n this.txInverse = [];\n }\n return result;\n }\n\n private commitTemplate(template: ReportTemplate, entry: HistoryEntry | null) {\n if (template === this.state.template) return;\n this.setState({ template, dirty: this.txDepth > 0 ? true : this.isDirty(), version: this.state.version + 1 });\n if (this.txDepth === 0) this.onChange?.(template, entry);\n }\n\n private pushHistory(entry: HistoryEntry) {\n const last = this.undoStack[this.undoStack.length - 1];\n if (entry.mergeKey && last && last.mergeKey === entry.mergeKey && entry.at - last.at < this.mergeWindowMs) {\n // Merging into the saved entry moves the document away from what was\n // saved while leaving the stack the same height, so the mark is gone.\n if (last === this.savedEntry) this.savedEntry = null;\n last.patches.push(...entry.patches);\n last.inversePatches.unshift(...entry.inversePatches);\n last.at = entry.at;\n last.selectionAfter = entry.selectionAfter;\n } else {\n this.undoStack.push(entry);\n if (this.undoStack.length > this.maxHistory) this.undoStack.shift();\n }\n this.redoStack = [];\n }\n\n /* ------------------------------ history ---------------------------- */\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undoLabel(): string | undefined {\n return this.undoStack[this.undoStack.length - 1]?.label;\n }\n\n redoLabel(): string | undefined {\n return this.redoStack[this.redoStack.length - 1]?.label;\n }\n\n undo(): boolean {\n const entry = this.undoStack.pop();\n if (!entry) return false;\n const template = applyPatches(this.state.template, entry.inversePatches);\n this.redoStack.push(entry);\n this.setState({ template, selection: entry.selectionBefore.filter((id) => !!findIn(template, id)), editingId: null, dirty: this.isDirty(), version: this.state.version + 1 });\n this.onChange?.(template, null);\n return true;\n }\n\n redo(): boolean {\n const entry = this.redoStack.pop();\n if (!entry) return false;\n const template = applyPatches(this.state.template, entry.patches);\n this.undoStack.push(entry);\n this.setState({ template, selection: entry.selectionAfter.filter((id) => !!findIn(template, id)), editingId: null, dirty: this.isDirty(), version: this.state.version + 1 });\n this.onChange?.(template, null);\n return true;\n }\n\n /** Replaces the document and clears history (loading a template). */\n load(template: ReportTemplate): void {\n this.undoStack = [];\n this.redoStack = [];\n this.savedEntry = null;\n this.unhistoried = false;\n this.setState({ template, selection: [], hoverId: null, editingId: null, dirty: false, version: this.state.version + 1 });\n }\n\n history(): { undo: readonly HistoryEntry[]; redo: readonly HistoryEntry[] } {\n return { undo: this.undoStack, redo: this.redoStack };\n }\n}\n\nfunction findIn(template: ReportTemplate, id: string): Node | undefined {\n return indexTemplate(template).get(id)?.node;\n}\n\nfunction sameIds(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((x, i) => x === b[i]);\n}\n\nfunction labelFor(cmd: Command): string {\n switch (cmd.type) {\n case \"insertNode\":\n case \"insertNodes\":\n return \"Insert\";\n case \"removeNodes\":\n return \"Delete\";\n case \"moveNode\":\n return \"Move\";\n case \"duplicateNode\":\n return \"Duplicate\";\n case \"setProps\":\n case \"setProp\":\n return \"Edit properties\";\n case \"setStyle\":\n return \"Edit style\";\n case \"setFlow\":\n return \"Edit page flow\";\n case \"setVisibleWhen\":\n return \"Edit visibility\";\n case \"setName\":\n return \"Rename\";\n case \"setLocked\":\n return cmd.locked ? \"Lock\" : \"Unlock\";\n case \"setRowLayout\":\n return \"Change columns\";\n case \"wrapNodes\":\n return \"Wrap\";\n case \"replaceNode\":\n return \"Replace\";\n case \"setPage\":\n return \"Page settings\";\n case \"setDocumentStyles\":\n case \"setTextStyle\":\n return \"Document styles\";\n case \"setTemplateName\":\n return \"Rename report\";\n case \"setSettings\":\n return \"Settings\";\n case \"setRegionFirstPage\":\n return \"First page header/footer\";\n case \"addLibraryItem\":\n return \"Save to library\";\n case \"removeLibraryItem\":\n return \"Remove from library\";\n case \"replaceTemplate\":\n return \"Load\";\n }\n}\n","import type { ResolvedNode, ResolvedSegment } from \"../resolve/resolved.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport type { RenderContext, RenderMode, BindingInfo } from \"../registry/block-definition.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { DocumentStyles } from \"../types/template.js\";\nimport type { PageContext } from \"../types/data.js\";\nimport type { FormatContext } from \"../expr/format.js\";\nimport { h, type VChild, type VNode, type VProps } from \"../vnode/h.js\";\nimport { styleToCss, cssText } from \"../theme/resolve-style.js\";\nimport { Scope, evaluate } from \"../expr/evaluate.js\";\nimport { toDisplayString } from \"../expr/format.js\";\nimport type { RichTextDoc, InlineNode, TextMarks, Paragraph } from \"../richtext/model.js\";\nimport { isSafeUrl } from \"../validate/validate.js\";\nimport { resolveValue } from \"../theme/tokens.js\";\n\nexport interface RenderTreeOptions {\n registry: BlockRegistry;\n theme: Theme;\n styles: DocumentStyles;\n mode: RenderMode;\n page: PageContext;\n format: FormatContext;\n /** Content width in px at the root. */\n width: number;\n /** Hook for editors to add attributes to node wrappers. */\n decorate?: (node: ResolvedNode, props: VProps) => VProps;\n}\n\nfunction deferredScope(opts: RenderTreeOptions): Scope {\n return new Scope({\n page: opts.page,\n now: opts.format.now ?? new Date(),\n theme: { name: opts.theme.name, logo: opts.theme.logo, colors: opts.theme.colors, typography: opts.theme.typography, meta: opts.theme.meta ?? {} }\n });\n}\n\nfunction evalDeferred(expr: string, opts: RenderTreeOptions): string {\n try {\n return toDisplayString(evaluate(expr, { scope: deferredScope(opts), format: opts.format }));\n } catch {\n return \"\";\n }\n}\n\n/** Design-mode chip for a data token. */\nexport function tokenChip(expr: string, label: string | undefined, value?: string): VNode {\n return h(\"span\", { class: \"bp-token\", \"data-expr\": expr, title: expr, contenteditable: \"false\" }, label ?? expr, value !== undefined && value !== \"\" ? h(\"span\", { class: \"bp-token__value\" }, value) : null);\n}\n\nexport function renderSegments(segments: ResolvedSegment[] | undefined, fallback: string | undefined, opts: RenderTreeOptions): VChild[] {\n if (!segments) return fallback !== undefined ? [fallback] : [];\n return segments.map((s) => {\n if (s.kind === \"text\") return s.text;\n const value = s.deferred ? evalDeferred(s.expr!, opts) : s.value ?? \"\";\n if (opts.mode === \"design\") return tokenChip(s.expr!, s.label, s.deferred ? value : undefined);\n return value;\n });\n}\n\nfunction markWrap(children: VChild[], marks: TextMarks | undefined, opts: RenderTreeOptions): VChild {\n if (!marks) return children;\n let out: VChild = children;\n if (marks.code) out = h(\"code\", { class: \"bp-code\" }, out);\n if (marks.bold) out = h(\"strong\", null, out);\n if (marks.italic) out = h(\"em\", null, out);\n if (marks.underline) out = h(\"u\", null, out);\n if (marks.strike) out = h(\"s\", null, out);\n if (marks.color) out = h(\"span\", { style: { color: resolveValue(marks.color, opts.theme, \"inherit\") } }, out);\n if (marks.link) {\n const href = marks.link;\n const safe = isSafeUrl(href);\n const linkColor = resolveValue(opts.styles.link.color, opts.theme, opts.theme.colors.secondary);\n out = h(\"a\", { class: \"bp-link\", href: safe ? href : undefined, rel: \"noopener\", style: { color: linkColor, \"text-decoration\": opts.styles.link.underline === false ? \"none\" : \"underline\" } }, out);\n }\n return out;\n}\n\nexport function renderInline(content: InlineNode[], opts: RenderTreeOptions): VChild[] {\n return content.map((n) => {\n if (n.type === \"break\") return h(\"br\");\n if (n.type === \"text\") return markWrap([n.text], n.marks, opts);\n const value = n.deferred ? evalDeferred(n.expr, opts) : n.value ?? \"\";\n const inner = opts.mode === \"design\" ? tokenChip(n.expr, n.label, n.deferred ? value : undefined) : value;\n return markWrap([inner], n.marks, opts);\n });\n}\n\nfunction renderParagraph(p: Paragraph, opts: RenderTreeOptions): VNode {\n const empty = p.content.length === 0;\n return h(\"p\", { class: [\"bp-p\", empty && \"bp-p--empty\"], style: p.align ? { \"text-align\": p.align } : undefined }, empty ? h(\"br\") : renderInline(p.content, opts));\n}\n\nexport function renderRichText(doc: RichTextDoc | undefined, opts: RenderTreeOptions): VChild[] {\n if (!doc) return [];\n return doc.content.map((b) => {\n if (b.type === \"paragraph\") return renderParagraph(b, opts);\n return h(\n b.type === \"bulletList\" ? \"ul\" : \"ol\",\n { class: \"bp-list\" },\n b.content.map((li) => h(\"li\", null, li.content.map((p) => renderParagraph(p, opts))))\n );\n });\n}\n\nexport function nodeAttrs(node: ResolvedNode, extra: VProps = {}): VProps {\n return {\n \"data-key\": node.key,\n \"data-node\": node.nodeId,\n \"data-type\": node.type,\n ...extra\n };\n}\n\n/** Width available to a column inside a row. */\nexport function columnWidth(rowWidth: number, span: number, gap: number, columns: number): number {\n const inner = rowWidth - gap * Math.max(0, columns - 1);\n return Math.max(0, (inner * span) / 12);\n}\n\n/**\n * Renders a resolved node (and its subtree) to a VNode. This is the single\n * rendering path used by the editor canvas, the preview and the PDF service.\n */\nexport function renderNode(node: ResolvedNode, opts: RenderTreeOptions, width: number = opts.width): VNode | null {\n const def = opts.registry.get(node.type);\n const gap = opts.styles.spacing.blockGap;\n const columnGap = opts.styles.spacing.columnGap;\n\n // Children first (containers)\n let childWidth = width;\n if (def?.container) {\n const pad = node.style.padding;\n const bw = node.style.border ? node.style.border.width : 0;\n childWidth = Math.max(0, width - pad.left - pad.right - 2 * bw);\n }\n const children: VNode[] = [];\n if (node.role === \"row\") {\n const count = node.children.length;\n for (const col of node.children) {\n const w = columnWidth(childWidth, col.span ?? 12 / Math.max(1, count), columnGap, count);\n const v = renderNode(col, opts, w);\n if (v) children.push(v);\n }\n } else {\n for (const c of node.children) {\n const v = renderNode(c, opts, childWidth);\n if (v) children.push(v);\n }\n }\n\n const s = node.style;\n const css = styleToCss(s);\n delete css[\"margin\"];\n delete css[\"width\"];\n delete css[\"height\"];\n\n const wrapperStyle: Record<string, string | undefined> = {};\n const m = s.margin;\n if (m.top || m.right || m.bottom || m.left) wrapperStyle[\"margin\"] = `${m.top}px ${m.right}px ${m.bottom}px ${m.left}px`;\n if (s.width !== undefined && node.role === \"block\") {\n wrapperStyle[\"width\"] = typeof s.width === \"number\" ? `${s.width}px` : s.width;\n wrapperStyle[\"max-width\"] = \"100%\";\n if (s.align === \"center\") wrapperStyle[\"margin-left\"] = wrapperStyle[\"margin-right\"] = \"auto\";\n else if (s.align === \"right\") wrapperStyle[\"margin-left\"] = \"auto\";\n }\n if (s.height !== undefined && node.role === \"block\") wrapperStyle[\"height\"] = `${s.height}px`;\n if (node.role === \"column\") {\n wrapperStyle[\"grid-column\"] = `span ${node.span ?? 12}`;\n wrapperStyle[\"min-width\"] = \"0\";\n }\n\n const classes = [\"bp-node\", `bp-node--${node.type}`, `bp-${node.role}`];\n if (node.props.__hiddenByCondition) classes.push(\"bp-node--hidden\");\n if (node.placeholder) classes.push(\"bp-node--placeholder\");\n if (node.locked) classes.push(\"bp-node--locked\");\n if (node.iteration) classes.push(\"bp-repeater-item\");\n if (node.flow.keepTogether) classes.push(\"bp-node--keep\");\n\n let attrs: VProps = nodeAttrs(node, { class: classes, style: wrapperStyle });\n if (opts.decorate) attrs = opts.decorate(node, attrs);\n\n if (!def) {\n return h(\"div\", attrs, h(\"div\", { class: \"bp-unknown-block\", style: cssText(css) }, `Unavailable block: ${node.type}`));\n }\n\n const ctx: RenderContext = {\n node,\n props: node.props,\n style: s,\n css,\n theme: opts.theme,\n styles: opts.styles,\n mode: opts.mode,\n h,\n children,\n page: opts.page,\n width,\n format: opts.format,\n registry: opts.registry,\n text: (prop, fallback) => renderSegments(node.textSegments[prop], fallback ?? (typeof node.props[prop] === \"string\" ? (node.props[prop] as string) : undefined), opts),\n richText: (prop) => renderRichText(node.richText[prop] ?? (node.props[prop] as RichTextDoc | undefined), opts),\n textValue: (value) => (value === undefined ? [] : [value]),\n binding: (prop) => node.bindings[prop] as BindingInfo | undefined,\n partAttrs: (part, extra = {}) => ({ \"data-part\": part, \"data-node\": node.nodeId, ...extra }),\n placeholder: (text, extra = {}) => h(\"div\", { class: \"bp-placeholder\", ...extra }, text)\n };\n\n let inner: VNode | null;\n try {\n inner = def.render(ctx);\n } catch (e) {\n inner = h(\"div\", { class: \"bp-block-error\" }, `${def.name} failed to render: ${(e as Error).message}`);\n }\n if (!inner) return null;\n\n // Containers: lay out children in a column with the document block gap.\n if (def.container && node.role !== \"row\" && node.role !== \"column\" && def.container.direction !== \"row\") {\n // Blocks render their own children; nothing to add here.\n }\n void gap;\n return h(\"div\", attrs, inner);\n}\n\n/** Renders a list of resolved sections into a fragment-less flat list. */\nexport function renderSections(sections: ResolvedNode[], opts: RenderTreeOptions): VNode[] {\n const out: VNode[] = [];\n for (const s of sections) {\n const v = renderNode(s, opts, opts.width);\n if (v) out.push(v);\n }\n return out;\n}\n"],"mappings":"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","names":["arg","opts","v","f","g","spacing","current","g","current","h","check","getPath","g","getPath","z","labelFor"]}
1
+ {"version":3,"sources":["../src/types/template.ts","../src/richtext/model.ts","../src/expr/ast.ts","../src/expr/parser.ts","../src/expr/format.ts","../src/expr/evaluate.ts","../src/expr/typecheck.ts","../src/expr/condition.ts","../src/theme/default-theme.ts","../src/theme/tokens.ts","../src/theme/resolve-style.ts","../src/vnode/h.ts","../src/registry/block-definition.ts","../src/registry/registry.ts","../src/schema/template.schema.ts","../src/schema/ids.ts","../src/schema/migrate.ts","../src/schema/create.ts","../src/data/sample.ts","../src/data/pipes.ts","../src/data/calculation.ts","../src/resolve/describe.ts","../src/diff/template-diff.ts","../src/resolve/resolve.ts","../src/resolve/resolved.ts","../src/layout/page-geometry.ts","../src/layout/paginate.ts","../src/validate/issues.ts","../src/validate/validate.ts","../src/validate/output.ts","../src/editor/tree.ts","../src/editor/commands.ts","../src/editor/store.ts","../src/render/render-node.ts"],"sourcesContent":["/**\n * BroadPaper document format — schemaVersion 1.\n *\n * These types describe the saved JSON template. They are a public API:\n * every change must be additive or go through a migration in `schema/migrate.ts`.\n *\n * Units: page geometry (size, margins, region heights) is stored in millimetres\n * because that is how people think about paper. All other lengths (font sizes,\n * padding, borders) are CSS pixels at 96 dpi.\n */\n\nimport type { BlockStyle } from \"./style.js\";\n\nexport const CURRENT_SCHEMA_VERSION = 1 as const;\nexport type SchemaVersion = typeof CURRENT_SCHEMA_VERSION;\n\n/** A colour literal (`#RRGGBB`, `rgba(...)`) or a theme token reference (`$colors.primary`). */\nexport type ColorValue = string;\n/** A font family literal (`\"Inter\"`) or a theme token reference (`$typography.headingFont`). */\nexport type FontValue = string;\n/** A theme token reference. Always starts with `$`. */\nexport type TokenRef = `$${string}`;\n\nexport type PageSizeName = \"A4\" | \"A3\" | \"A5\" | \"Letter\" | \"Legal\" | \"Tabloid\";\nexport interface CustomPageSize {\n /** Width in millimetres. */\n width: number;\n /** Height in millimetres. */\n height: number;\n}\nexport type PageSize = PageSizeName | CustomPageSize;\nexport type PageOrientation = \"portrait\" | \"landscape\";\n\nexport interface PageMargins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport interface PageRegionSettings {\n /** Region height in millimetres (0 disables the region). */\n height: number;\n /** Use `header.firstPage` / `footer.firstPage` content on page 1. */\n differentFirstPage: boolean;\n}\n\nexport interface PageSettings {\n size: PageSize;\n orientation: PageOrientation;\n margins: PageMargins;\n header: PageRegionSettings;\n footer: PageRegionSettings;\n background?: ColorValue;\n /** Number of pages to show as the design canvas when the document is empty. */\n minPages?: number;\n}\n\nexport type TextStyleId = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"body\" | \"lead\" | \"caption\" | \"small\" | (string & {});\n\nexport interface TextStyle {\n fontFamily?: FontValue;\n fontSize?: number;\n fontWeight?: number | \"normal\" | \"bold\";\n fontStyle?: \"normal\" | \"italic\";\n lineHeight?: number;\n letterSpacing?: number;\n textTransform?: \"none\" | \"uppercase\" | \"lowercase\" | \"capitalize\";\n color?: ColorValue;\n marginTop?: number;\n marginBottom?: number;\n /** Headings default to keep-with-next. */\n keepWithNext?: boolean;\n}\n\nexport interface TableStyle {\n fontSize?: number;\n headerBackground?: ColorValue;\n headerColor?: ColorValue;\n headerFontWeight?: number | \"normal\" | \"bold\";\n borderColor?: ColorValue;\n borderWidth?: number;\n /** \"all\" draws a grid, \"horizontal\" draws row rules, \"none\" draws no lines. */\n borders?: \"all\" | \"horizontal\" | \"outer\" | \"none\";\n zebraBackground?: ColorValue;\n cellPaddingX?: number;\n cellPaddingY?: number;\n}\n\nexport interface CardStyle {\n background?: ColorValue;\n borderColor?: ColorValue;\n borderWidth?: number;\n borderRadius?: number;\n padding?: number;\n shadow?: boolean;\n}\n\nexport interface DocumentStyles {\n text: Record<TextStyleId, TextStyle>;\n table: TableStyle;\n card: CardStyle;\n link: { color?: ColorValue; underline?: boolean };\n spacing: {\n /** Vertical gap between blocks in px. */\n blockGap: number;\n /** Default section vertical padding in px. */\n sectionPadding: number;\n /** Gap between columns in px. */\n columnGap: number;\n };\n}\n\n/** Structured visibility rule, built by the UI without writing code. */\nexport interface ConditionRule {\n /** Left operand: an expression, usually a data path such as `client.isRetired`. */\n left: string;\n operator:\n | \"eq\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"contains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"in\"\n | \"isEmpty\"\n | \"isNotEmpty\"\n | \"isTrue\"\n | \"isFalse\";\n /** Right operand as a literal (string, number, boolean) or an expression string wrapped in `{{ }}`. */\n right?: string | number | boolean | null;\n}\nexport interface ConditionGroup {\n op: \"and\" | \"or\";\n rules: Array<ConditionRule | ConditionGroup>;\n}\n/** A raw expression string or a structured group. Both compile to the expression language. */\nexport type Condition = string | ConditionGroup;\n\nexport type BreakMode = \"auto\" | \"page\";\n\nexport interface FlowOptions {\n breakBefore?: BreakMode;\n breakAfter?: BreakMode;\n /** Never split this node across pages unless it is taller than a page. */\n keepTogether?: boolean;\n /** Keep this node on the same page as the start of the next sibling. */\n keepWithNext?: boolean;\n /** Minimum lines/rows to leave at the bottom of a page (orphans). */\n minOrphans?: number;\n /** Minimum lines/rows to carry to the next page (widows). */\n minWidows?: number;\n}\n\n/**\n * A node in the document tree. Structural node types are `section`, `row` and\n * `column`; everything else is a block type resolved through the block registry.\n */\nexport interface Node {\n id: string;\n type: string;\n props: Record<string, unknown>;\n style?: BlockStyle;\n children?: Node[];\n visibleWhen?: Condition;\n flow?: FlowOptions;\n /** Human label shown in the layer tree. */\n name?: string;\n /** A locked node cannot be moved or deleted in the editor. */\n locked?: boolean;\n}\n\nexport interface RegionContent {\n default: Node[];\n firstPage?: Node[];\n}\n\nexport interface LibraryItem {\n id: string;\n name: string;\n description?: string;\n category?: string;\n /** A section (or block) subtree to insert. IDs are re-generated on insert. */\n node: Node;\n thumbnail?: string;\n}\n\nexport interface TemplateSettings {\n /** BCP-47 locale used for number/date formatting defaults. */\n locale?: string;\n /** ISO 4217 currency used when `currency` pipe has no explicit code. */\n currency?: string;\n /** IANA time zone used for date formatting. */\n timeZone?: string;\n /** Data source ids this template was designed against. */\n dataSources?: string[];\n}\n\nexport interface TemplateMeta {\n createdAt?: string;\n updatedAt?: string;\n author?: string;\n description?: string;\n tags?: string[];\n /** Free-form host metadata. Never interpreted by BroadPaper. */\n custom?: Record<string, unknown>;\n}\n\nexport interface ReportTemplate {\n schemaVersion: SchemaVersion;\n id: string;\n name: string;\n meta?: TemplateMeta;\n page: PageSettings;\n styles: DocumentStyles;\n header: RegionContent;\n footer: RegionContent;\n /** Top-level content: a list of `section` nodes. */\n body: Node[];\n library?: LibraryItem[];\n settings?: TemplateSettings;\n}\n\n/** A template of any historical schema version. Use `migrateTemplate` before use. */\nexport interface AnyVersionTemplate {\n schemaVersion: number;\n [key: string]: unknown;\n}\n","/**\n * Constrained rich-text model. This is what is stored in the template — never HTML.\n * It is intentionally small: paragraphs and lists containing inline runs with a\n * fixed set of marks, plus inline data tokens.\n */\n\nexport interface TextMarks {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n code?: boolean;\n /** Colour literal or theme token. */\n color?: string;\n /** A hyperlink. Only `http(s):` and `mailto:` are rendered. May contain `{{ }}` tokens. */\n link?: string;\n}\n\nexport interface TextRun {\n type: \"text\";\n text: string;\n marks?: TextMarks;\n}\n\nexport interface TokenRun {\n type: \"token\";\n /** Expression, e.g. `client.firstName | upper`. */\n expr: string;\n marks?: TextMarks;\n /** Filled by the resolver: evaluated display value. */\n value?: string;\n /** Filled by the resolver: human label for design-mode chips. */\n label?: string;\n /** Filled by the resolver: expression depends on `page.*` and is evaluated per page. */\n deferred?: boolean;\n}\n\nexport interface BreakRun {\n type: \"break\";\n}\n\nexport type InlineNode = TextRun | TokenRun | BreakRun;\n\nexport interface Paragraph {\n type: \"paragraph\";\n content: InlineNode[];\n align?: \"left\" | \"center\" | \"right\" | \"justify\";\n}\n\nexport interface ListItem {\n type: \"listItem\";\n content: Paragraph[];\n}\n\nexport interface List {\n type: \"bulletList\" | \"orderedList\";\n content: ListItem[];\n}\n\nexport type BlockNode = Paragraph | List;\n\nexport interface RichTextDoc {\n type: \"doc\";\n content: BlockNode[];\n}\n\nexport function createParagraph(text = \"\", marks?: TextMarks): Paragraph {\n return { type: \"paragraph\", content: text ? [{ type: \"text\", text, ...(marks ? { marks } : {}) }] : [] };\n}\n\nexport function createRichText(text = \"\"): RichTextDoc {\n return { type: \"doc\", content: [createParagraph(text)] };\n}\n\n/** Builds a rich text document from a template string containing `{{ expr }}` tokens. */\nexport function richTextFromTemplate(template: string): RichTextDoc {\n const paragraphs = template.split(/\\n/);\n return {\n type: \"doc\",\n content: paragraphs.map((p) => ({ type: \"paragraph\", content: inlineFromTemplate(p) }))\n };\n}\n\nexport function inlineFromTemplate(text: string): InlineNode[] {\n const out: InlineNode[] = [];\n const re = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) {\n if (m.index > last) out.push({ type: \"text\", text: text.slice(last, m.index) });\n out.push({ type: \"token\", expr: m[1]! });\n last = m.index + m[0].length;\n }\n if (last < text.length) out.push({ type: \"text\", text: text.slice(last) });\n return out;\n}\n\n/** Plain-text projection used for search, validation messages and layer labels. */\nexport function richTextToPlain(doc: RichTextDoc | undefined, tokenText: (expr: string) => string = (e) => `{{${e}}}`): string {\n if (!doc) return \"\";\n const lines: string[] = [];\n for (const block of doc.content) {\n if (block.type === \"paragraph\") lines.push(inlineToPlain(block.content, tokenText));\n else for (const item of block.content) for (const p of item.content) lines.push(inlineToPlain(p.content, tokenText));\n }\n return lines.join(\"\\n\");\n}\n\nexport function inlineToPlain(content: InlineNode[], tokenText: (expr: string) => string): string {\n return content\n .map((n) => (n.type === \"text\" ? n.text : n.type === \"token\" ? tokenText(n.expr) : \"\\n\"))\n .join(\"\");\n}\n\n/** Every token expression used in a rich text document, in order. */\nexport function richTextTokens(doc: RichTextDoc | undefined): string[] {\n const out: string[] = [];\n if (!doc) return out;\n const visitInline = (content: InlineNode[]) => {\n for (const n of content) {\n if (n.type === \"token\") out.push(n.expr);\n if (n.type === \"text\" && n.marks?.link) {\n for (const e of extractTemplateTokens(n.marks.link)) out.push(e);\n }\n }\n };\n for (const block of doc.content) {\n if (block.type === \"paragraph\") visitInline(block.content);\n else for (const item of block.content) for (const p of item.content) visitInline(p.content);\n }\n return out;\n}\n\n/** Extracts `{{ expr }}` expressions from a plain template string. */\nexport function extractTemplateTokens(text: string | undefined): string[] {\n if (!text) return [];\n const out: string[] = [];\n const re = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) out.push(m[1]!);\n return out;\n}\n\nexport function isRichTextDoc(value: unknown): value is RichTextDoc {\n return !!value && typeof value === \"object\" && (value as RichTextDoc).type === \"doc\" && Array.isArray((value as RichTextDoc).content);\n}\n","/**\n * Abstract syntax tree for the BroadPaper expression language.\n *\n * The language is intentionally small and has no way to execute host code:\n * paths client.firstName holdings[0].name item.value\n * literals \"text\" 'text' 12.5 true false null\n * operators == != < <= > >= + - * / % and or not in ?:\n * pipes value | currency:\"GBP\" | default:\"—\"\n * functions sum(holdings.value) count(items) coalesce(a, b)\n */\n\nexport type Expr =\n | { kind: \"literal\"; value: string | number | boolean | null }\n | { kind: \"path\"; segments: PathSegment[] }\n | { kind: \"unary\"; op: \"not\" | \"-\"; arg: Expr }\n | { kind: \"binary\"; op: BinaryOp; left: Expr; right: Expr }\n | { kind: \"conditional\"; test: Expr; then: Expr; else: Expr }\n | { kind: \"call\"; name: string; args: Expr[] }\n | { kind: \"pipe\"; input: Expr; name: string; args: Expr[] }\n | { kind: \"array\"; items: Expr[] };\n\nexport type PathSegment = { kind: \"prop\"; name: string } | { kind: \"index\"; index: number };\n\nexport type BinaryOp = \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"+\" | \"-\" | \"*\" | \"/\" | \"%\" | \"and\" | \"or\" | \"in\";\n\nexport function pathToString(segments: PathSegment[]): string {\n let s = \"\";\n for (const seg of segments) {\n if (seg.kind === \"prop\") s += s ? `.${seg.name}` : seg.name;\n else s += `[${seg.index}]`;\n }\n return s;\n}\n\n/** Serialises an AST back to canonical source text. */\nexport function exprToString(e: Expr): string {\n switch (e.kind) {\n case \"literal\":\n return typeof e.value === \"string\" ? JSON.stringify(e.value) : String(e.value);\n case \"path\":\n return pathToString(e.segments);\n case \"unary\":\n return e.op === \"not\" ? `not ${wrap(e.arg)}` : `-${wrap(e.arg)}`;\n case \"binary\":\n return `${wrap(e.left)} ${e.op} ${wrap(e.right)}`;\n case \"conditional\":\n return `${wrap(e.test)} ? ${wrap(e.then)} : ${wrap(e.else)}`;\n case \"call\":\n return `${e.name}(${e.args.map(exprToString).join(\", \")})`;\n case \"pipe\":\n return `${exprToString(e.input)} | ${e.name}${e.args.length ? \":\" + e.args.map(exprToString).join(\":\") : \"\"}`;\n case \"array\":\n return `[${e.items.map(exprToString).join(\", \")}]`;\n }\n}\n\nfunction wrap(e: Expr): string {\n const s = exprToString(e);\n return e.kind === \"binary\" || e.kind === \"conditional\" || e.kind === \"pipe\" ? `(${s})` : s;\n}\n\n/** Collects every path referenced by an expression (for validation and dependency tracking). */\nexport function collectPaths(e: Expr, out: PathSegment[][] = []): PathSegment[][] {\n switch (e.kind) {\n case \"path\":\n out.push(e.segments);\n break;\n case \"unary\":\n collectPaths(e.arg, out);\n break;\n case \"binary\":\n collectPaths(e.left, out);\n collectPaths(e.right, out);\n break;\n case \"conditional\":\n collectPaths(e.test, out);\n collectPaths(e.then, out);\n collectPaths(e.else, out);\n break;\n case \"call\":\n case \"array\":\n for (const a of e.kind === \"call\" ? e.args : e.items) collectPaths(a, out);\n break;\n case \"pipe\":\n collectPaths(e.input, out);\n for (const a of e.args) collectPaths(a, out);\n break;\n }\n return out;\n}\n","import type { BinaryOp, Expr, PathSegment } from \"./ast.js\";\n\nexport class ExpressionError extends Error {\n constructor(\n message: string,\n public readonly position: number,\n public readonly source: string\n ) {\n super(message);\n this.name = \"ExpressionError\";\n }\n}\n\ntype Token =\n | { type: \"num\"; value: number; pos: number }\n | { type: \"str\"; value: string; pos: number }\n | { type: \"ident\"; value: string; pos: number }\n | { type: \"op\"; value: string; pos: number }\n | { type: \"eof\"; pos: number };\n\nconst MAX_LENGTH = 2000;\nconst MAX_DEPTH = 32;\nconst KEYWORDS = new Set([\"and\", \"or\", \"not\", \"in\", \"true\", \"false\", \"null\"]);\nconst MULTI_OPS = [\"==\", \"!=\", \"<=\", \">=\"];\nconst SINGLE_OPS = new Set(\"+-*/%<>()[]|:?,.\".split(\"\"));\n\nexport function tokenize(src: string): Token[] {\n if (src.length > MAX_LENGTH) throw new ExpressionError(`Expression is too long (max ${MAX_LENGTH} characters)`, 0, src);\n const tokens: Token[] = [];\n let i = 0;\n while (i < src.length) {\n const ch = src[i]!;\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n const pos = i;\n if (/[0-9]/.test(ch) || (ch === \".\" && /[0-9]/.test(src[i + 1] ?? \"\"))) {\n let j = i;\n while (j < src.length && /[0-9_]/.test(src[j]!)) j++;\n if (src[j] === \".\" && /[0-9]/.test(src[j + 1] ?? \"\")) {\n j++;\n while (j < src.length && /[0-9]/.test(src[j]!)) j++;\n }\n if ((src[j] === \"e\" || src[j] === \"E\") && /[0-9+-]/.test(src[j + 1] ?? \"\")) {\n j += 2;\n while (j < src.length && /[0-9]/.test(src[j]!)) j++;\n }\n tokens.push({ type: \"num\", value: Number(src.slice(i, j).replace(/_/g, \"\")), pos });\n i = j;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n let j = i + 1;\n let out = \"\";\n while (j < src.length && src[j] !== ch) {\n if (src[j] === \"\\\\\" && j + 1 < src.length) {\n const n = src[j + 1]!;\n out += n === \"n\" ? \"\\n\" : n === \"t\" ? \"\\t\" : n;\n j += 2;\n } else {\n out += src[j];\n j++;\n }\n }\n if (j >= src.length) throw new ExpressionError(\"Unterminated string\", pos, src);\n tokens.push({ type: \"str\", value: out, pos });\n i = j + 1;\n continue;\n }\n if (/[A-Za-z_$]/.test(ch)) {\n let j = i;\n while (j < src.length && /[A-Za-z0-9_$]/.test(src[j]!)) j++;\n tokens.push({ type: \"ident\", value: src.slice(i, j), pos });\n i = j;\n continue;\n }\n const two = src.slice(i, i + 2);\n if (MULTI_OPS.includes(two)) {\n tokens.push({ type: \"op\", value: two, pos });\n i += 2;\n continue;\n }\n if (ch === \"=\" && src[i + 1] !== \"=\") {\n // Be forgiving: a single \"=\" reads as equality.\n tokens.push({ type: \"op\", value: \"==\", pos });\n i++;\n continue;\n }\n if (ch === \"&\" && src[i + 1] === \"&\") {\n tokens.push({ type: \"ident\", value: \"and\", pos });\n i += 2;\n continue;\n }\n if (ch === \"|\" && src[i + 1] === \"|\") {\n tokens.push({ type: \"ident\", value: \"or\", pos });\n i += 2;\n continue;\n }\n if (ch === \"!\" ) {\n tokens.push({ type: \"ident\", value: \"not\", pos });\n i++;\n continue;\n }\n if (SINGLE_OPS.has(ch)) {\n tokens.push({ type: \"op\", value: ch, pos });\n i++;\n continue;\n }\n throw new ExpressionError(`Unexpected character \"${ch}\"`, pos, src);\n }\n tokens.push({ type: \"eof\", pos: src.length });\n return tokens;\n}\n\n/**\n * Pratt parser. Precedence (low → high):\n * pipe |\n * conditional ?:\n * or\n * and\n * not (prefix)\n * == != in\n * < <= > >=\n * + -\n * * / %\n * unary -\n * postfix . [ (\n */\nclass Parser {\n private i = 0;\n private depth = 0;\n constructor(\n private readonly tokens: Token[],\n private readonly src: string\n ) {}\n\n parse(): Expr {\n const e = this.parsePipe();\n if (this.peek().type !== \"eof\") this.fail(`Unexpected \"${this.describe(this.peek())}\"`);\n return e;\n }\n\n private peek(): Token {\n return this.tokens[this.i]!;\n }\n private next(): Token {\n return this.tokens[this.i++]!;\n }\n private isOp(v: string): boolean {\n const t = this.peek();\n return t.type === \"op\" && t.value === v;\n }\n private isKw(v: string): boolean {\n const t = this.peek();\n return t.type === \"ident\" && t.value === v;\n }\n private expectOp(v: string) {\n if (!this.isOp(v)) this.fail(`Expected \"${v}\" but found \"${this.describe(this.peek())}\"`);\n this.next();\n }\n private describe(t: Token): string {\n return t.type === \"eof\" ? \"end of expression\" : t.type === \"str\" ? `\"${t.value}\"` : String(t.value);\n }\n private fail(msg: string): never {\n throw new ExpressionError(msg, this.peek().pos, this.src);\n }\n private enter() {\n if (++this.depth > MAX_DEPTH) this.fail(\"Expression is nested too deeply\");\n }\n private leave() {\n this.depth--;\n }\n\n private parsePipe(): Expr {\n let e = this.parseConditional();\n while (this.isOp(\"|\")) {\n this.next();\n const nameTok = this.next();\n if (nameTok.type !== \"ident\") this.fail(\"Expected a formatter name after |\");\n const args: Expr[] = [];\n while (this.isOp(\":\")) {\n this.next();\n args.push(this.parseConditional());\n }\n e = { kind: \"pipe\", input: e, name: nameTok.value, args };\n }\n return e;\n }\n\n private parseConditional(): Expr {\n const test = this.parseOr();\n if (this.isOp(\"?\")) {\n this.enter();\n this.next();\n const then = this.parseConditional();\n this.expectOp(\":\");\n const els = this.parseConditional();\n this.leave();\n return { kind: \"conditional\", test, then, else: els };\n }\n return test;\n }\n\n private parseOr(): Expr {\n let left = this.parseAnd();\n while (this.isKw(\"or\")) {\n this.next();\n left = { kind: \"binary\", op: \"or\", left, right: this.parseAnd() };\n }\n return left;\n }\n\n private parseAnd(): Expr {\n let left = this.parseNot();\n while (this.isKw(\"and\")) {\n this.next();\n left = { kind: \"binary\", op: \"and\", left, right: this.parseNot() };\n }\n return left;\n }\n\n private parseNot(): Expr {\n if (this.isKw(\"not\")) {\n this.enter();\n this.next();\n const arg = this.parseNot();\n this.leave();\n return { kind: \"unary\", op: \"not\", arg };\n }\n return this.parseEquality();\n }\n\n private parseEquality(): Expr {\n let left = this.parseComparison();\n for (;;) {\n if (this.isOp(\"==\") || this.isOp(\"!=\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseComparison() };\n } else if (this.isKw(\"in\")) {\n this.next();\n left = { kind: \"binary\", op: \"in\", left, right: this.parseComparison() };\n } else return left;\n }\n }\n\n private parseComparison(): Expr {\n let left = this.parseAdditive();\n while (this.isOp(\"<\") || this.isOp(\"<=\") || this.isOp(\">\") || this.isOp(\">=\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseAdditive() };\n }\n return left;\n }\n\n private parseAdditive(): Expr {\n let left = this.parseMultiplicative();\n while (this.isOp(\"+\") || this.isOp(\"-\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseMultiplicative() };\n }\n return left;\n }\n\n private parseMultiplicative(): Expr {\n let left = this.parseUnary();\n while (this.isOp(\"*\") || this.isOp(\"/\") || this.isOp(\"%\")) {\n const op = this.next() as { value: BinaryOp };\n left = { kind: \"binary\", op: op.value, left, right: this.parseUnary() };\n }\n return left;\n }\n\n private parseUnary(): Expr {\n if (this.isOp(\"-\")) {\n this.enter();\n this.next();\n const arg = this.parseUnary();\n this.leave();\n if (arg.kind === \"literal\" && typeof arg.value === \"number\") return { kind: \"literal\", value: -arg.value };\n return { kind: \"unary\", op: \"-\", arg };\n }\n return this.parsePostfix();\n }\n\n private parsePostfix(): Expr {\n let e = this.parsePrimary();\n for (;;) {\n if (this.isOp(\".\")) {\n this.next();\n const t = this.next();\n if (t.type !== \"ident\") this.fail(\"Expected a property name after .\");\n e = appendSegment(e, { kind: \"prop\", name: t.value }, () => this.fail(\"Property access is only allowed on data paths\"));\n } else if (this.isOp(\"[\")) {\n this.next();\n const t = this.next();\n if (t.type !== \"num\" || !Number.isInteger(t.value) || t.value < 0) this.fail(\"Index must be a non-negative integer\");\n this.expectOp(\"]\");\n e = appendSegment(e, { kind: \"index\", index: t.value }, () => this.fail(\"Indexing is only allowed on data paths\"));\n } else return e;\n }\n }\n\n private parsePrimary(): Expr {\n const t = this.next();\n switch (t.type) {\n case \"num\":\n return { kind: \"literal\", value: t.value };\n case \"str\":\n return { kind: \"literal\", value: t.value };\n case \"ident\": {\n if (t.value === \"true\") return { kind: \"literal\", value: true };\n if (t.value === \"false\") return { kind: \"literal\", value: false };\n if (t.value === \"null\") return { kind: \"literal\", value: null };\n if (KEYWORDS.has(t.value)) this.fail(`Unexpected keyword \"${t.value}\"`);\n if (this.isOp(\"(\")) {\n this.enter();\n this.next();\n const args: Expr[] = [];\n if (!this.isOp(\")\")) {\n args.push(this.parsePipe());\n while (this.isOp(\",\")) {\n this.next();\n args.push(this.parsePipe());\n }\n }\n this.expectOp(\")\");\n this.leave();\n return { kind: \"call\", name: t.value, args };\n }\n return { kind: \"path\", segments: [{ kind: \"prop\", name: t.value }] };\n }\n case \"op\":\n if (t.value === \"(\") {\n this.enter();\n const e = this.parsePipe();\n this.expectOp(\")\");\n this.leave();\n return e;\n }\n if (t.value === \"[\") {\n this.enter();\n const items: Expr[] = [];\n if (!this.isOp(\"]\")) {\n items.push(this.parsePipe());\n while (this.isOp(\",\")) {\n this.next();\n items.push(this.parsePipe());\n }\n }\n this.expectOp(\"]\");\n this.leave();\n return { kind: \"array\", items };\n }\n this.fail(`Unexpected \"${t.value}\"`);\n // eslint-disable-next-line no-fallthrough\n case \"eof\":\n this.fail(\"Unexpected end of expression\");\n }\n }\n}\n\nfunction appendSegment(e: Expr, seg: PathSegment, fail: () => never): Expr {\n if (e.kind !== \"path\") return fail();\n return { kind: \"path\", segments: [...e.segments, seg] };\n}\n\nconst cache = new Map<string, Expr>();\n\n/** Parses an expression. Results are cached; the AST must be treated as immutable. */\nexport function parseExpression(src: string): Expr {\n const key = src.trim();\n const hit = cache.get(key);\n if (hit) return hit;\n if (key.length === 0) throw new ExpressionError(\"Expression is empty\", 0, src);\n const ast = new Parser(tokenize(key), key).parse();\n if (cache.size > 5000) cache.clear();\n cache.set(key, ast);\n return ast;\n}\n\n/** Returns the parse error for an expression, or null if it parses. */\nexport function checkExpressionSyntax(src: string): ExpressionError | null {\n try {\n parseExpression(src);\n return null;\n } catch (e) {\n return e instanceof ExpressionError ? e : new ExpressionError(String(e), 0, src);\n }\n}\n","/**\n * Formatting pipes. Every pipe is a pure function of (value, args, context).\n * They never throw for bad input: unformattable values pass through as text so\n * a report never fails to render because one field was unexpectedly empty.\n */\n\nexport interface FormatContext {\n locale: string;\n currency: string;\n timeZone?: string;\n /** Fixed \"now\" for deterministic output (tests, reproducible PDFs). */\n now?: Date;\n}\n\nexport type PipeFn = (value: unknown, args: unknown[], ctx: FormatContext) => unknown;\n\nexport interface PipeDefinition {\n name: string;\n description: string;\n /** Output type used by the static type checker. \"same\" keeps the input type. */\n returns: \"string\" | \"number\" | \"boolean\" | \"same\" | \"array\";\n /** Argument descriptions shown in the editor. */\n args?: Array<{ name: string; type: \"string\" | \"number\" | \"boolean\" | \"any\"; optional?: boolean; description?: string }>;\n /** Input types this pipe is meant for (documentation and editor suggestions only). */\n accepts?: string[];\n fn: PipeFn;\n}\n\nconst intlNumberCache = new Map<string, Intl.NumberFormat>();\nconst intlDateCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction numberFormat(locale: string, opts: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = locale + JSON.stringify(opts);\n let f = intlNumberCache.get(key);\n if (!f) {\n try {\n f = new Intl.NumberFormat(locale, opts);\n } catch {\n f = new Intl.NumberFormat(\"en-GB\", { ...opts, currency: opts.currency ?? \"GBP\" });\n }\n intlNumberCache.set(key, f);\n }\n return f;\n}\n\nfunction dateFormat(locale: string, opts: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = locale + JSON.stringify(opts);\n let f = intlDateCache.get(key);\n if (!f) {\n try {\n f = new Intl.DateTimeFormat(locale, opts);\n } catch {\n f = new Intl.DateTimeFormat(\"en-GB\", opts);\n }\n intlDateCache.set(key, f);\n }\n return f;\n}\n\nexport function toNumber(value: unknown): number | null {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value.replace(/[,\\s]/g, \"\"));\n return Number.isFinite(n) ? n : null;\n }\n if (typeof value === \"boolean\") return value ? 1 : 0;\n return null;\n}\n\nexport function toDate(value: unknown): Date | null {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\n if (typeof value === \"number\") return new Date(value);\n if (typeof value === \"string\" && value.trim()) {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value as object).length === 0;\n return false;\n}\n\nexport function toDisplayString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (value instanceof Date) return value.toISOString();\n if (Array.isArray(value)) return value.map(toDisplayString).join(\", \");\n return \"\";\n}\n\n/**\n * Date pattern tokens (a pragmatic subset of Unicode/date-fns tokens):\n * yyyy yy MMMM MMM MM M dd d EEEE EEE HH H hh h mm ss a\n */\nexport function formatDatePattern(date: Date, pattern: string, ctx: FormatContext): string {\n const parts = (opts: Intl.DateTimeFormatOptions) => {\n const o: Intl.DateTimeFormatOptions = { ...opts };\n if (ctx.timeZone) o.timeZone = ctx.timeZone;\n return dateFormat(ctx.locale, o).formatToParts(date);\n };\n const get = (opts: Intl.DateTimeFormatOptions, type: string) => parts(opts).find((p) => p.type === type)?.value ?? \"\";\n const pad = (s: string, n: number) => s.padStart(n, \"0\");\n const numeric = parts({ year: \"numeric\", month: \"numeric\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\", hour12: false });\n const num = (type: string) => numeric.find((p) => p.type === type)?.value ?? \"\";\n const hour24 = Number(num(\"hour\")) % 24;\n const hour12 = hour24 % 12 === 0 ? 12 : hour24 % 12;\n\n return pattern.replace(/yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE|HH|H|hh|h|mm|ss|a|'[^']*'/g, (tok) => {\n switch (tok) {\n case \"yyyy\":\n return num(\"year\");\n case \"yy\":\n return num(\"year\").slice(-2);\n case \"MMMM\":\n return get({ month: \"long\" }, \"month\");\n case \"MMM\":\n return get({ month: \"short\" }, \"month\");\n case \"MM\":\n return pad(num(\"month\"), 2);\n case \"M\":\n return num(\"month\");\n case \"dd\":\n return pad(num(\"day\"), 2);\n case \"d\":\n return num(\"day\");\n case \"EEEE\":\n return get({ weekday: \"long\" }, \"weekday\");\n case \"EEE\":\n return get({ weekday: \"short\" }, \"weekday\");\n case \"HH\":\n return pad(String(hour24), 2);\n case \"H\":\n return String(hour24);\n case \"hh\":\n return pad(String(hour12), 2);\n case \"h\":\n return String(hour12);\n case \"mm\":\n return pad(num(\"minute\"), 2);\n case \"ss\":\n return pad(num(\"second\"), 2);\n case \"a\":\n return hour24 < 12 ? \"AM\" : \"PM\";\n default:\n return tok.startsWith(\"'\") ? tok.slice(1, -1) : tok;\n }\n });\n}\n\nconst NAMED_DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: \"short\" },\n medium: { dateStyle: \"medium\" },\n long: { dateStyle: \"long\" },\n full: { dateStyle: \"full\" }\n};\n\nexport function formatDate(value: unknown, pattern: string | undefined, ctx: FormatContext, withTime = false): string {\n const d = toDate(value);\n if (!d) return toDisplayString(value);\n if (pattern && NAMED_DATE_STYLES[pattern]) {\n const opts: Intl.DateTimeFormatOptions = { ...NAMED_DATE_STYLES[pattern] };\n if (withTime) opts.timeStyle = \"short\";\n if (ctx.timeZone) opts.timeZone = ctx.timeZone;\n return dateFormat(ctx.locale, opts).format(d);\n }\n if (pattern) return formatDatePattern(d, pattern, ctx);\n const opts: Intl.DateTimeFormatOptions = withTime ? { dateStyle: \"medium\", timeStyle: \"short\" } : { dateStyle: \"medium\" };\n if (ctx.timeZone) opts.timeZone = ctx.timeZone;\n return dateFormat(ctx.locale, opts).format(d);\n}\n\nexport function formatCurrency(value: unknown, currency: string | undefined, decimals: number | undefined, ctx: FormatContext): string {\n const n = toNumber(value);\n if (n === null) return toDisplayString(value);\n const code = (currency && String(currency).toUpperCase()) || ctx.currency;\n const opts: Intl.NumberFormatOptions = { style: \"currency\", currency: code };\n if (decimals !== undefined) {\n opts.minimumFractionDigits = decimals;\n opts.maximumFractionDigits = decimals;\n }\n return numberFormat(ctx.locale, opts).format(n);\n}\n\nexport function formatNumber(value: unknown, decimals: number | undefined, ctx: FormatContext): string {\n const n = toNumber(value);\n if (n === null) return toDisplayString(value);\n const opts: Intl.NumberFormatOptions = {};\n if (decimals !== undefined) {\n opts.minimumFractionDigits = decimals;\n opts.maximumFractionDigits = decimals;\n } else opts.maximumFractionDigits = 2;\n return numberFormat(ctx.locale, opts).format(n);\n}\n\nexport function formatPercent(value: unknown, decimals: number | undefined, ctx: FormatContext, alreadyScaled = false): string {\n const n = toNumber(value);\n if (n === null) return toDisplayString(value);\n const opts: Intl.NumberFormatOptions = { style: \"percent\" };\n const d = decimals ?? 1;\n opts.minimumFractionDigits = d;\n opts.maximumFractionDigits = d;\n return numberFormat(ctx.locale, opts).format(alreadyScaled ? n / 100 : n);\n}\n\nfunction arg<T>(args: unknown[], i: number): T | undefined {\n return args[i] as T | undefined;\n}\n\nexport const PIPES: Record<string, PipeDefinition> = {\n currency: {\n name: \"currency\",\n description: \"Format as money\",\n returns: \"string\",\n accepts: [\"number\", \"currency\"],\n args: [\n { name: \"code\", type: \"string\", optional: true, description: \"ISO currency code, e.g. GBP\" },\n { name: \"decimals\", type: \"number\", optional: true }\n ],\n fn: (v, a, ctx) => formatCurrency(v, arg<string>(a, 0), toNumber(a[1]) ?? undefined, ctx)\n },\n number: {\n name: \"number\",\n description: \"Format with thousands separators\",\n returns: \"string\",\n accepts: [\"number\"],\n args: [{ name: \"decimals\", type: \"number\", optional: true }],\n fn: (v, a, ctx) => formatNumber(v, toNumber(a[0]) ?? undefined, ctx)\n },\n percent: {\n name: \"percent\",\n description: \"Format a fraction (0.25) as a percentage (25%)\",\n returns: \"string\",\n accepts: [\"number\", \"percent\"],\n args: [\n { name: \"decimals\", type: \"number\", optional: true },\n { name: \"scaled\", type: \"boolean\", optional: true, description: \"Set true when the value is already 0–100\" }\n ],\n fn: (v, a, ctx) => formatPercent(v, toNumber(a[0]) ?? undefined, ctx, a[1] === true)\n },\n date: {\n name: \"date\",\n description: \"Format a date\",\n returns: \"string\",\n accepts: [\"date\", \"datetime\"],\n args: [{ name: \"pattern\", type: \"string\", optional: true, description: \"e.g. dd MMM yyyy, or short/medium/long/full\" }],\n fn: (v, a, ctx) => formatDate(v, arg<string>(a, 0), ctx, false)\n },\n datetime: {\n name: \"datetime\",\n description: \"Format a date with time\",\n returns: \"string\",\n accepts: [\"date\", \"datetime\"],\n args: [{ name: \"pattern\", type: \"string\", optional: true }],\n fn: (v, a, ctx) => formatDate(v, arg<string>(a, 0), ctx, true)\n },\n boolean: {\n name: \"boolean\",\n description: \"Show a boolean as text\",\n returns: \"string\",\n accepts: [\"boolean\"],\n args: [\n { name: \"yes\", type: \"string\", optional: true },\n { name: \"no\", type: \"string\", optional: true }\n ],\n fn: (v, a) => (v === true || v === \"true\" || v === 1 ? arg<string>(a, 0) ?? \"Yes\" : arg<string>(a, 1) ?? \"No\")\n },\n upper: { name: \"upper\", description: \"UPPERCASE\", returns: \"string\", fn: (v) => toDisplayString(v).toUpperCase() },\n lower: { name: \"lower\", description: \"lowercase\", returns: \"string\", fn: (v) => toDisplayString(v).toLowerCase() },\n title: {\n name: \"title\",\n description: \"Title Case\",\n returns: \"string\",\n fn: (v) => toDisplayString(v).replace(/\\b\\p{L}/gu, (c) => c.toUpperCase())\n },\n default: {\n name: \"default\",\n description: \"Fallback when the value is empty\",\n returns: \"same\",\n args: [{ name: \"fallback\", type: \"any\" }],\n fn: (v, a) => (isEmptyValue(v) ? a[0] : v)\n },\n join: {\n name: \"join\",\n description: \"Join a list into text\",\n returns: \"string\",\n accepts: [\"array\"],\n args: [{ name: \"separator\", type: \"string\", optional: true }],\n fn: (v, a) => (Array.isArray(v) ? v.map(toDisplayString).join(arg<string>(a, 0) ?? \", \") : toDisplayString(v))\n },\n truncate: {\n name: \"truncate\",\n description: \"Limit length with an ellipsis\",\n returns: \"string\",\n args: [{ name: \"length\", type: \"number\" }],\n fn: (v, a) => {\n const s = toDisplayString(v);\n const n = toNumber(a[0]) ?? 50;\n return s.length > n ? s.slice(0, Math.max(0, n - 1)).trimEnd() + \"…\" : s;\n }\n },\n round: {\n name: \"round\",\n description: \"Round to N decimals\",\n returns: \"number\",\n accepts: [\"number\"],\n args: [{ name: \"decimals\", type: \"number\", optional: true }],\n fn: (v, a) => {\n const n = toNumber(v);\n if (n === null) return v;\n const d = toNumber(a[0]) ?? 0;\n const m = 10 ** d;\n return Math.round(n * m) / m;\n }\n },\n abs: { name: \"abs\", description: \"Absolute value\", returns: \"number\", accepts: [\"number\"], fn: (v) => (toNumber(v) === null ? v : Math.abs(toNumber(v)!)) },\n pluralize: {\n name: \"pluralize\",\n description: \"Choose singular/plural word by count\",\n returns: \"string\",\n args: [\n { name: \"singular\", type: \"string\" },\n { name: \"plural\", type: \"string\" }\n ],\n fn: (v, a) => (toNumber(v) === 1 ? arg<string>(a, 0) ?? \"\" : arg<string>(a, 1) ?? `${arg<string>(a, 0) ?? \"\"}s`)\n },\n length: { name: \"length\", description: \"Number of items or characters\", returns: \"number\", fn: (v) => (Array.isArray(v) ? v.length : toDisplayString(v).length) },\n first: { name: \"first\", description: \"First item\", returns: \"same\", accepts: [\"array\"], fn: (v) => (Array.isArray(v) ? v[0] : v) },\n last: { name: \"last\", description: \"Last item\", returns: \"same\", accepts: [\"array\"], fn: (v) => (Array.isArray(v) ? v[v.length - 1] : v) },\n sortBy: {\n name: \"sortBy\",\n description: \"Sort a list by a field\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [\n { name: \"field\", type: \"string\" },\n { name: \"direction\", type: \"string\", optional: true, description: \"asc or desc\" }\n ],\n fn: (v, a) => {\n if (!Array.isArray(v)) return v;\n const field = arg<string>(a, 0) ?? \"\";\n const dir = (arg<string>(a, 1) ?? \"asc\").toLowerCase() === \"desc\" ? -1 : 1;\n return [...v].sort((x, y) => compareValues(getField(x, field), getField(y, field)) * dir);\n }\n },\n take: {\n name: \"take\",\n description: \"First N items\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [{ name: \"count\", type: \"number\" }],\n fn: (v, a) => (Array.isArray(v) ? v.slice(0, Math.max(0, toNumber(a[0]) ?? 0)) : v)\n },\n filter: {\n name: \"filter\",\n description: \"Keep items whose field equals a value\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [\n { name: \"field\", type: \"string\" },\n { name: \"value\", type: \"any\" }\n ],\n fn: (v, a) => (Array.isArray(v) ? v.filter((x) => looseEquals(getField(x, arg<string>(a, 0) ?? \"\"), a[1])) : v)\n },\n pluck: {\n name: \"pluck\",\n description: \"Extract one field from each item\",\n returns: \"array\",\n accepts: [\"array\"],\n args: [{ name: \"field\", type: \"string\" }],\n fn: (v, a) => (Array.isArray(v) ? v.map((x) => getField(x, arg<string>(a, 0) ?? \"\")) : getField(v, arg<string>(a, 0) ?? \"\"))\n },\n initials: {\n name: \"initials\",\n description: \"Initials of a name\",\n returns: \"string\",\n fn: (v) =>\n toDisplayString(v)\n .split(/\\s+/)\n .filter(Boolean)\n .map((w) => w[0]!.toUpperCase())\n .join(\"\")\n }\n};\n\nexport function getField(obj: unknown, path: string): unknown {\n if (obj === null || obj === undefined) return undefined;\n let cur: unknown = obj;\n for (const part of path.split(\".\")) {\n if (!part) continue;\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n if (!Object.prototype.hasOwnProperty.call(cur, part)) return undefined;\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\nexport function compareValues(a: unknown, b: unknown): number {\n const na = toNumber(a);\n const nb = toNumber(b);\n if (na !== null && nb !== null && typeof a !== \"string\" && typeof b !== \"string\") return na - nb;\n const da = toDate(a);\n const db = toDate(b);\n if (da && db && (a instanceof Date || typeof a === \"string\") && (b instanceof Date || typeof b === \"string\") && /\\d{4}-\\d{2}/.test(String(a))) return da.getTime() - db.getTime();\n const sa = toDisplayString(a);\n const sb = toDisplayString(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n}\n\nexport function looseEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || a === undefined || b === null || b === undefined) return (a ?? null) === (b ?? null);\n if (typeof a === \"number\" || typeof b === \"number\") {\n const na = toNumber(a);\n const nb = toNumber(b);\n if (na !== null && nb !== null) return na === nb;\n }\n if (typeof a === \"boolean\" || typeof b === \"boolean\") return String(a) === String(b);\n return toDisplayString(a) === toDisplayString(b);\n}\n","import type { Expr, PathSegment } from \"./ast.js\";\nimport { parseExpression } from \"./parser.js\";\nimport { PIPES, compareValues, isEmptyValue, looseEquals, toDisplayString, toNumber, type FormatContext } from \"./format.js\";\n\n/**\n * A lexical scope chain. Lookups walk from the innermost scope outwards, so a\n * repeater's `item` shadows a data source called `item` (and we warn about that\n * in validation).\n */\nexport class Scope {\n constructor(\n private readonly vars: Record<string, unknown>,\n private readonly parent?: Scope\n ) {}\n\n lookup(name: string): { found: boolean; value: unknown } {\n if (Object.prototype.hasOwnProperty.call(this.vars, name)) return { found: true, value: this.vars[name] };\n if (this.parent) return this.parent.lookup(name);\n return { found: false, value: undefined };\n }\n\n child(vars: Record<string, unknown>): Scope {\n return new Scope(vars, this);\n }\n\n /** Names visible in this scope (innermost first, deduplicated). */\n names(): string[] {\n const out: string[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let s: Scope | undefined = this;\n while (s) {\n for (const k of Object.keys(s.vars)) if (!out.includes(k)) out.push(k);\n s = s.parent;\n }\n return out;\n }\n}\n\nexport interface EvalContext {\n scope: Scope;\n format: FormatContext;\n /** Optional sink for non-fatal problems encountered during evaluation. */\n onWarning?: (message: string, expr?: string) => void;\n}\n\nconst FUNCTIONS: Record<string, (args: unknown[], ctx: EvalContext) => unknown> = {\n sum: ([list]) => numbers(list).reduce((a, b) => a + b, 0),\n count: ([list]) => (Array.isArray(list) ? list.length : isEmptyValue(list) ? 0 : 1),\n avg: ([list]) => {\n const ns = numbers(list);\n return ns.length ? ns.reduce((a, b) => a + b, 0) / ns.length : null;\n },\n min: ([list, ...rest]) => {\n const ns = rest.length ? numbers([list, ...rest]) : numbers(list);\n return ns.length ? Math.min(...ns) : null;\n },\n max: ([list, ...rest]) => {\n const ns = rest.length ? numbers([list, ...rest]) : numbers(list);\n return ns.length ? Math.max(...ns) : null;\n },\n first: ([list]) => (Array.isArray(list) ? list[0] : list),\n last: ([list]) => (Array.isArray(list) ? list[list.length - 1] : list),\n length: ([v]) => (Array.isArray(v) ? v.length : toDisplayString(v).length),\n coalesce: (args) => args.find((a) => !isEmptyValue(a)) ?? null,\n isEmpty: ([v]) => isEmptyValue(v),\n isNotEmpty: ([v]) => !isEmptyValue(v),\n contains: ([hay, needle]) =>\n Array.isArray(hay) ? hay.some((x) => looseEquals(x, needle)) : toDisplayString(hay).toLowerCase().includes(toDisplayString(needle).toLowerCase()),\n startsWith: ([s, p]) => toDisplayString(s).toLowerCase().startsWith(toDisplayString(p).toLowerCase()),\n endsWith: ([s, p]) => toDisplayString(s).toLowerCase().endsWith(toDisplayString(p).toLowerCase()),\n concat: (args) => args.map(toDisplayString).join(\"\"),\n round: ([v, d]) => {\n const n = toNumber(v);\n if (n === null) return null;\n const m = 10 ** (toNumber(d) ?? 0);\n return Math.round(n * m) / m;\n },\n abs: ([v]) => {\n const n = toNumber(v);\n return n === null ? null : Math.abs(n);\n },\n number: ([v]) => toNumber(v),\n string: ([v]) => toDisplayString(v),\n if: ([c, a, b]) => (truthy(c) ? a : b),\n now: (_args, ctx) => ctx.format.now ?? new Date(),\n year: ([v]) => dateOf(v)?.getFullYear() ?? null,\n daysBetween: ([a, b]) => {\n const da = dateOf(a);\n const db = dateOf(b);\n return da && db ? Math.round((db.getTime() - da.getTime()) / 86_400_000) : null;\n }\n};\n\nexport const FUNCTION_NAMES = Object.keys(FUNCTIONS);\n\nfunction dateOf(v: unknown): Date | null {\n if (v instanceof Date) return v;\n if (typeof v === \"string\" || typeof v === \"number\") {\n const d = new Date(v);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction numbers(list: unknown): number[] {\n if (!Array.isArray(list)) {\n const n = toNumber(list);\n return n === null ? [] : [n];\n }\n const out: number[] = [];\n for (const v of list) {\n const n = toNumber(v);\n if (n !== null) out.push(n);\n }\n return out;\n}\n\nexport function truthy(v: unknown): boolean {\n if (v === null || v === undefined || v === false || v === 0 || v === \"\") return false;\n if (typeof v === \"string\") return ![\"false\", \"no\", \"0\", \"off\"].includes(v.trim().toLowerCase());\n if (Array.isArray(v)) return v.length > 0;\n return true;\n}\n\n/**\n * Safe property access: only own enumerable data properties, never prototype\n * members, never functions, never symbols.\n */\nexport function readProperty(obj: unknown, name: string): unknown {\n if (obj === null || obj === undefined) return undefined;\n if (typeof obj === \"string\" && name === \"length\") return obj.length;\n if (typeof obj !== \"object\") return undefined;\n if (Array.isArray(obj)) {\n if (name === \"length\") return obj.length;\n // Implicit projection: holdings.value → [h.value for h in holdings]\n const projected = obj.map((x) => readProperty(x, name));\n return projected.every((v) => v === undefined) ? undefined : projected;\n }\n if (!Object.prototype.hasOwnProperty.call(obj, name)) return undefined;\n const v = (obj as Record<string, unknown>)[name];\n return typeof v === \"function\" ? undefined : v;\n}\n\nexport function resolvePath(segments: PathSegment[], scope: Scope): { found: boolean; value: unknown } {\n const first = segments[0];\n if (!first || first.kind !== \"prop\") return { found: false, value: undefined };\n const root = scope.lookup(first.name);\n if (!root.found) return { found: false, value: undefined };\n let cur = root.value;\n for (let i = 1; i < segments.length; i++) {\n const seg = segments[i]!;\n if (seg.kind === \"prop\") cur = readProperty(cur, seg.name);\n else cur = Array.isArray(cur) ? cur[seg.index] : undefined;\n if (cur === undefined) return { found: true, value: undefined };\n }\n return { found: true, value: cur };\n}\n\nexport function evaluateAst(e: Expr, ctx: EvalContext): unknown {\n switch (e.kind) {\n case \"literal\":\n return e.value;\n case \"path\": {\n const r = resolvePath(e.segments, ctx.scope);\n return r.value;\n }\n case \"unary\": {\n const v = evaluateAst(e.arg, ctx);\n if (e.op === \"not\") return !truthy(v);\n const n = toNumber(v);\n return n === null ? null : -n;\n }\n case \"binary\":\n return evaluateBinary(e.op, e.left, e.right, ctx);\n case \"conditional\":\n return truthy(evaluateAst(e.test, ctx)) ? evaluateAst(e.then, ctx) : evaluateAst(e.else, ctx);\n case \"call\": {\n const fn = FUNCTIONS[e.name];\n if (!fn) {\n ctx.onWarning?.(`Unknown function \"${e.name}\"`);\n return null;\n }\n return fn(\n e.args.map((a) => evaluateAst(a, ctx)),\n ctx\n );\n }\n case \"pipe\": {\n const input = evaluateAst(e.input, ctx);\n const pipe = PIPES[e.name];\n if (!pipe) {\n ctx.onWarning?.(`Unknown formatter \"${e.name}\"`);\n return input;\n }\n return pipe.fn(\n input,\n e.args.map((a) => evaluateAst(a, ctx)),\n ctx.format\n );\n }\n case \"array\":\n return e.items.map((i) => evaluateAst(i, ctx));\n }\n}\n\nfunction evaluateBinary(op: string, leftE: Expr, rightE: Expr, ctx: EvalContext): unknown {\n if (op === \"and\") return truthy(evaluateAst(leftE, ctx)) ? truthy(evaluateAst(rightE, ctx)) : false;\n if (op === \"or\") return truthy(evaluateAst(leftE, ctx)) ? true : truthy(evaluateAst(rightE, ctx));\n const l = evaluateAst(leftE, ctx);\n const r = evaluateAst(rightE, ctx);\n switch (op) {\n case \"==\":\n return looseEquals(l, r);\n case \"!=\":\n return !looseEquals(l, r);\n case \"<\":\n return compareOrNull(l, r, (c) => c < 0);\n case \"<=\":\n return compareOrNull(l, r, (c) => c <= 0);\n case \">\":\n return compareOrNull(l, r, (c) => c > 0);\n case \">=\":\n return compareOrNull(l, r, (c) => c >= 0);\n case \"in\":\n return Array.isArray(r) ? r.some((x) => looseEquals(x, l)) : toDisplayString(r).includes(toDisplayString(l));\n case \"+\": {\n const nl = toNumber(l);\n const nr = toNumber(r);\n if (nl !== null && nr !== null && typeof l !== \"string\" && typeof r !== \"string\") return nl + nr;\n if (typeof l === \"string\" || typeof r === \"string\") return toDisplayString(l) + toDisplayString(r);\n return nl !== null && nr !== null ? nl + nr : null;\n }\n case \"-\":\n case \"*\":\n case \"/\":\n case \"%\": {\n const nl = toNumber(l);\n const nr = toNumber(r);\n if (nl === null || nr === null) return null;\n if (op === \"-\") return nl - nr;\n if (op === \"*\") return nl * nr;\n if (op === \"/\") return nr === 0 ? null : nl / nr;\n return nr === 0 ? null : nl % nr;\n }\n }\n return null;\n}\n\nfunction compareOrNull(l: unknown, r: unknown, test: (c: number) => boolean): boolean {\n if (l === null || l === undefined || r === null || r === undefined) return false;\n return test(compareValues(l, r));\n}\n\n/** Evaluates an expression string in a scope. Never throws for runtime data problems. */\nexport function evaluate(src: string, ctx: EvalContext): unknown {\n return evaluateAst(parseExpression(src), ctx);\n}\n\n/** Evaluates to a boolean using report truthiness rules. */\nexport function evaluateCondition(src: string, ctx: EvalContext): boolean {\n return truthy(evaluate(src, ctx));\n}\n\n/** Evaluates to display text. */\nexport function evaluateText(src: string, ctx: EvalContext): string {\n return toDisplayString(evaluate(src, ctx));\n}\n\nexport interface TemplateSegment {\n kind: \"text\" | \"token\";\n text: string;\n /** Present for tokens: the expression source. */\n expr?: string;\n}\n\n/** Splits `Hello {{ client.firstName }}` into text/token segments. */\nexport function splitTemplate(template: string): TemplateSegment[] {\n const out: TemplateSegment[] = [];\n const re = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(template))) {\n if (m.index > last) out.push({ kind: \"text\", text: template.slice(last, m.index) });\n out.push({ kind: \"token\", text: m[0], expr: m[1]! });\n last = m.index + m[0].length;\n }\n if (last < template.length) out.push({ kind: \"text\", text: template.slice(last) });\n return out;\n}\n\n/** Interpolates `{{ expr }}` tokens in a string. */\nexport function interpolate(template: string, ctx: EvalContext): string {\n if (!template.includes(\"{{\")) return template;\n return splitTemplate(template)\n .map((s) => {\n if (s.kind === \"text\") return s.text;\n try {\n return evaluateText(s.expr!, ctx);\n } catch {\n ctx.onWarning?.(`Invalid expression \"${s.expr}\"`, s.expr);\n return \"\";\n }\n })\n .join(\"\");\n}\n","import type { Expr, PathSegment } from \"./ast.js\";\nimport { pathToString } from \"./ast.js\";\nimport { parseExpression, ExpressionError } from \"./parser.js\";\nimport { PIPES } from \"./format.js\";\nimport { FUNCTION_NAMES } from \"./evaluate.js\";\nimport type { DataSource, FieldSchema, FieldType } from \"../types/data.js\";\n\nexport type ValueType = FieldType | \"any\" | \"null\" | \"unknown\";\n\nexport interface TypeIssue {\n code: \"unknown-root\" | \"unknown-field\" | \"unknown-pipe\" | \"unknown-function\" | \"syntax\" | \"type-mismatch\" | \"not-a-list\" | \"not-an-object\";\n message: string;\n /** Character offset when known. */\n position?: number;\n}\n\nexport interface TypeResult {\n type: ValueType;\n schema?: FieldSchema;\n issues: TypeIssue[];\n}\n\n/**\n * A static scope describing what names are visible and their schemas.\n * Mirrors the runtime `Scope` chain.\n */\nexport class SchemaScope {\n constructor(\n private readonly vars: Record<string, FieldSchema>,\n private readonly parent?: SchemaScope\n ) {}\n\n lookup(name: string): FieldSchema | undefined {\n if (Object.prototype.hasOwnProperty.call(this.vars, name)) return this.vars[name];\n return this.parent?.lookup(name);\n }\n\n child(vars: Record<string, FieldSchema>): SchemaScope {\n return new SchemaScope(vars, this);\n }\n\n entries(): Array<{ name: string; schema: FieldSchema; depth: number }> {\n const out: Array<{ name: string; schema: FieldSchema; depth: number }> = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let s: SchemaScope | undefined = this;\n let depth = 0;\n while (s) {\n for (const [name, schema] of Object.entries(s.vars)) if (!out.some((e) => e.name === name)) out.push({ name, schema, depth });\n s = s.parent;\n depth++;\n }\n return out;\n }\n}\n\nexport const GLOBAL_SCHEMAS: Record<string, FieldSchema> = {\n page: {\n type: \"object\",\n label: \"Page\",\n fields: {\n number: { type: \"number\", label: \"Page number\" },\n total: { type: \"number\", label: \"Total pages\" }\n }\n },\n now: { type: \"datetime\", label: \"Generated at\" },\n theme: {\n type: \"object\",\n label: \"Theme\",\n fields: {\n name: { type: \"string\", label: \"Theme name\" },\n logo: { type: \"image\", label: \"Logo\" },\n colors: { type: \"object\", label: \"Colours\", fields: {} },\n typography: { type: \"object\", label: \"Typography\", fields: {} },\n meta: { type: \"object\", label: \"Brand details\", fields: {} }\n }\n }\n};\n\nexport function dataSourceSchemas(sources: DataSource[]): Record<string, FieldSchema> {\n const out: Record<string, FieldSchema> = {};\n for (const s of sources) out[s.id] = { type: \"object\", label: s.label, description: s.description, fields: s.schema };\n return out;\n}\n\nexport function createSchemaScope(sources: DataSource[], extraGlobals: Record<string, FieldSchema> = {}): SchemaScope {\n return new SchemaScope({ ...GLOBAL_SCHEMAS, ...extraGlobals }).child(dataSourceSchemas(sources));\n}\n\n/** Resolves a path through a schema scope, returning the field schema when known. */\nexport function resolvePathSchema(segments: PathSegment[], scope: SchemaScope): { schema?: FieldSchema; issue?: TypeIssue } {\n const first = segments[0];\n if (!first || first.kind !== \"prop\") return { issue: { code: \"unknown-root\", message: \"Expression must start with a name\" } };\n const root = scope.lookup(first.name);\n if (!root) return { issue: { code: \"unknown-root\", message: `Unknown data source or variable \"${first.name}\"` } };\n let cur: FieldSchema = root;\n let projected = false;\n for (let i = 1; i < segments.length; i++) {\n const seg = segments[i]!;\n const soFar = pathToString(segments.slice(0, i));\n if (seg.kind === \"index\") {\n if (cur.type !== \"array\") return { issue: { code: \"not-a-list\", message: `\"${soFar}\" is not a list and cannot be indexed` } };\n cur = cur.itemSchema ?? { type: \"any\" as FieldType };\n continue;\n }\n if (cur.type === \"array\") {\n // Implicit projection over a list: holdings.value\n if (!cur.itemSchema) return { schema: { type: \"array\" } };\n if (cur.itemSchema.type !== \"object\" || !cur.itemSchema.fields) return { issue: { code: \"not-an-object\", message: `Items of \"${soFar}\" have no field \"${seg.name}\"` } };\n const f: FieldSchema | undefined = cur.itemSchema.fields[seg.name];\n if (!f) return { issue: { code: \"unknown-field\", message: `Items of \"${soFar}\" have no field \"${seg.name}\"` } };\n projected = true;\n cur = { type: \"array\", itemSchema: f, label: f.label };\n continue;\n }\n if ((cur.type as string) === \"any\") return { schema: { type: \"any\" as FieldType } };\n if (cur.type !== \"object\") return { issue: { code: \"not-an-object\", message: `\"${soFar}\" is a ${cur.type} and has no field \"${seg.name}\"` } };\n if (cur.fields && Object.keys(cur.fields).length === 0 && [\"colors\", \"typography\", \"meta\"].includes(segments[i - 1]!.kind === \"prop\" ? (segments[i - 1] as { name: string }).name : \"\")) {\n // Open theme objects: any key is allowed.\n return { schema: { type: \"string\" } };\n }\n const f: FieldSchema | undefined = cur.fields?.[seg.name];\n if (!f) return { issue: { code: \"unknown-field\", message: `\"${soFar}\" has no field \"${seg.name}\"` } };\n cur = f;\n }\n void projected;\n return { schema: cur };\n}\n\nfunction typeOfSchema(s: FieldSchema | undefined): ValueType {\n return (s?.type as ValueType) ?? \"unknown\";\n}\n\n/** Statically type-checks an expression against a schema scope. */\nexport function typeCheckAst(e: Expr, scope: SchemaScope): TypeResult {\n const issues: TypeIssue[] = [];\n const type = check(e, scope, issues);\n return { type: type.type, schema: type.schema, issues };\n}\n\nfunction check(e: Expr, scope: SchemaScope, issues: TypeIssue[]): { type: ValueType; schema?: FieldSchema } {\n switch (e.kind) {\n case \"literal\":\n return { type: e.value === null ? \"null\" : (typeof e.value as ValueType) };\n case \"path\": {\n const r = resolvePathSchema(e.segments, scope);\n if (r.issue) {\n issues.push(r.issue);\n return { type: \"unknown\" };\n }\n return { type: typeOfSchema(r.schema), schema: r.schema };\n }\n case \"unary\": {\n const t = check(e.arg, scope, issues);\n return { type: e.op === \"not\" ? \"boolean\" : t.type === \"unknown\" ? \"unknown\" : \"number\" };\n }\n case \"binary\": {\n const l = check(e.left, scope, issues);\n const r = check(e.right, scope, issues);\n switch (e.op) {\n case \"and\":\n case \"or\":\n case \"==\":\n case \"!=\":\n case \"<\":\n case \"<=\":\n case \">\":\n case \">=\":\n case \"in\":\n return { type: \"boolean\" };\n case \"+\":\n return { type: l.type === \"string\" || r.type === \"string\" ? \"string\" : \"number\" };\n default:\n return { type: \"number\" };\n }\n }\n case \"conditional\": {\n check(e.test, scope, issues);\n const a = check(e.then, scope, issues);\n check(e.else, scope, issues);\n return a;\n }\n case \"call\": {\n if (!FUNCTION_NAMES.includes(e.name)) issues.push({ code: \"unknown-function\", message: `Unknown function \"${e.name}\"` });\n for (const a of e.args) check(a, scope, issues);\n const numeric = [\"sum\", \"count\", \"avg\", \"min\", \"max\", \"length\", \"round\", \"abs\", \"number\", \"year\", \"daysBetween\"];\n if (numeric.includes(e.name)) return { type: \"number\" };\n if ([\"isEmpty\", \"isNotEmpty\", \"contains\", \"startsWith\", \"endsWith\"].includes(e.name)) return { type: \"boolean\" };\n if ([\"concat\", \"string\"].includes(e.name)) return { type: \"string\" };\n if (e.name === \"now\") return { type: \"datetime\" };\n if ([\"first\", \"last\"].includes(e.name) && e.args[0]) {\n const t = check(e.args[0], scope, issues);\n return t.schema?.type === \"array\" ? { type: typeOfSchema(t.schema.itemSchema), schema: t.schema.itemSchema } : t;\n }\n return { type: \"any\" };\n }\n case \"pipe\": {\n const input = check(e.input, scope, issues);\n for (const a of e.args) check(a, scope, issues);\n const def = PIPES[e.name];\n if (!def) {\n issues.push({ code: \"unknown-pipe\", message: `Unknown formatter \"${e.name}\"` });\n return input;\n }\n if (def.returns === \"same\") return input;\n if (def.returns === \"array\") return { type: \"array\", schema: input.schema?.type === \"array\" ? input.schema : undefined };\n if (def.accepts && input.type !== \"unknown\" && input.type !== \"any\" && input.type !== \"null\" && !def.accepts.includes(input.type)) {\n const compat = (def.accepts.includes(\"number\") && (input.type === \"currency\" || input.type === \"percent\")) || (def.accepts.includes(\"array\") && input.type === \"array\");\n if (!compat) issues.push({ code: \"type-mismatch\", message: `Formatter \"${e.name}\" expects ${def.accepts.join(\" or \")} but received ${input.type}` });\n }\n return { type: def.returns };\n }\n case \"array\":\n for (const i of e.items) check(i, scope, issues);\n return { type: \"array\" };\n }\n}\n\n/** Parses and type-checks an expression string. Syntax errors are returned as issues. */\nexport function typeCheck(src: string, scope: SchemaScope): TypeResult {\n try {\n return typeCheckAst(parseExpression(src), scope);\n } catch (err) {\n const pos = err instanceof ExpressionError ? err.position : undefined;\n return { type: \"unknown\", issues: [{ code: \"syntax\", message: (err as Error).message, position: pos }] };\n }\n}\n","import type { Condition, ConditionGroup, ConditionRule } from \"../types/template.js\";\n\n/**\n * Compiles a structured condition (built by the UI) to expression source.\n * Raw string conditions are returned unchanged.\n */\nexport function compileCondition(condition: Condition | undefined): string | null {\n if (condition === undefined || condition === null) return null;\n if (typeof condition === \"string\") return condition.trim() || null;\n const src = compileGroup(condition);\n return src || null;\n}\n\nfunction compileGroup(group: ConditionGroup): string {\n const parts = group.rules\n .map((r) => (\"op\" in r ? compileGroup(r) : compileRule(r)))\n .filter((s): s is string => !!s);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0]!;\n return parts.map((p) => `(${p})`).join(group.op === \"and\" ? \" and \" : \" or \");\n}\n\nfunction literal(v: ConditionRule[\"right\"]): string {\n if (v === null || v === undefined) return \"null\";\n if (typeof v === \"string\") {\n const m = /^\\{\\{\\s*(.+?)\\s*\\}\\}$/.exec(v);\n if (m) return m[1]!;\n return JSON.stringify(v);\n }\n return String(v);\n}\n\nfunction compileRule(rule: ConditionRule): string {\n const left = rule.left.trim();\n if (!left) return \"\";\n switch (rule.operator) {\n case \"eq\":\n return `${left} == ${literal(rule.right)}`;\n case \"neq\":\n return `${left} != ${literal(rule.right)}`;\n case \"gt\":\n return `${left} > ${literal(rule.right)}`;\n case \"gte\":\n return `${left} >= ${literal(rule.right)}`;\n case \"lt\":\n return `${left} < ${literal(rule.right)}`;\n case \"lte\":\n return `${left} <= ${literal(rule.right)}`;\n case \"contains\":\n return `contains(${left}, ${literal(rule.right)})`;\n case \"startsWith\":\n return `startsWith(${left}, ${literal(rule.right)})`;\n case \"endsWith\":\n return `endsWith(${left}, ${literal(rule.right)})`;\n case \"in\":\n return `${left} in ${Array.isArray(rule.right) ? JSON.stringify(rule.right) : literal(rule.right)}`;\n case \"isEmpty\":\n return `isEmpty(${left})`;\n case \"isNotEmpty\":\n return `isNotEmpty(${left})`;\n case \"isTrue\":\n return `${left} == true`;\n case \"isFalse\":\n return `not ${left}`;\n }\n}\n\nexport const CONDITION_OPERATORS: Array<{ value: ConditionRule[\"operator\"]; label: string; needsValue: boolean; types?: string[] }> = [\n { value: \"eq\", label: \"equals\", needsValue: true },\n { value: \"neq\", label: \"does not equal\", needsValue: true },\n { value: \"gt\", label: \"is greater than\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"gte\", label: \"is at least\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"lt\", label: \"is less than\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"lte\", label: \"is at most\", needsValue: true, types: [\"number\", \"currency\", \"percent\", \"date\", \"datetime\"] },\n { value: \"contains\", label: \"contains\", needsValue: true, types: [\"string\", \"array\"] },\n { value: \"startsWith\", label: \"starts with\", needsValue: true, types: [\"string\"] },\n { value: \"endsWith\", label: \"ends with\", needsValue: true, types: [\"string\"] },\n { value: \"isEmpty\", label: \"is empty\", needsValue: false },\n { value: \"isNotEmpty\", label: \"is not empty\", needsValue: false },\n { value: \"isTrue\", label: \"is true\", needsValue: false, types: [\"boolean\"] },\n { value: \"isFalse\", label: \"is false\", needsValue: false, types: [\"boolean\"] }\n];\n","import type { Theme } from \"../types/theme.js\";\nimport type { DocumentStyles } from \"../types/template.js\";\n\n/** The built-in fallback theme. Any missing host theme value falls back to this. */\nexport const DEFAULT_THEME: Theme = {\n id: \"default\",\n name: \"Default\",\n typography: {\n headingFont: \"Inter, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n bodyFont: \"Inter, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n monoFont: \"'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n baseFontSize: 11,\n headingScale: 1.25,\n headingWeight: 600,\n bodyWeight: 400,\n lineHeight: 1.5,\n headingLetterSpacing: -0.01\n },\n colors: {\n primary: \"#1F3A5F\",\n secondary: \"#4A6FA5\",\n accent: \"#E0B04B\",\n text: \"#1A1D21\",\n mutedText: \"#6B7280\",\n surface: \"#FFFFFF\",\n background: \"#F5F6F8\",\n border: \"#E2E5EA\",\n success: \"#1E8E5A\",\n warning: \"#C77D0A\",\n danger: \"#C0392B\",\n chart: [\"#1F3A5F\", \"#4A6FA5\", \"#E0B04B\", \"#7FB3D5\", \"#A9CCE3\", \"#F4D03F\", \"#6C7A89\", \"#B0BEC5\"]\n },\n radius: 6,\n table: {\n headerBackground: \"#F3F4F6\",\n headerColor: \"#1A1D21\",\n zebraBackground: \"#FAFAFB\",\n borderColor: \"#E2E5EA\"\n }\n};\n\n/** Document styles used by `createTemplate()`. Everything references theme tokens. */\nexport function defaultDocumentStyles(): DocumentStyles {\n return {\n text: {\n h1: { fontFamily: \"$typography.headingFont\", fontSize: 26, fontWeight: 600, lineHeight: 1.2, letterSpacing: -0.02, color: \"$colors.primary\", marginTop: 0, marginBottom: 8, keepWithNext: true },\n h2: { fontFamily: \"$typography.headingFont\", fontSize: 18, fontWeight: 600, lineHeight: 1.25, letterSpacing: -0.01, color: \"$colors.primary\", marginTop: 12, marginBottom: 6, keepWithNext: true },\n h3: { fontFamily: \"$typography.headingFont\", fontSize: 14, fontWeight: 600, lineHeight: 1.3, color: \"$colors.text\", marginTop: 8, marginBottom: 4, keepWithNext: true },\n h4: { fontFamily: \"$typography.headingFont\", fontSize: 12, fontWeight: 600, lineHeight: 1.35, color: \"$colors.text\", textTransform: \"uppercase\", letterSpacing: 0.04, marginTop: 8, marginBottom: 4, keepWithNext: true },\n body: { fontFamily: \"$typography.bodyFont\", fontSize: 11, fontWeight: 400, lineHeight: 1.5, color: \"$colors.text\", marginTop: 0, marginBottom: 0 },\n lead: { fontFamily: \"$typography.bodyFont\", fontSize: 13, fontWeight: 400, lineHeight: 1.55, color: \"$colors.text\", marginTop: 0, marginBottom: 0 },\n caption: { fontFamily: \"$typography.bodyFont\", fontSize: 9, fontWeight: 400, lineHeight: 1.4, color: \"$colors.mutedText\", marginTop: 0, marginBottom: 0 },\n small: { fontFamily: \"$typography.bodyFont\", fontSize: 8, fontWeight: 400, lineHeight: 1.4, color: \"$colors.mutedText\", marginTop: 0, marginBottom: 0 }\n },\n table: {\n fontSize: 10,\n headerBackground: \"$table.headerBackground\",\n headerColor: \"$table.headerColor\",\n headerFontWeight: 600,\n borderColor: \"$table.borderColor\",\n borderWidth: 1,\n borders: \"horizontal\",\n zebraBackground: \"$table.zebraBackground\",\n cellPaddingX: 8,\n cellPaddingY: 6\n },\n card: {\n background: \"$colors.surface\",\n borderColor: \"$colors.border\",\n borderWidth: 1,\n borderRadius: 6,\n padding: 16,\n shadow: false\n },\n link: { color: \"$colors.secondary\", underline: true },\n spacing: { blockGap: 8, sectionPadding: 0, columnGap: 16 }\n };\n}\n","import type { Theme } from \"../types/theme.js\";\nimport { DEFAULT_THEME } from \"./default-theme.js\";\n\nexport function isTokenRef(value: unknown): value is `$${string}` {\n return typeof value === \"string\" && value.startsWith(\"$\") && value.length > 1;\n}\n\n/**\n * Resolves a theme token such as `$colors.primary`, `$typography.headingFont`,\n * `$table.headerBackground` or `$logo`. Returns `undefined` when the token does\n * not exist in either the theme or the default theme.\n */\nexport function resolveToken(token: string, theme: Theme): string | undefined {\n const path = token.slice(1).split(\".\");\n const fromTheme = walk(theme, path);\n if (typeof fromTheme === \"string\") return fromTheme;\n const fromDefault = walk(DEFAULT_THEME, path);\n return typeof fromDefault === \"string\" ? fromDefault : undefined;\n}\n\nfunction walk(obj: unknown, path: string[]): unknown {\n let cur: unknown = obj;\n for (const p of path) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n if (!Object.prototype.hasOwnProperty.call(cur, p)) return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\n/** Returns a concrete value: token references resolved, literals passed through. */\nexport function resolveValue(value: string | undefined, theme: Theme, fallback: string): string {\n if (value === undefined || value === null || value === \"\") return fallback;\n if (isTokenRef(value)) return resolveToken(value, theme) ?? fallback;\n return value;\n}\n\nexport interface ThemeTokenInfo {\n token: `$${string}`;\n label: string;\n value: string;\n group: \"colors\" | \"typography\" | \"table\" | \"brand\";\n}\n\n/** Every token a theme exposes, for pickers in the editor. */\nexport function listThemeTokens(theme: Theme): ThemeTokenInfo[] {\n const merged: Theme = mergeTheme(theme);\n const out: ThemeTokenInfo[] = [];\n for (const [k, v] of Object.entries(merged.colors)) if (typeof v === \"string\") out.push({ token: `$colors.${k}`, label: humanize(k), value: v, group: \"colors\" });\n for (const [k, v] of Object.entries(merged.typography)) if (typeof v === \"string\") out.push({ token: `$typography.${k}`, label: humanize(k), value: v, group: \"typography\" });\n for (const [k, v] of Object.entries(merged.table ?? {})) if (typeof v === \"string\") out.push({ token: `$table.${k}`, label: humanize(k), value: v, group: \"table\" });\n if (merged.logo) out.push({ token: \"$logo\", label: \"Logo\", value: merged.logo, group: \"brand\" });\n if (merged.logoDark) out.push({ token: \"$logoDark\", label: \"Logo (dark)\", value: merged.logoDark, group: \"brand\" });\n return out;\n}\n\nexport function humanize(key: string): string {\n return key.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/^./, (c) => c.toUpperCase());\n}\n\n/** Merges a partial host theme over the default theme so every value is present. */\nexport function mergeTheme(theme: Partial<Theme> | undefined): Theme {\n if (!theme) return DEFAULT_THEME;\n return {\n ...DEFAULT_THEME,\n ...theme,\n typography: { ...DEFAULT_THEME.typography, ...(theme.typography ?? {}) },\n colors: { ...DEFAULT_THEME.colors, ...(theme.colors ?? {}), chart: theme.colors?.chart?.length ? theme.colors.chart : DEFAULT_THEME.colors.chart },\n table: { ...DEFAULT_THEME.table, ...(theme.table ?? {}) },\n fonts: theme.fonts ?? [],\n meta: theme.meta ?? {}\n };\n}\n\n/** Reports which theme values the host left undefined (validation warning source). */\nexport function missingThemeValues(theme: Partial<Theme>): string[] {\n const missing: string[] = [];\n const required: Array<keyof Theme[\"colors\"]> = [\"primary\", \"secondary\", \"accent\", \"text\", \"mutedText\", \"surface\", \"background\", \"border\"];\n for (const k of required) if (!theme.colors?.[k]) missing.push(`colors.${k}`);\n if (!theme.typography?.headingFont) missing.push(\"typography.headingFont\");\n if (!theme.typography?.bodyFont) missing.push(\"typography.bodyFont\");\n return missing;\n}\n\n/** Simple relative-luminance check used to pick readable text on coloured surfaces. */\nexport function isDarkColor(hex: string): boolean {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) return false;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n const lum = 0.2126 * srgb(r) + 0.7152 * srgb(g) + 0.0722 * srgb(b);\n return lum < 0.4;\n}\n\nfunction srgb(c: number): number {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;\n}\n\n/**\n * What to call a text style where a person will read it.\n *\n * The ids are the contract — `h1` is what a template stores and what a block\n * references — but nobody thinks in `h1`. The inspector already spelled these\n * out inline in one place; naming them once means the style dropdown, the\n * document panel and the block inspector cannot drift apart. An id the built-in\n * set does not know about is humanised rather than guessed at, so a host that\n * adds `pullQuote` gets \"Pull quote\" instead of \"Heading ullQuote\".\n */\nconst TEXT_STYLE_NAMES: Record<string, string> = {\n h1: \"Heading 1\",\n h2: \"Heading 2\",\n h3: \"Heading 3\",\n h4: \"Heading 4\",\n h5: \"Heading 5\",\n h6: \"Heading 6\",\n body: \"Body text\",\n lead: \"Lead paragraph\",\n caption: \"Caption\",\n small: \"Small print\"\n};\n\nexport function textStyleLabel(id: string): string {\n return TEXT_STYLE_NAMES[id] ?? humanize(id);\n}\n","import type { BlockStyle, ResolvedStyle, Spacing } from \"../types/style.js\";\nimport type { DocumentStyles, TextStyle } from \"../types/template.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport { resolveValue } from \"./tokens.js\";\n\nexport interface StyleCascadeInput {\n theme: Theme;\n styles: DocumentStyles;\n /** Document text style to inherit from. Defaults to \"body\". */\n textStyle?: string;\n /** Block definition defaults (lowest priority above document styles). */\n defaults?: BlockStyle;\n /** Instance overrides (highest priority). */\n overrides?: BlockStyle;\n /** When false, instance overrides are ignored (host permission). */\n allowOverrides?: boolean;\n}\n\nfunction spacing(base: Required<Spacing>, ...layers: Array<Spacing | undefined>): Required<Spacing> {\n const out = { ...base };\n for (const l of layers) {\n if (!l) continue;\n if (l.top !== undefined) out.top = l.top;\n if (l.right !== undefined) out.right = l.right;\n if (l.bottom !== undefined) out.bottom = l.bottom;\n if (l.left !== undefined) out.left = l.left;\n }\n return out;\n}\n\n/**\n * Resolves the style cascade for one block:\n * theme defaults → document text style → block definition defaults → instance overrides.\n * Output contains only concrete values; renderers never see tokens.\n */\nexport function resolveStyle(input: StyleCascadeInput): ResolvedStyle {\n const { theme, styles } = input;\n const text: TextStyle = styles.text[input.textStyle ?? \"body\"] ?? styles.text.body ?? {};\n const d = input.defaults ?? {};\n const o = input.allowOverrides === false ? {} : input.overrides ?? {};\n\n const typo = theme.typography;\n const fontFamily = resolveValue(o.fontFamily ?? d.fontFamily ?? text.fontFamily, theme, typo.bodyFont);\n const fontSize = o.fontSize ?? d.fontSize ?? text.fontSize ?? typo.baseFontSize ?? 11;\n const fontWeight = o.fontWeight ?? d.fontWeight ?? text.fontWeight ?? typo.bodyWeight ?? 400;\n const lineHeight = o.lineHeight ?? d.lineHeight ?? text.lineHeight ?? typo.lineHeight ?? 1.5;\n\n const border = o.border || d.border\n ? {\n width: o.border?.width ?? d.border?.width ?? 1,\n style: o.border?.style ?? d.border?.style ?? \"solid\",\n color: resolveValue(o.border?.color ?? d.border?.color, theme, theme.colors.border),\n radius: o.border?.radius ?? d.border?.radius ?? 0,\n sides: o.border?.sides ?? d.border?.sides ?? [\"top\", \"right\", \"bottom\", \"left\"]\n }\n : undefined;\n\n const background = resolveOptional(o.background ?? d.background, theme);\n\n return {\n fontFamily,\n fontSize,\n fontWeight,\n fontStyle: o.fontStyle ?? d.fontStyle ?? text.fontStyle ?? \"normal\",\n lineHeight,\n letterSpacing: o.letterSpacing ?? d.letterSpacing ?? text.letterSpacing ?? 0,\n textTransform: o.textTransform ?? d.textTransform ?? text.textTransform ?? \"none\",\n textAlign: o.textAlign ?? d.textAlign ?? \"left\",\n verticalAlign: o.verticalAlign ?? d.verticalAlign ?? \"top\",\n color: resolveValue(o.color ?? d.color ?? text.color, theme, theme.colors.text),\n background,\n padding: spacing({ top: 0, right: 0, bottom: 0, left: 0 }, d.padding, o.padding),\n margin: spacing({ top: text.marginTop ?? 0, right: 0, bottom: text.marginBottom ?? 0, left: 0 }, d.margin, o.margin),\n border,\n width: o.width ?? d.width,\n height: o.height ?? d.height,\n align: o.align ?? d.align,\n opacity: o.opacity ?? d.opacity\n };\n}\n\nfunction resolveOptional(value: string | undefined, theme: Theme): string | undefined {\n if (!value || value === \"transparent\" || value === \"none\") return undefined;\n return resolveValue(value, theme, \"\");\n}\n\n/** Converts a resolved style to inline CSS declarations (used by every renderer). */\nexport function styleToCss(s: ResolvedStyle, opts: { text?: boolean; box?: boolean } = { text: true, box: true }): Record<string, string> {\n const css: Record<string, string> = {};\n if (opts.text !== false) {\n css[\"font-family\"] = s.fontFamily;\n css[\"font-size\"] = `${s.fontSize}px`;\n css[\"font-weight\"] = String(s.fontWeight);\n css[\"font-style\"] = s.fontStyle;\n css[\"line-height\"] = String(s.lineHeight);\n if (s.letterSpacing) css[\"letter-spacing\"] = `${s.letterSpacing}em`;\n if (s.textTransform !== \"none\") css[\"text-transform\"] = s.textTransform;\n css[\"text-align\"] = s.textAlign;\n css[\"color\"] = s.color;\n }\n if (opts.box !== false) {\n if (s.background) css[\"background\"] = s.background;\n const p = s.padding;\n if (p.top || p.right || p.bottom || p.left) css[\"padding\"] = `${p.top}px ${p.right}px ${p.bottom}px ${p.left}px`;\n const m = s.margin;\n if (m.top || m.right || m.bottom || m.left) css[\"margin\"] = `${m.top}px ${m.right}px ${m.bottom}px ${m.left}px`;\n if (s.border && s.border.width > 0 && s.border.style !== \"none\") {\n const decl = `${s.border.width}px ${s.border.style} ${s.border.color}`;\n if (s.border.sides.length === 4) css[\"border\"] = decl;\n else for (const side of s.border.sides) css[`border-${side}`] = decl;\n }\n if (s.border?.radius) css[\"border-radius\"] = `${s.border.radius}px`;\n if (s.width !== undefined) css[\"width\"] = typeof s.width === \"number\" ? `${s.width}px` : s.width;\n if (s.height !== undefined) css[\"height\"] = `${s.height}px`;\n if (s.opacity !== undefined && s.opacity < 1) css[\"opacity\"] = String(s.opacity);\n }\n return css;\n}\n\nexport function cssText(css: Record<string, string | number | undefined>): string {\n return Object.entries(css)\n .filter(([, v]) => v !== undefined && v !== \"\")\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n}\n","/**\n * A tiny virtual node model. Block renderers return VNodes so the same render\n * code produces DOM in the editor, DOM in the preview, DOM in the PDF service,\n * and HTML strings in tests — without any framework.\n */\n\nexport type VChild = VNode | string | number | null | undefined | false | VChild[];\n\nexport interface VNode {\n tag: string;\n props: VProps;\n children: Array<VNode | string>;\n /** \"svg\" for SVG namespace elements. Inferred from the tag when omitted. */\n ns?: \"svg\";\n}\n\nexport interface VProps {\n class?: string | Array<string | false | null | undefined>;\n style?: string | Record<string, string | number | undefined>;\n /** Data attributes are passed as `data-*` keys. */\n [attr: string]: string | number | boolean | undefined | null | Array<string | false | null | undefined> | Record<string, string | number | undefined>;\n}\n\nconst SVG_TAGS = new Set([\n \"svg\", \"g\", \"path\", \"rect\", \"circle\", \"ellipse\", \"line\", \"polyline\", \"polygon\", \"text\", \"tspan\", \"defs\", \"clipPath\", \"linearGradient\", \"radialGradient\", \"stop\", \"use\", \"symbol\", \"mask\", \"pattern\", \"title\", \"desc\", \"foreignObject\"\n]);\n\nexport function h(tag: string, props?: VProps | null, ...children: VChild[]): VNode {\n const node: VNode = { tag, props: props ?? {}, children: [] };\n if (SVG_TAGS.has(tag)) node.ns = \"svg\";\n appendChildren(node.children, children);\n return node;\n}\n\nfunction appendChildren(out: Array<VNode | string>, children: VChild[]) {\n for (const c of children) {\n if (c === null || c === undefined || c === false || c === \"\") continue;\n if (Array.isArray(c)) appendChildren(out, c);\n else if (typeof c === \"number\") out.push(String(c));\n else out.push(c);\n }\n}\n\nexport function isVNode(v: unknown): v is VNode {\n return !!v && typeof v === \"object\" && typeof (v as VNode).tag === \"string\" && Array.isArray((v as VNode).children);\n}\n\nexport function classNames(value: VProps[\"class\"]): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n return value.filter(Boolean).join(\" \");\n}\n\nexport function styleString(value: VProps[\"style\"]): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n return Object.entries(value)\n .filter(([, v]) => v !== undefined && v !== \"\" && v !== null)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n}\n\nconst ESC: Record<string, string> = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" };\nexport function escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nconst VOID = new Set([\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"link\", \"meta\", \"source\", \"track\", \"wbr\"]);\n\n/** Serialises a VNode tree to an HTML string. Attribute values are always escaped. */\nexport function toHtml(node: VNode | string | Array<VNode | string>): string {\n if (Array.isArray(node)) return node.map(toHtml).join(\"\");\n if (typeof node === \"string\") return escapeHtml(node);\n const attrs: string[] = [];\n for (const [k, v] of Object.entries(node.props)) {\n if (v === undefined || v === null || v === false) continue;\n if (k === \"class\") {\n const c = classNames(v as VProps[\"class\"]);\n if (c) attrs.push(`class=\"${escapeHtml(c)}\"`);\n } else if (k === \"style\") {\n const s = styleString(v as VProps[\"style\"]);\n if (s) attrs.push(`style=\"${escapeHtml(s)}\"`);\n } else if (v === true) attrs.push(escapeHtml(k));\n else attrs.push(`${escapeHtml(k)}=\"${escapeHtml(String(v))}\"`);\n }\n const open = `<${node.tag}${attrs.length ? \" \" + attrs.join(\" \") : \"\"}>`;\n if (VOID.has(node.tag)) return open;\n return `${open}${node.children.map(toHtml).join(\"\")}</${node.tag}>`;\n}\n\n/** Depth-first walk. Return false from the visitor to stop descending. */\nexport function walkVNodes(node: VNode, visit: (n: VNode) => boolean | void): void {\n if (visit(node) === false) return;\n for (const c of node.children) if (typeof c !== \"string\") walkVNodes(c, visit);\n}\n","import type { BlockStyle, ResolvedStyle } from \"../types/style.js\";\nimport type { DocumentStyles, FlowOptions, Node } from \"../types/template.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { DataSource, FieldSchema, FieldType, PageContext } from \"../types/data.js\";\nimport type { VChild, VNode, VProps, h as hyperscript } from \"../vnode/h.js\";\nimport type { FormatContext } from \"../expr/format.js\";\nimport type { SchemaScope } from \"../expr/typecheck.js\";\nimport type { ResolvedNode } from \"../resolve/resolved.js\";\nimport type { Scope } from \"../expr/evaluate.js\";\nimport type { Issue } from \"../validate/issues.js\";\n\nexport type BlockCategory = \"content\" | \"layout\" | \"data\" | \"visualisation\" | \"custom\" | \"structure\";\nexport type LicenseTier = \"community\" | \"pro\" | \"enterprise\";\nexport type SplitMode = \"none\" | \"lines\" | \"rows\" | \"children\";\nexport type RenderMode = \"design\" | \"preview\";\n\n/* ------------------------------------------------------------------ */\n/* Inspector (properties panel) schema */\n/* ------------------------------------------------------------------ */\n\nexport interface InspectorFieldBase {\n /** Property name on `props` this field edits. Supports dot paths (`series.color`). */\n prop: string;\n label: string;\n /**\n * Help text under the control. A function when the useful wording depends on\n * the block's other settings — a table's row alias is named by the designer,\n * so \"use it like `row.name`\" is wrong for every table that renamed it.\n */\n description?: string | ((props: Record<string, unknown>) => string);\n /** Show only when the predicate passes. */\n when?: (props: Record<string, unknown>) => boolean;\n /** Take a full row in a two-column inspector grid. */\n fullWidth?: boolean;\n}\n\nexport type SelectOption = { value: string | number | boolean; label: string; icon?: string; description?: string };\n\nexport type InspectorField =\n | (InspectorFieldBase & { kind: \"text\"; placeholder?: string; allowTokens?: boolean })\n | (InspectorFieldBase & { kind: \"textarea\"; placeholder?: string; rows?: number; allowTokens?: boolean })\n | (InspectorFieldBase & { kind: \"richtext\" })\n | (InspectorFieldBase & { kind: \"number\"; min?: number; max?: number; step?: number; unit?: string })\n | (InspectorFieldBase & { kind: \"toggle\" })\n | (InspectorFieldBase & { kind: \"select\"; options?: SelectOption[]; optionsFrom?: (props: Record<string, unknown>) => SelectOption[] })\n | (InspectorFieldBase & { kind: \"segmented\"; options: SelectOption[] })\n | (InspectorFieldBase & { kind: \"color\"; allowTransparent?: boolean })\n | (InspectorFieldBase & { kind: \"font\" })\n | (InspectorFieldBase & { kind: \"textStyle\" })\n | (InspectorFieldBase & { kind: \"binding\"; valueType?: FieldType | FieldType[]; placeholder?: string })\n | (InspectorFieldBase & { kind: \"collection\"; placeholder?: string })\n | (InspectorFieldBase & { kind: \"expression\"; placeholder?: string })\n | (InspectorFieldBase & { kind: \"image\"; allowBinding?: boolean })\n | (InspectorFieldBase & { kind: \"condition\" })\n | (InspectorFieldBase & { kind: \"columns\" })\n | (InspectorFieldBase & { kind: \"series\" })\n | (InspectorFieldBase & { kind: \"keyValues\" })\n | (InspectorFieldBase & {\n kind: \"list\";\n itemLabel?: string;\n fields: InspectorField[];\n /**\n * One line describing a collapsed item. Without it the list falls back to\n * whatever field looks like a name, which for a table's conditional\n * formatting rules meant showing the column id — \"c5\" — to a person who\n * has never seen a column id and has no way to look one up.\n */\n itemSummary?: (item: Record<string, unknown>, index: number, props: Record<string, unknown>) => string;\n })\n | (InspectorFieldBase & { kind: \"custom\"; component: InspectorComponent });\n\n/**\n * Framework-neutral mount adapter for custom inspector UIs. `@broadpaper/react`\n * and `@broadpaper/angular` provide helpers that produce one from a component.\n */\nexport interface InspectorComponent {\n mount(element: HTMLElement, api: InspectorApi): void;\n update?(api: InspectorApi): void;\n unmount?(element: HTMLElement): void;\n}\n\nexport interface InspectorApi {\n value: unknown;\n props: Record<string, unknown>;\n node: Node;\n setValue(value: unknown): void;\n setProps(patch: Record<string, unknown>): void;\n dataSources: DataSource[];\n schemaScope: SchemaScope;\n theme: Theme;\n}\n\nexport interface InspectorSection {\n title: string;\n fields: InspectorField[];\n collapsed?: boolean;\n when?: (props: Record<string, unknown>) => boolean;\n}\n\n/** Which built-in style groups the inspector shows for a block. */\nexport type StyleGroup = \"textStyle\" | \"typography\" | \"alignment\" | \"spacing\" | \"border\" | \"background\" | \"size\" | \"flow\";\n\n/* ------------------------------------------------------------------ */\n/* Bindings */\n/* ------------------------------------------------------------------ */\n\nexport type BindingKind =\n /** A single expression yielding a value. */\n | \"value\"\n /** An expression yielding an array. */\n | \"collection\"\n /** A plain string that may contain `{{ }}` tokens. */\n | \"template\"\n /** A rich text document containing inline tokens. */\n | \"richtext\"\n /** A structured or string condition. */\n | \"condition\"\n /** A list of objects that contain nested bindings (see `items`). Not evaluated itself. */\n | \"list\";\n\nexport interface BindingSpec {\n prop: string;\n kind: BindingKind;\n valueType?: FieldType | FieldType[];\n /** Nested bindings inside list props (e.g. table columns). */\n items?: BindingSpec[];\n /** For collections: props on this block that are evaluated per item (e.g. table column values). */\n scoped?: BindingSpec[];\n /** Prop holding the alias name introduced into scope for per-item bindings. */\n alias?: string;\n /**\n * The expression is evaluated per item of the block's collection by the block's\n * own `resolve` hook (e.g. table column values). The resolver leaves it alone;\n * validation checks it in the item scope.\n */\n perItem?: boolean;\n}\n\nexport interface BindingInfo {\n prop: string;\n kind: BindingKind;\n expr: string;\n /** Human label such as \"Client › First name\". */\n label: string;\n type?: FieldType | \"unknown\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Containers */\n/* ------------------------------------------------------------------ */\n\nexport interface ContainerSpec {\n /** What children this node accepts: block types, or a wildcard group. */\n accepts: Array<string | \"@blocks\" | \"@rows\" | \"@columns\" | \"@sections\">;\n min?: number;\n max?: number;\n /** Repeat children once per item of the collection in `collectionProp`. */\n repeat?: { collectionProp: string; aliasProp?: string; keepItemTogetherProp?: string; emptyMessageProp?: string; limitProp?: string };\n /** Show children only when the condition in `conditionProp` holds. */\n conditional?: { conditionProp: string; elseChildrenProp?: string };\n /** Direction children are laid out in. Default \"column\". */\n direction?: \"column\" | \"row\";\n}\n\n/* ------------------------------------------------------------------ */\n/* Contexts */\n/* ------------------------------------------------------------------ */\n\nexport interface ResolveHookContext<P> {\n props: P;\n node: Node;\n scope: Scope;\n mode: RenderMode;\n theme: Theme;\n format: FormatContext;\n evaluate(expr: string): unknown;\n evaluateIn(expr: string, vars: Record<string, unknown>): unknown;\n warn(message: string): void;\n}\n\nexport interface RenderContext<P = Record<string, unknown>> {\n node: ResolvedNode;\n props: P;\n style: ResolvedStyle;\n /** Inline CSS for the block root: text + box (padding, border, background). Margin/width are applied by the wrapper. */\n css: Record<string, string>;\n theme: Theme;\n styles: DocumentStyles;\n mode: RenderMode;\n h: typeof hyperscript;\n /** Rendered child nodes (containers only). */\n children: VNode[];\n page: PageContext;\n /** Available width in px. */\n width: number;\n format: FormatContext;\n registry: BlockRegistryLike;\n /** Renders an interpolated string prop; tokens become chips in design mode. */\n text(prop: string, fallback?: string): VChild[];\n /** Renders a rich text prop. */\n richText(prop: string): VChild[];\n /** Renders a plain string value that may contain tokens (already resolved in preview). */\n textValue(value: string | undefined): VChild[];\n /** Metadata about a bound prop (for badges/chips). */\n binding(prop: string): BindingInfo | undefined;\n /** Standard attributes for a sub-element the editor should be able to target. */\n partAttrs(part: string, extra?: VProps): VProps;\n /** Placeholder shown in design mode for empty content. */\n placeholder(text: string, extra?: VProps): VNode;\n}\n\nexport interface ValidateContext<P> {\n props: P;\n node: Node;\n schemaScope: SchemaScope;\n dataSources: DataSource[];\n theme: Theme;\n /** Type-checks an expression and returns its issues (already prefixed with the node). */\n checkExpression(expr: string, prop: string): Issue[];\n}\n\nexport interface BlockRegistryLike {\n get(type: string): BlockDefinition | undefined;\n has(type: string): boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Definition */\n/* ------------------------------------------------------------------ */\n\nexport interface BlockDefinition<P extends Record<string, unknown> = Record<string, unknown>> {\n /** Unique type id. Custom blocks should be namespaced: \"acme.risk-profile\". */\n type: string;\n name: string;\n description?: string;\n category: BlockCategory;\n /** Lucide icon name (e.g. \"heading\") or an inline `<svg>` string. */\n icon?: string;\n keywords?: string[];\n /**\n * The tier **the host** sells this block in, badged in the palette and\n * reported by validation when the host has not enabled it.\n *\n * It exists so an embedder can put their own blocks behind their own plans.\n * BroadPaper's built-in blocks never set it, and must not: the two BroadPaper\n * licences unlock identical software, and nothing in this SDK reads an\n * entitlement to decide what to allow. Chart, Table and Repeater carried\n * `\"pro\"` for a while, which said the opposite of what we sell.\n */\n license?: LicenseTier;\n /** Do not show in the block palette (structural nodes, deprecated types). */\n hidden?: boolean;\n /** Version of the props shape. Bump and implement `migrate` when it changes. */\n version?: number;\n\n defaultProps: P | (() => P);\n defaultStyle?: BlockStyle;\n defaultFlow?: FlowOptions;\n /** Document text style to inherit from (\"body\", \"h1\", ...). */\n defaultTextStyle?: string;\n\n inspector?: InspectorSection[];\n styleGroups?: StyleGroup[];\n /** Declares props holding expressions. Derived from `inspector` when omitted. */\n bindings?: BindingSpec[];\n\n container?: ContainerSpec;\n /** How the paginator may split this node. Containers default to \"children\", leaves to \"none\". */\n split?: SplitMode;\n /**\n * What the measurer should inspect: \"text\" reads line boxes, \"table\" reads rows.\n * Derived from `split` when omitted.\n */\n measure?: \"text\" | \"table\" | \"none\";\n\n /**\n * Props for a block created by dropping a data field onto the page.\n *\n * The designer lets a user drag a field out of the data panel, and what should\n * appear is not the same thing for every block: a list wants a table with a\n * column per item field, each already formatted the way the schema says; a\n * scalar wants a labelled value. Only the block knows what its own props mean,\n * so the block decides — including a custom block, which is the reason this is\n * a hook rather than a rule in the editor.\n *\n * `expr` is the bare path; `formatted` is the same path with the field's own\n * formatter appended, which is what a prop rendering the value as text should\n * use. Return undefined to take the designer's default.\n */\n fromField?(field: { expr: string; formatted: string; schema: FieldSchema; label: string }): Partial<P> | undefined;\n\n /** Adjust resolved props after binding resolution (compute derived data, sort, etc.). */\n resolve?(ctx: ResolveHookContext<P>): P | void;\n render(ctx: RenderContext<P>): VNode | null;\n validate?(ctx: ValidateContext<P>): Issue[];\n migrate?(props: Record<string, unknown>, fromVersion: number): P;\n\n canvas?: {\n /** Enables inline editing of a prop directly on the canvas. */\n inlineEdit?: { prop: string; kind: \"richtext\" | \"text\" };\n /** Layer-tree label. */\n label?: (props: P) => string;\n /** Minimum height in px for the empty design-mode placeholder. */\n minHeight?: number;\n };\n}\n\n/** Identity helper that gives full type inference for custom blocks. */\nexport function defineBlock<P extends Record<string, unknown>>(def: BlockDefinition<P>): BlockDefinition<P> {\n if (!def.type || !/^[a-z0-9][a-z0-9._-]*$/i.test(def.type)) {\n throw new Error(`Invalid block type \"${def.type}\". Use letters, digits, dots, dashes and underscores.`);\n }\n return def;\n}\n\nexport function resolveDefaultProps<P extends Record<string, unknown>>(def: BlockDefinition<P>): P {\n const d = def.defaultProps;\n return typeof d === \"function\" ? structuredClone((d as () => P)()) : structuredClone(d);\n}\n\nexport type { FieldSchema };\n","import type { BlockDefinition, BindingSpec, InspectorField, LicenseTier } from \"./block-definition.js\";\n\nexport interface RegistryOptions {\n /** Licence tiers that are enabled. Blocks above the enabled tier are still rendered but flagged. */\n enabledTiers?: LicenseTier[];\n}\n\nconst TIER_RANK: Record<LicenseTier, number> = { community: 0, pro: 1, enterprise: 2 };\n\n/**\n * The block registry. Built-in blocks and host custom blocks are registered the\n * same way; there is no privileged path.\n */\nexport class BlockRegistry {\n private readonly defs = new Map<string, BlockDefinition<any>>();\n private readonly listeners = new Set<() => void>();\n private readonly enabledTiers: Set<LicenseTier>;\n\n constructor(defs: Array<BlockDefinition<any>> = [], opts: RegistryOptions = {}) {\n this.enabledTiers = new Set(opts.enabledTiers ?? [\"community\", \"pro\", \"enterprise\"]);\n for (const d of defs) this.register(d);\n }\n\n register<P extends Record<string, unknown>>(def: BlockDefinition<P>): this {\n if (this.defs.has(def.type)) throw new Error(`Block type \"${def.type}\" is already registered`);\n this.defs.set(def.type, def);\n this.emit();\n return this;\n }\n\n /** Replaces an existing definition (used for hot-swapping custom blocks in dev). */\n replace<P extends Record<string, unknown>>(def: BlockDefinition<P>): this {\n this.defs.set(def.type, def);\n this.emit();\n return this;\n }\n\n unregister(type: string): this {\n this.defs.delete(type);\n this.emit();\n return this;\n }\n\n get(type: string): BlockDefinition | undefined {\n return this.defs.get(type);\n }\n\n has(type: string): boolean {\n return this.defs.has(type);\n }\n\n require(type: string): BlockDefinition {\n const d = this.defs.get(type);\n if (!d) throw new Error(`Unknown block type \"${type}\"`);\n return d;\n }\n\n list(): BlockDefinition[] {\n return [...this.defs.values()];\n }\n\n /** Blocks shown in the palette, grouped by category, honouring `hidden`. */\n palette(): BlockDefinition[] {\n return this.list().filter((d) => !d.hidden && d.category !== \"structure\");\n }\n\n isTierEnabled(tier: LicenseTier | undefined): boolean {\n return this.enabledTiers.has(tier ?? \"community\");\n }\n\n /** The highest tier required by a set of block types. */\n requiredTier(types: Iterable<string>): LicenseTier {\n let best: LicenseTier = \"community\";\n for (const t of types) {\n const tier = this.defs.get(t)?.license ?? \"community\";\n if (TIER_RANK[tier] > TIER_RANK[best]) best = tier;\n }\n return best;\n }\n\n /** Effective binding specs for a block: explicit `bindings`, else derived from the inspector. */\n bindingsOf(type: string): BindingSpec[] {\n const def = this.defs.get(type);\n if (!def) return [];\n return bindingSpecsFor(def);\n }\n\n /** Whether `childType` may be placed inside `parentType`. */\n accepts(parentType: string, childType: string): boolean {\n const parent = this.defs.get(parentType);\n const child = this.defs.get(childType);\n if (!parent?.container) return false;\n for (const rule of parent.container.accepts) {\n if (rule === childType) return true;\n if (rule === \"@blocks\" && child && child.category !== \"structure\") return true;\n if (rule === \"@rows\" && childType === \"row\") return true;\n if (rule === \"@columns\" && childType === \"column\") return true;\n if (rule === \"@sections\" && childType === \"section\") return true;\n }\n return false;\n }\n\n subscribe(fn: () => void): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n private emit() {\n for (const l of this.listeners) l();\n }\n}\n\nconst bindingCache = new WeakMap<BlockDefinition<any>, BindingSpec[]>();\n\nexport function bindingSpecsFor(def: BlockDefinition<any>): BindingSpec[] {\n const hit = bindingCache.get(def);\n if (hit) return hit;\n let specs: BindingSpec[];\n if (def.bindings) specs = def.bindings;\n else {\n specs = [];\n const visit = (fields: InspectorField[]) => {\n for (const f of fields) {\n switch (f.kind) {\n case \"binding\":\n specs.push({ prop: f.prop, kind: \"value\", valueType: f.valueType });\n break;\n case \"collection\":\n specs.push({ prop: f.prop, kind: \"collection\" });\n break;\n case \"expression\":\n specs.push({ prop: f.prop, kind: \"value\" });\n break;\n case \"richtext\":\n specs.push({ prop: f.prop, kind: \"richtext\" });\n break;\n case \"condition\":\n specs.push({ prop: f.prop, kind: \"condition\" });\n break;\n case \"text\":\n case \"textarea\":\n if (f.allowTokens !== false) specs.push({ prop: f.prop, kind: \"template\" });\n break;\n case \"image\":\n if (f.allowBinding !== false) specs.push({ prop: f.prop, kind: \"template\" });\n break;\n case \"list\":\n visit(f.fields);\n break;\n default:\n break;\n }\n }\n };\n for (const s of def.inspector ?? []) visit(s.fields);\n }\n bindingCache.set(def, specs);\n return specs;\n}\n","import { z } from \"zod\";\nimport { CURRENT_SCHEMA_VERSION } from \"../types/template.js\";\n\nconst color = z.string().min(1);\nconst spacing = z.object({ top: z.number().optional(), right: z.number().optional(), bottom: z.number().optional(), left: z.number().optional() }).partial();\n\nconst borderSpec = z\n .object({\n width: z.number().min(0).optional(),\n style: z.enum([\"solid\", \"dashed\", \"dotted\", \"none\"]).optional(),\n color: color.optional(),\n radius: z.number().min(0).optional(),\n sides: z.array(z.enum([\"top\", \"right\", \"bottom\", \"left\"])).optional()\n })\n .partial();\n\nexport const blockStyleSchema = z\n .object({\n textStyle: z.string().optional(),\n fontFamily: z.string().optional(),\n fontSize: z.number().positive().optional(),\n fontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional(),\n lineHeight: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n textTransform: z.enum([\"none\", \"uppercase\", \"lowercase\", \"capitalize\"]).optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\", \"justify\"]).optional(),\n verticalAlign: z.enum([\"top\", \"middle\", \"bottom\"]).optional(),\n color: color.optional(),\n background: color.optional(),\n padding: spacing.optional(),\n margin: spacing.optional(),\n border: borderSpec.optional(),\n width: z.union([z.number(), z.string()]).optional(),\n height: z.number().optional(),\n align: z.enum([\"left\", \"center\", \"right\"]).optional(),\n opacity: z.number().min(0).max(1).optional()\n })\n .partial();\n\nconst conditionRule = z.object({\n left: z.string(),\n operator: z.enum([\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\", \"contains\", \"startsWith\", \"endsWith\", \"in\", \"isEmpty\", \"isNotEmpty\", \"isTrue\", \"isFalse\"]),\n right: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional()\n});\n\nexport const conditionGroupSchema: z.ZodType<import(\"../types/template.js\").ConditionGroup> = z.lazy(() =>\n z.object({ op: z.enum([\"and\", \"or\"]), rules: z.array(z.union([conditionRule, conditionGroupSchema])) })\n);\n\nconst conditionSchema = z.union([z.string(), conditionGroupSchema]);\n\nconst flowSchema = z\n .object({\n breakBefore: z.enum([\"auto\", \"page\"]).optional(),\n breakAfter: z.enum([\"auto\", \"page\"]).optional(),\n keepTogether: z.boolean().optional(),\n keepWithNext: z.boolean().optional(),\n minOrphans: z.number().int().min(0).optional(),\n minWidows: z.number().int().min(0).optional()\n })\n .partial();\n\nexport const nodeSchema: z.ZodType<import(\"../types/template.js\").Node> = z.lazy(() =>\n z.object({\n id: z.string().min(1),\n type: z.string().min(1),\n props: z.record(z.unknown()),\n style: blockStyleSchema.optional(),\n children: z.array(nodeSchema).optional(),\n visibleWhen: conditionSchema.optional(),\n flow: flowSchema.optional(),\n name: z.string().optional(),\n locked: z.boolean().optional()\n })\n);\n\nconst textStyleSchema = z\n .object({\n fontFamily: z.string().optional(),\n fontSize: z.number().positive().optional(),\n fontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n fontStyle: z.enum([\"normal\", \"italic\"]).optional(),\n lineHeight: z.number().positive().optional(),\n letterSpacing: z.number().optional(),\n textTransform: z.enum([\"none\", \"uppercase\", \"lowercase\", \"capitalize\"]).optional(),\n color: color.optional(),\n marginTop: z.number().optional(),\n marginBottom: z.number().optional(),\n keepWithNext: z.boolean().optional()\n })\n .partial();\n\nconst pageRegion = z.object({ height: z.number().min(0), differentFirstPage: z.boolean() });\n\nexport const pageSettingsSchema = z.object({\n size: z.union([z.enum([\"A4\", \"A3\", \"A5\", \"Letter\", \"Legal\", \"Tabloid\"]), z.object({ width: z.number().positive(), height: z.number().positive() })]),\n orientation: z.enum([\"portrait\", \"landscape\"]),\n margins: z.object({ top: z.number().min(0), right: z.number().min(0), bottom: z.number().min(0), left: z.number().min(0) }),\n header: pageRegion,\n footer: pageRegion,\n background: color.optional(),\n minPages: z.number().int().min(1).optional()\n});\n\nexport const documentStylesSchema = z.object({\n text: z.record(textStyleSchema),\n table: z\n .object({\n fontSize: z.number().optional(),\n headerBackground: color.optional(),\n headerColor: color.optional(),\n headerFontWeight: z.union([z.number(), z.enum([\"normal\", \"bold\"])]).optional(),\n borderColor: color.optional(),\n borderWidth: z.number().optional(),\n borders: z.enum([\"all\", \"horizontal\", \"outer\", \"none\"]).optional(),\n zebraBackground: color.optional(),\n cellPaddingX: z.number().optional(),\n cellPaddingY: z.number().optional()\n })\n .partial(),\n card: z\n .object({\n background: color.optional(),\n borderColor: color.optional(),\n borderWidth: z.number().optional(),\n borderRadius: z.number().optional(),\n padding: z.number().optional(),\n shadow: z.boolean().optional()\n })\n .partial(),\n link: z.object({ color: color.optional(), underline: z.boolean().optional() }).partial(),\n spacing: z.object({ blockGap: z.number(), sectionPadding: z.number(), columnGap: z.number() })\n});\n\nconst regionContent = z.object({ default: z.array(nodeSchema), firstPage: z.array(nodeSchema).optional() });\n\nexport const templateSchema = z.object({\n schemaVersion: z.literal(CURRENT_SCHEMA_VERSION),\n id: z.string().min(1),\n name: z.string(),\n meta: z\n .object({\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n author: z.string().optional(),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n custom: z.record(z.unknown()).optional()\n })\n .partial()\n .optional(),\n page: pageSettingsSchema,\n styles: documentStylesSchema,\n header: regionContent,\n footer: regionContent,\n body: z.array(nodeSchema),\n library: z\n .array(\n z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n category: z.string().optional(),\n node: nodeSchema,\n thumbnail: z.string().optional()\n })\n )\n .optional(),\n settings: z\n .object({\n locale: z.string().optional(),\n currency: z.string().optional(),\n timeZone: z.string().optional(),\n dataSources: z.array(z.string()).optional()\n })\n .partial()\n .optional()\n});\n\nexport type TemplateSchemaInput = z.input<typeof templateSchema>;\n\nexport interface ParseResult {\n ok: boolean;\n template?: import(\"../types/template.js\").ReportTemplate;\n errors: Array<{ path: string; message: string }>;\n}\n\n/** Validates the JSON shape of a template (after migration). */\nexport function parseTemplate(json: unknown): ParseResult {\n const r = templateSchema.safeParse(json);\n if (r.success) return { ok: true, template: r.data as import(\"../types/template.js\").ReportTemplate, errors: [] };\n return { ok: false, errors: r.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message })) };\n}\n","const ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\nfunction randomBytes(n: number): Uint8Array {\n const out = new Uint8Array(n);\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (c?.getRandomValues) c.getRandomValues(out);\n else for (let i = 0; i < n; i++) out[i] = Math.floor(Math.random() * 256);\n return out;\n}\n\nlet counter = 0;\nlet deterministic: string | null = null;\n\n/** Generates a short, URL-safe unique id. */\nexport function createId(prefix = \"n\"): string {\n if (deterministic !== null) return `${prefix}_${deterministic}${(++counter).toString(36)}`;\n const bytes = randomBytes(10);\n let s = \"\";\n for (const b of bytes) s += ALPHABET[b % ALPHABET.length];\n return `${prefix}_${s}`;\n}\n\n/** Tests: makes ids predictable. Pass null to restore random ids. */\nexport function setDeterministicIds(seed: string | null): void {\n deterministic = seed;\n counter = 0;\n}\n","import { CURRENT_SCHEMA_VERSION, type AnyVersionTemplate, type ReportTemplate } from \"../types/template.js\";\n\nexport interface Migration {\n from: number;\n to: number;\n description: string;\n migrate(template: AnyVersionTemplate): AnyVersionTemplate;\n}\n\n/**\n * Ordered list of migrations. Each is a pure function from version N to N+1.\n * Never edit a shipped migration; add a new one.\n */\nexport const MIGRATIONS: Migration[] = [\n {\n from: 0,\n to: 1,\n description: \"Pre-release drafts: normalise `content` → `body`, add page regions and styles\",\n migrate(t) {\n const out: AnyVersionTemplate = { ...t, schemaVersion: 1 };\n if (Array.isArray(t.content) && !t.body) {\n out.body = t.content;\n delete out.content;\n }\n out.header ??= { default: [] };\n out.footer ??= { default: [] };\n return out;\n }\n }\n];\n\nexport interface MigrationResult {\n template: ReportTemplate;\n /** Migrations that were applied, in order. */\n applied: Migration[];\n fromVersion: number;\n}\n\nexport class MigrationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MigrationError\";\n }\n}\n\n/**\n * Brings a template of any supported version up to the current schema.\n * Throws `MigrationError` for future versions or missing migration steps.\n */\nexport function migrateTemplate(input: AnyVersionTemplate | ReportTemplate): MigrationResult {\n const fromVersion = typeof input.schemaVersion === \"number\" ? input.schemaVersion : 0;\n if (fromVersion > CURRENT_SCHEMA_VERSION) {\n throw new MigrationError(`Template schemaVersion ${fromVersion} is newer than this version of BroadPaper supports (${CURRENT_SCHEMA_VERSION}). Upgrade the SDK.`);\n }\n let current: AnyVersionTemplate = structuredClone(input) as AnyVersionTemplate;\n const applied: Migration[] = [];\n let v = fromVersion;\n while (v < CURRENT_SCHEMA_VERSION) {\n const step = MIGRATIONS.find((m) => m.from === v);\n if (!step) throw new MigrationError(`No migration from schemaVersion ${v} to ${v + 1}`);\n current = step.migrate(current);\n current.schemaVersion = step.to;\n applied.push(step);\n v = step.to;\n }\n return { template: current as unknown as ReportTemplate, applied, fromVersion };\n}\n\nexport function needsMigration(input: { schemaVersion?: number }): boolean {\n return (input.schemaVersion ?? 0) < CURRENT_SCHEMA_VERSION;\n}\n","import type { Node, PageSettings, ReportTemplate, ConditionGroup, FlowOptions } from \"../types/template.js\";\nimport type { BlockStyle } from \"../types/style.js\";\nimport { CURRENT_SCHEMA_VERSION } from \"../types/template.js\";\nimport { defaultDocumentStyles } from \"../theme/default-theme.js\";\nimport { createId } from \"./ids.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport { resolveDefaultProps } from \"../registry/block-definition.js\";\n\nexport function defaultPageSettings(overrides: Partial<PageSettings> = {}): PageSettings {\n return {\n size: \"A4\",\n orientation: \"portrait\",\n margins: { top: 18, right: 18, bottom: 18, left: 18 },\n header: { height: 14, differentFirstPage: false },\n footer: { height: 12, differentFirstPage: false },\n ...overrides\n };\n}\n\nexport interface CreateTemplateOptions {\n id?: string;\n name?: string;\n page?: Partial<PageSettings>;\n locale?: string;\n currency?: string;\n /** Start with an empty first section. Default true. */\n withEmptySection?: boolean;\n}\n\n/** Creates a new, valid, empty template. */\nexport function createTemplate(opts: CreateTemplateOptions = {}): ReportTemplate {\n const now = new Date().toISOString();\n return {\n schemaVersion: CURRENT_SCHEMA_VERSION,\n id: opts.id ?? createId(\"tpl\"),\n name: opts.name ?? \"Untitled report\",\n meta: { createdAt: now, updatedAt: now },\n page: defaultPageSettings(opts.page),\n styles: defaultDocumentStyles(),\n header: { default: [] },\n footer: { default: [] },\n body: opts.withEmptySection === false ? [] : [createSection()],\n settings: { locale: opts.locale ?? \"en-GB\", currency: opts.currency ?? \"GBP\" }\n };\n}\n\nexport interface CreateNodeOptions {\n id?: string;\n props?: Record<string, unknown>;\n style?: BlockStyle;\n children?: Node[];\n flow?: FlowOptions;\n visibleWhen?: string | ConditionGroup;\n name?: string;\n}\n\n/** Creates a node of a registered block type with its default props. */\nexport function createNode(registry: BlockRegistry, type: string, opts: CreateNodeOptions = {}): Node {\n const def = registry.get(type);\n const props = { ...(def ? resolveDefaultProps(def) : {}), ...(opts.props ?? {}) };\n const node: Node = { id: opts.id ?? createId(), type, props };\n if (opts.style) node.style = opts.style;\n if (def?.container || opts.children) node.children = opts.children ?? [];\n if (opts.flow) node.flow = opts.flow;\n if (opts.visibleWhen !== undefined) node.visibleWhen = opts.visibleWhen;\n if (opts.name) node.name = opts.name;\n return node;\n}\n\nexport function createSection(opts: CreateNodeOptions = {}): Node {\n return { id: opts.id ?? createId(\"sec\"), type: \"section\", props: { padding: 0, ...(opts.props ?? {}) }, children: opts.children ?? [], ...(opts.style ? { style: opts.style } : {}), ...(opts.flow ? { flow: opts.flow } : {}), ...(opts.name ? { name: opts.name } : {}) };\n}\n\nexport function createColumn(span: number, children: Node[] = [], id?: string): Node {\n return { id: id ?? createId(\"col\"), type: \"column\", props: { span }, children };\n}\n\n/** Creates a row with the given twelfths layout, e.g. [6, 6] or [4, 8]. */\nexport function createRow(layout: number[], columns?: Node[][], opts: CreateNodeOptions = {}): Node {\n const total = layout.reduce((a, b) => a + b, 0);\n if (total !== 12) throw new Error(`Row layout must sum to 12, got ${total} from [${layout.join(\", \")}]`);\n return {\n id: opts.id ?? createId(\"row\"),\n type: \"row\",\n props: { layout, ...(opts.props ?? {}) },\n children: layout.map((span, i) => createColumn(span, columns?.[i] ?? [])),\n ...(opts.style ? { style: opts.style } : {}),\n ...(opts.flow ? { flow: opts.flow } : {}),\n ...(opts.name ? { name: opts.name } : {})\n };\n}\n\nexport const ROW_LAYOUTS: Array<{ id: string; label: string; layout: number[] }> = [\n { id: \"12\", label: \"Full width\", layout: [12] },\n { id: \"6-6\", label: \"Two columns\", layout: [6, 6] },\n { id: \"4-4-4\", label: \"Three columns\", layout: [4, 4, 4] },\n { id: \"3-3-3-3\", label: \"Four columns\", layout: [3, 3, 3, 3] },\n { id: \"8-4\", label: \"Wide left\", layout: [8, 4] },\n { id: \"4-8\", label: \"Wide right\", layout: [4, 8] },\n { id: \"9-3\", label: \"Sidebar right\", layout: [9, 3] },\n { id: \"3-9\", label: \"Sidebar left\", layout: [3, 9] }\n];\n\n/** Deep-clones a subtree assigning fresh ids (for duplicate/paste/library insert). */\nexport function cloneWithNewIds(node: Node): Node {\n const prefix = node.type === \"section\" ? \"sec\" : node.type === \"row\" ? \"row\" : node.type === \"column\" ? \"col\" : \"n\";\n return {\n ...structuredClone(node),\n id: createId(prefix),\n children: node.children?.map(cloneWithNewIds)\n };\n}\n","import type { DataSource, FieldSchema, ReportData } from \"../types/data.js\";\nimport type { PathSegment } from \"../expr/ast.js\";\nimport type { SchemaScope } from \"../expr/typecheck.js\";\nimport { resolvePathSchema } from \"../expr/typecheck.js\";\n\n/**\n * Synthesises plausible sample data from a schema. Used in design mode when the\n * host provides no sample data so tables, charts and KPIs still show something.\n */\nexport function synthesizeSampleData(sources: DataSource[], opts: { arrayLength?: number; now?: Date } = {}): ReportData {\n const out: ReportData = {};\n for (const s of sources) out[s.id] = synthesizeObject(s.schema, opts, 0);\n return out;\n}\n\nexport function synthesizeValue(schema: FieldSchema, opts: { arrayLength?: number; now?: Date } = {}, depth = 0, index = 0): unknown {\n if (schema.example !== undefined) return schema.example;\n if (schema.enum?.length) return schema.enum[index % schema.enum.length];\n const now = opts.now ?? new Date();\n switch (schema.type) {\n case \"string\":\n return schema.label ?? \"Sample text\";\n case \"number\":\n return [1240, 875, 2310, 1580, 990, 1870][index % 6];\n case \"currency\":\n return [125000, 48200.5, 231000, 15800, 99000, 187500][index % 6];\n case \"percent\":\n return [0.125, 0.082, 0.31, 0.058, 0.196, 0.229][index % 6];\n case \"date\":\n case \"datetime\": {\n const d = new Date(now);\n d.setMonth(d.getMonth() - index);\n return d.toISOString();\n }\n case \"boolean\":\n return index % 2 === 0;\n case \"image\":\n return undefined;\n case \"url\":\n return \"https://example.com\";\n case \"richtext\":\n return \"Sample rich text\";\n case \"object\":\n return depth > 6 ? {} : synthesizeObject(schema.fields ?? {}, opts, depth + 1);\n case \"array\": {\n const n = opts.arrayLength ?? 4;\n const item = schema.itemSchema ?? { type: \"string\" as const };\n return depth > 6 ? [] : Array.from({ length: n }, (_, i) => synthesizeValue(item, opts, depth + 1, i));\n }\n default:\n return undefined;\n }\n}\n\nfunction synthesizeObject(fields: Record<string, FieldSchema>, opts: { arrayLength?: number; now?: Date }, depth: number): Record<string, unknown> {\n const o: Record<string, unknown> = {};\n let i = 0;\n for (const [k, f] of Object.entries(fields)) o[k] = synthesizeValue(f, opts, depth, i++);\n return o;\n}\n\n/** Human label for a data path, e.g. \"Client › First name\". */\nexport function labelForPath(segments: PathSegment[], scope: SchemaScope): string {\n const parts: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i]!;\n if (seg.kind === \"index\") {\n parts[parts.length - 1] = `${parts[parts.length - 1] ?? \"\"} #${seg.index + 1}`;\n continue;\n }\n const r = resolvePathSchema(segments.slice(0, i + 1), scope);\n parts.push(r.schema?.label ?? humanizeKey(seg.name));\n }\n return parts.join(\" › \");\n}\n\nexport function humanizeKey(key: string): string {\n return key\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/^./, (c) => c.toUpperCase());\n}\n","/**\n * The formatter a field wants, when nobody has said otherwise.\n *\n * A schema already knows that a field is money in sterling, or a date the host\n * writes as `d MMMM yyyy`, or a fraction meant to be read as a percentage.\n * Nothing was doing anything with that: a binding inserted from the data panel\n * was the bare path, so a currency field rendered as `482310.4` and a date as\n * `2026-08-31T00:00:00.000Z` until somebody typed a pipe after it.\n *\n * That is a fine default for a developer who knows the expression language and\n * a poor one for anybody else, so the pipe is written into the expression at the\n * moment the binding is created. Written in, and not applied invisibly at render\n * time, for two reasons worth stating:\n *\n * - it stays visible and editable. The template says `| currency:'USD'`, so\n * somebody reading it can see why the document shows dollars, and somebody who\n * wants three decimal places can change it;\n * - it cannot change what an existing template does. Formatting bound values at\n * render time would alter the output of every document already saved against a\n * typed schema, which is not a change a published SDK gets to make quietly.\n *\n * Blocks that evaluate their own expressions — a table's columns, a chart's\n * series — get the same treatment from the same function, which is what keeps a\n * total in a table footer formatted like the column above it.\n */\nimport type { FieldSchema } from \"../types/data.js\";\n\n/**\n * The pipe expression for a field, or null when the value should be shown as it\n * is.\n *\n * Text, booleans, URLs and rich text are already what they should look like.\n * Everything numeric or temporal is not.\n */\nexport function defaultPipeFor(schema: FieldSchema | undefined): string | null {\n if (!schema) return null;\n switch (schema.type) {\n case \"currency\": {\n // The code is quoted into the expression rather than left to the render\n // context, because a document's currency and a column's currency are\n // different facts: a GBP report can perfectly well contain a line in\n // dollars, and the context can only hold one answer.\n const code = schema.currency?.trim().toUpperCase();\n return code ? `currency:'${code}'` : \"currency\";\n }\n case \"percent\":\n return \"percent\";\n case \"number\":\n // Thousands separators and the locale's decimal point. A number with no\n // pipe prints as JavaScript writes it, which is 1234.5 where a document\n // wants 1,234.5.\n return \"number\";\n case \"date\":\n return schema.format ? `date:'${escapePattern(schema.format)}'` : \"date\";\n case \"datetime\":\n return schema.format ? `datetime:'${escapePattern(schema.format)}'` : \"datetime\";\n default:\n return null;\n }\n}\n\n/**\n * Adds the field's default formatter to a path expression.\n *\n * Leaves anything that already has a pipe alone — the author said what they\n * wanted — and leaves anything that is not a plain path alone too, because a\n * computed expression's type is its own business and appending to it could\n * change what it means.\n */\nexport function withDefaultPipe(expr: string, schema: FieldSchema | undefined): string {\n const trimmed = expr.trim();\n if (!trimmed || hasPipe(trimmed)) return trimmed;\n if (!isPlainPath(trimmed)) return trimmed;\n const pipe = defaultPipeFor(schema);\n return pipe ? `${trimmed} | ${pipe}` : trimmed;\n}\n\n/** Whether an expression already ends in a formatter, ignoring `||`. */\nexport function hasPipe(expr: string): boolean {\n for (let i = 0; i < expr.length; i++) {\n if (expr[i] !== \"|\") continue;\n if (expr[i + 1] === \"|\") {\n i++;\n continue;\n }\n if (expr[i - 1] === \"|\") continue;\n return true;\n }\n return false;\n}\n\n/**\n * A dotted path and nothing else: `client.name`, `row.amount`, `holdings[0].value`.\n *\n * Anything with an operator, a call or a literal in it is left alone. `a + b`\n * with a currency pipe bolted on would format the sum, which may be what the\n * author wanted or may not, and guessing is worse than doing nothing.\n */\nexport function isPlainPath(expr: string): boolean {\n return /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\[\\d+\\])*$/.test(expr.trim());\n}\n\n/** A single quote inside a pattern would end the string literal early. */\nfunction escapePattern(pattern: string): string {\n return pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n}\n","/**\n * A calculation, as a person would describe it rather than as the expression\n * language would.\n *\n * The designer has always been able to *bind* a value — point a property at a\n * field — and never to work one out. Arithmetic arrived only inside a template\n * somebody wrote by hand, so a host with the expression editor switched off had a\n * document whose totals it could read and not change, and a host with it on asked\n * a business user to write `sum(invoice.lineItems.amount) * (1 + taxRate)`. Both\n * are the same missing feature.\n *\n * So: a small closed model of the arithmetic documents actually contain, and a\n * codec between it and the expression language. The builder in the editor edits\n * this; the template still holds an ordinary expression, so nothing downstream —\n * the interpreter, the validator, the renderer, the PDF backends — learns anything\n * new. A calculation is a *view* of an expression, never a second way to store one.\n *\n * ## Left to right, and no brackets\n *\n * `start` and then a list of `steps`, each applied to the running total. That is\n * the one decision here worth defending, because a tree would be more general and\n * much worse: an interface with brackets in it is a formula editor, and a business\n * user with a formula editor is a business user writing formulas. Left-to-right\n * covers what invoices and reports do — a subtotal, VAT on it, a discount off it,\n * a division for an average — and reads as a sentence:\n *\n * Total of Lines › Amount, add VAT rate as a percentage\n *\n * Precedence never arises, because there is none to get wrong: every step applies\n * to everything before it, and `toExpression` brackets accordingly.\n *\n * ## Percentages are an operator, not multiplication\n *\n * \"Add VAT rate as a percentage\" rather than \"multiply by (1 + VAT rate)\". It is\n * the same arithmetic and it is the difference between a step somebody can choose\n * and one they have to derive. It is also emitted null-safe — `coalesce(rate, 0)`\n * — because a business that has not set a VAT rate wants an invoice without VAT,\n * not one with a hole where the total was.\n *\n * ## The contract that makes this safe\n *\n * {@link fromExpression} returns `null` for anything it cannot rebuild **byte for\n * byte**. An interface that offered to edit an expression it would then rewrite\n * differently is an interface that silently changes documents on being looked at;\n * refusing is the honest answer, and the caller shows the value as read-only\n * instead. `calculation.test.ts` asserts the round trip on every expression the\n * starter templates ship.\n */\nimport { exprToString, type Expr } from \"../expr/ast.js\";\nimport { parseExpression } from \"../expr/parser.js\";\n\n/** The five aggregates a document asks for. Deliberately not every function. */\nexport type CalcAggregate = \"sum\" | \"avg\" | \"count\" | \"min\" | \"max\";\n\n/** One thing a calculation reads or holds. Flat: a term is never itself a calculation. */\nexport type CalcTerm =\n /** A field, by its dotted path. `invoice.taxRate`, `row.amount`. */\n | { kind: \"field\"; path: string }\n /** A column of a list, across every row of it. `sum(invoice.lineItems.amount)`. */\n | { kind: \"aggregate\"; fn: CalcAggregate; path: string }\n /** A number somebody typed. */\n | { kind: \"number\"; value: number };\n\n/**\n * What to do with a term, given everything so far.\n *\n * `addPercent` and `subtractPercent` treat the term as a rate: 0.2 is a fifth.\n * That matches `percent`-typed fields and the mapping package's own reading of a\n * typed rate, so a VAT rate is the same number everywhere in the product.\n */\nexport type CalcOp = \"add\" | \"subtract\" | \"multiply\" | \"divide\" | \"addPercent\" | \"subtractPercent\";\n\nexport interface CalcStep {\n op: CalcOp;\n term: CalcTerm;\n}\n\nexport interface Calculation {\n start: CalcTerm;\n steps: CalcStep[];\n /**\n * How the result is shown: a pipe chain, exactly as it appears after `|` in the\n * expression. `currency:\"GBP\"`, `number:0`, `percent:1`. Presentation only, and\n * applied once at the end — a format in the middle of arithmetic would turn a\n * number into a string and the next step into a concatenation.\n */\n format?: string;\n}\n\n/** Everything a calculation reads, for validation and for naming it. */\nexport function calcPaths(calc: Calculation): string[] {\n const out: string[] = [];\n const add = (term: CalcTerm) => {\n if (term.kind === \"field\" || term.kind === \"aggregate\") out.push(term.path);\n };\n add(calc.start);\n for (const step of calc.steps) add(step.term);\n return out;\n}\n\n/* ------------------------------ to expression ----------------------------- */\n\nfunction termAst(term: CalcTerm): Expr {\n if (term.kind === \"number\") return { kind: \"literal\", value: term.value };\n const path: Expr = { kind: \"path\", segments: term.path.split(\".\").map((name) => ({ kind: \"prop\", name })) };\n return term.kind === \"aggregate\" ? { kind: \"call\", name: term.fn, args: [path] } : path;\n}\n\n/** `coalesce(x, 0)`, so an unset rate means \"no VAT\" rather than a broken total. */\nfunction safe(term: CalcTerm): Expr {\n if (term.kind === \"number\") return termAst(term);\n return { kind: \"call\", name: \"coalesce\", args: [termAst(term), { kind: \"literal\", value: 0 }] };\n}\n\nfunction applyStep(left: Expr, step: CalcStep): Expr {\n switch (step.op) {\n case \"add\":\n return { kind: \"binary\", op: \"+\", left, right: termAst(step.term) };\n case \"subtract\":\n return { kind: \"binary\", op: \"-\", left, right: termAst(step.term) };\n case \"multiply\":\n return { kind: \"binary\", op: \"*\", left, right: termAst(step.term) };\n case \"divide\":\n return { kind: \"binary\", op: \"/\", left, right: termAst(step.term) };\n case \"addPercent\":\n return { kind: \"binary\", op: \"*\", left, right: { kind: \"binary\", op: \"+\", left: { kind: \"literal\", value: 1 }, right: safe(step.term) } };\n case \"subtractPercent\":\n return { kind: \"binary\", op: \"*\", left, right: { kind: \"binary\", op: \"-\", left: { kind: \"literal\", value: 1 }, right: safe(step.term) } };\n }\n}\n\n/** The AST, for a caller that wants to type-check a calculation before storing it. */\nexport function calcToAst(calc: Calculation): Expr {\n let ast = termAst(calc.start);\n for (const step of calc.steps) ast = applyStep(ast, step);\n if (!calc.format) return ast;\n // The format is a pipe chain and may be more than one pipe, so it is parsed\n // rather than assembled: `currency:\"GBP\":0` has arguments, and hand-building\n // those here would be a second, worse parser.\n const piped = parseExpression(`__x__ | ${calc.format}`);\n return graft(piped, ast);\n}\n\n/** Replaces the `__x__` placeholder at the bottom of a parsed pipe chain. */\nfunction graft(piped: Expr, input: Expr): Expr {\n if (piped.kind === \"pipe\") return { ...piped, input: graft(piped.input, input) };\n return input;\n}\n\nexport function toExpression(calc: Calculation): string {\n return exprToString(calcToAst(calc));\n}\n\n/* ----------------------------- from expression ---------------------------- */\n\nconst AGGREGATES: CalcAggregate[] = [\"sum\", \"avg\", \"count\", \"min\", \"max\"];\n\nfunction asTerm(e: Expr): CalcTerm | null {\n if (e.kind === \"literal\" && typeof e.value === \"number\") return { kind: \"number\", value: e.value };\n if (e.kind === \"path\" && e.segments.every((s) => s.kind === \"prop\")) {\n return { kind: \"field\", path: e.segments.map((s) => (s.kind === \"prop\" ? s.name : \"\")).join(\".\") };\n }\n if (e.kind === \"call\" && AGGREGATES.includes(e.name as CalcAggregate) && e.args.length === 1) {\n const inner = asTerm(e.args[0]!);\n if (inner?.kind === \"field\") return { kind: \"aggregate\", fn: e.name as CalcAggregate, path: inner.path };\n }\n return null;\n}\n\n/** Unwraps the `coalesce(x, 0)` a percentage step is emitted with. */\nfunction asSafeTerm(e: Expr): CalcTerm | null {\n if (e.kind === \"call\" && e.name === \"coalesce\" && e.args.length === 2) {\n const fallback = e.args[1]!;\n if (fallback.kind === \"literal\" && fallback.value === 0) return asTerm(e.args[0]!);\n return null;\n }\n return asTerm(e);\n}\n\n/**\n * Whether a right-hand side is `1 + rate` or `1 - rate`, which is what a\n * percentage step looks like once it is arithmetic.\n */\nfunction asPercent(e: Expr): { op: \"addPercent\" | \"subtractPercent\"; term: CalcTerm } | null {\n if (e.kind !== \"binary\" || (e.op !== \"+\" && e.op !== \"-\")) return null;\n if (e.left.kind !== \"literal\" || e.left.value !== 1) return null;\n const term = asSafeTerm(e.right);\n if (!term) return null;\n return { op: e.op === \"+\" ? \"addPercent\" : \"subtractPercent\", term };\n}\n\nconst OPS: Record<string, CalcOp> = { \"+\": \"add\", \"-\": \"subtract\", \"*\": \"multiply\", \"/\": \"divide\" };\n\n/**\n * Reads an expression back as a calculation, or refuses.\n *\n * `null` means \"this is not something the builder can represent\", and the caller's\n * job is then to show the value rather than offer to edit it. Everything this\n * accepts, {@link toExpression} reproduces character for character — which is\n * asserted, because the failure otherwise is a template quietly rewritten by\n * somebody opening a panel.\n */\nexport function fromExpression(expr: string): Calculation | null {\n let ast: Expr;\n try {\n ast = parseExpression(expr);\n } catch {\n return null;\n }\n\n // The format comes off the top: every pipe in the chain, in source form.\n const formats: string[] = [];\n while (ast.kind === \"pipe\") {\n formats.unshift(`${ast.name}${ast.args.length ? \":\" + ast.args.map(exprToString).join(\":\") : \"\"}`);\n ast = ast.input;\n }\n const format = formats.length ? formats.join(\" | \") : undefined;\n\n // Then the left spine, innermost first.\n const steps: CalcStep[] = [];\n // Annotated, because the loop above narrows `ast` to \"not a pipe\" and an\n // inferred `cursor` would then refuse the wider node its own descent produces.\n let cursor: Expr = ast;\n while (cursor.kind === \"binary\") {\n const op = OPS[cursor.op];\n if (!op) return null;\n if (op === \"multiply\") {\n const percent = asPercent(cursor.right);\n if (percent) {\n steps.unshift(percent);\n cursor = cursor.left;\n continue;\n }\n }\n const term = asTerm(cursor.right);\n if (!term) return null;\n steps.unshift({ op, term });\n cursor = cursor.left;\n }\n\n const start = asTerm(cursor);\n if (!start) return null;\n\n const calc: Calculation = { start, steps, ...(format ? { format } : {}) };\n // The whole point. Anything that does not come back identically is refused,\n // however close it looked.\n return toExpression(calc) === expr.trim() ? calc : null;\n}\n\n/** Whether an expression is arithmetic rather than a plain field or a formatted one. */\nexport function isCalculation(calc: Calculation): boolean {\n return calc.steps.length > 0 || calc.start.kind === \"aggregate\";\n}\n","import type { BindingInfo } from \"../registry/block-definition.js\";\nimport type { SchemaScope } from \"../expr/typecheck.js\";\nimport { typeCheckAst } from \"../expr/typecheck.js\";\nimport { parseExpression } from \"../expr/parser.js\";\nimport { collectPaths } from \"../expr/ast.js\";\nimport { labelForPath } from \"../data/sample.js\";\n\n/**\n * How an expression should be written where a person is going to read it:\n * `portfolio.allocation` as \"Portfolio › Asset allocation\", a piped value with\n * the filter named after it, a computed one marked with an ƒ.\n *\n * The canvas has always drawn its token chips this way. Sharing the same\n * function with the layer tree, the breadcrumb and the inspector is what stops\n * one part of the editor calling a thing \"Asset allocation\" while another calls\n * it \"portfolio.allocation\" — the raw path stays available as a tooltip, which\n * is the right place for it.\n */\nexport function describeExpression(expr: string, scope: SchemaScope): { label: string; type: BindingInfo[\"type\"] } {\n try {\n const ast = parseExpression(expr);\n const tc = typeCheckAst(ast, scope);\n const type = tc.issues.length ? \"unknown\" : (tc.type as BindingInfo[\"type\"]);\n const paths = collectPaths(ast);\n if (ast.kind === \"path\") return { label: labelForPath(ast.segments, scope), type };\n if (ast.kind === \"pipe\" && ast.input.kind === \"path\") return { label: `${labelForPath(ast.input.segments, scope)} · ${ast.name}`, type };\n // Anything computed — a conditional that omits an optional clause, a sum, a\n // fallback — is named after the fields it reads. Falling through to the raw\n // source printed `adviser.qualifications ? \", \" + adv…` into a chip on the\n // page, which is the expression's text and not its meaning.\n const names = [...new Set(paths.map((p) => labelForPath(p, scope)))];\n if (names.length === 1) return { label: `ƒ ${names[0]}`, type };\n if (names.length > 1) return { label: `ƒ ${names.slice(0, 2).join(\", \")}${names.length > 2 ? \"…\" : \"\"}`, type };\n return { label: expr, type };\n } catch {\n return { label: expr, type: \"unknown\" };\n }\n}\n\n/**\n * Rewrites the readable parts of a label written by a block: `{{ tokens }}` and\n * bare dotted paths become the names a person would use. Anything that does not\n * resolve is left exactly as it was, so an unknown path still shows itself\n * rather than turning into a guess.\n */\nexport function humaniseLabel(text: string, scope: SchemaScope): string {\n const described = (expr: string) => {\n const { label } = describeExpression(expr.trim(), scope);\n return label;\n };\n return text\n .replace(/\\{\\{([^}]+)\\}\\}/g, (_, expr: string) => described(expr))\n .replace(/\\b[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)+\\b/g, (path) => {\n const label = described(path);\n return label === path ? path : label;\n });\n}\n","/**\n * What changed between two saved templates, said in words.\n *\n * A revision history is only useful if it can answer \"what is different about\n * this one\" without asking anybody to read a template. A structural diff of the\n * JSON answers a different question — which keys moved — and it answers it in\n * the vocabulary of the format: `body[2].children[0].props.columns`. This speaks\n * the vocabulary of the designer instead: the table in “Summary”, the page\n * margins, the Heading 1 style.\n *\n * Three decisions shape everything below.\n *\n * **Nodes are matched by id, never by position.** Every node already carries a\n * stable id, and matching by position is how inserting one section at the top\n * becomes \"changed every section in the document\". A subtree added or removed\n * is one change, not one per descendant — a person who deleted a section\n * deleted a section.\n *\n * **Expression syntax never reaches the words.** A host may hide expressions\n * entirely (`expressions: false`), and a revision list that printed\n * `sum(invoice.lineItems.amount) | currency` would put back exactly what that\n * flag took away. Bindings are named with `describeExpression`, the same\n * function the canvas chips use, and anything that still would not read as\n * words is called \"a calculated value\".\n *\n * **It is pure.** No DOM, no registry required, deterministic output — the same\n * two templates always produce the same list in the same order, so a host can\n * store the summary beside a revision and trust it later.\n */\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport type { InspectorField } from \"../registry/block-definition.js\";\nimport type { DataSource } from \"../types/data.js\";\nimport type { Node, PageSettings, ReportTemplate } from \"../types/template.js\";\nimport { createSchemaScope, type SchemaScope } from \"../expr/typecheck.js\";\nimport { describeExpression } from \"../resolve/describe.js\";\nimport { isRichTextDoc, richTextToPlain } from \"../richtext/model.js\";\nimport { humanize, textStyleLabel } from \"../theme/tokens.js\";\n\nexport type ChangeKind = \"added\" | \"removed\" | \"changed\" | \"moved\";\nexport type ChangeArea = \"document\" | \"page\" | \"styles\" | \"header\" | \"footer\" | \"body\";\n\nexport interface TemplateChange {\n kind: ChangeKind;\n area: ChangeArea;\n /** The node's id, when the change is to a node. */\n nodeId?: string;\n /** What changed, named for a person: \"Table\", \"Top margin\", \"Heading 1 style\". */\n subject: string;\n /** One sentence: `Added a table to “Summary”`, `Changed the page margins`. */\n summary: string;\n /** Display strings, only when a single simple value changed. ≤ 80 chars each, truncated with \"…\". */\n before?: string;\n after?: string;\n}\n\nexport interface TemplateDiff {\n changes: TemplateChange[];\n counts: Record<ChangeKind, number>;\n /** Changes beyond `maxChanges` that were counted but not listed. */\n truncated: number;\n identical: boolean;\n}\n\nexport interface DiffOptions {\n /** Block definitions, for naming block types and their properties. */\n registry?: BlockRegistry;\n /** Default 200. */\n maxChanges?: number;\n /**\n * The data sources the template binds to, so a binding is named by its field's\n * own label (\"Invoice number\") rather than a humanised key (\"Number\").\n * Optional: without them the names are still words, just plainer ones.\n */\n dataSources?: DataSource[];\n}\n\nconst DISPLAY_LIMIT = 80;\nconst SUMMARY_LIMIT = 120;\n\nconst AREA_RANK: Record<ChangeArea, number> = { document: 0, page: 1, styles: 2, header: 3, body: 4, footer: 5 };\n\n/** A change with the position it sorts by, which never leaves this module. */\ninterface Placed extends TemplateChange {\n rank: number;\n}\n\nexport function diffTemplates(before: ReportTemplate, after: ReportTemplate, options: DiffOptions = {}): TemplateDiff {\n const ctx: Context = {\n registry: options.registry,\n scope: createSchemaScope(options.dataSources ?? [])\n };\n\n const placed: Placed[] = [\n ...documentChanges(before, after, ctx),\n ...pageChanges(before.page, after.page),\n ...styleChanges(before, after, ctx),\n ...nodeChanges(before, after, ctx)\n ];\n\n // Stable: equal ranks keep the order they were produced in, which is already\n // document order within each group.\n const ordered = placed\n .map((c, i) => ({ c, i }))\n .sort((a, b) => AREA_RANK[a.c.area] - AREA_RANK[b.c.area] || a.c.rank - b.c.rank || a.i - b.i)\n .map(({ c }) => strip(c));\n\n const counts: Record<ChangeKind, number> = { added: 0, removed: 0, changed: 0, moved: 0 };\n for (const change of ordered) counts[change.kind]++;\n const max = Math.max(0, options.maxChanges ?? 200);\n\n return {\n changes: ordered.slice(0, max),\n counts,\n truncated: Math.max(0, ordered.length - max),\n identical: ordered.length === 0\n };\n}\n\n/**\n * One line for a list of revisions.\n *\n * A single change is worth naming outright; several are counted, because a list\n * row that tried to name seven changes would be truncated into saying none of\n * them properly.\n */\nexport function summariseDiff(diff: TemplateDiff): string {\n const total = diff.counts.added + diff.counts.removed + diff.counts.changed + diff.counts.moved;\n if (total === 0) return \"No changes\";\n if (total === 1) {\n const only = diff.changes[0];\n return clip(only ? `1 change: ${only.summary}` : \"1 change\", SUMMARY_LIMIT);\n }\n const parts = ([\"added\", \"changed\", \"moved\", \"removed\"] as const).filter((k) => diff.counts[k] > 0).map((k) => `${diff.counts[k]} ${k}`);\n return clip(`${total} changes: ${parts.join(\", \")}`, SUMMARY_LIMIT);\n}\n\n/* -------------------------------------------------------------- context */\n\ninterface Context {\n registry: BlockRegistry | undefined;\n scope: SchemaScope;\n}\n\nfunction strip(change: Placed): TemplateChange {\n const { rank, ...rest } = change;\n void rank;\n const out: TemplateChange = { kind: rest.kind, area: rest.area, subject: rest.subject, summary: rest.summary };\n if (rest.nodeId !== undefined) out.nodeId = rest.nodeId;\n if (rest.before !== undefined) out.before = clip(rest.before, DISPLAY_LIMIT);\n if (rest.after !== undefined) out.after = clip(rest.after, DISPLAY_LIMIT);\n return out;\n}\n\n/* ------------------------------------------------------------- document */\n\nfunction documentChanges(before: ReportTemplate, after: ReportTemplate, ctx: Context): Placed[] {\n void ctx;\n const out: Placed[] = [];\n if (before.name !== after.name) {\n out.push({ kind: \"changed\", area: \"document\", subject: \"Design name\", summary: \"Renamed the design\", before: before.name, after: after.name, rank: 0 });\n }\n // `dataSources` in settings is the host's bookkeeping about which sources a\n // template was built against, and nothing a person chose — so it is not a change\n // worth listing.\n const settings: Array<[keyof NonNullable<ReportTemplate[\"settings\"]>, string, string]> = [\n [\"locale\", \"Language and region\", \"Changed the language and region\"],\n [\"currency\", \"Currency\", \"Changed the currency\"],\n [\"timeZone\", \"Time zone\", \"Changed the time zone\"]\n ];\n settings.forEach(([key, subject, summary], i) => {\n const a = before.settings?.[key];\n const b = after.settings?.[key];\n if (a === b) return;\n out.push({ kind: \"changed\", area: \"document\", subject, summary, before: a === undefined ? \"Default\" : String(a), after: b === undefined ? \"Default\" : String(b), rank: i + 1 });\n });\n return out;\n}\n\n/* ----------------------------------------------------------------- page */\n\nfunction pageChanges(before: PageSettings, after: PageSettings): Placed[] {\n const out: Placed[] = [];\n let rank = 0;\n const push = (subject: string, summary: string, a?: string, b?: string) => {\n out.push({ kind: \"changed\", area: \"page\", subject, summary, ...(a !== undefined ? { before: a } : {}), ...(b !== undefined ? { after: b } : {}), rank: rank++ });\n };\n\n if (!same(before.size, after.size)) push(\"Page size\", \"Changed the page size\", pageSize(before.size), pageSize(after.size));\n if (before.orientation !== after.orientation) push(\"Page orientation\", \"Changed the page orientation\", humanize(before.orientation), humanize(after.orientation));\n // One change for all four, because nobody thinks of a margin change as four\n // edits — and four rows saying \"Top margin\", \"Right margin\"… would bury the\n // one that matters.\n if (!same(before.margins, after.margins)) push(\"Page margins\", \"Changed the page margins\", margins(before.margins), margins(after.margins));\n\n for (const region of [\"header\", \"footer\"] as const) {\n const a = before[region];\n const b = after[region];\n const name = region === \"header\" ? \"Header\" : \"Footer\";\n if (a?.height !== b?.height) push(`${name} height`, `Changed the ${region} height`, regionHeight(a?.height), regionHeight(b?.height));\n if (Boolean(a?.differentFirstPage) !== Boolean(b?.differentFirstPage)) {\n push(\n `Different first-page ${region}`,\n b?.differentFirstPage ? `Turned on a different ${region} for the first page` : `Turned off the different ${region} for the first page`,\n onOff(a?.differentFirstPage),\n onOff(b?.differentFirstPage)\n );\n }\n }\n\n if (before.background !== after.background) push(\"Page background\", \"Changed the page background\", colour(before.background), colour(after.background));\n if (before.minPages !== after.minPages) {\n push(\"Empty pages shown\", \"Changed how many pages an empty document shows\", String(before.minPages ?? 1), String(after.minPages ?? 1));\n }\n\n // Anything a newer schema added that this does not know by name still counts,\n // rather than disappearing from the history because nobody wrote a sentence for it.\n const known = new Set([\"size\", \"orientation\", \"margins\", \"header\", \"footer\", \"background\", \"minPages\"]);\n const extra = keysOf(before, after).filter((k) => !known.has(k) && !same((before as unknown as Record<string, unknown>)[k], (after as unknown as Record<string, unknown>)[k]));\n if (extra.length) push(\"Page settings\", \"Changed the page settings\");\n return out;\n}\n\nfunction pageSize(size: PageSettings[\"size\"]): string {\n return typeof size === \"string\" ? size : `${size.width} × ${size.height} mm`;\n}\n\nfunction margins(m: PageSettings[\"margins\"]): string {\n return [m.top, m.right, m.bottom, m.left].map((v) => `${v} mm`).join(\" · \");\n}\n\nfunction regionHeight(height: number | undefined): string {\n return !height ? \"None\" : `${height} mm`;\n}\n\n/* --------------------------------------------------------------- styles */\n\n/** What each style property is called, where a person reads it. */\nconst TEXT_STYLE_WORDS: Record<string, string> = {\n fontFamily: \"font\",\n fontSize: \"size\",\n fontWeight: \"weight\",\n fontStyle: \"slant\",\n lineHeight: \"line height\",\n letterSpacing: \"letter spacing\",\n textTransform: \"capitalisation\",\n color: \"colour\",\n marginTop: \"space above\",\n marginBottom: \"space below\",\n keepWithNext: \"keep with next\"\n};\n\nconst TABLE_WORDS: Record<string, string> = {\n fontSize: \"text size\",\n headerBackground: \"header background\",\n headerColor: \"header text colour\",\n headerFontWeight: \"header weight\",\n borderColor: \"border colour\",\n borderWidth: \"border width\",\n borders: \"lines\",\n zebraBackground: \"stripe colour\",\n cellPaddingX: \"cell padding\",\n cellPaddingY: \"cell padding\"\n};\n\nconst CARD_WORDS: Record<string, string> = {\n background: \"background\",\n borderColor: \"border colour\",\n borderWidth: \"border width\",\n borderRadius: \"corner radius\",\n padding: \"padding\",\n shadow: \"shadow\"\n};\n\nconst LINK_WORDS: Record<string, string> = { color: \"colour\", underline: \"underline\" };\n\nconst SPACING_WORDS: Record<string, string> = {\n blockGap: \"space between blocks\",\n sectionPadding: \"section padding\",\n columnGap: \"space between columns\"\n};\n\nfunction styleChanges(before: ReportTemplate, after: ReportTemplate, ctx: Context): Placed[] {\n void ctx;\n const out: Placed[] = [];\n let rank = 0;\n const a = before.styles ?? ({} as ReportTemplate[\"styles\"]);\n const b = after.styles ?? ({} as ReportTemplate[\"styles\"]);\n\n // Text styles, in the order the newer template lists them and then any that\n // only the older one had — so a removed style sorts after the ones that stayed.\n const beforeText = (a.text ?? {}) as Record<string, Record<string, unknown>>;\n const afterText = (b.text ?? {}) as Record<string, Record<string, unknown>>;\n const ids = [...Object.keys(afterText), ...Object.keys(beforeText).filter((id) => !(id in afterText))];\n for (const id of ids) {\n const label = textStyleLabel(id);\n const subject = `${label} style`;\n if (!(id in beforeText)) {\n out.push({ kind: \"added\", area: \"styles\", subject, summary: `Added the ${label} style`, rank: rank++ });\n } else if (!(id in afterText)) {\n out.push({ kind: \"removed\", area: \"styles\", subject, summary: `Removed the ${label} style`, rank: rank++ });\n } else {\n const change = groupChange(beforeText[id]!, afterText[id]!, TEXT_STYLE_WORDS, (words) => `Changed the ${words} of the ${label} style`, subject);\n if (change) out.push({ ...change, rank: rank++ });\n }\n }\n\n const groups: Array<[keyof ReportTemplate[\"styles\"], Record<string, string>, string, (words: string) => string]> = [\n [\"table\", TABLE_WORDS, \"Table style\", (w) => `Changed the ${w} of tables`],\n [\"card\", CARD_WORDS, \"Card style\", (w) => `Changed the ${w} of cards`],\n [\"link\", LINK_WORDS, \"Link style\", (w) => `Changed the ${w} of links`],\n [\"spacing\", SPACING_WORDS, \"Spacing\", (w) => `Changed the ${w}`]\n ];\n for (const [key, words, subject, sentence] of groups) {\n const change = groupChange(\n ((a as unknown as Record<string, unknown>)[key] ?? {}) as Record<string, unknown>,\n ((b as unknown as Record<string, unknown>)[key] ?? {}) as Record<string, unknown>,\n words,\n sentence,\n subject\n );\n if (change) out.push({ ...change, rank: rank++ });\n }\n\n const known = new Set([\"text\", \"table\", \"card\", \"link\", \"spacing\"]);\n const extra = keysOf(a, b).filter((k) => !known.has(k) && !same((a as unknown as Record<string, unknown>)[k], (b as unknown as Record<string, unknown>)[k]));\n if (extra.length) out.push({ kind: \"changed\", area: \"styles\", subject: \"Document styles\", summary: \"Changed the document styles\", rank: rank++ });\n return out;\n}\n\n/** One change for a whole group of style properties, naming what moved in it. */\nfunction groupChange(\n before: Record<string, unknown>,\n after: Record<string, unknown>,\n words: Record<string, string>,\n sentence: (words: string) => string,\n subject: string\n): Omit<Placed, \"rank\"> | null {\n const changed = keysOf(before, after).filter((k) => !same(before[k], after[k]));\n if (!changed.length) return null;\n const names = unique(changed.map((k) => words[k] ?? lowerFirst(humanize(k))));\n const change: Omit<Placed, \"rank\"> = { kind: \"changed\", area: \"styles\", subject, summary: sentence(list(names)) };\n if (changed.length === 1) {\n const key = changed[0]!;\n change.before = styleValue(key, before[key]);\n change.after = styleValue(key, after[key]);\n }\n return change;\n}\n\nfunction styleValue(key: string, value: unknown): string {\n if (value === undefined || value === null) return \"Default\";\n if (typeof value === \"boolean\") return onOff(value);\n if (typeof value === \"number\") return /line|weight/i.test(key) ? String(value) : `${value} px`;\n if (typeof value === \"string\") return /colou?r|background/i.test(key) ? colour(value) : value.startsWith(\"$\") ? token(value) : humanize(value);\n return \"Custom\";\n}\n\n/* ---------------------------------------------------------------- nodes */\n\ntype Region = \"header\" | \"body\" | \"footer\";\n\ninterface Entry {\n node: Node;\n /** The node that holds it, or null at the top of a region list. */\n parentId: string | null;\n /** Distinguishes the five top-level lists from each other. */\n parentKey: string;\n area: Region;\n /** Position in a depth-first walk of the whole template. */\n order: number;\n}\n\ninterface Indexed {\n byId: Map<string, Entry>;\n ordered: Entry[];\n /** Children in order, keyed by `parentKey`. */\n children: Map<string, string[]>;\n}\n\nfunction indexTemplate(template: ReportTemplate): Indexed {\n const byId = new Map<string, Entry>();\n const ordered: Entry[] = [];\n const children = new Map<string, string[]>();\n const lists: Array<[Region, string, Node[] | undefined]> = [\n [\"header\", \"header:default\", template.header?.default],\n [\"header\", \"header:firstPage\", template.header?.firstPage],\n [\"body\", \"body\", template.body],\n [\"footer\", \"footer:default\", template.footer?.default],\n [\"footer\", \"footer:firstPage\", template.footer?.firstPage]\n ];\n const walk = (nodes: Node[], area: Region, parentKey: string, parentId: string | null) => {\n const ids: string[] = [];\n for (const node of nodes) {\n // A duplicate id would make \"which one changed\" unanswerable; the first\n // one wins, which is also what the editor's own lookup does.\n if (byId.has(node.id)) continue;\n const entry: Entry = { node, parentId, parentKey, area, order: ordered.length };\n byId.set(node.id, entry);\n ordered.push(entry);\n ids.push(node.id);\n if (node.children?.length) walk(node.children, area, node.id, node.id);\n }\n children.set(parentKey, ids);\n };\n for (const [area, key, nodes] of lists) if (nodes) walk(nodes, area, key, null);\n return { byId, ordered, children };\n}\n\nfunction nodeChanges(before: ReportTemplate, after: ReportTemplate, ctx: Context): Placed[] {\n const a = indexTemplate(before);\n const b = indexTemplate(after);\n const out: Placed[] = [];\n\n /*\n * Where a removed node sorts.\n *\n * It no longer has a position in the newer template, so it takes the position\n * just after the nearest earlier node that survived — which puts \"Removed the\n * chart\" next to the things that were beside it rather than at the end of the\n * list.\n */\n const removedRank = (entry: Entry): number => {\n for (let i = entry.order - 1; i >= 0; i--) {\n const survivor = b.byId.get(a.ordered[i]!.node.id);\n if (survivor) return survivor.order + 0.5;\n }\n return -0.5;\n };\n\n for (const entry of a.ordered) {\n const id = entry.node.id;\n if (b.byId.has(id)) continue;\n // Inside something that was removed as well: that removal already says it.\n if (entry.parentId && !b.byId.has(entry.parentId)) continue;\n out.push({\n kind: \"removed\",\n area: entry.area,\n nodeId: id,\n subject: subjectOf(entry, a, ctx),\n summary: `Removed ${refOf(entry, a, ctx, \"definite\")}${place(entry, a, \"from\", ctx)}`,\n rank: removedRank(entry)\n });\n }\n\n // Which surviving nodes changed their order among the siblings both versions share.\n const reordered = new Set<string>();\n for (const [key, afterIds] of b.children) {\n const beforeIds = a.children.get(key);\n if (!beforeIds) continue;\n const shared = beforeIds.filter((id) => afterIds.includes(id));\n if (shared.length < 2) continue;\n const positions = shared.map((id) => afterIds.indexOf(id));\n const keep = longestIncreasing(positions);\n shared.forEach((id, i) => {\n if (!keep.has(i)) reordered.add(id);\n });\n }\n\n for (const entry of b.ordered) {\n const id = entry.node.id;\n const was = a.byId.get(id);\n if (!was) {\n if (entry.parentId && !a.byId.has(entry.parentId)) continue;\n out.push({\n kind: \"added\",\n area: entry.area,\n nodeId: id,\n subject: subjectOf(entry, b, ctx),\n summary: `Added ${refOf(entry, b, ctx, \"indefinite\")}${place(entry, b, \"to\", ctx)}`,\n rank: entry.order\n });\n continue;\n }\n\n if (was.parentKey !== entry.parentKey) {\n const from = place(was, a, \"from\", ctx);\n const to = place(entry, b, \"to\", ctx);\n const within = place(entry, b, \"within\", ctx);\n out.push({\n kind: \"moved\",\n area: entry.area,\n nodeId: id,\n subject: subjectOf(entry, b, ctx),\n // Between two columns of the same section is still \"within\" it: naming the\n // same section twice would read as a mistake.\n summary: `Moved ${refOf(entry, b, ctx, \"definite\")}${from.replace(/^ from /, \"\") === to.replace(/^ to /, \"\") ? within : `${from}${to}`}`,\n rank: entry.order\n });\n } else if (reordered.has(id)) {\n out.push({\n kind: \"moved\",\n area: entry.area,\n nodeId: id,\n subject: subjectOf(entry, b, ctx),\n summary: `Moved ${refOf(entry, b, ctx, \"definite\")}${place(entry, b, \"within\", ctx)}`,\n rank: entry.order\n });\n }\n\n const changed = nodeEdit(was, a, entry, b, ctx);\n if (changed) out.push({ ...changed, rank: entry.order + 0.25 });\n }\n\n return out;\n}\n\n/** The change to a node's own settings, ignoring its children and its lock. */\nfunction nodeEdit(was: Entry, wasIndex: Indexed, now: Entry, nowIndex: Indexed, ctx: Context): Placed | null {\n const x = was.node;\n const y = now.node;\n const propKeys = keysOf(x.props ?? {}, y.props ?? {}).filter((k) => !same(x.props?.[k], y.props?.[k]));\n const typeChanged = x.type !== y.type;\n const styleChanged = !same(x.style, y.style);\n const visibilityChanged = !same(x.visibleWhen, y.visibleWhen);\n const flowChanged = !same(x.flow, y.flow);\n const nameChanged = (x.name ?? \"\") !== (y.name ?? \"\");\n if (!propKeys.length && !typeChanged && !styleChanged && !visibilityChanged && !flowChanged && !nameChanged) return null;\n\n const ref = refOf(now, nowIndex, ctx, \"definite\");\n const where = place(now, nowIndex, \"in\", ctx);\n const base = { kind: \"changed\" as const, area: now.area, nodeId: y.id, subject: subjectOf(now, nowIndex, ctx), rank: 0 };\n const aspects = propKeys.length + Number(styleChanged) + Number(visibilityChanged) + Number(flowChanged) + Number(nameChanged) + Number(typeChanged);\n\n if (aspects === 1 && nameChanged) {\n // Renaming changes what the node is called, so the sentence names the old one.\n return { ...base, summary: `Renamed ${refOf(was, wasIndex, ctx, \"definite\")}${place(was, wasIndex, \"in\", ctx)}`, before: x.name ?? \"\", after: y.name ?? \"\" };\n }\n if (aspects === 1 && styleChanged) return { ...base, summary: `Changed the look of ${ref}${where}` };\n if (aspects === 1 && visibilityChanged) return { ...base, summary: `Changed when ${ref}${where} appears` };\n if (aspects === 1 && flowChanged) return { ...base, summary: `Changed how ${ref}${where} breaks across pages` };\n\n const names = unique([\n ...(typeChanged ? [\"type\"] : []),\n ...propKeys.map((k) => propLabel(y.type, k, ctx)),\n ...(styleChanged ? [\"look\"] : []),\n ...(visibilityChanged ? [\"visibility\"] : []),\n ...(flowChanged ? [\"page breaks\"] : []),\n ...(nameChanged ? [\"name\"] : [])\n ]);\n const summary = names.length > 3 ? `Changed ${names.length} settings of ${ref}${where}` : `Changed the ${list(names)} of ${ref}${where}`;\n const change: Placed = { ...base, summary };\n\n if (aspects === 1 && propKeys.length === 1) {\n const key = propKeys[0]!;\n const from = simpleValue(x.type, key, x.props?.[key], ctx);\n const to = simpleValue(y.type, key, y.props?.[key], ctx);\n if (from !== null && to !== null) {\n change.before = from;\n change.after = to;\n }\n }\n return change;\n}\n\n/* ---------------------------------------------------------- node naming */\n\n/** Structural types get their own nouns: the registry calls a row \"Columns\". */\nconst STRUCTURE_NOUNS: Record<string, string> = { section: \"section\", row: \"row of columns\", column: \"column\" };\n\nfunction blockName(type: string, ctx: Context): string {\n if (STRUCTURE_NOUNS[type]) return humanize(STRUCTURE_NOUNS[type]!);\n const name = ctx.registry?.get(type)?.name;\n return name && name.trim() ? name.trim() : humanize(type.replace(/[-_.]+/g, \" \"));\n}\n\nfunction subjectOf(entry: Entry, index: Indexed, ctx: Context): string {\n const node = entry.node;\n if (node.name?.trim()) return node.name.trim();\n if (node.type === \"section\") {\n const label = sectionLabel(entry, index, ctx);\n return label.quoted ? `Section “${label.text}”` : humanize(label.text);\n }\n return blockName(node.type, ctx);\n}\n\nfunction refOf(entry: Entry, index: Indexed, ctx: Context, form: \"definite\" | \"indefinite\"): string {\n const node = entry.node;\n if (node.type === \"section\") {\n const label = sectionLabel(entry, index, ctx);\n return label.quoted ? `the section “${label.text}”` : label.text;\n }\n if (node.name?.trim()) return `“${node.name.trim()}”`;\n const noun = lowerFirst(blockName(node.type, ctx));\n if (form === \"definite\") return `the ${noun}`;\n return `${/^[aeiou]/i.test(noun) ? \"an\" : \"a\"} ${noun}`;\n}\n\n/**\n * What a section is called: its own name, else the text of its first heading,\n * else its position — \"section 2\". A section with neither a name nor a heading\n * is usually a band of figures, and its position is the only thing a person\n * could find it by.\n */\nfunction sectionLabel(entry: Entry, index: Indexed, ctx: Context): { text: string; quoted: boolean } {\n const node = entry.node;\n if (node.name?.trim()) return { text: node.name.trim(), quoted: true };\n const heading = firstHeading(node, ctx);\n if (heading) return { text: heading, quoted: true };\n const siblings = index.children.get(entry.parentKey) ?? [];\n const sections = siblings.filter((id) => index.byId.get(id)?.node.type === \"section\");\n return { text: `section ${sections.indexOf(node.id) + 1}`, quoted: false };\n}\n\nfunction firstHeading(node: Node, ctx: Context): string | null {\n for (const child of node.children ?? []) {\n if (child.type === \"heading\") {\n const text = child.props?.text;\n if (typeof text === \"string\" && text.trim()) return clip(readableText(text, ctx).trim(), 60);\n if (isRichTextDoc(text)) return clip(richTextToPlain(text, (e) => expressionLabel(e, ctx)).trim(), 60);\n }\n const nested = firstHeading(child, ctx);\n if (nested) return nested;\n }\n return null;\n}\n\n/**\n * Where a node is: ` in “Summary”`, ` to section 2`, ` from the header`.\n *\n * The nearest section above it names the place, because a section is the thing\n * a person scrolls to. With no section above it — a block straight in the header\n * or footer — the region does. A section at the top of the body is its own place,\n * and says nothing.\n */\nfunction place(entry: Entry, index: Indexed, preposition: \"in\" | \"to\" | \"from\" | \"within\", ctx: Context): string {\n let cursor = entry.parentId ? index.byId.get(entry.parentId) : undefined;\n while (cursor) {\n if (cursor.node.type === \"section\") {\n const label = sectionLabel(cursor, index, ctx);\n return ` ${preposition} ${label.quoted ? `“${label.text}”` : label.text}`;\n }\n cursor = cursor.parentId ? index.byId.get(cursor.parentId) : undefined;\n }\n if (entry.area === \"header\") return ` ${preposition} the header`;\n if (entry.area === \"footer\") return ` ${preposition} the footer`;\n return preposition === \"within\" ? \" within the document\" : \"\";\n}\n\n/* ------------------------------------------------------------ properties */\n\nfunction propLabel(type: string, prop: string, ctx: Context): string {\n const def = ctx.registry?.get(type);\n const find = (fields: InspectorField[]): string | null => {\n for (const field of fields) if (field.prop === prop || field.prop.startsWith(`${prop}.`)) return field.label;\n return null;\n };\n for (const section of def?.inspector ?? []) {\n const label = find(section.fields);\n if (label) return lowerFirst(label);\n }\n return lowerFirst(humanize(prop));\n}\n\n/**\n * A property's value as a person would read it, or null when it is not one value.\n *\n * Only strings, numbers, booleans and rich text count: a table's columns or a\n * chart's series changing is described by name, and a before/after pair of two\n * JSON arrays would say nothing.\n */\nfunction simpleValue(type: string, prop: string, value: unknown, ctx: Context): string | null {\n if (value === undefined || value === null) return \"None\";\n if (typeof value === \"boolean\") return onOff(value);\n if (typeof value === \"number\") return String(value);\n if (isRichTextDoc(value)) return oneLine(richTextToPlain(value, (e) => expressionLabel(e, ctx)));\n if (typeof value !== \"string\") return null;\n\n const kind = ctx.registry?.bindingsOf(type).find((b) => b.prop === prop)?.kind;\n if (kind === \"value\" || kind === \"collection\") return expressionLabel(value, ctx);\n if (kind === \"condition\" || kind === \"list\") return null;\n if (!kind && looksLikeExpression(value)) return expressionLabel(value, ctx);\n return oneLine(readableText(value, ctx));\n}\n\n/** `{{ tokens }}` in a text prop, each replaced by what it names. */\nfunction readableText(text: string, ctx: Context): string {\n return text.replace(/\\{\\{([^}]*)\\}\\}/g, (_, expr: string) => expressionLabel(expr.trim(), ctx));\n}\n\n/**\n * Without a registry there is no telling a binding prop from a text prop, so the\n * unmistakable shapes are treated as expressions: a pipe, or a function call.\n * A bare dotted word is left alone — \"broadpaper.com\" is text far more often\n * than it is a path.\n */\nfunction looksLikeExpression(value: string): boolean {\n return /\\|\\s*[A-Za-z_]\\w*/.test(value) || /^\\s*[A-Za-z_]\\w*\\s*\\(/.test(value);\n}\n\nfunction expressionLabel(expr: string, ctx: Context): string {\n if (!expr.trim()) return \"nothing\";\n const { label } = describeExpression(expr, ctx.scope);\n // `describeExpression` hands back the source itself when it finds nothing to\n // name — a literal, or something it could not parse. Words survive; syntax\n // does not.\n if (label === expr && /[^\\w\\s'’-]/.test(expr)) return \"a calculated value\";\n return label;\n}\n\n/* ---------------------------------------------------------------- words */\n\nfunction colour(value: string | undefined): string {\n if (!value) return \"None\";\n return value.startsWith(\"$\") ? token(value) : value;\n}\n\n/** `$colors.primary` as \"Theme primary\". */\nfunction token(value: string): string {\n const last = value.slice(1).split(\".\").pop() ?? value;\n return `Theme ${lowerFirst(humanize(last))}`;\n}\n\nfunction onOff(value: boolean | undefined): string {\n return value ? \"On\" : \"Off\";\n}\n\nfunction list(words: string[]): string {\n if (words.length <= 1) return words[0] ?? \"\";\n return `${words.slice(0, -1).join(\", \")} and ${words[words.length - 1]}`;\n}\n\n/** Lower-cases a leading capital, but not an acronym: \"Table\" → \"table\", \"KPI\" stays. */\nfunction lowerFirst(text: string): string {\n if (text.length > 1 && text[1] === text[1]!.toUpperCase() && /[A-Z]/.test(text[1]!)) return text;\n return text.charAt(0).toLowerCase() + text.slice(1);\n}\n\nfunction oneLine(text: string): string {\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction clip(text: string, limit: number): string {\n return text.length <= limit ? text : `${text.slice(0, limit - 1).trimEnd()}…`;\n}\n\nfunction unique<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\n/* ------------------------------------------------------------- equality */\n\nfunction keysOf(a: unknown, b: unknown): string[] {\n const keys = new Set<string>();\n for (const o of [a, b]) if (o && typeof o === \"object\") for (const k of Object.keys(o)) keys.add(k);\n return [...keys];\n}\n\n/**\n * Deep equality that ignores key order and treats a missing key as undefined.\n *\n * A template that went through a JSON round trip, or through a store that\n * rebuilt its objects, is the same template; comparing references or serialised\n * strings would call it changed.\n */\nfunction same(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== \"object\" || typeof b !== \"object\") return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a)) {\n const other = b as unknown[];\n return a.length === other.length && a.every((v, i) => same(v, other[i]));\n }\n const x = a as Record<string, unknown>;\n const y = b as Record<string, unknown>;\n return keysOf(x, y).every((k) => same(x[k], y[k]));\n}\n\n/**\n * Indexes of a longest strictly increasing subsequence.\n *\n * The siblings in that subsequence kept their relative order; everything else is\n * what moved. Without it, inserting one block at the top would shift every later\n * sibling's index and each would be reported as moved.\n */\nfunction longestIncreasing(values: number[]): Set<number> {\n const tails: number[] = [];\n const previous: number[] = new Array(values.length).fill(-1);\n for (let i = 0; i < values.length; i++) {\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (values[tails[mid]!]! < values[i]!) lo = mid + 1;\n else hi = mid;\n }\n if (lo > 0) previous[i] = tails[lo - 1]!;\n tails[lo] = i;\n }\n const keep = new Set<number>();\n let cursor = tails.length ? tails[tails.length - 1]! : -1;\n while (cursor >= 0) {\n keep.add(cursor);\n cursor = previous[cursor]!;\n }\n return keep;\n}\n","import type { ReportTemplate, Node, FlowOptions } from \"../types/template.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { DataSource, ReportData, FieldSchema } from \"../types/data.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport { bindingSpecsFor } from \"../registry/registry.js\";\nimport type { BindingInfo, BindingSpec, BlockDefinition, RenderMode, ResolveHookContext } from \"../registry/block-definition.js\";\nimport { resolveDefaultProps } from \"../registry/block-definition.js\";\nimport { Scope, evaluate, evaluateCondition, splitTemplate, type EvalContext } from \"../expr/evaluate.js\";\nimport { toDisplayString } from \"../expr/format.js\";\nconst display = toDisplayString;\nimport type { FormatContext } from \"../expr/format.js\";\nimport { parseExpression, checkExpressionSyntax } from \"../expr/parser.js\";\nimport { collectPaths } from \"../expr/ast.js\";\nimport { SchemaScope, createSchemaScope, resolvePathSchema, typeCheckAst } from \"../expr/typecheck.js\";\nimport { compileCondition } from \"../expr/condition.js\";\nimport { resolveStyle } from \"../theme/resolve-style.js\";\nimport { mergeTheme } from \"../theme/tokens.js\";\nimport { isRichTextDoc, type RichTextDoc, type InlineNode, type Paragraph } from \"../richtext/model.js\";\nimport { synthesizeSampleData, synthesizeValue } from \"../data/sample.js\";\nimport { describeExpression } from \"./describe.js\";\nimport type { ResolvedDocument, ResolvedFlow, ResolvedNode, ResolvedRegion, ResolvedSegment } from \"./resolved.js\";\n\nexport interface ResolveOptions {\n template: ReportTemplate;\n registry: BlockRegistry;\n theme?: Partial<Theme>;\n dataSources?: DataSource[];\n /** Runtime data (preview / PDF). */\n data?: ReportData;\n /** Sample data used in design mode when `data` is absent. */\n sampleData?: ReportData;\n mode?: RenderMode;\n /** Fixed clock for deterministic output. */\n now?: Date;\n locale?: string;\n currency?: string;\n timeZone?: string;\n /** Iterations shown per repeater in design mode. */\n designIterations?: number;\n /** Hard cap on repeater iterations (safety). */\n maxIterations?: number;\n /** Whether per-block style overrides are honoured. */\n allowStyleOverrides?: boolean;\n /** Design mode: still show nodes whose condition is false (marked as hidden). */\n designShowHidden?: boolean;\n}\n\ninterface Ctx {\n registry: BlockRegistry;\n theme: Theme;\n template: ReportTemplate;\n mode: RenderMode;\n format: FormatContext;\n warnings: ResolvedDocument[\"warnings\"];\n designIterations: number;\n maxIterations: number;\n allowStyleOverrides: boolean;\n designShowHidden: boolean;\n dataSources: DataSource[];\n}\n\n/**\n * Resolves a template into a `ResolvedDocument`: evaluates every binding,\n * expands repeaters, decides conditionals and cascades styles.\n */\nexport function resolveTemplate(opts: ResolveOptions): ResolvedDocument {\n const mode: RenderMode = opts.mode ?? \"preview\";\n const theme = mergeTheme(opts.theme);\n const template = opts.template;\n const dataSources = opts.dataSources ?? [];\n const now = opts.now ?? new Date();\n const format: FormatContext = {\n locale: opts.locale ?? template.settings?.locale ?? \"en-GB\",\n currency: opts.currency ?? template.settings?.currency ?? \"GBP\",\n timeZone: opts.timeZone ?? template.settings?.timeZone,\n now\n };\n const warnings: ResolvedDocument[\"warnings\"] = [];\n\n let data: ReportData;\n if (mode === \"preview\") data = opts.data ?? opts.sampleData ?? {};\n else data = opts.data ?? opts.sampleData ?? synthesizeSampleData(dataSources, { now });\n if (mode === \"design\") {\n // Fill any sources the sample omitted so the canvas never shows holes.\n const synth = synthesizeSampleData(dataSources, { now });\n data = { ...synth, ...data };\n }\n\n const globals: Record<string, unknown> = {\n page: { number: 1, total: 1 },\n now,\n theme: { name: theme.name, logo: theme.logo, logoDark: theme.logoDark, colors: theme.colors, typography: theme.typography, meta: theme.meta ?? {} }\n };\n const scope = new Scope(globals).child(data);\n const schemaScope = createSchemaScope(dataSources);\n\n const ctx: Ctx = {\n registry: opts.registry,\n theme,\n template,\n mode,\n format,\n warnings,\n designIterations: Math.max(1, opts.designIterations ?? 1),\n maxIterations: opts.maxIterations ?? 5000,\n allowStyleOverrides: opts.allowStyleOverrides ?? true,\n designShowHidden: opts.designShowHidden ?? true,\n dataSources\n };\n\n const resolveList = (nodes: Node[] | undefined) => (nodes ?? []).flatMap((n) => resolveNode(ctx, n, scope, schemaScope, \"\", \"section\"));\n\n const header: ResolvedRegion = { default: resolveList(template.header?.default) };\n if (template.page.header.differentFirstPage) header.firstPage = resolveList(template.header?.firstPage);\n const footer: ResolvedRegion = { default: resolveList(template.footer?.default) };\n if (template.page.footer.differentFirstPage) footer.firstPage = resolveList(template.footer?.firstPage);\n\n return { body: resolveList(template.body), header, footer, warnings, mode };\n}\n\nfunction isPageDependent(expr: string): boolean {\n try {\n return collectPaths(parseExpression(expr)).some((p) => p[0]?.kind === \"prop\" && p[0].name === \"page\");\n } catch {\n return false;\n }\n}\n\nfunction evalCtx(ctx: Ctx, scope: Scope, nodeId: string): EvalContext {\n return {\n scope,\n format: ctx.format,\n onWarning: (message, expr) => ctx.warnings.push({ message, nodeId, expr })\n };\n}\n\nfunction safeEvaluate(ctx: Ctx, scope: Scope, nodeId: string, expr: string): unknown {\n try {\n return evaluate(expr, evalCtx(ctx, scope, nodeId));\n } catch (e) {\n ctx.warnings.push({ message: `Invalid expression: ${(e as Error).message}`, nodeId, expr });\n return undefined;\n }\n}\n\nconst labelFor = describeExpression;\n\nfunction resolveSegments(ctx: Ctx, scope: Scope, schemaScope: SchemaScope, nodeId: string, value: string): { segments: ResolvedSegment[]; text: string; pageDependent: boolean } {\n const segments: ResolvedSegment[] = [];\n let pageDependent = false;\n for (const s of splitTemplate(value)) {\n if (s.kind === \"text\") {\n segments.push(s);\n continue;\n }\n const expr = s.expr!;\n const { label } = labelFor(expr, schemaScope);\n if (isPageDependent(expr)) {\n pageDependent = true;\n segments.push({ ...s, label, deferred: true });\n continue;\n }\n const v = safeEvaluate(ctx, scope, nodeId, expr);\n segments.push({ ...s, label, value: display(v) });\n }\n const text = segments.map((s) => (s.kind === \"text\" ? s.text : s.value ?? \"\")).join(\"\");\n return { segments, text, pageDependent };\n}\n\nfunction resolveRichText(ctx: Ctx, scope: Scope, schemaScope: SchemaScope, nodeId: string, doc: RichTextDoc): { doc: RichTextDoc; pageDependent: boolean } {\n let pageDependent = false;\n const inline = (content: InlineNode[]): InlineNode[] =>\n content.map((n) => {\n if (n.type !== \"token\") {\n if (n.type === \"text\" && n.marks?.link?.includes(\"{{\")) {\n const r = resolveSegments(ctx, scope, schemaScope, nodeId, n.marks.link);\n return { ...n, marks: { ...n.marks, link: r.text } };\n }\n return n;\n }\n const { label } = labelFor(n.expr, schemaScope);\n if (isPageDependent(n.expr)) {\n pageDependent = true;\n return { ...n, label, deferred: true };\n }\n return { ...n, label, value: display(safeEvaluate(ctx, scope, nodeId, n.expr)) };\n });\n const para = (p: Paragraph): Paragraph => ({ ...p, content: inline(p.content) });\n const out: RichTextDoc = {\n type: \"doc\",\n content: doc.content.map((b) => (b.type === \"paragraph\" ? para(b) : { ...b, content: b.content.map((li) => ({ ...li, content: li.content.map(para) })) }))\n };\n return { doc: out, pageDependent };\n}\n\nfunction getPath(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const p of parts) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\nfunction setPath(obj: Record<string, unknown>, path: string, value: unknown) {\n const parts = path.split(\".\");\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const p = parts[i]!;\n if (typeof cur[p] !== \"object\" || cur[p] === null) cur[p] = {};\n cur = cur[p] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]!] = value;\n}\n\nfunction resolveFlow(def: BlockDefinition | undefined, node: Node, textStyleKeepWithNext: boolean | undefined): ResolvedFlow {\n const d: FlowOptions = def?.defaultFlow ?? {};\n const n: FlowOptions = node.flow ?? {};\n const isContainer = !!def?.container;\n const split = def?.split ?? (isContainer ? \"children\" : \"none\");\n return {\n breakBefore: n.breakBefore ?? d.breakBefore ?? \"auto\",\n breakAfter: n.breakAfter ?? d.breakAfter ?? \"auto\",\n keepTogether: n.keepTogether ?? d.keepTogether ?? false,\n keepWithNext: n.keepWithNext ?? d.keepWithNext ?? textStyleKeepWithNext ?? false,\n split,\n minOrphans: n.minOrphans ?? d.minOrphans ?? 2,\n minWidows: n.minWidows ?? d.minWidows ?? 2\n };\n}\n\nfunction roleOf(type: string): ResolvedNode[\"role\"] {\n return type === \"section\" || type === \"row\" || type === \"column\" ? type : \"block\";\n}\n\n/**\n * Resolves a single template node into zero or more resolved nodes (zero when\n * hidden by a condition in preview mode).\n */\nexport function resolveNode(ctx: Ctx, node: Node, scope: Scope, schemaScope: SchemaScope, keyPrefix: string, _parentRole: ResolvedNode[\"role\"]): ResolvedNode[] {\n const def = ctx.registry.get(node.type);\n const key = keyPrefix + node.id;\n const nodeId = node.id;\n\n // Visibility\n let hiddenByCondition = false;\n const cond = compileCondition(node.visibleWhen);\n if (cond) {\n const syntax = checkExpressionSyntax(cond);\n if (syntax) ctx.warnings.push({ message: `Invalid condition: ${syntax.message}`, nodeId, expr: cond });\n else {\n let visible = true;\n try {\n visible = evaluateCondition(cond, evalCtx(ctx, scope, nodeId));\n } catch (e) {\n ctx.warnings.push({ message: `Condition failed: ${(e as Error).message}`, nodeId, expr: cond });\n }\n if (!visible) {\n if (ctx.mode === \"preview\" || !ctx.designShowHidden) return [];\n hiddenByCondition = true;\n }\n }\n }\n\n if (!def) {\n ctx.warnings.push({ message: `Unknown block type \"${node.type}\"`, nodeId });\n return [\n {\n key,\n nodeId,\n type: node.type,\n role: roleOf(node.type),\n props: { ...node.props, __unknown: true },\n raw: node.props,\n style: resolveStyle({ theme: ctx.theme, styles: ctx.template.styles }),\n flow: resolveFlow(undefined, node, undefined),\n children: [],\n bindings: {},\n textSegments: {},\n richText: {},\n label: node.name ?? node.type,\n locked: node.locked\n }\n ];\n }\n\n const defaults = resolveDefaultProps(def);\n const raw: Record<string, unknown> = { ...defaults, ...node.props };\n const props: Record<string, unknown> = structuredClone(raw);\n const bindings: Record<string, BindingInfo> = {};\n const textSegments: Record<string, ResolvedSegment[]> = {};\n const richText: Record<string, RichTextDoc> = {};\n let pageDependent = false;\n\n const applySpec = (spec: BindingSpec, target: Record<string, unknown>, propPrefix: string) => {\n const propPath = propPrefix + spec.prop;\n const value = getPath(target, spec.prop);\n switch (spec.kind) {\n case \"value\": {\n if (typeof value !== \"string\" || value.trim() === \"\") return;\n const { label, type } = labelFor(value, schemaScope);\n bindings[propPath] = { prop: propPath, kind: \"value\", expr: value, label, type };\n if (isPageDependent(value)) {\n pageDependent = true;\n setPath(target, spec.prop, undefined);\n return;\n }\n setPath(target, spec.prop, safeEvaluate(ctx, scope, nodeId, value));\n return;\n }\n case \"collection\": {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n setPath(target, spec.prop, []);\n return;\n }\n const { label, type } = labelFor(value, schemaScope);\n bindings[propPath] = { prop: propPath, kind: \"collection\", expr: value, label, type };\n const v = safeEvaluate(ctx, scope, nodeId, value);\n setPath(target, spec.prop, Array.isArray(v) ? v : v === undefined || v === null ? [] : [v]);\n return;\n }\n case \"template\": {\n if (typeof value !== \"string\") return;\n if (!value.includes(\"{{\")) {\n textSegments[propPath] = [{ kind: \"text\", text: value }];\n return;\n }\n const r = resolveSegments(ctx, scope, schemaScope, nodeId, value);\n if (r.pageDependent) pageDependent = true;\n textSegments[propPath] = r.segments;\n const tokens = r.segments.filter((s) => s.kind === \"token\");\n if (tokens.length === 1 && r.segments.length === 1) {\n const { label, type } = labelFor(tokens[0]!.expr!, schemaScope);\n bindings[propPath] = { prop: propPath, kind: \"template\", expr: tokens[0]!.expr!, label, type };\n }\n setPath(target, spec.prop, r.text);\n return;\n }\n case \"richtext\": {\n if (!isRichTextDoc(value)) return;\n const r = resolveRichText(ctx, scope, schemaScope, nodeId, value);\n if (r.pageDependent) pageDependent = true;\n richText[propPath] = r.doc;\n return;\n }\n case \"condition\":\n case \"list\":\n return;\n }\n };\n\n for (const spec of bindingSpecsFor(def)) {\n if (spec.perItem) continue;\n if (spec.items) {\n const list = getPath(props, spec.prop);\n if (Array.isArray(list)) list.forEach((item, i) => item && typeof item === \"object\" && spec.items!.forEach((s) => !s.perItem && applySpec(s, item as Record<string, unknown>, `${spec.prop}.${i}.`)));\n continue;\n }\n applySpec(spec, props, \"\");\n }\n\n // Block-level resolve hook\n if (def.resolve) {\n const hookCtx: ResolveHookContext<Record<string, unknown>> = {\n props,\n node,\n scope,\n mode: ctx.mode,\n theme: ctx.theme,\n format: ctx.format,\n evaluate: (expr) => safeEvaluate(ctx, scope, nodeId, expr),\n evaluateIn: (expr, vars) => safeEvaluate(ctx, scope.child(vars), nodeId, expr),\n warn: (message) => ctx.warnings.push({ message, nodeId })\n };\n try {\n const out = def.resolve(hookCtx);\n if (out && typeof out === \"object\") Object.assign(props, out);\n } catch (e) {\n ctx.warnings.push({ message: `Block \"${def.name}\" failed to resolve: ${(e as Error).message}`, nodeId });\n }\n }\n\n // Style + flow\n const textStyleId = node.style?.textStyle ?? def.defaultTextStyle;\n const style = resolveStyle({\n theme: ctx.theme,\n styles: ctx.template.styles,\n textStyle: textStyleId,\n defaults: def.defaultStyle,\n overrides: node.style,\n allowOverrides: ctx.allowStyleOverrides\n });\n const textStyleDef = textStyleId ? ctx.template.styles.text[textStyleId] : undefined;\n const flow = resolveFlow(def, node, textStyleDef?.keepWithNext);\n\n // Children\n let children: ResolvedNode[] = [];\n let iterationInfo: ResolvedNode[\"iteration\"] | undefined;\n let placeholder = false;\n const c = def.container;\n if (c?.repeat) {\n const listValue = props[c.repeat.collectionProp];\n const alias = (props[c.repeat.aliasProp ?? \"alias\"] as string) || \"item\";\n const collectionExpr = raw[c.repeat.collectionProp];\n let items = Array.isArray(listValue) ? listValue : [];\n const limit = c.repeat.limitProp ? Number(props[c.repeat.limitProp]) || undefined : undefined;\n if (limit) items = items.slice(0, limit);\n if (items.length > ctx.maxIterations) {\n ctx.warnings.push({ message: `Repeater truncated to ${ctx.maxIterations} items`, nodeId });\n items = items.slice(0, ctx.maxIterations);\n }\n let itemSchema: FieldSchema | undefined;\n if (typeof collectionExpr === \"string\" && collectionExpr.trim()) {\n try {\n let ast = parseExpression(collectionExpr);\n while (ast.kind === \"pipe\") ast = ast.input;\n const r = ast.kind === \"path\" ? resolvePathSchema(ast.segments, schemaScope) : {};\n itemSchema = r.schema?.type === \"array\" ? r.schema.itemSchema : undefined;\n } catch {\n itemSchema = undefined;\n }\n }\n if (ctx.mode === \"design\") {\n if (items.length === 0) {\n items = itemSchema ? [synthesizeValue(itemSchema, { now: ctx.format.now }, 0, 0)] : [{}];\n placeholder = true;\n }\n items = items.slice(0, ctx.designIterations);\n }\n const keepItem = c.repeat.keepItemTogetherProp ? !!props[c.repeat.keepItemTogetherProp] : false;\n const count = items.length;\n const childSchemaScope = schemaScope.child({\n [alias]: itemSchema ?? { type: \"object\", label: alias, fields: {} },\n index: { type: \"number\", label: \"Index\" },\n first: { type: \"boolean\", label: \"Is first\" },\n last: { type: \"boolean\", label: \"Is last\" },\n count: { type: \"number\", label: \"Count\" }\n });\n children = items.map((item, index) => {\n const iterScope = scope.child({ [alias]: item, item, index: index + 1, first: index === 0, last: index === count - 1, count });\n const iterKey = `${key}@${index}`;\n const iterChildren = (node.children ?? []).flatMap((ch) => resolveNode(ctx, ch, iterScope, childSchemaScope, `${iterKey}/`, \"block\"));\n const iteration: ResolvedNode = {\n key: iterKey,\n nodeId,\n type: \"repeater-item\",\n role: \"block\",\n props: { index, count },\n raw: {},\n style: resolveStyle({ theme: ctx.theme, styles: ctx.template.styles }),\n flow: { breakBefore: \"auto\", breakAfter: \"auto\", keepTogether: keepItem, keepWithNext: false, split: \"children\", minOrphans: 1, minWidows: 1 },\n children: iterChildren,\n bindings: {},\n textSegments: {},\n richText: {},\n iteration: { index, count, alias },\n label: `${alias} ${index + 1}`\n };\n return iteration;\n });\n iterationInfo = undefined;\n props.__itemCount = Array.isArray(listValue) ? listValue.length : 0;\n } else if (c?.conditional) {\n const condValue = compileCondition(raw[c.conditional.conditionProp] as never);\n let show = true;\n if (condValue) {\n const syntax = checkExpressionSyntax(condValue);\n if (syntax) ctx.warnings.push({ message: `Invalid condition: ${syntax.message}`, nodeId, expr: condValue });\n else {\n try {\n show = evaluateCondition(condValue, evalCtx(ctx, scope, nodeId));\n } catch (e) {\n ctx.warnings.push({ message: `Condition failed: ${(e as Error).message}`, nodeId, expr: condValue });\n }\n }\n }\n props.__conditionResult = show;\n if (show || ctx.mode === \"design\") {\n children = (node.children ?? []).flatMap((ch) => resolveNode(ctx, ch, scope, schemaScope, keyPrefix, \"block\"));\n }\n } else if (c) {\n children = (node.children ?? []).flatMap((ch) => resolveNode(ctx, ch, scope, schemaScope, keyPrefix, roleOf(node.type)));\n }\n\n const resolved: ResolvedNode = {\n key,\n nodeId,\n type: node.type,\n role: roleOf(node.type),\n props,\n raw,\n style,\n flow,\n children,\n bindings,\n textSegments,\n richText,\n label: node.name ?? def.canvas?.label?.(props) ?? def.name,\n locked: node.locked,\n pageDependent: pageDependent || undefined,\n placeholder: placeholder || undefined,\n iteration: iterationInfo\n };\n if (hiddenByCondition) resolved.props.__hiddenByCondition = true;\n if (node.type === \"row\") {\n const layout = Array.isArray(props.layout) ? (props.layout as number[]) : children.map(() => 12 / Math.max(1, children.length));\n resolved.layout = { columns: layout };\n children.forEach((col, i) => {\n col.span = layout[i] ?? 12 / Math.max(1, children.length);\n });\n }\n return [resolved];\n}\n\n/** Convenience for tests and tooling: resolves and returns display text of an expression. */\nexport function evaluateToText(expr: string, data: ReportData, format?: Partial<FormatContext>): string {\n const scope = new Scope({ now: format?.now ?? new Date() }).child(data);\n return toDisplayString(\n evaluate(expr, {\n scope,\n format: { locale: \"en-GB\", currency: \"GBP\", ...format }\n })\n );\n}\n","import type { ResolvedStyle } from \"../types/style.js\";\nimport type { BindingInfo, SplitMode } from \"../registry/block-definition.js\";\nimport type { PageContext } from \"../types/data.js\";\nimport type { RichTextDoc } from \"../richtext/model.js\";\nimport type { TemplateSegment } from \"../expr/evaluate.js\";\n\nexport type ResolvedRole = \"section\" | \"row\" | \"column\" | \"block\";\n\nexport interface ResolvedFlow {\n breakBefore: \"auto\" | \"page\";\n breakAfter: \"auto\" | \"page\";\n keepTogether: boolean;\n keepWithNext: boolean;\n split: SplitMode;\n minOrphans: number;\n minWidows: number;\n}\n\n/**\n * A node after resolution: every expression evaluated, every repeater expanded,\n * every conditional decided, every style concrete. This is what the measurer,\n * paginator and renderers consume. It is plain data and fully serialisable\n * (which is how the PDF service receives it).\n */\nexport interface ResolvedNode {\n /** Unique instance key. Repeater iterations get `${nodeId}@${index}` suffixes. */\n key: string;\n /** Template node id this instance came from. */\n nodeId: string;\n type: string;\n role: ResolvedRole;\n /** Evaluated props (binding props replaced by their values). */\n props: Record<string, unknown>;\n /** Original template props (for design-mode chips and inline editing). */\n raw: Record<string, unknown>;\n style: ResolvedStyle;\n flow: ResolvedFlow;\n children: ResolvedNode[];\n bindings: Record<string, BindingInfo>;\n /** Interpolated `template` props as segments (design mode renders tokens as chips). */\n textSegments: Record<string, ResolvedSegment[]>;\n /** Resolved rich text props. */\n richText: Record<string, RichTextDoc>;\n /** For rows: column spans in twelfths. */\n layout?: { columns: number[] };\n /** For columns: span in twelfths. */\n span?: number;\n /** Repeater metadata for iterations. */\n iteration?: { index: number; count: number; alias: string };\n /** Human label for the layer tree / breadcrumbs. */\n label?: string;\n /** True in design mode for placeholder content (e.g. an empty repeater). */\n placeholder?: boolean;\n /** Node is locked in the editor. */\n locked?: boolean;\n /** True if any prop references `page.*` (rendered per page). */\n pageDependent?: boolean;\n}\n\nexport interface ResolvedSegment extends TemplateSegment {\n /** Evaluated value for tokens (undefined when page-dependent). */\n value?: string;\n /** Human label for the chip. */\n label?: string;\n /** Deferred: evaluated at render time with the page context. */\n deferred?: boolean;\n}\n\nexport interface ResolvedRegion {\n /** Sections for regular pages. */\n default: ResolvedNode[];\n /** Sections for the first page (only when differentFirstPage). */\n firstPage?: ResolvedNode[];\n}\n\nexport interface ResolvedDocument {\n body: ResolvedNode[];\n header: ResolvedRegion;\n footer: ResolvedRegion;\n /** Warnings collected during resolution (unknown fields, bad expressions...). */\n warnings: Array<{ message: string; nodeId?: string; expr?: string }>;\n mode: \"design\" | \"preview\";\n}\n\nexport const DEFAULT_PAGE_CONTEXT: PageContext = { number: 1, total: 1 };\n","import type { PageSettings, PageSize, PageSizeName } from \"../types/template.js\";\n\n/** CSS pixels per millimetre at 96 dpi. */\nexport const PX_PER_MM = 96 / 25.4;\n\nexport const PAGE_SIZES_MM: Record<PageSizeName, { width: number; height: number }> = {\n A3: { width: 297, height: 420 },\n A4: { width: 210, height: 297 },\n A5: { width: 148, height: 210 },\n Letter: { width: 215.9, height: 279.4 },\n Legal: { width: 215.9, height: 355.6 },\n Tabloid: { width: 279.4, height: 431.8 }\n};\n\nexport function mmToPx(mm: number): number {\n return Math.round(mm * PX_PER_MM * 100) / 100;\n}\n\nexport function pxToMm(px: number): number {\n return Math.round((px / PX_PER_MM) * 100) / 100;\n}\n\nexport function pageSizeMm(size: PageSize): { width: number; height: number } {\n return typeof size === \"string\" ? PAGE_SIZES_MM[size] ?? PAGE_SIZES_MM.A4 : size;\n}\n\n/** Concrete page geometry in CSS px. */\nexport interface PageGeometry {\n width: number;\n height: number;\n margins: { top: number; right: number; bottom: number; left: number };\n headerHeight: number;\n footerHeight: number;\n /** Width of the content column (page width minus horizontal margins). */\n contentWidth: number;\n /** Height available for body content on a regular page. */\n contentHeight: number;\n /** Y offset of the body content box from the page top. */\n contentTop: number;\n /** Y offset of the header region from the page top. */\n headerTop: number;\n /** Y offset of the footer region from the page top. */\n footerTop: number;\n}\n\nexport function computePageGeometry(page: PageSettings): PageGeometry {\n const size = pageSizeMm(page.size);\n const portrait = page.orientation !== \"landscape\";\n const width = mmToPx(portrait ? size.width : size.height);\n const height = mmToPx(portrait ? size.height : size.width);\n const margins = {\n top: mmToPx(page.margins.top),\n right: mmToPx(page.margins.right),\n bottom: mmToPx(page.margins.bottom),\n left: mmToPx(page.margins.left)\n };\n const headerHeight = mmToPx(Math.max(0, page.header.height));\n const footerHeight = mmToPx(Math.max(0, page.footer.height));\n const contentTop = margins.top + headerHeight;\n const footerTop = height - margins.bottom - footerHeight;\n return {\n width,\n height,\n margins,\n headerHeight,\n footerHeight,\n contentWidth: Math.max(0, width - margins.left - margins.right),\n contentHeight: Math.max(0, footerTop - contentTop),\n contentTop,\n headerTop: margins.top,\n footerTop\n };\n}\n","import type { ResolvedDocument, ResolvedNode } from \"../resolve/resolved.js\";\nimport type { GeometryMap, NodeGeometry, SectionGeometry } from \"./geometry.js\";\nimport type { PageGeometry } from \"./page-geometry.js\";\n\n/* ------------------------------------------------------------------ */\n/* Output model */\n/* ------------------------------------------------------------------ */\n\nexport interface RepeatedHeader {\n tableKey: string;\n height: number;\n left: number;\n width: number;\n}\n\n/**\n * A clip window over a section's full render, placed on a page.\n * `[from, to)` are y coordinates in the section's own coordinate space.\n */\nexport interface PageFragment {\n sectionKey: string;\n from: number;\n to: number;\n /** Table headers to repeat above the clipped content (tables cut at `from`). */\n repeatHeaders: RepeatedHeader[];\n /** Y position of the fragment within the page content box. */\n y: number;\n /** Rendered height: (to - from) + repeated header heights. */\n height: number;\n /** True when this fragment continues a section started on an earlier page. */\n continued: boolean;\n /** True when the section continues on a later page. */\n continues: boolean;\n}\n\nexport interface Page {\n index: number;\n number: number;\n fragments: PageFragment[];\n /** Whether page 1 variants of header/footer apply. */\n first: boolean;\n}\n\nexport interface LayoutWarning {\n code: \"forced-split\" | \"region-overflow\" | \"oversized-header\" | \"empty-document\" | \"no-op-break\";\n message: string;\n nodeId?: string;\n sectionKey?: string;\n page?: number;\n}\n\nexport interface PagedDocument {\n pages: Page[];\n totalPages: number;\n geometry: PageGeometry;\n warnings: LayoutWarning[];\n}\n\nexport interface PaginateOptions {\n document: ResolvedDocument;\n geometry: GeometryMap;\n page: PageGeometry;\n /** Show at least this many pages (design canvas). */\n minPages?: number;\n /** Geometry for header/footer sections (for overflow warnings). */\n regionGeometry?: GeometryMap;\n}\n\n/* ------------------------------------------------------------------ */\n/* Break finding */\n/* ------------------------------------------------------------------ */\n\ninterface BreakCtx {\n geom: SectionGeometry;\n pageHeight: number;\n}\n\nfunction g(ctx: BreakCtx, node: ResolvedNode): NodeGeometry {\n return ctx.geom.nodes[node.key] ?? { top: 0, height: 0, left: 0, width: 0 };\n}\n\nconst EPS = 0.01;\n\n/**\n * Largest valid break position y with minY < y <= limit inside a list of\n * siblings, or null if none exists.\n */\nexport function bestBreak(ctx: BreakCtx, list: ResolvedNode[], limit: number, minY: number): number | null {\n // Keep-with-next means \"stay with the next thing the reader can see\". A\n // sibling that draws nothing — a conditional whose rule is false, an empty\n // repeater — must not satisfy it, or a heading is left stranded at the foot\n // of a page while its content starts the next one.\n const visible = (from: number, step: -1 | 1): ResolvedNode | undefined => {\n for (let j = from; j >= 0 && j < list.length; j += step) {\n const s = list[j]!;\n if (g(ctx, s).height > EPS) return s;\n }\n return undefined;\n };\n\n for (let i = list.length - 1; i >= 0; i--) {\n const child = list[i]!;\n const cg = g(ctx, child);\n const top = cg.top;\n const bottom = cg.top + cg.height;\n if (top > limit + EPS) continue;\n // A child that draws nothing is not a break site of its own: breaking after\n // it is the same as breaking before the next visible child, and letting it\n // offer a break here would strand the heading it sits behind.\n if (cg.height <= EPS) continue;\n\n const next = visible(i + 1, 1);\n if (bottom > limit + EPS) {\n // Child straddles the limit: try to split it. A break at the child's very\n // top is really a break *before* it and must respect keep-with-next below.\n const inner = breakInside(ctx, child, limit, minY);\n if (inner !== null && inner > minY + EPS && inner > top + EPS) return inner;\n } else {\n // Child ends above the limit: break after it (keep the gap on this page).\n const candidate = next ? Math.min(g(ctx, next).top, limit) : Math.min(bottom, limit);\n const blocked = child.flow.keepWithNext && !!next;\n if (!blocked && candidate > minY + EPS) return candidate;\n if (!blocked) return null;\n }\n\n // Break before this child.\n const prev = visible(i - 1, -1);\n const prevBlocks = !!prev && prev.flow.keepWithNext;\n if (!prevBlocks && top > minY + EPS) return top;\n if (!prevBlocks) return null;\n // Previous sibling insists on staying with us: keep walking back so the\n // break lands before it (or inside it if it is splittable).\n }\n return null;\n}\n\nfunction breakInside(ctx: BreakCtx, node: ResolvedNode, limit: number, minY: number): number | null {\n const ng = g(ctx, node);\n const fitsOnFreshPage = ng.height <= ctx.pageHeight + EPS;\n if (node.flow.keepTogether && fitsOnFreshPage) return null;\n\n if (node.role === \"row\" && node.children.length > 1) {\n const allowSplit = node.props.allowSplit === true;\n if (!allowSplit && fitsOnFreshPage) return null;\n return columnsAgree(ctx, node.children, limit, minY);\n }\n\n switch (node.flow.split) {\n case \"none\":\n return null;\n case \"lines\": {\n const lines = ng.lines;\n if (!lines || lines.length < 2) return null;\n const minOrphans = Math.max(1, node.flow.minOrphans);\n const minWidows = Math.max(1, node.flow.minWidows);\n for (let i = lines.length - 2; i >= 0; i--) {\n const y = lines[i]!;\n if (y > limit + EPS) continue;\n const before = i + 1;\n const after = lines.length - before;\n if (before < minOrphans) return null;\n if (after < minWidows) continue;\n return y > minY + EPS ? y : null;\n }\n return null;\n }\n case \"rows\": {\n const rows = ng.rows;\n if (!rows || rows.length === 0) return null;\n const body = rows.filter((r) => r.kind === \"body\");\n if (body.length < 2) return null;\n const minOrphans = Math.max(1, node.flow.minOrphans);\n const minWidows = Math.max(1, node.flow.minWidows);\n for (let i = body.length - 2; i >= 0; i--) {\n const r = body[i]!;\n const y = r.top + r.height;\n if (y > limit + EPS) continue;\n const before = i + 1;\n const after = body.length - before;\n if (before < minOrphans) return null;\n if (after < minWidows) continue;\n return y > minY + EPS ? y : null;\n }\n return null;\n }\n case \"children\":\n return bestBreak(ctx, node.children, limit, minY);\n }\n}\n\n/** Finds a y that is a valid break in every column simultaneously. */\nfunction columnsAgree(ctx: BreakCtx, columns: ResolvedNode[], limit: number, minY: number): number | null {\n let y = limit;\n for (let iter = 0; iter < 64; iter++) {\n let yNext = y;\n for (const col of columns) {\n const kids = col.children;\n if (kids.length === 0) continue;\n const first = g(ctx, kids[0]!).top;\n const lastG = g(ctx, kids[kids.length - 1]!);\n const last = lastG.top + lastG.height;\n if (y <= first + EPS || y >= last - EPS) continue;\n const b = bestBreak(ctx, kids, y, minY);\n if (b === null) return null;\n if (b < yNext) yNext = b;\n }\n if (Math.abs(yNext - y) < EPS) return y > minY + EPS ? y : null;\n y = yNext;\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Section helpers */\n/* ------------------------------------------------------------------ */\n\nfunction collectTables(node: ResolvedNode, out: ResolvedNode[] = []): ResolvedNode[] {\n if (node.flow.split === \"rows\") out.push(node);\n for (const c of node.children) collectTables(c, out);\n return out;\n}\n\nfunction repeatedHeadersAt(geom: SectionGeometry, tables: ResolvedNode[], from: number): RepeatedHeader[] {\n const out: RepeatedHeader[] = [];\n for (const t of tables) {\n const tg = geom.nodes[t.key];\n if (!tg?.rows) continue;\n const headerRows = tg.rows.filter((r) => r.kind === \"header\");\n if (headerRows.length === 0) continue;\n const bottom = tg.top + tg.height;\n if (tg.top < from - EPS && from < bottom - EPS) {\n const height = headerRows.reduce((a, r) => a + r.height, 0);\n out.push({ tableKey: t.key, height, left: tg.left, width: tg.width });\n }\n }\n return out;\n}\n\n/**\n * Offsets inside a section at which a page break was explicitly asked for.\n *\n * A \"page break\" block, or any block whose flow says `breakBefore`/`breakAfter:\n * \"page\"`, is an instruction rather than a preference: unlike keep-together it\n * is never traded away to make content fit. Section-level breaks are handled by\n * the page loop; these are the ones nested inside a section's own content.\n */\ninterface ForcedBreaks {\n /** Offsets strictly inside the section's content, where it must be split. */\n inside: number[];\n /** A break before the first thing in the section: it starts a page. */\n atStart: boolean;\n /** A break after the last thing in the section: what follows starts a page. */\n atEnd: boolean;\n}\n\nfunction forcedBreaks(section: ResolvedNode, geom: SectionGeometry): ForcedBreaks {\n const offsets = new Set<number>();\n let contentTop = Number.POSITIVE_INFINITY;\n let contentBottom = 0;\n const visit = (n: ResolvedNode) => {\n const g = geom.nodes[n.key];\n if (g) {\n if (n.flow.breakBefore === \"page\") offsets.add(g.top);\n if (n.flow.breakAfter === \"page\") offsets.add(g.top + g.height);\n }\n n.children.forEach(visit);\n };\n for (const child of section.children) {\n const g = geom.nodes[child.key];\n if (g) {\n contentTop = Math.min(contentTop, g.top);\n contentBottom = Math.max(contentBottom, g.top + g.height);\n }\n visit(child);\n }\n if (!Number.isFinite(contentTop)) contentTop = 0;\n\n // A break at either edge of the content is not a split — it is a statement\n // about the section itself, the same thing `breakBefore`/`breakAfter` says.\n // Measured against the content rather than the section box, so a section's\n // own padding does not turn the break into a page of whitespace.\n return {\n inside: [...offsets].filter((y) => y > contentTop + EPS && y < contentBottom - EPS).sort((a, b) => a - b),\n atStart: [...offsets].some((y) => y <= contentTop + EPS),\n atEnd: [...offsets].some((y) => y >= contentBottom - EPS)\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Pagination */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pure, deterministic pagination. Given resolved sections and their measured\n * geometry, assigns clip-window fragments to pages.\n */\nexport function paginate(opts: PaginateOptions): PagedDocument {\n const { document, geometry, page } = opts;\n const pageHeight = page.contentHeight;\n const warnings: LayoutWarning[] = [];\n const pages: Page[] = [];\n\n let current: Page = { index: 0, number: 1, fragments: [], first: true };\n let y = 0;\n let pendingBreak = false;\n\n const newPage = () => {\n pages.push(current);\n current = { index: pages.length, number: pages.length + 1, fragments: [], first: false };\n y = 0;\n pendingBreak = false;\n };\n\n for (const section of document.body) {\n const geom = geometry[section.key];\n if (!geom) {\n warnings.push({ code: \"forced-split\", message: \"Section was not measured\", sectionKey: section.key, nodeId: section.nodeId });\n continue;\n }\n const H = geom.height;\n const ctx: BreakCtx = { geom, pageHeight };\n const tables = collectTables(section);\n const forced = forcedBreaks(section, geom);\n const contentBottom = section.children.reduce((m, c) => {\n const cg = geom.nodes[c.key];\n return cg ? Math.max(m, cg.top + cg.height) : m;\n }, 0);\n\n if ((pendingBreak || section.flow.breakBefore === \"page\" || forced.atStart) && y > 0) newPage();\n if (section.flow.keepTogether && H > pageHeight - y + EPS && H <= pageHeight + EPS && y > 0) newPage();\n\n if (H <= EPS) {\n // Empty section: still occupies nothing but keeps its order.\n continue;\n }\n\n let from = 0;\n let guard = 0;\n while (from < H - EPS) {\n if (++guard > 10_000) {\n warnings.push({ code: \"forced-split\", message: \"Pagination aborted after too many fragments\", sectionKey: section.key, nodeId: section.nodeId });\n break;\n }\n const avail = pageHeight - y;\n const headers = repeatedHeadersAt(geom, tables, from);\n const extra = headers.reduce((a, h) => a + h.height, 0);\n // This pass may not run past an explicit break, whatever else would fit.\n const stop = forced.inside.find((f) => f > from + EPS) ?? H;\n const lastPass = stop >= H - EPS;\n const remaining = stop - from;\n\n if (remaining + extra <= avail + EPS) {\n current.fragments.push({ sectionKey: section.key, from, to: stop, repeatHeaders: headers, y, height: remaining + extra, continued: from > 0, continues: !lastPass });\n y += remaining + extra;\n from = stop;\n if (lastPass) break;\n newPage();\n continue;\n }\n\n const limit = Math.min(from + avail - extra, stop);\n let to: number | null = null;\n if (limit > from + EPS) {\n // Section-level keep rules are handled above; break inside the section body.\n to = section.flow.split === \"children\" ? bestBreak(ctx, section.children, limit, from) : null;\n if (to !== null && to <= from + EPS) to = null;\n if (to !== null && to > limit + EPS) to = null;\n // Only trailing section padding remains: absorb it rather than orphaning whitespace.\n if (lastPass && to !== null && to >= contentBottom - EPS) {\n current.fragments.push({ sectionKey: section.key, from, to: H, repeatHeaders: headers, y, height: Math.min(H - from + extra, avail), continued: from > 0, continues: false });\n y += Math.min(H - from + extra, avail);\n from = H;\n break;\n }\n }\n\n if (to === null) {\n if (y > 0 || current.fragments.length > 0) {\n // Nothing fits in the remaining space: start a fresh page and try again.\n newPage();\n continue;\n }\n // Fresh page and still no valid break: force a raw clip so we always progress.\n if (limit <= from + EPS) {\n warnings.push({ code: \"oversized-header\", message: \"A repeated table header is taller than the page\", sectionKey: section.key, nodeId: section.nodeId, page: current.number });\n to = Math.min(H, from + Math.max(1, pageHeight));\n } else {\n to = Math.min(H, limit);\n warnings.push({ code: \"forced-split\", message: \"Content taller than a page had to be cut at an arbitrary position\", sectionKey: section.key, nodeId: section.nodeId, page: current.number });\n }\n }\n\n current.fragments.push({ sectionKey: section.key, from, to, repeatHeaders: headers, y, height: to - from + extra, continued: from > 0, continues: true });\n from = to;\n newPage();\n }\n\n if (section.flow.breakAfter === \"page\" || forced.atEnd) pendingBreak = true;\n }\n\n pages.push(current);\n\n // Trim a trailing empty page created by a final break/newPage.\n while (pages.length > 1 && pages[pages.length - 1]!.fragments.length === 0) pages.pop();\n // A break after the last content has nothing to push onto a new page, and a\n // report that ends on a blank page looks broken. Say so rather than doing\n // nothing silently, which reads as the break being ignored.\n if (pendingBreak) {\n warnings.push({ code: \"no-op-break\", message: \"A page break after the last content has nothing to move to a new page\", page: pages.length });\n }\n\n const minPages = Math.max(1, opts.minPages ?? 1);\n while (pages.length < minPages) pages.push({ index: pages.length, number: pages.length + 1, fragments: [], first: pages.length === 0 });\n\n if (document.body.length === 0) warnings.push({ code: \"empty-document\", message: \"The document has no content\" });\n\n // Region overflow warnings\n if (opts.regionGeometry) {\n const check = (sections: ResolvedNode[] | undefined, limit: number, region: string) => {\n if (!sections) return;\n const total = sections.reduce((a, s) => a + (opts.regionGeometry![s.key]?.height ?? 0), 0);\n if (total > limit + 0.5) warnings.push({ code: \"region-overflow\", message: `${region} content (${Math.round(total)}px) is taller than the ${region.toLowerCase()} region (${Math.round(limit)}px) and will be clipped` });\n };\n check(document.header.default, page.headerHeight, \"Header\");\n check(document.header.firstPage, page.headerHeight, \"First-page header\");\n check(document.footer.default, page.footerHeight, \"Footer\");\n check(document.footer.firstPage, page.footerHeight, \"First-page footer\");\n }\n\n return { pages, totalPages: pages.length, geometry: page, warnings };\n}\n","export type IssueSeverity = \"error\" | \"warning\" | \"info\";\n\nexport type IssueCode =\n | \"schema-invalid\"\n | \"unknown-block\"\n | \"license-required\"\n | \"unknown-binding\"\n | \"invalid-expression\"\n | \"type-mismatch\"\n | \"invalid-condition\"\n | \"missing-collection\"\n | \"missing-required\"\n | \"missing-theme-token\"\n | \"missing-theme-value\"\n | \"unsupported-font\"\n | \"invalid-url\"\n | \"invalid-image\"\n | \"empty-content\"\n | \"empty-value\"\n | \"region-overflow\"\n | \"layout-invalid\"\n | \"scope-shadowing\"\n | \"custom\";\n\n/**\n * Which question an issue answers.\n *\n * `template` issues are defects in the design itself: they are true for every\n * client the report is ever run for, and the designer has to fix them.\n * `output` issues are true only of the data in front of you — a field this\n * particular client has not filled in. Both matter, but conflating them makes\n * the first kind unfindable and the second kind look like the designer's fault.\n */\nexport type IssueSource = \"template\" | \"output\";\n\nexport interface Issue {\n severity: IssueSeverity;\n code: IssueCode;\n message: string;\n /** Defaults to \"template\". */\n source?: IssueSource;\n /** Node id the issue belongs to, when applicable. */\n nodeId?: string;\n /** Prop path on that node. */\n prop?: string;\n /** Region: body, header, footer, library. */\n region?: \"body\" | \"header\" | \"footer\" | \"library\" | \"document\";\n /** Optional machine-readable detail. */\n detail?: Record<string, unknown>;\n}\n\nexport function issue(severity: IssueSeverity, code: IssueCode, message: string, extra: Partial<Issue> = {}): Issue {\n return { severity, code, message, ...extra };\n}\n","import type { ReportTemplate, Node } from \"../types/template.js\";\nimport type { DataSource, FieldSchema } from \"../types/data.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport { bindingSpecsFor } from \"../registry/registry.js\";\nimport type { BindingSpec, ValidateContext } from \"../registry/block-definition.js\";\nimport { createSchemaScope, resolvePathSchema, typeCheck, SchemaScope } from \"../expr/typecheck.js\";\nimport { parseExpression } from \"../expr/parser.js\";\nimport { compileCondition } from \"../expr/condition.js\";\nimport { extractTemplateTokens, isRichTextDoc, richTextTokens } from \"../richtext/model.js\";\nimport { isTokenRef, missingThemeValues, resolveToken, mergeTheme } from \"../theme/tokens.js\";\nimport { parseTemplate } from \"../schema/template.schema.js\";\nimport { issue, type Issue } from \"./issues.js\";\nimport type { RegionId } from \"../editor/tree.js\";\nimport { computePageGeometry } from \"../layout/page-geometry.js\";\n\nexport interface ValidateOptions {\n template: ReportTemplate;\n registry: BlockRegistry;\n dataSources?: DataSource[];\n theme?: Partial<Theme>;\n /** Font families the host guarantees are available (theme fonts are added automatically). */\n availableFonts?: string[];\n /** Skip the JSON shape check (already parsed). */\n skipSchema?: boolean;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n issues: Issue[];\n errors: Issue[];\n warnings: Issue[];\n}\n\n/**\n * Statically analyses a template against a registry, data schemas and a theme.\n * Runs without data and without a DOM, so it can be used server-side before\n * accepting a template for storage.\n */\nexport function validateTemplate(opts: ValidateOptions): ValidationResult {\n const issues: Issue[] = [];\n const { template, registry } = opts;\n const dataSources = opts.dataSources ?? [];\n const theme = mergeTheme(opts.theme);\n\n if (!opts.skipSchema) {\n const parsed = parseTemplate(template);\n for (const e of parsed.errors) issues.push(issue(\"error\", \"schema-invalid\", `${e.path}: ${e.message}`, { region: \"document\" }));\n }\n\n if (opts.theme) for (const m of missingThemeValues(opts.theme)) issues.push(issue(\"warning\", \"missing-theme-value\", `Theme \"${opts.theme.name ?? opts.theme.id ?? \"\"}\" has no value for ${m}; the default is used`, { region: \"document\" }));\n\n const rootScope = createSchemaScope(dataSources);\n const sourceIds = new Set(dataSources.map((s) => s.id));\n for (const id of template.settings?.dataSources ?? []) if (!sourceIds.has(id)) issues.push(issue(\"warning\", \"unknown-binding\", `Template was designed against data source \"${id}\" which is not provided`, { region: \"document\" }));\n\n const fonts = new Set<string>([...(opts.availableFonts ?? []), ...(theme.fonts ?? []).map((f) => f.family), ...splitFonts(theme.typography.headingFont), ...splitFonts(theme.typography.bodyFont), ...splitFonts(theme.typography.monoFont ?? \"\")]);\n const checkFont = (value: string | undefined, where: Partial<Issue>) => {\n if (!value || isTokenRef(value) || !opts.availableFonts) return;\n const families = splitFonts(value);\n if (!families.some((f) => fonts.has(f) || GENERIC_FONTS.has(f.toLowerCase()))) issues.push(issue(\"warning\", \"unsupported-font\", `Font \"${value}\" is not available; the theme body font will be used`, where));\n };\n const checkColor = (value: string | undefined, where: Partial<Issue>) => {\n if (!value || !isTokenRef(value)) return;\n if (resolveToken(value, theme) === undefined) issues.push(issue(\"warning\", \"missing-theme-token\", `Theme token \"${value}\" does not exist`, where));\n };\n\n for (const [id, ts] of Object.entries(template.styles.text)) {\n checkFont(ts.fontFamily, { region: \"document\", prop: `styles.text.${id}.fontFamily` });\n checkColor(ts.color, { region: \"document\", prop: `styles.text.${id}.color` });\n }\n\n const geometry = computePageGeometry(template.page);\n if (geometry.contentHeight < 100) issues.push(issue(\"error\", \"layout-invalid\", \"Page margins, header and footer leave less than 100px for content\", { region: \"document\" }));\n if (geometry.contentWidth < 100) issues.push(issue(\"error\", \"layout-invalid\", \"Page margins leave less than 100px of width for content\", { region: \"document\" }));\n\n const regionOf = (r: RegionId): Issue[\"region\"] => (r === \"body\" ? \"body\" : r.startsWith(\"header\") ? \"header\" : \"footer\");\n\n const visitNode = (node: Node, region: RegionId, parent: Node | null, scope: SchemaScope) => {\n const where: Partial<Issue> = { nodeId: node.id, region: regionOf(region) };\n const def = registry.get(node.type);\n if (!def) {\n issues.push(issue(\"error\", \"unknown-block\", `Block type \"${node.type}\" is not registered${node.type.includes(\".\") ? \" (custom block unavailable)\" : \"\"}`, where));\n return;\n }\n if (!registry.isTierEnabled(def.license)) issues.push(issue(\"warning\", \"license-required\", `\"${def.name}\" requires the ${def.license} tier`, where));\n\n if (parent) {\n if (!registry.accepts(parent.type, node.type)) issues.push(issue(\"error\", \"layout-invalid\", `\"${def.name}\" cannot be placed inside \"${registry.get(parent.type)?.name ?? parent.type}\"`, where));\n } else if (node.type !== \"section\") issues.push(issue(\"error\", \"layout-invalid\", `Top-level nodes must be sections, found \"${node.type}\"`, where));\n\n if (node.type === \"row\") {\n const layout = node.props.layout as number[] | undefined;\n const total = (layout ?? []).reduce((a, b) => a + b, 0);\n if (!layout || total !== 12) issues.push(issue(\"error\", \"layout-invalid\", `Row layout must sum to 12 (got ${total})`, where));\n else if ((node.children?.length ?? 0) !== layout.length) issues.push(issue(\"error\", \"layout-invalid\", `Row has ${node.children?.length ?? 0} columns but a ${layout.length}-column layout`, where));\n }\n\n if (node.style) {\n checkFont(node.style.fontFamily, { ...where, prop: \"style.fontFamily\" });\n checkColor(node.style.color, { ...where, prop: \"style.color\" });\n checkColor(node.style.background, { ...where, prop: \"style.background\" });\n checkColor(node.style.border?.color, { ...where, prop: \"style.border.color\" });\n if (node.style.textStyle && !template.styles.text[node.style.textStyle]) issues.push(issue(\"warning\", \"missing-theme-token\", `Text style \"${node.style.textStyle}\" is not defined in the document styles`, { ...where, prop: \"style.textStyle\" }));\n }\n\n const cond = compileCondition(node.visibleWhen);\n if (cond) checkExpr(cond, \"visibleWhen\", \"condition\");\n\n const props = { ...(typeof def.defaultProps === \"function\" ? def.defaultProps() : def.defaultProps), ...node.props } as Record<string, unknown>;\n\n function checkExpr(expr: string, prop: string, kind: BindingSpec[\"kind\"], s: SchemaScope = scope, expected?: FieldSchema[\"type\"] | FieldSchema[\"type\"][]): Issue[] {\n const out: Issue[] = [];\n const r = typeCheck(expr, s);\n for (const i of r.issues) {\n const code = i.code === \"syntax\" ? \"invalid-expression\" : i.code === \"type-mismatch\" ? \"type-mismatch\" : \"unknown-binding\";\n out.push(issue(i.code === \"syntax\" ? \"error\" : \"warning\", kind === \"condition\" && code !== \"unknown-binding\" ? \"invalid-condition\" : code, `${i.message} in \"${expr}\"`, { ...where, prop }));\n }\n if (kind === \"collection\" && r.issues.length === 0 && r.type !== \"array\" && r.type !== \"any\" && r.type !== \"unknown\") out.push(issue(\"error\", \"missing-collection\", `\"${expr}\" is a ${r.type}, not a list`, { ...where, prop }));\n if (expected && r.issues.length === 0 && r.type !== \"unknown\" && r.type !== \"any\" && r.type !== \"null\") {\n const list = Array.isArray(expected) ? expected : [expected];\n const numeric = [\"number\", \"currency\", \"percent\"];\n const compatible = list.includes(r.type as FieldSchema[\"type\"]) || (list.some((t) => numeric.includes(t)) && numeric.includes(r.type)) || (list.includes(\"string\") && r.type !== \"array\" && r.type !== \"object\");\n if (!compatible) out.push(issue(\"warning\", \"type-mismatch\", `\"${expr}\" is a ${r.type}; expected ${list.join(\" or \")}`, { ...where, prop }));\n }\n issues.push(...out);\n return out;\n }\n\n const runSpec = (spec: BindingSpec, target: Record<string, unknown>, prefix: string, s: SchemaScope) => {\n const value = getPath(target, spec.prop);\n const prop = prefix + spec.prop;\n switch (spec.kind) {\n case \"value\":\n if (typeof value === \"string\" && value.trim()) checkExpr(value, prop, \"value\", s, spec.valueType);\n break;\n case \"collection\":\n if (typeof value === \"string\" && value.trim()) checkExpr(value, prop, \"collection\", s);\n else if (def.container?.repeat?.collectionProp === spec.prop) issues.push(issue(\"warning\", \"missing-collection\", `\"${def.name}\" has no list to repeat over`, { ...where, prop }));\n else if (def.type === \"table\" || def.type === \"chart\") issues.push(issue(\"warning\", \"missing-collection\", `\"${def.name}\" is not bound to a list`, { ...where, prop }));\n break;\n case \"template\":\n if (typeof value === \"string\") for (const e of extractTemplateTokens(value)) checkExpr(e, prop, \"value\", s);\n break;\n case \"richtext\":\n if (isRichTextDoc(value)) for (const e of richTextTokens(value)) checkExpr(e, prop, \"value\", s);\n break;\n case \"condition\": {\n const c = compileCondition(value as never);\n if (c) checkExpr(c, prop, \"condition\", s);\n break;\n }\n case \"list\":\n break;\n }\n };\n\n // Scope for scoped bindings (per-item expressions such as table columns)\n let itemScope = scope;\n let childScope = scope;\n const specs = bindingSpecsFor(def);\n // Establish the item scope from collection specs first so per-item bindings can use it regardless of declaration order.\n for (const spec of specs) {\n if (spec.kind !== \"collection\") continue;\n const collectionExpr = props[spec.prop];\n const itemSchema = typeof collectionExpr === \"string\" && collectionExpr.trim() ? itemSchemaOf(collectionExpr, scope) : undefined;\n const alias = (spec.alias && (props[spec.alias] as string)) || \"item\";\n if (dataSources.some((d) => d.id === alias)) issues.push(issue(\"warning\", \"scope-shadowing\", `Repeater alias \"${alias}\" hides the data source with the same name`, where));\n const vars: Record<string, FieldSchema> = {\n [alias]: itemSchema ?? { type: \"object\", label: alias, fields: {} },\n item: itemSchema ?? { type: \"object\", label: \"Item\", fields: {} },\n row: itemSchema ?? { type: \"object\", label: \"Row\", fields: {} },\n index: { type: \"number\" },\n first: { type: \"boolean\" },\n last: { type: \"boolean\" },\n count: { type: \"number\" }\n };\n itemScope = scope.child(vars);\n if (def.container?.repeat?.collectionProp === spec.prop) childScope = itemScope;\n }\n for (const spec of specs) {\n if (spec.perItem) {\n runSpec(spec, props, \"\", itemScope);\n continue;\n }\n if (spec.items) {\n const list = getPath(props, spec.prop);\n if (Array.isArray(list)) list.forEach((item, i) => item && typeof item === \"object\" && spec.items!.forEach((sub) => runSpec(sub, item as Record<string, unknown>, `${spec.prop}.${i}.`, sub.perItem ? itemScope : scope)));\n continue;\n }\n runSpec(spec, props, \"\", scope);\n if (spec.kind === \"collection\") for (const sub of spec.scoped ?? []) runSpec(sub, props, \"\", itemScope);\n }\n if (def.validate) {\n const vctx: ValidateContext<Record<string, unknown>> = {\n props,\n node,\n schemaScope: itemScope,\n dataSources,\n theme,\n checkExpression: (expr, prop) => checkExpr(expr, prop, \"value\", itemScope)\n };\n try {\n const extra = def.validate(vctx);\n for (const i of extra) issues.push({ ...i, nodeId: i.nodeId ?? node.id, region: i.region ?? where.region });\n } catch (e) {\n issues.push(issue(\"warning\", \"custom\", `Validation for \"${def.name}\" failed: ${(e as Error).message}`, where));\n }\n }\n\n for (const child of node.children ?? []) visitNode(child, region, node, childScope);\n };\n\n const visitRegion = (nodes: Node[], region: RegionId) => nodes.forEach((n) => visitNode(n, region, null, rootScope));\n visitRegion(template.body, \"body\");\n visitRegion(template.header.default, \"header\");\n visitRegion(template.header.firstPage ?? [], \"header:first\");\n visitRegion(template.footer.default, \"footer\");\n visitRegion(template.footer.firstPage ?? [], \"footer:first\");\n\n if (template.body.every((s) => (s.children?.length ?? 0) === 0)) issues.push(issue(\"info\", \"empty-content\", \"The document has no content yet\", { region: \"body\" }));\n\n const errors = issues.filter((i) => i.severity === \"error\");\n const warnings = issues.filter((i) => i.severity === \"warning\");\n return { ok: errors.length === 0, issues, errors, warnings };\n}\n\nconst GENERIC_FONTS = new Set([\"serif\", \"sans-serif\", \"monospace\", \"system-ui\", \"ui-sans-serif\", \"ui-serif\", \"ui-monospace\", \"cursive\", \"fantasy\", \"inherit\"]);\n\nfunction splitFonts(value: string): string[] {\n return value\n .split(\",\")\n .map((f) => f.trim().replace(/^['\"]|['\"]$/g, \"\"))\n .filter(Boolean);\n}\n\nfunction getPath(obj: Record<string, unknown>, path: string): unknown {\n let cur: unknown = obj;\n for (const p of path.split(\".\")) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\nexport function itemSchemaOf(collectionExpr: string, scope: SchemaScope): FieldSchema | undefined {\n try {\n const ast = parseExpression(collectionExpr);\n const base = ast.kind === \"pipe\" ? unwrapPipes(ast) : ast;\n if (base.kind !== \"path\") return undefined;\n const r = resolvePathSchema(base.segments, scope);\n return r.schema?.type === \"array\" ? r.schema.itemSchema : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction unwrapPipes(e: import(\"../expr/ast.js\").Expr): import(\"../expr/ast.js\").Expr {\n let cur = e;\n while (cur.kind === \"pipe\") cur = cur.input;\n return cur;\n}\n\n/** URL safety check shared by validation and renderers. */\nexport function isSafeUrl(url: string | undefined, opts: { allowData?: boolean } = {}): boolean {\n if (!url) return false;\n const u = url.trim();\n if (/^https?:\\/\\//i.test(u)) return true;\n if (/^mailto:/i.test(u)) return true;\n if (u.startsWith(\"/\") && !u.startsWith(\"//\")) return true;\n if (u.startsWith(\"./\") || u.startsWith(\"../\")) return true;\n if (opts.allowData && /^data:image\\/(png|jpe?g|gif|webp|svg\\+xml)[;,]/i.test(u)) {\n // Only SVG is markup, and only markup can carry script: a PNG or a JPEG is\n // decoded by the image pipeline and never parsed as a document. Returning\n // here also keeps the scan off the large payloads, which are always raster.\n if (!/^data:image\\/svg\\+xml/i.test(u)) return true;\n\n const comma = u.indexOf(\",\");\n const payload = comma === -1 ? \"\" : u.slice(comma + 1);\n let decoded: string;\n if (/;base64/i.test(u.slice(0, comma === -1 ? u.length : comma))) {\n // This branch used to be missing, and it is the one that matters:\n // `FileReader.readAsDataURL` — how every uploaded file arrives — always\n // produces base64, so scanning the undecoded text found nothing and a\n // scripted SVG was declared safe. The percent-encoded form was rejected\n // correctly all along, which is what made it easy to miss.\n decoded = decodeBase64(payload);\n } else {\n try {\n decoded = decodeURIComponent(payload);\n } catch {\n decoded = payload;\n }\n }\n // Deliberately the whole payload, not a prefix. A cap only decides how far\n // into the file an attacker has to put the script.\n return !/<script|javascript:|on[a-z]+\\s*=|<foreignObject/i.test(decoded);\n }\n return false;\n}\n\n/** Base64 to text, in whichever runtime this is: browsers, workers and Node all differ. */\nfunction decodeBase64(value: string): string {\n const b64 = value.trim();\n try {\n const g = globalThis as { atob?: (s: string) => string; Buffer?: { from(s: string, enc: string): { toString(enc: string): string } } };\n if (typeof g.atob === \"function\") return g.atob(b64);\n if (g.Buffer) return g.Buffer.from(b64, \"base64\").toString(\"utf8\");\n } catch {\n /* malformed base64 falls through */\n }\n // Undecodable means unverifiable, and an image that cannot be checked is not\n // one to declare safe.\n return \"<script\";\n}\n","import type { BlockRegistry } from \"../registry/registry.js\";\nimport type { ResolvedDocument, ResolvedNode } from \"../resolve/resolved.js\";\nimport type { InlineNode, RichTextDoc } from \"../richtext/model.js\";\nimport type { Expr } from \"../expr/ast.js\";\nimport { parseExpression } from \"../expr/parser.js\";\nimport { issue, type Issue } from \"./issues.js\";\n\nexport interface OutputCheckOptions {\n /** A document resolved in preview mode against the data you intend to ship. */\n resolved: ResolvedDocument;\n registry: BlockRegistry;\n /** Names the data set in the messages, e.g. \"Edge case\". */\n dataLabel?: string;\n /** Cap on issues returned, so a broken data set cannot flood the UI. */\n limit?: number;\n}\n\n/**\n * Reports what this particular data set does to the report: fields that come out\n * blank, blocks that render nothing, sections with no content at all.\n *\n * This is deliberately separate from `validateTemplate`, which asks whether the\n * design is sound and never looks at data. A template can be perfectly valid and\n * still produce \"Values as at .\" for a client whose review has no end date, and\n * only one of those two checks can ever tell you so.\n *\n * Three things it does not complain about, because complaining would train\n * people to ignore it:\n *\n * - Content hidden by a false condition. A preview resolution has already\n * dropped those nodes, so they cannot be reached from here at all.\n * - An expression that already handles the empty case — a `default:` fallback\n * or a conditional. Warning about those would be warning about the fix.\n * - Zero, false and empty-but-intended lists. `0` is a value; a table with an\n * empty message is a designed outcome, not an accident.\n * - Page-dependent tokens, which have no value until the paginator runs.\n */\nexport function checkOutput(opts: OutputCheckOptions): Issue[] {\n const { resolved, registry } = opts;\n const limit = opts.limit ?? 60;\n const out: Issue[] = [];\n const seen = new Set<string>();\n const suffix = opts.dataLabel ? ` in “${opts.dataLabel}”` : \" in this data set\";\n\n const push = (i: Issue) => {\n const key = `${i.nodeId ?? \"\"}|${i.prop ?? \"\"}|${i.message}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push(i);\n };\n\n // A document nobody has put anything in yet is not a data problem. The\n // structural pass already greets it with \"The document has no content yet\";\n // warning again, once per empty section and once per sample set, tells the\n // designer twice over about the blank page they are looking at.\n const blankDocument = resolved.body.every((s) => s.children.length === 0);\n\n const regions: Array<[ResolvedNode[], Issue[\"region\"]]> = [\n [resolved.body, \"body\"],\n [resolved.header.default, \"header\"],\n [resolved.header.firstPage ?? [], \"header\"],\n [resolved.footer.default, \"footer\"],\n [resolved.footer.firstPage ?? [], \"footer\"]\n ];\n\n for (const [nodes, region] of regions) for (const n of nodes) visit(n, region);\n\n return out.slice(0, limit);\n\n function visit(node: ResolvedNode, region: Issue[\"region\"]) {\n // Repeater iterations all come from one template node; reporting the first\n // is enough to get the designer to the block, and `seen` collapses the rest.\n if (!node.placeholder) inspect(node, region);\n for (const c of node.children) visit(c, region);\n }\n\n function inspect(node: ResolvedNode, region: Issue[\"region\"]) {\n const def = registry.get(node.type);\n const name = node.label || def?.name || node.type;\n const where = { nodeId: node.nodeId, region, source: \"output\" as const };\n\n // 1. A whole prop bound to a single field that came back with nothing.\n for (const [prop, b] of Object.entries(node.bindings)) {\n if (b.kind !== \"value\" && b.kind !== \"template\") continue;\n if (node.textSegments[prop]?.some((s) => s.deferred)) continue;\n if (handlesEmpty(b.expr)) continue;\n const value = getPath(node.props, prop);\n if (!isBlank(value)) continue;\n // Say what is actually missing. One empty optional field — a signature\n // block with no qualifications line, a KPI with no caption — is a gap in\n // the block, not the block coming out blank, and reporting it as the\n // latter sends the designer looking for a problem that is not there. The\n // block is only blank when this field was all it had to draw.\n const blank = !drawsWithout(node, prop);\n push(\n issue(\n \"warning\",\n \"empty-value\",\n blank ? `“${b.label}” has no value${suffix}, so ${name} renders blank` : `“${b.label}” has no value${suffix} and is left out of ${name}`,\n { ...where, prop }\n )\n );\n }\n\n // 2. A token inside a sentence, where the sentence survives and the value\n // does not. This is what produces \"Values as at .\" and \"contact X on or\".\n for (const [prop, segments] of Object.entries(node.textSegments)) {\n if (node.bindings[prop]) continue; // already reported whole, above\n for (const s of segments) {\n if (s.kind !== \"token\" || s.deferred || !s.expr) continue;\n if (s.value === undefined || !isBlank(s.value)) continue;\n if (handlesEmpty(s.expr)) continue;\n push(issue(\"warning\", \"empty-value\", `“${s.label ?? short(s.expr)}” is empty${suffix}, leaving a gap in ${name}`, { ...where, prop }));\n }\n }\n\n // 3. The same, for tokens inside rich text.\n for (const [prop, doc] of Object.entries(node.richText)) {\n for (const inline of inlinesOf(doc)) {\n if (inline.type !== \"token\" || inline.deferred) continue;\n if (inline.value === undefined || !isBlank(inline.value)) continue;\n if (handlesEmpty(inline.expr)) continue;\n push(issue(\"warning\", \"empty-value\", `“${inline.label ?? short(inline.expr)}” is empty${suffix}, leaving a gap in ${name}`, { ...where, prop }));\n }\n }\n\n // 4. A block that carries text and ends up with none of it. Only where it\n // has no children: a card with an empty title and three paragraphs in it\n // is a card with an empty title, not an empty card.\n if (node.children.length === 0 && !hasOwnContent(node) && carriesText(node)) {\n push(issue(\"warning\", \"empty-content\", `${name} renders nothing${suffix}`, where));\n }\n\n // 5. A section that contains nothing a reader would see. Worth its own\n // message because the heading it should have had is missing too.\n if (node.role === \"section\" && !blankDocument && !subtreeHasContent(node)) {\n push(issue(\"warning\", \"empty-content\", `Section “${name}” has no visible content${suffix}`, where));\n }\n }\n\n /**\n * Text this node renders itself, ignoring its children. `skip` leaves one\n * prop out, which is how a missing field is told apart from a blank block.\n */\n function ownText(node: ResolvedNode, skip?: string): string {\n let text = \"\";\n for (const [prop, segments] of Object.entries(node.textSegments)) {\n if (prop === skip) continue;\n for (const s of segments) text += s.kind === \"text\" ? s.text : s.deferred ? \"1\" : s.value ?? \"\";\n }\n for (const [prop, doc] of Object.entries(node.richText)) {\n if (prop === skip) continue;\n // Tokens count as the value they resolved to, not as their expression:\n // the question is what the reader ends up seeing.\n for (const inline of inlinesOf(doc)) text += inline.type === \"token\" ? (inline.deferred ? \"1\" : inline.value ?? \"\") : inline.type === \"text\" ? inline.text : \"\";\n }\n for (const [prop, b] of Object.entries(node.bindings)) {\n if (prop === skip) continue;\n if (b.kind === \"value\") text += String(getPath(node.props, prop) ?? \"\");\n else if (b.kind === \"collection\") {\n const v = getPath(node.props, prop);\n if (Array.isArray(v) && v.length) text += \"1\";\n }\n }\n return text.trim();\n }\n\n /** Does this block still draw something with `prop` left out of it? */\n function drawsWithout(node: ResolvedNode, prop: string): boolean {\n if (ownText(node, prop) !== \"\") return true;\n // Anything the block draws that is not words counts too: a signature block\n // is still a signature block with a rule and a date on it.\n return node.children.some(subtreeHasContent) || staticProps(node, prop);\n }\n\n /**\n * Props a block draws that are not bound to data — a fixed label, a caption\n * typed by the designer. They are not in `textSegments` once they carry no\n * token, so the plain prop values are what says the block is not empty.\n */\n function staticProps(node: ResolvedNode, skip: string): boolean {\n for (const [prop, value] of Object.entries(node.props)) {\n if (prop === skip || prop.startsWith(\"__\")) continue;\n if (node.bindings[prop]) continue;\n if (typeof value === \"string\" && value.trim() !== \"\") return true;\n }\n return false;\n }\n\n function hasOwnContent(node: ResolvedNode): boolean {\n return ownText(node) !== \"\";\n }\n\n /** Does this block have any prop whose whole job is to carry words? */\n function carriesText(node: ResolvedNode): boolean {\n return Object.keys(node.textSegments).length > 0 || Object.keys(node.richText).length > 0;\n }\n\n function subtreeHasContent(node: ResolvedNode): boolean {\n if (DECORATION.has(node.type)) return false;\n const def = registry.get(node.type);\n // Charts and images say something without saying words.\n if (def?.category === \"visualisation\" && !DECORATION.has(node.type)) return true;\n if (node.type === \"image\" || node.type === \"logo\" || node.type === \"signature\") return true;\n if (hasOwnContent(node)) return true;\n return node.children.some(subtreeHasContent);\n }\n}\n\n/** Every inline node in a rich text document, paragraphs and list items alike. */\nfunction inlinesOf(doc: RichTextDoc): InlineNode[] {\n const out: InlineNode[] = [];\n for (const block of doc.content) {\n const paras = block.type === \"paragraph\" ? [block] : block.content.flatMap((li) => li.content);\n for (const p of paras) out.push(...p.content);\n }\n return out;\n}\n\n/** Blocks that occupy space without carrying information. */\nconst DECORATION = new Set([\"spacer\", \"divider\", \"pageBreak\"]);\n\n/**\n * Whether an expression has already dealt with the value being missing.\n *\n * `{{ periodEnd ? \"as at \" + periodEnd : \"\" }}` evaluating to nothing is the\n * author's intent, not a hole; so is a `default:` fallback. Reporting those\n * would mean the check fires precisely when someone has fixed the problem,\n * which is the fastest way to teach people to ignore a panel.\n */\nfunction handlesEmpty(expr: string): boolean {\n try {\n return guards(parseExpression(expr));\n } catch {\n return false;\n }\n}\n\nfunction guards(node: Expr): boolean {\n switch (node.kind) {\n case \"conditional\":\n return true;\n case \"pipe\":\n return node.name === \"default\" || guards(node.input);\n case \"binary\":\n // `a or b` and `a and b` are the same intent written shorter.\n return node.op === \"or\" || node.op === \"and\" || guards(node.left) || guards(node.right);\n case \"call\":\n return node.name === \"coalesce\" || node.name === \"default\";\n default:\n return false;\n }\n}\n\n/** Expressions belong in a tooltip, not mid-sentence; keep the message readable. */\nfunction short(expr: string): string {\n return expr.length > 48 ? `${expr.slice(0, 47)}…` : expr;\n}\n\n/** Empty means absent or blank — never `0` and never `false`. */\nfunction isBlank(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n return false;\n}\n\nfunction getPath(obj: Record<string, unknown>, path: string): unknown {\n let cur: unknown = obj;\n for (const p of path.split(\".\")) {\n if (cur === null || cur === undefined || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n","import type { Node, ReportTemplate } from \"../types/template.js\";\n\nexport type RegionId = \"body\" | \"header\" | \"header:first\" | \"footer\" | \"footer:first\";\nexport const REGION_IDS: RegionId[] = [\"body\", \"header\", \"header:first\", \"footer\", \"footer:first\"];\n\nexport function getRegion(template: ReportTemplate, region: RegionId): Node[] {\n switch (region) {\n case \"body\":\n return template.body;\n case \"header\":\n return template.header.default;\n case \"header:first\":\n return (template.header.firstPage ??= []);\n case \"footer\":\n return template.footer.default;\n case \"footer:first\":\n return (template.footer.firstPage ??= []);\n }\n}\n\nexport function readRegion(template: ReportTemplate, region: RegionId): Node[] {\n switch (region) {\n case \"body\":\n return template.body;\n case \"header\":\n return template.header.default;\n case \"header:first\":\n return template.header.firstPage ?? [];\n case \"footer\":\n return template.footer.default;\n case \"footer:first\":\n return template.footer.firstPage ?? [];\n }\n}\n\nexport interface NodeLocation {\n region: RegionId;\n /** Index path from the region root to the node. */\n path: number[];\n}\n\nexport interface NodeEntry {\n node: Node;\n parent: Node | null;\n region: RegionId;\n path: number[];\n depth: number;\n index: number;\n}\n\nexport type NodeIndex = Map<string, NodeEntry>;\n\n/** Builds an id → entry index over the whole template. */\nexport function indexTemplate(template: ReportTemplate): NodeIndex {\n const index: NodeIndex = new Map();\n const visit = (nodes: Node[], parent: Node | null, region: RegionId, path: number[]) => {\n nodes.forEach((node, i) => {\n const p = [...path, i];\n index.set(node.id, { node, parent, region, path: p, depth: p.length - 1, index: i });\n if (node.children) visit(node.children, node, region, p);\n });\n };\n for (const r of REGION_IDS) visit(readRegion(template, r), null, r, []);\n return index;\n}\n\nexport function findNode(template: ReportTemplate, id: string): NodeEntry | undefined {\n return indexTemplate(template).get(id);\n}\n\n/** Returns the list that contains the node at `location` and the node's index in it. */\nexport function listAt(template: ReportTemplate, location: NodeLocation): { list: Node[]; index: number } {\n let list = getRegion(template, location.region);\n for (let i = 0; i < location.path.length - 1; i++) {\n const n = list[location.path[i]!];\n if (!n) throw new Error(\"Invalid node path\");\n n.children ??= [];\n list = n.children;\n }\n return { list, index: location.path[location.path.length - 1] ?? 0 };\n}\n\nexport function nodeAt(template: ReportTemplate, location: NodeLocation): Node | undefined {\n const { list, index } = listAt(template, location);\n return list[index];\n}\n\n/** Ancestor chain from the region root down to (and including) the node. */\nexport function ancestors(index: NodeIndex, id: string): NodeEntry[] {\n const chain: NodeEntry[] = [];\n let cur = index.get(id);\n while (cur) {\n chain.unshift(cur);\n cur = cur.parent ? index.get(cur.parent.id) : undefined;\n }\n return chain;\n}\n\nexport function isDescendant(index: NodeIndex, ancestorId: string, id: string): boolean {\n let cur = index.get(id);\n while (cur?.parent) {\n if (cur.parent.id === ancestorId) return true;\n cur = index.get(cur.parent.id);\n }\n return false;\n}\n\n/** Depth-first walk over every node in the template. */\nexport function walkTemplate(template: ReportTemplate, visit: (node: Node, region: RegionId, parent: Node | null) => void): void {\n const rec = (nodes: Node[], region: RegionId, parent: Node | null) => {\n for (const n of nodes) {\n visit(n, region, parent);\n if (n.children) rec(n.children, region, n);\n }\n };\n for (const r of REGION_IDS) rec(readRegion(template, r), r, null);\n}\n\nexport function countNodes(template: ReportTemplate): number {\n let n = 0;\n walkTemplate(template, () => n++);\n return n;\n}\n\n/** Collects all block types used in the template. */\nexport function usedBlockTypes(template: ReportTemplate): Set<string> {\n const s = new Set<string>();\n walkTemplate(template, (n) => s.add(n.type));\n return s;\n}\n","import { current, isDraft, type Draft } from \"immer\";\nimport type { ReportTemplate, Node, PageSettings, DocumentStyles, TextStyle, Condition, FlowOptions, LibraryItem } from \"../types/template.js\";\nimport type { BlockStyle } from \"../types/style.js\";\nimport { getRegion, indexTemplate, listAt, type NodeLocation, type RegionId } from \"./tree.js\";\nimport { cloneWithNewIds, createColumn } from \"../schema/create.js\";\nimport { createId } from \"../schema/ids.js\";\n\n/**\n * Commands are plain data. Each is applied by a reducer that mutates an immer\n * draft; immer turns the mutation into immutable structural sharing + patches.\n */\nexport type Command =\n | { type: \"insertNode\"; node: Node; at: NodeLocation }\n | { type: \"insertNodes\"; nodes: Node[]; at: NodeLocation }\n | { type: \"removeNodes\"; ids: string[] }\n | { type: \"moveNode\"; id: string; to: NodeLocation }\n | { type: \"duplicateNode\"; id: string; newId?: string }\n | { type: \"setProps\"; id: string; patch: Record<string, unknown> }\n | { type: \"setProp\"; id: string; path: string; value: unknown }\n | { type: \"setStyle\"; id: string; patch: BlockStyle | null }\n | { type: \"setFlow\"; id: string; patch: FlowOptions }\n | { type: \"setVisibleWhen\"; id: string; condition: Condition | undefined }\n | { type: \"setName\"; id: string; name: string | undefined }\n | { type: \"setLocked\"; id: string; locked: boolean }\n | { type: \"setRowLayout\"; id: string; layout: number[] }\n | { type: \"wrapNodes\"; ids: string[]; wrapper: Node }\n | { type: \"replaceNode\"; id: string; node: Node }\n | { type: \"setPage\"; patch: Partial<PageSettings> }\n | { type: \"setDocumentStyles\"; patch: Partial<DocumentStyles> }\n | { type: \"setTextStyle\"; id: string; patch: TextStyle | null }\n | { type: \"setTemplateName\"; name: string }\n | { type: \"setSettings\"; patch: NonNullable<ReportTemplate[\"settings\"]> }\n | { type: \"setRegionFirstPage\"; region: \"header\" | \"footer\"; enabled: boolean }\n | { type: \"addLibraryItem\"; item: LibraryItem }\n | { type: \"removeLibraryItem\"; id: string }\n | { type: \"replaceTemplate\"; template: ReportTemplate };\n\nexport class CommandError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CommandError\";\n }\n}\n\nfunction setDeep(obj: Record<string, unknown>, path: string, value: unknown) {\n const parts = path.split(\".\");\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const p = parts[i]!;\n const next = cur[p];\n if (Array.isArray(next)) cur = next as unknown as Record<string, unknown>;\n else if (next && typeof next === \"object\") cur = next as Record<string, unknown>;\n else {\n cur[p] = {};\n cur = cur[p] as Record<string, unknown>;\n }\n }\n const last = parts[parts.length - 1]!;\n if (value === undefined) delete cur[last];\n else cur[last] = value;\n}\n\n/** Applies a command to a template draft. Throws `CommandError` for invalid operations. */\nexport function applyCommand(draft: Draft<ReportTemplate>, cmd: Command): void {\n const t = draft as ReportTemplate;\n switch (cmd.type) {\n case \"insertNode\": {\n const { list, index } = listAt(t, cmd.at);\n list.splice(Math.min(index, list.length), 0, cmd.node);\n return;\n }\n case \"insertNodes\": {\n const { list, index } = listAt(t, cmd.at);\n list.splice(Math.min(index, list.length), 0, ...cmd.nodes);\n return;\n }\n case \"removeNodes\": {\n const index = indexTemplate(t);\n // Remove deepest-first so parent removals do not invalidate indices.\n const entries = cmd.ids.map((id) => index.get(id)).filter((e): e is NonNullable<typeof e> => !!e);\n entries.sort((a, b) => b.depth - a.depth || b.index - a.index);\n for (const e of entries) {\n const list = e.parent ? (e.parent.children ??= []) : getRegion(t, e.region);\n const i = list.findIndex((n) => n.id === e.node.id);\n if (i >= 0) list.splice(i, 1);\n }\n return;\n }\n case \"moveNode\": {\n const index = indexTemplate(t);\n const entry = index.get(cmd.id);\n if (!entry) throw new CommandError(`Node ${cmd.id} not found`);\n // Refuse to move a node into its own subtree.\n const target = listAt(t, cmd.to);\n let probe: Node | undefined = target.list === entry.node.children ? entry.node : undefined;\n if (probe) throw new CommandError(\"Cannot move a node inside itself\");\n const containerPath = cmd.to.path.slice(0, -1);\n let cur = getRegion(t, cmd.to.region);\n for (const i of containerPath) {\n const n: Node | undefined = cur[i];\n if (!n) break;\n if (n.id === cmd.id) throw new CommandError(\"Cannot move a node inside itself\");\n cur = n.children ?? [];\n }\n void probe;\n const sourceList = entry.parent ? (entry.parent.children ??= []) : getRegion(t, entry.region);\n const sourceIndex = sourceList.indexOf(entry.node);\n const [node] = sourceList.splice(sourceIndex, 1);\n const dest = listAt(t, cmd.to);\n let destIndex = dest.index;\n if (dest.list === sourceList && sourceIndex < destIndex) destIndex--;\n dest.list.splice(Math.min(destIndex, dest.list.length), 0, node!);\n return;\n }\n case \"duplicateNode\": {\n const index = indexTemplate(t);\n const entry = index.get(cmd.id);\n if (!entry) throw new CommandError(`Node ${cmd.id} not found`);\n const list = entry.parent ? (entry.parent.children ??= []) : getRegion(t, entry.region);\n const copy = cloneWithNewIds(isDraft(entry.node) ? current(entry.node) : entry.node);\n if (cmd.newId) copy.id = cmd.newId;\n list.splice(entry.index + 1, 0, copy);\n return;\n }\n case \"setProps\": {\n const n = requireNode(t, cmd.id);\n for (const [k, v] of Object.entries(cmd.patch)) {\n if (v === undefined) delete n.props[k];\n else n.props[k] = v;\n }\n return;\n }\n case \"setProp\": {\n const n = requireNode(t, cmd.id);\n setDeep(n.props, cmd.path, cmd.value);\n return;\n }\n case \"setStyle\": {\n const n = requireNode(t, cmd.id);\n if (cmd.patch === null) {\n delete n.style;\n return;\n }\n n.style ??= {};\n mergeStyle(n.style, cmd.patch);\n if (Object.keys(n.style).length === 0) delete n.style;\n return;\n }\n case \"setFlow\": {\n const n = requireNode(t, cmd.id);\n n.flow = { ...(n.flow ?? {}), ...cmd.patch };\n for (const k of Object.keys(n.flow) as Array<keyof FlowOptions>) if (n.flow[k] === undefined) delete n.flow[k];\n if (Object.keys(n.flow).length === 0) delete n.flow;\n return;\n }\n case \"setVisibleWhen\": {\n const n = requireNode(t, cmd.id);\n if (cmd.condition === undefined || cmd.condition === \"\") delete n.visibleWhen;\n else n.visibleWhen = cmd.condition;\n return;\n }\n case \"setName\": {\n const n = requireNode(t, cmd.id);\n if (cmd.name) n.name = cmd.name;\n else delete n.name;\n return;\n }\n case \"setLocked\": {\n const n = requireNode(t, cmd.id);\n if (cmd.locked) n.locked = true;\n else delete n.locked;\n return;\n }\n case \"setRowLayout\": {\n const row = requireNode(t, cmd.id);\n if (row.type !== \"row\") throw new CommandError(\"setRowLayout requires a row\");\n const total = cmd.layout.reduce((a, b) => a + b, 0);\n if (total !== 12) throw new CommandError(\"Row layout must sum to 12\");\n row.children ??= [];\n const columns = row.children;\n // Shrink: move orphaned children into the last surviving column.\n while (columns.length > cmd.layout.length) {\n const removed = columns.pop()!;\n const target = columns[columns.length - 1]!;\n target.children ??= [];\n target.children.push(...(removed.children ?? []));\n }\n while (columns.length < cmd.layout.length) columns.push(createColumn(cmd.layout[columns.length]!));\n columns.forEach((c, i) => {\n c.props.span = cmd.layout[i]!;\n });\n row.props.layout = [...cmd.layout];\n return;\n }\n case \"wrapNodes\": {\n const index = indexTemplate(t);\n const entries = cmd.ids.map((id) => index.get(id)).filter((e): e is NonNullable<typeof e> => !!e);\n if (entries.length === 0) return;\n const first = entries[0]!;\n const list = first.parent ? (first.parent.children ??= []) : getRegion(t, first.region);\n const nodes = entries.map((e) => e.node);\n const startIndex = list.indexOf(first.node);\n for (const n of nodes) {\n const i = list.indexOf(n);\n if (i >= 0) list.splice(i, 1);\n }\n const wrapper = { ...cmd.wrapper, children: [...(cmd.wrapper.children ?? []), ...nodes.map((n) => (isDraft(n) ? current(n) : n))] };\n list.splice(Math.min(startIndex, list.length), 0, wrapper);\n return;\n }\n case \"replaceNode\": {\n const index = indexTemplate(t);\n const entry = index.get(cmd.id);\n if (!entry) throw new CommandError(`Node ${cmd.id} not found`);\n const list = entry.parent ? (entry.parent.children ??= []) : getRegion(t, entry.region);\n list[entry.index] = cmd.node;\n return;\n }\n case \"setPage\": {\n Object.assign(t.page, structuredClone(cmd.patch));\n return;\n }\n case \"setDocumentStyles\": {\n const p = cmd.patch;\n if (p.text) for (const [id, s] of Object.entries(p.text)) t.styles.text[id] = { ...(t.styles.text[id] ?? {}), ...s };\n if (p.table) Object.assign(t.styles.table, p.table);\n if (p.card) Object.assign(t.styles.card, p.card);\n if (p.link) Object.assign(t.styles.link, p.link);\n if (p.spacing) Object.assign(t.styles.spacing, p.spacing);\n return;\n }\n case \"setTextStyle\": {\n if (cmd.patch === null) {\n delete t.styles.text[cmd.id];\n return;\n }\n const existing = t.styles.text[cmd.id] ?? {};\n for (const [k, v] of Object.entries(cmd.patch)) {\n if (v === undefined) delete (existing as Record<string, unknown>)[k];\n else (existing as Record<string, unknown>)[k] = v;\n }\n t.styles.text[cmd.id] = existing;\n return;\n }\n case \"setTemplateName\": {\n t.name = cmd.name;\n return;\n }\n case \"setSettings\": {\n t.settings = { ...(t.settings ?? {}), ...cmd.patch };\n return;\n }\n case \"setRegionFirstPage\": {\n t.page[cmd.region].differentFirstPage = cmd.enabled;\n if (cmd.enabled && !t[cmd.region].firstPage) t[cmd.region].firstPage = (isDraft(t[cmd.region].default) ? current(t[cmd.region].default) : t[cmd.region].default).map(cloneWithNewIds);\n return;\n }\n case \"addLibraryItem\": {\n t.library ??= [];\n t.library.push({ ...cmd.item, id: cmd.item.id || createId(\"lib\") });\n return;\n }\n case \"removeLibraryItem\": {\n t.library = (t.library ?? []).filter((l) => l.id !== cmd.id);\n return;\n }\n case \"replaceTemplate\": {\n const fresh = structuredClone(cmd.template);\n for (const k of Object.keys(t) as Array<keyof ReportTemplate>) delete (t as unknown as Record<string, unknown>)[k];\n Object.assign(t, fresh);\n return;\n }\n }\n}\n\nfunction requireNode(t: ReportTemplate, id: string): Node {\n const e = indexTemplate(t).get(id);\n if (!e) throw new CommandError(`Node ${id} not found`);\n return e.node;\n}\n\nfunction mergeStyle(target: BlockStyle, patch: BlockStyle) {\n for (const [k, v] of Object.entries(patch) as Array<[keyof BlockStyle, unknown]>) {\n if (v === undefined || v === null) {\n delete target[k];\n continue;\n }\n if ((k === \"padding\" || k === \"margin\" || k === \"border\") && typeof v === \"object\") {\n const merged = { ...((target[k] as Record<string, unknown>) ?? {}), ...(v as Record<string, unknown>) };\n for (const key of Object.keys(merged)) if (merged[key] === undefined) delete merged[key];\n if (Object.keys(merged).length === 0) delete target[k];\n else (target as Record<string, unknown>)[k] = merged;\n continue;\n }\n (target as Record<string, unknown>)[k] = v;\n }\n}\n\nexport type { NodeLocation, RegionId };\n","import { produceWithPatches, applyPatches, enablePatches, type Patch } from \"immer\";\nimport type { ReportTemplate, Node } from \"../types/template.js\";\nimport { applyCommand, type Command } from \"./commands.js\";\nimport { indexTemplate, type NodeIndex, type NodeLocation, type RegionId } from \"./tree.js\";\n\nenablePatches();\n\nexport interface HistoryEntry {\n label: string;\n patches: Patch[];\n inversePatches: Patch[];\n selectionBefore: string[];\n selectionAfter: string[];\n at: number;\n /** Consecutive entries with the same merge key within `mergeWindowMs` are coalesced. */\n mergeKey?: string;\n}\n\nexport interface EditorState {\n template: ReportTemplate;\n selection: string[];\n hoverId: string | null;\n /** The node being edited inline (rich text), if any. */\n editingId: string | null;\n mode: \"design\" | \"preview\";\n zoom: number;\n activeRegion: RegionId;\n dirty: boolean;\n /** Monotonic counter incremented on every document change. */\n version: number;\n}\n\nexport interface DispatchOptions {\n label?: string;\n /** Coalesce with the previous history entry sharing this key (typing, slider drags). */\n mergeKey?: string;\n /** Do not record in history (e.g. transient drag previews). */\n skipHistory?: boolean;\n}\n\nexport interface EditorStoreOptions {\n template: ReportTemplate;\n maxHistory?: number;\n mergeWindowMs?: number;\n /** Called after every change, with the new template. */\n onChange?: (template: ReportTemplate, entry: HistoryEntry | null) => void;\n}\n\ntype Listener = (state: EditorState, prev: EditorState) => void;\n\n/**\n * Framework-agnostic editor store. The document is immutable; every change goes\n * through `dispatch(command)` and is recorded as immer patches for undo/redo.\n */\nexport class EditorStore {\n private state: EditorState;\n private undoStack: HistoryEntry[] = [];\n private redoStack: HistoryEntry[] = [];\n private listeners = new Set<Listener>();\n private txDepth = 0;\n private txPatches: Patch[] = [];\n private txInverse: Patch[] = [];\n private txLabel = \"\";\n private txSelectionBefore: string[] = [];\n private txSkipHistory = false;\n private indexCache: { version: number; index: NodeIndex } | null = null;\n /**\n * The history entry that was on top of the undo stack when the document was\n * last saved, so that undoing back to it reports clean again. Identity is the\n * whole test: undo pops, redo pushes, and a new edit pushes something else.\n */\n private savedEntry: HistoryEntry | null = null;\n /** A change that bypassed history, which no amount of undoing can take back. */\n private unhistoried = false;\n private readonly maxHistory: number;\n private readonly mergeWindowMs: number;\n private readonly onChange?: EditorStoreOptions[\"onChange\"];\n\n constructor(opts: EditorStoreOptions) {\n this.state = {\n template: opts.template,\n selection: [],\n hoverId: null,\n editingId: null,\n mode: \"design\",\n zoom: 1,\n activeRegion: \"body\",\n dirty: false,\n version: 0\n };\n this.maxHistory = opts.maxHistory ?? 200;\n this.mergeWindowMs = opts.mergeWindowMs ?? 800;\n this.onChange = opts.onChange;\n }\n\n /* ----------------------------- reading ----------------------------- */\n\n getState(): EditorState {\n return this.state;\n }\n\n get template(): ReportTemplate {\n return this.state.template;\n }\n\n /** Cached id → node index for the current document version. */\n index(): NodeIndex {\n if (!this.indexCache || this.indexCache.version !== this.state.version) {\n this.indexCache = { version: this.state.version, index: indexTemplate(this.state.template) };\n }\n return this.indexCache.index;\n }\n\n getNode(id: string): Node | undefined {\n return this.index().get(id)?.node;\n }\n\n locationOf(id: string): NodeLocation | undefined {\n const e = this.index().get(id);\n return e ? { region: e.region, path: e.path } : undefined;\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private setState(next: Partial<EditorState>) {\n const prev = this.state;\n this.state = { ...prev, ...next };\n for (const l of this.listeners) l(this.state, prev);\n }\n\n /* ------------------------------ UI state --------------------------- */\n\n select(ids: string[] | string | null): void {\n const selection = ids === null ? [] : Array.isArray(ids) ? ids : [ids];\n if (sameIds(selection, this.state.selection)) return;\n this.setState({ selection, editingId: selection.length === 1 && this.state.editingId === selection[0] ? this.state.editingId : null });\n }\n\n toggleSelect(id: string): void {\n const has = this.state.selection.includes(id);\n this.select(has ? this.state.selection.filter((s) => s !== id) : [...this.state.selection, id]);\n }\n\n hover(id: string | null): void {\n if (id !== this.state.hoverId) this.setState({ hoverId: id });\n }\n\n setEditing(id: string | null): void {\n if (id !== this.state.editingId) this.setState({ editingId: id, selection: id ? [id] : this.state.selection });\n }\n\n setMode(mode: EditorState[\"mode\"]): void {\n if (mode !== this.state.mode) this.setState({ mode, editingId: null });\n }\n\n setZoom(zoom: number): void {\n const z = Math.min(3, Math.max(0.25, Math.round(zoom * 100) / 100));\n if (z !== this.state.zoom) this.setState({ zoom: z });\n }\n\n setActiveRegion(region: RegionId): void {\n if (region !== this.state.activeRegion) this.setState({ activeRegion: region });\n }\n\n markClean(): void {\n this.savedEntry = this.undoStack[this.undoStack.length - 1] ?? null;\n this.unhistoried = false;\n if (this.state.dirty) this.setState({ dirty: false });\n }\n\n /** Whether the document differs from the last saved state. */\n private isDirty(): boolean {\n if (this.unhistoried) return true;\n return (this.undoStack[this.undoStack.length - 1] ?? null) !== this.savedEntry;\n }\n\n /* ------------------------------ commands --------------------------- */\n\n /** Applies one command. Inside a transaction, patches accumulate into one history entry. */\n dispatch(command: Command, opts: DispatchOptions = {}): void {\n const [next, patches, inverse] = produceWithPatches(this.state.template, (draft) => {\n applyCommand(draft, command);\n });\n if (patches.length === 0) return;\n\n if (this.txDepth > 0) {\n this.txPatches.push(...patches);\n this.txInverse.unshift(...inverse);\n if (opts.skipHistory) this.txSkipHistory = true;\n this.commitTemplate(next, null);\n return;\n }\n\n const selectionBefore = this.state.selection;\n const entry: HistoryEntry = {\n label: opts.label ?? labelFor(command),\n patches,\n inversePatches: inverse,\n selectionBefore,\n selectionAfter: selectionBefore,\n at: Date.now(),\n mergeKey: opts.mergeKey\n };\n if (opts.skipHistory) this.unhistoried = true;\n else this.pushHistory(entry);\n this.commitTemplate(next, opts.skipHistory ? null : entry);\n }\n\n /**\n * Groups every dispatch inside `fn` into a single undo step. Nested\n * transactions join the outermost one. If `fn` throws, all changes roll back.\n */\n transaction<T>(label: string, fn: () => T): T {\n if (this.txDepth === 0) {\n this.txPatches = [];\n this.txInverse = [];\n this.txLabel = label;\n this.txSelectionBefore = this.state.selection;\n this.txSkipHistory = false;\n }\n this.txDepth++;\n const before = this.state.template;\n let result: T;\n try {\n result = fn();\n } catch (e) {\n this.txDepth--;\n if (this.txDepth === 0) {\n this.commitTemplate(before, null);\n this.txPatches = [];\n this.txInverse = [];\n }\n throw e;\n }\n this.txDepth--;\n if (this.txDepth === 0 && this.txPatches.length > 0) {\n const entry: HistoryEntry = {\n label: this.txLabel,\n patches: this.txPatches,\n inversePatches: this.txInverse,\n selectionBefore: this.txSelectionBefore,\n selectionAfter: this.state.selection,\n at: Date.now()\n };\n if (this.txSkipHistory) this.unhistoried = true;\n else this.pushHistory(entry);\n // The per-dispatch commits inside the transaction ran before the entry\n // existed, so the dirty flag they set was a guess. Settle it now.\n this.setState({ dirty: this.isDirty() });\n this.onChange?.(this.state.template, entry);\n this.txPatches = [];\n this.txInverse = [];\n }\n return result;\n }\n\n private commitTemplate(template: ReportTemplate, entry: HistoryEntry | null) {\n if (template === this.state.template) return;\n this.setState({ template, dirty: this.txDepth > 0 ? true : this.isDirty(), version: this.state.version + 1 });\n if (this.txDepth === 0) this.onChange?.(template, entry);\n }\n\n private pushHistory(entry: HistoryEntry) {\n const last = this.undoStack[this.undoStack.length - 1];\n if (entry.mergeKey && last && last.mergeKey === entry.mergeKey && entry.at - last.at < this.mergeWindowMs) {\n // Merging into the saved entry moves the document away from what was\n // saved while leaving the stack the same height, so the mark is gone.\n if (last === this.savedEntry) this.savedEntry = null;\n last.patches.push(...entry.patches);\n last.inversePatches.unshift(...entry.inversePatches);\n last.at = entry.at;\n last.selectionAfter = entry.selectionAfter;\n } else {\n this.undoStack.push(entry);\n if (this.undoStack.length > this.maxHistory) this.undoStack.shift();\n }\n this.redoStack = [];\n }\n\n /* ------------------------------ history ---------------------------- */\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undoLabel(): string | undefined {\n return this.undoStack[this.undoStack.length - 1]?.label;\n }\n\n redoLabel(): string | undefined {\n return this.redoStack[this.redoStack.length - 1]?.label;\n }\n\n undo(): boolean {\n const entry = this.undoStack.pop();\n if (!entry) return false;\n const template = applyPatches(this.state.template, entry.inversePatches);\n this.redoStack.push(entry);\n this.setState({ template, selection: entry.selectionBefore.filter((id) => !!findIn(template, id)), editingId: null, dirty: this.isDirty(), version: this.state.version + 1 });\n this.onChange?.(template, null);\n return true;\n }\n\n redo(): boolean {\n const entry = this.redoStack.pop();\n if (!entry) return false;\n const template = applyPatches(this.state.template, entry.patches);\n this.undoStack.push(entry);\n this.setState({ template, selection: entry.selectionAfter.filter((id) => !!findIn(template, id)), editingId: null, dirty: this.isDirty(), version: this.state.version + 1 });\n this.onChange?.(template, null);\n return true;\n }\n\n /** Replaces the document and clears history (loading a template). */\n load(template: ReportTemplate): void {\n this.undoStack = [];\n this.redoStack = [];\n this.savedEntry = null;\n this.unhistoried = false;\n this.setState({ template, selection: [], hoverId: null, editingId: null, dirty: false, version: this.state.version + 1 });\n }\n\n history(): { undo: readonly HistoryEntry[]; redo: readonly HistoryEntry[] } {\n return { undo: this.undoStack, redo: this.redoStack };\n }\n}\n\nfunction findIn(template: ReportTemplate, id: string): Node | undefined {\n return indexTemplate(template).get(id)?.node;\n}\n\nfunction sameIds(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((x, i) => x === b[i]);\n}\n\nfunction labelFor(cmd: Command): string {\n switch (cmd.type) {\n case \"insertNode\":\n case \"insertNodes\":\n return \"Insert\";\n case \"removeNodes\":\n return \"Delete\";\n case \"moveNode\":\n return \"Move\";\n case \"duplicateNode\":\n return \"Duplicate\";\n case \"setProps\":\n case \"setProp\":\n return \"Edit properties\";\n case \"setStyle\":\n return \"Edit style\";\n case \"setFlow\":\n return \"Edit page flow\";\n case \"setVisibleWhen\":\n return \"Edit visibility\";\n case \"setName\":\n return \"Rename\";\n case \"setLocked\":\n return cmd.locked ? \"Lock\" : \"Unlock\";\n case \"setRowLayout\":\n return \"Change columns\";\n case \"wrapNodes\":\n return \"Wrap\";\n case \"replaceNode\":\n return \"Replace\";\n case \"setPage\":\n return \"Page settings\";\n case \"setDocumentStyles\":\n case \"setTextStyle\":\n return \"Document styles\";\n case \"setTemplateName\":\n return \"Rename report\";\n case \"setSettings\":\n return \"Settings\";\n case \"setRegionFirstPage\":\n return \"First page header/footer\";\n case \"addLibraryItem\":\n return \"Save to library\";\n case \"removeLibraryItem\":\n return \"Remove from library\";\n case \"replaceTemplate\":\n return \"Load\";\n }\n}\n","import type { ResolvedNode, ResolvedSegment } from \"../resolve/resolved.js\";\nimport type { BlockRegistry } from \"../registry/registry.js\";\nimport type { RenderContext, RenderMode, BindingInfo } from \"../registry/block-definition.js\";\nimport type { Theme } from \"../types/theme.js\";\nimport type { DocumentStyles } from \"../types/template.js\";\nimport type { PageContext } from \"../types/data.js\";\nimport type { FormatContext } from \"../expr/format.js\";\nimport { h, type VChild, type VNode, type VProps } from \"../vnode/h.js\";\nimport { styleToCss, cssText } from \"../theme/resolve-style.js\";\nimport { Scope, evaluate } from \"../expr/evaluate.js\";\nimport { toDisplayString } from \"../expr/format.js\";\nimport type { RichTextDoc, InlineNode, TextMarks, Paragraph } from \"../richtext/model.js\";\nimport { isSafeUrl } from \"../validate/validate.js\";\nimport { resolveValue } from \"../theme/tokens.js\";\n\nexport interface RenderTreeOptions {\n registry: BlockRegistry;\n theme: Theme;\n styles: DocumentStyles;\n mode: RenderMode;\n page: PageContext;\n format: FormatContext;\n /** Content width in px at the root. */\n width: number;\n /** Hook for editors to add attributes to node wrappers. */\n decorate?: (node: ResolvedNode, props: VProps) => VProps;\n}\n\nfunction deferredScope(opts: RenderTreeOptions): Scope {\n return new Scope({\n page: opts.page,\n now: opts.format.now ?? new Date(),\n theme: { name: opts.theme.name, logo: opts.theme.logo, colors: opts.theme.colors, typography: opts.theme.typography, meta: opts.theme.meta ?? {} }\n });\n}\n\nfunction evalDeferred(expr: string, opts: RenderTreeOptions): string {\n try {\n return toDisplayString(evaluate(expr, { scope: deferredScope(opts), format: opts.format }));\n } catch {\n return \"\";\n }\n}\n\n/** Design-mode chip for a data token. */\nexport function tokenChip(expr: string, label: string | undefined, value?: string): VNode {\n return h(\"span\", { class: \"bp-token\", \"data-expr\": expr, title: expr, contenteditable: \"false\" }, label ?? expr, value !== undefined && value !== \"\" ? h(\"span\", { class: \"bp-token__value\" }, value) : null);\n}\n\nexport function renderSegments(segments: ResolvedSegment[] | undefined, fallback: string | undefined, opts: RenderTreeOptions): VChild[] {\n if (!segments) return fallback !== undefined ? [fallback] : [];\n return segments.map((s) => {\n if (s.kind === \"text\") return s.text;\n const value = s.deferred ? evalDeferred(s.expr!, opts) : s.value ?? \"\";\n if (opts.mode === \"design\") return tokenChip(s.expr!, s.label, s.deferred ? value : undefined);\n return value;\n });\n}\n\nfunction markWrap(children: VChild[], marks: TextMarks | undefined, opts: RenderTreeOptions): VChild {\n if (!marks) return children;\n let out: VChild = children;\n if (marks.code) out = h(\"code\", { class: \"bp-code\" }, out);\n if (marks.bold) out = h(\"strong\", null, out);\n if (marks.italic) out = h(\"em\", null, out);\n if (marks.underline) out = h(\"u\", null, out);\n if (marks.strike) out = h(\"s\", null, out);\n if (marks.color) out = h(\"span\", { style: { color: resolveValue(marks.color, opts.theme, \"inherit\") } }, out);\n if (marks.link) {\n const href = marks.link;\n const safe = isSafeUrl(href);\n const linkColor = resolveValue(opts.styles.link.color, opts.theme, opts.theme.colors.secondary);\n out = h(\"a\", { class: \"bp-link\", href: safe ? href : undefined, rel: \"noopener\", style: { color: linkColor, \"text-decoration\": opts.styles.link.underline === false ? \"none\" : \"underline\" } }, out);\n }\n return out;\n}\n\nexport function renderInline(content: InlineNode[], opts: RenderTreeOptions): VChild[] {\n return content.map((n) => {\n if (n.type === \"break\") return h(\"br\");\n if (n.type === \"text\") return markWrap([n.text], n.marks, opts);\n const value = n.deferred ? evalDeferred(n.expr, opts) : n.value ?? \"\";\n const inner = opts.mode === \"design\" ? tokenChip(n.expr, n.label, n.deferred ? value : undefined) : value;\n return markWrap([inner], n.marks, opts);\n });\n}\n\nfunction renderParagraph(p: Paragraph, opts: RenderTreeOptions): VNode {\n const empty = p.content.length === 0;\n return h(\"p\", { class: [\"bp-p\", empty && \"bp-p--empty\"], style: p.align ? { \"text-align\": p.align } : undefined }, empty ? h(\"br\") : renderInline(p.content, opts));\n}\n\nexport function renderRichText(doc: RichTextDoc | undefined, opts: RenderTreeOptions): VChild[] {\n if (!doc) return [];\n return doc.content.map((b) => {\n if (b.type === \"paragraph\") return renderParagraph(b, opts);\n return h(\n b.type === \"bulletList\" ? \"ul\" : \"ol\",\n { class: \"bp-list\" },\n b.content.map((li) => h(\"li\", null, li.content.map((p) => renderParagraph(p, opts))))\n );\n });\n}\n\nexport function nodeAttrs(node: ResolvedNode, extra: VProps = {}): VProps {\n return {\n \"data-key\": node.key,\n \"data-node\": node.nodeId,\n \"data-type\": node.type,\n ...extra\n };\n}\n\n/** Width available to a column inside a row. */\nexport function columnWidth(rowWidth: number, span: number, gap: number, columns: number): number {\n const inner = rowWidth - gap * Math.max(0, columns - 1);\n return Math.max(0, (inner * span) / 12);\n}\n\n/**\n * Renders a resolved node (and its subtree) to a VNode. This is the single\n * rendering path used by the editor canvas, the preview and the PDF service.\n */\nexport function renderNode(node: ResolvedNode, opts: RenderTreeOptions, width: number = opts.width): VNode | null {\n const def = opts.registry.get(node.type);\n const gap = opts.styles.spacing.blockGap;\n const columnGap = opts.styles.spacing.columnGap;\n\n // Children first (containers)\n let childWidth = width;\n if (def?.container) {\n const pad = node.style.padding;\n const bw = node.style.border ? node.style.border.width : 0;\n childWidth = Math.max(0, width - pad.left - pad.right - 2 * bw);\n }\n const children: VNode[] = [];\n if (node.role === \"row\") {\n const count = node.children.length;\n for (const col of node.children) {\n const w = columnWidth(childWidth, col.span ?? 12 / Math.max(1, count), columnGap, count);\n const v = renderNode(col, opts, w);\n if (v) children.push(v);\n }\n } else {\n for (const c of node.children) {\n const v = renderNode(c, opts, childWidth);\n if (v) children.push(v);\n }\n }\n\n const s = node.style;\n const css = styleToCss(s);\n delete css[\"margin\"];\n delete css[\"width\"];\n delete css[\"height\"];\n\n const wrapperStyle: Record<string, string | undefined> = {};\n const m = s.margin;\n if (m.top || m.right || m.bottom || m.left) wrapperStyle[\"margin\"] = `${m.top}px ${m.right}px ${m.bottom}px ${m.left}px`;\n if (s.width !== undefined && node.role === \"block\") {\n wrapperStyle[\"width\"] = typeof s.width === \"number\" ? `${s.width}px` : s.width;\n wrapperStyle[\"max-width\"] = \"100%\";\n if (s.align === \"center\") wrapperStyle[\"margin-left\"] = wrapperStyle[\"margin-right\"] = \"auto\";\n else if (s.align === \"right\") wrapperStyle[\"margin-left\"] = \"auto\";\n }\n if (s.height !== undefined && node.role === \"block\") wrapperStyle[\"height\"] = `${s.height}px`;\n if (node.role === \"column\") {\n wrapperStyle[\"grid-column\"] = `span ${node.span ?? 12}`;\n wrapperStyle[\"min-width\"] = \"0\";\n }\n\n const classes = [\"bp-node\", `bp-node--${node.type}`, `bp-${node.role}`];\n if (node.props.__hiddenByCondition) classes.push(\"bp-node--hidden\");\n if (node.placeholder) classes.push(\"bp-node--placeholder\");\n if (node.locked) classes.push(\"bp-node--locked\");\n if (node.iteration) classes.push(\"bp-repeater-item\");\n if (node.flow.keepTogether) classes.push(\"bp-node--keep\");\n\n let attrs: VProps = nodeAttrs(node, { class: classes, style: wrapperStyle });\n if (opts.decorate) attrs = opts.decorate(node, attrs);\n\n if (!def) {\n return h(\"div\", attrs, h(\"div\", { class: \"bp-unknown-block\", style: cssText(css) }, `Unavailable block: ${node.type}`));\n }\n\n const ctx: RenderContext = {\n node,\n props: node.props,\n style: s,\n css,\n theme: opts.theme,\n styles: opts.styles,\n mode: opts.mode,\n h,\n children,\n page: opts.page,\n width,\n format: opts.format,\n registry: opts.registry,\n text: (prop, fallback) => renderSegments(node.textSegments[prop], fallback ?? (typeof node.props[prop] === \"string\" ? (node.props[prop] as string) : undefined), opts),\n richText: (prop) => renderRichText(node.richText[prop] ?? (node.props[prop] as RichTextDoc | undefined), opts),\n textValue: (value) => (value === undefined ? [] : [value]),\n binding: (prop) => node.bindings[prop] as BindingInfo | undefined,\n partAttrs: (part, extra = {}) => ({ \"data-part\": part, \"data-node\": node.nodeId, ...extra }),\n placeholder: (text, extra = {}) => h(\"div\", { class: \"bp-placeholder\", ...extra }, text)\n };\n\n let inner: VNode | null;\n try {\n inner = def.render(ctx);\n } catch (e) {\n inner = h(\"div\", { class: \"bp-block-error\" }, `${def.name} failed to render: ${(e as Error).message}`);\n }\n if (!inner) return null;\n\n // Containers: lay out children in a column with the document block gap.\n if (def.container && node.role !== \"row\" && node.role !== \"column\" && def.container.direction !== \"row\") {\n // Blocks render their own children; nothing to add here.\n }\n void gap;\n return h(\"div\", attrs, inner);\n}\n\n/** Renders a list of resolved sections into a fragment-less flat list. */\nexport function renderSections(sections: ResolvedNode[], opts: RenderTreeOptions): VNode[] {\n const out: VNode[] = [];\n for (const s of sections) {\n const v = renderNode(s, opts, opts.width);\n if (v) out.push(v);\n }\n return out;\n}\n"],"mappings":"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","names":["arg","opts","list","v","f","token","g","spacing","current","walk","list","margins","list","g","current","h","check","list","getPath","g","getPath","indexTemplate","list","list","indexTemplate","indexTemplate","z","labelFor","safe"]}