@broadpaper/blocks 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +143 -0
- package/THIRD-PARTY-NOTICES.md +255 -0
- package/dist/index.d.ts +312 -0
- package/dist/index.js +1799 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/blocks/structure.ts","../src/blocks/content.ts","../src/shared/marks.ts","../src/blocks/layout.ts","../src/blocks/table.ts","../src/blocks/charts.ts","../src/charts/chart-svg.ts"],"sourcesContent":["import { BlockRegistry, type BlockDefinition, type RegistryOptions } from \"@broadpaper/core\";\nimport { sectionBlock, rowBlock, columnBlock, repeaterItemBlock } from \"./blocks/structure.js\";\nimport { headingBlock, textBlock, imageBlock, logoBlock, dividerBlock, spacerBlock, buttonBlock, calloutBlock, quoteBlock, fieldBlock, kpiBlock, signatureBlock, dateBlock, pageNumberBlock, timestampBlock } from \"./blocks/content.js\";\nimport { containerBlock, cardBlock, pageBreakBlock, keepTogetherBlock, conditionalBlock, repeaterBlock } from \"./blocks/layout.js\";\nimport { tableBlock, keyValueListBlock } from \"./blocks/table.js\";\nimport { chartBlock, progressBlock } from \"./blocks/charts.js\";\n\nexport * from \"./blocks/structure.js\";\nexport * from \"./blocks/content.js\";\nexport * from \"./blocks/layout.js\";\nexport * from \"./blocks/table.js\";\nexport * from \"./blocks/charts.js\";\nexport * from \"./charts/chart-svg.js\";\n\n/** Every built-in block, in palette order. */\nexport const builtInBlocks: Array<BlockDefinition<any>> = [\n // structure\n sectionBlock,\n rowBlock,\n columnBlock,\n repeaterItemBlock,\n // content\n headingBlock,\n textBlock,\n imageBlock,\n logoBlock,\n dividerBlock,\n spacerBlock,\n buttonBlock,\n calloutBlock,\n quoteBlock,\n signatureBlock,\n dateBlock,\n pageNumberBlock,\n timestampBlock,\n // layout\n containerBlock,\n cardBlock,\n pageBreakBlock,\n keepTogetherBlock,\n // data\n fieldBlock,\n kpiBlock,\n keyValueListBlock,\n conditionalBlock,\n repeaterBlock,\n tableBlock,\n // visualisation\n chartBlock,\n progressBlock\n];\n\n/** Creates a registry with every built-in block plus any custom blocks. */\nexport function createRegistry(custom: Array<BlockDefinition<any>> = [], opts: RegistryOptions = {}): BlockRegistry {\n return new BlockRegistry([...builtInBlocks, ...custom], opts);\n}\n","import { defineBlock, cssText, type VNode } from \"@broadpaper/core\";\n\n/**\n * Structural nodes. They are hidden from the palette; the editor creates them\n * through layout tools (add section, add row with a column layout).\n */\n\nexport const sectionBlock = defineBlock<{ padding: number; background?: string; label?: string }>({\n type: \"section\",\n name: \"Section\",\n category: \"structure\",\n icon: \"rectangle-horizontal\",\n hidden: true,\n defaultProps: { padding: 0 },\n container: { accepts: [\"@rows\", \"@blocks\"] },\n split: \"children\",\n styleGroups: [\"spacing\", \"background\", \"border\", \"flow\"],\n inspector: [\n {\n title: \"Section\",\n fields: [\n { kind: \"text\", prop: \"label\", label: \"Label\", placeholder: \"e.g. Executive summary\", allowTokens: false },\n { kind: \"number\", prop: \"padding\", label: \"Padding\", min: 0, max: 120, unit: \"px\" }\n ]\n }\n ],\n canvas: { label: (p) => p.label ?? \"Section\" },\n render: ({ h, css, children, styles, props, mode, node }) => {\n const pad = Number(props.padding) || 0;\n const empty = children.length === 0;\n return h(\n \"div\",\n { class: [\"bp-section__inner\", empty && \"bp-section__inner--empty\"], style: cssText({ ...css, padding: pad ? `${pad}px` : css[\"padding\"] }) },\n h(\"div\", { class: \"bp-stack\", style: { gap: `${styles.spacing.blockGap}px` }, \"data-dropzone\": node.nodeId }, empty && mode === \"design\" ? h(\"div\", { class: \"bp-empty-section\" }, h(\"span\", { class: \"bp-empty-section__title\" }, \"Empty section\"), h(\"span\", { class: \"bp-empty-section__hint\" }, \"Drag blocks here, or pick one from the panel\")) : children)\n );\n }\n});\n\nexport const rowBlock = defineBlock<{ layout: number[]; allowSplit: boolean; verticalAlign: \"top\" | \"middle\" | \"bottom\" | \"stretch\" }>({\n type: \"row\",\n name: \"Columns\",\n description: \"A row of columns\",\n category: \"layout\",\n icon: \"columns-3\",\n keywords: [\"row\", \"columns\", \"grid\", \"layout\"],\n defaultProps: { layout: [6, 6], allowSplit: false, verticalAlign: \"top\" },\n container: { accepts: [\"@columns\"], direction: \"row\" },\n split: \"children\",\n styleGroups: [\"spacing\", \"background\", \"border\", \"flow\"],\n inspector: [\n {\n title: \"Columns\",\n fields: [\n {\n kind: \"segmented\",\n prop: \"verticalAlign\",\n label: \"Vertical align\",\n options: [\n { value: \"top\", label: \"Top\", icon: \"align-start-vertical\" },\n { value: \"middle\", label: \"Middle\", icon: \"align-center-vertical\" },\n { value: \"bottom\", label: \"Bottom\", icon: \"align-end-vertical\" },\n { value: \"stretch\", label: \"Stretch\", icon: \"stretch-vertical\" }\n ]\n },\n { kind: \"toggle\", prop: \"allowSplit\", label: \"Allow splitting across pages\", description: \"When off, a row that does not fit moves to the next page whole.\" }\n ]\n }\n ],\n canvas: { label: (p) => `Columns ${p.layout.join(\" / \")}` },\n render: ({ h, css, children, styles, props }) => {\n const align = props.verticalAlign === \"middle\" ? \"center\" : props.verticalAlign === \"bottom\" ? \"end\" : props.verticalAlign === \"stretch\" ? \"stretch\" : \"start\";\n return h(\"div\", { class: \"bp-row__grid\", style: cssText({ ...css, display: \"grid\", \"grid-template-columns\": \"repeat(12, minmax(0, 1fr))\", \"column-gap\": `${styles.spacing.columnGap}px`, \"align-items\": align }) }, children);\n }\n});\n\nexport const columnBlock = defineBlock<{ span: number }>({\n type: \"column\",\n name: \"Column\",\n category: \"structure\",\n icon: \"rectangle-vertical\",\n hidden: true,\n defaultProps: { span: 6 },\n container: { accepts: [\"@blocks\", \"@rows\"] },\n split: \"children\",\n styleGroups: [\"spacing\", \"background\", \"border\"],\n render: ({ h, css, children, node, styles, mode }) => {\n const empty = children.length === 0;\n return h(\n \"div\",\n { class: [\"bp-column__inner\", empty && \"bp-column__inner--empty\"], style: cssText({ ...css, \"min-width\": \"0\", height: \"100%\" }) },\n h(\"div\", { class: \"bp-stack\", style: { gap: `${styles.spacing.blockGap}px` }, \"data-dropzone\": node.nodeId }, empty && mode === \"design\" ? h(\"div\", { class: \"bp-empty-column\" }, \"Drop here\") : children)\n );\n }\n});\n\nexport const repeaterItemBlock = defineBlock<{ index: number; count: number }>({\n type: \"repeater-item\",\n name: \"Repeater item\",\n category: \"structure\",\n hidden: true,\n defaultProps: { index: 0, count: 0 },\n container: { accepts: [\"@blocks\", \"@rows\"] },\n split: \"children\",\n render: ({ h, children, styles }) => h(\"div\", { class: \"bp-stack bp-repeater-item__inner\", style: { gap: `${styles.spacing.blockGap}px` } }, children)\n});\n\nexport function stack(h: typeof import(\"@broadpaper/core\").h, children: VNode[], gap: number, extra: Record<string, unknown> = {}): VNode {\n return h(\"div\", { class: \"bp-stack\", style: { gap: `${gap}px` }, ...extra }, children);\n}\n","import { defineBlock, cssText, createRichText, isSafeUrl, resolveValue, isDarkColor, formatDate, type RichTextDoc, type InspectorSection, type VChild } from \"@broadpaper/core\";\nimport { checkMark, dotMark, triangleMark } from \"../shared/marks.js\";\n\nconst alignField: InspectorSection[\"fields\"][number] = {\n kind: \"segmented\",\n prop: \"align\",\n label: \"Align\",\n options: [\n { value: \"left\", label: \"Left\", icon: \"align-left\" },\n { value: \"center\", label: \"Centre\", icon: \"align-center\" },\n { value: \"right\", label: \"Right\", icon: \"align-right\" }\n ]\n};\n\n/* ------------------------------------------------------------------ */\n/* Heading */\n/* ------------------------------------------------------------------ */\n\nexport const headingBlock = defineBlock<{ text: string; level: \"h1\" | \"h2\" | \"h3\" | \"h4\" }>({\n type: \"heading\",\n name: \"Heading\",\n description: \"Section title using a document heading style\",\n category: \"content\",\n icon: \"heading\",\n keywords: [\"title\", \"h1\", \"h2\", \"h3\"],\n defaultProps: { text: \"Heading\", level: \"h2\" },\n defaultTextStyle: \"h2\",\n defaultFlow: { keepWithNext: true },\n split: \"none\",\n styleGroups: [\"textStyle\", \"typography\", \"alignment\", \"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Heading\",\n fields: [\n { kind: \"text\", prop: \"text\", label: \"Text\", placeholder: \"Heading text or {{ token }}\" },\n {\n kind: \"segmented\",\n prop: \"level\",\n label: \"Level\",\n options: [\n { value: \"h1\", label: \"H1\" },\n { value: \"h2\", label: \"H2\" },\n { value: \"h3\", label: \"H3\" },\n { value: \"h4\", label: \"H4\" }\n ]\n }\n ]\n }\n ],\n canvas: { inlineEdit: { prop: \"text\", kind: \"text\" }, label: (p) => p.text?.slice(0, 40) || \"Heading\" },\n render: ({ h, css, text, props, partAttrs, mode }) => {\n const content = text(\"text\");\n const empty = content.length === 0 || (content.length === 1 && content[0] === \"\");\n return h(props.level || \"h2\", { class: [\"bp-heading\", `bp-heading--${props.level}`], style: cssText(css), ...partAttrs(\"text\") }, empty && mode === \"design\" ? h(\"span\", { class: \"bp-placeholder-text\" }, \"Heading\") : content);\n }\n});\n\n/* ------------------------------------------------------------------ */\n/* Rich text */\n/* ------------------------------------------------------------------ */\n\nexport const textBlock = defineBlock<{ content: RichTextDoc }>({\n type: \"text\",\n name: \"Text\",\n description: \"Rich text with inline data tokens\",\n category: \"content\",\n icon: \"text\",\n keywords: [\"paragraph\", \"rich text\", \"body\", \"copy\"],\n defaultProps: () => ({ content: createRichText(\"\") }),\n defaultTextStyle: \"body\",\n split: \"lines\",\n measure: \"text\",\n styleGroups: [\"textStyle\", \"typography\", \"alignment\", \"spacing\", \"background\", \"border\", \"flow\"],\n inspector: [{ title: \"Text\", fields: [{ kind: \"richtext\", prop: \"content\", label: \"Content\" }] }],\n canvas: { inlineEdit: { prop: \"content\", kind: \"richtext\" }, label: () => \"Text\" },\n render: ({ h, css, richText, partAttrs, mode, node }) => {\n const doc = node.richText.content ?? (node.props.content as RichTextDoc | undefined);\n const isEmpty = !doc || doc.content.every((b) => b.type === \"paragraph\" && b.content.length === 0);\n return h(\"div\", { class: [\"bp-text\", isEmpty && \"bp-text--empty\"], style: cssText(css), ...partAttrs(\"text\") }, isEmpty && mode === \"design\" ? h(\"p\", { class: \"bp-p bp-placeholder-text\" }, \"Type or drop a field here…\") : richText(\"content\"));\n }\n});\n\n/* ------------------------------------------------------------------ */\n/* Image & logo */\n/* ------------------------------------------------------------------ */\n\nexport const imageBlock = defineBlock<{ src: string; alt: string; fit: \"contain\" | \"cover\"; width: number | null; height: number | null; align: \"left\" | \"center\" | \"right\"; radius: number; link: string }>({\n type: \"image\",\n name: \"Image\",\n description: \"Static or data-bound image\",\n category: \"content\",\n icon: \"image\",\n keywords: [\"picture\", \"photo\", \"graphic\"],\n defaultProps: { src: \"\", alt: \"\", fit: \"contain\", width: null, height: null, align: \"left\", radius: 0, link: \"\" },\n split: \"none\",\n styleGroups: [\"spacing\", \"border\", \"flow\"],\n inspector: [\n {\n title: \"Image\",\n fields: [\n { kind: \"image\", prop: \"src\", label: \"Source\", allowBinding: true },\n { kind: \"text\", prop: \"alt\", label: \"Alt text\", allowTokens: true },\n { kind: \"text\", prop: \"link\", label: \"Link URL\", allowTokens: true }\n ]\n },\n {\n title: \"Size\",\n fields: [\n { kind: \"number\", prop: \"width\", label: \"Width\", min: 8, max: 2000, unit: \"px\" },\n { kind: \"number\", prop: \"height\", label: \"Height\", min: 8, max: 2000, unit: \"px\" },\n {\n kind: \"segmented\",\n prop: \"fit\",\n label: \"Fit\",\n options: [\n { value: \"contain\", label: \"Contain\" },\n { value: \"cover\", label: \"Cover\" }\n ]\n },\n alignField,\n { kind: \"number\", prop: \"radius\", label: \"Corner radius\", min: 0, max: 200, unit: \"px\" }\n ]\n }\n ],\n validate: ({ props }) => {\n const src = String(props.src ?? \"\");\n if (src && !src.includes(\"{{\") && !isSafeUrl(src, { allowData: true })) return [{ severity: \"warning\", code: \"invalid-url\", message: `Image URL \"${src.slice(0, 60)}\" is not an http(s) or data:image URL`, prop: \"src\" }];\n return [];\n },\n render: ({ h, css, props, mode, node, width: avail }) => {\n const src = typeof props.src === \"string\" ? props.src : \"\";\n const safe = src && isSafeUrl(src, { allowData: true });\n const w = props.width ?? undefined;\n const hgt = props.height ?? undefined;\n const justify = props.align === \"center\" ? \"center\" : props.align === \"right\" ? \"flex-end\" : \"flex-start\";\n const imgStyle: Record<string, string | undefined> = {\n width: w ? `${Math.min(w, avail)}px` : hgt ? \"auto\" : \"100%\",\n height: hgt ? `${hgt}px` : \"auto\",\n \"max-width\": \"100%\",\n \"object-fit\": props.fit,\n \"border-radius\": props.radius ? `${props.radius}px` : undefined,\n display: \"block\"\n };\n let img;\n if (safe) img = h(\"img\", { src, alt: props.alt || \"\", style: imgStyle, draggable: \"false\" });\n else if (mode === \"design\") {\n const bound = node.bindings.src;\n img = h(\"div\", { class: \"bp-image-placeholder\", style: { width: w ? `${Math.min(w, avail)}px` : \"100%\", height: `${hgt ?? 140}px`, \"border-radius\": props.radius ? `${props.radius}px` : undefined } }, h(\"span\", { class: \"bp-image-placeholder__label\" }, bound ? bound.label : src ? \"Invalid image URL\" : \"Choose an image\"));\n } else img = h(\"div\", { style: { width: w ? `${w}px` : \"100%\", height: `${hgt ?? 0}px` } });\n const linked = props.link && isSafeUrl(props.link) ? h(\"a\", { href: props.link, rel: \"noopener\", style: { display: \"block\", width: w ? `${Math.min(w, avail)}px` : \"100%\" } }, img) : img;\n return h(\"div\", { class: \"bp-image\", style: cssText({ ...css, display: \"flex\", \"justify-content\": justify }) }, linked);\n }\n});\n\nexport const logoBlock = defineBlock<{ variant: \"auto\" | \"light\" | \"dark\"; height: number; align: \"left\" | \"center\" | \"right\" }>({\n type: \"logo\",\n name: \"Logo\",\n description: \"The active brand's logo\",\n category: \"content\",\n icon: \"badge-check\",\n keywords: [\"brand\", \"theme\"],\n defaultProps: { variant: \"auto\", height: 32, align: \"left\" },\n split: \"none\",\n styleGroups: [\"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Logo\",\n fields: [\n { kind: \"number\", prop: \"height\", label: \"Height\", min: 8, max: 400, unit: \"px\" },\n alignField,\n {\n kind: \"select\",\n prop: \"variant\",\n label: \"Variant\",\n options: [\n { value: \"auto\", label: \"Automatic\" },\n { value: \"light\", label: \"Standard\" },\n { value: \"dark\", label: \"For dark backgrounds\" }\n ]\n }\n ]\n }\n ],\n render: ({ h, css, props, theme, mode, style }) => {\n const onDark = props.variant === \"dark\" || (props.variant === \"auto\" && !!style.background && isDarkColor(style.background));\n const src = (onDark && theme.logoDark) || theme.logo;\n const justify = props.align === \"center\" ? \"center\" : props.align === \"right\" ? \"flex-end\" : \"flex-start\";\n const content = src && isSafeUrl(src, { allowData: true })\n ? h(\"img\", { src, alt: theme.logoAlt ?? `${theme.name} logo`, style: { height: `${props.height}px`, width: \"auto\", \"max-width\": \"100%\", display: \"block\" }, draggable: \"false\" })\n : mode === \"design\"\n ? h(\"div\", { class: \"bp-logo-placeholder\", style: { height: `${props.height}px` } }, theme.name || \"Logo\")\n : h(\"div\", { style: { height: `${props.height}px` } });\n return h(\"div\", { class: \"bp-logo\", style: cssText({ ...css, display: \"flex\", \"justify-content\": justify }) }, content);\n }\n});\n\n/* ------------------------------------------------------------------ */\n/* Divider, spacer */\n/* ------------------------------------------------------------------ */\n\nexport const dividerBlock = defineBlock<{ thickness: number; color: string; lineStyle: \"solid\" | \"dashed\" | \"dotted\"; width: number }>({\n type: \"divider\",\n name: \"Divider\",\n category: \"content\",\n icon: \"minus\",\n keywords: [\"rule\", \"line\", \"separator\", \"hr\"],\n defaultProps: { thickness: 1, color: \"$colors.border\", lineStyle: \"solid\", width: 100 },\n split: \"none\",\n styleGroups: [\"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Divider\",\n fields: [\n { kind: \"number\", prop: \"thickness\", label: \"Thickness\", min: 1, max: 20, unit: \"px\" },\n { kind: \"color\", prop: \"color\", label: \"Colour\" },\n {\n kind: \"segmented\",\n prop: \"lineStyle\",\n label: \"Style\",\n options: [\n { value: \"solid\", label: \"Solid\" },\n { value: \"dashed\", label: \"Dashed\" },\n { value: \"dotted\", label: \"Dotted\" }\n ]\n },\n { kind: \"number\", prop: \"width\", label: \"Width\", min: 5, max: 100, unit: \"%\" }\n ]\n }\n ],\n render: ({ h, css, props, theme }) =>\n h(\"div\", { class: \"bp-divider\", style: cssText({ ...css, display: \"flex\", \"justify-content\": \"center\" }) }, h(\"div\", { style: { width: `${props.width}%`, \"border-top\": `${props.thickness}px ${props.lineStyle} ${resolveValue(props.color, theme, theme.colors.border)}` } }))\n});\n\nexport const spacerBlock = defineBlock<{ height: number }>({\n type: \"spacer\",\n name: \"Spacer\",\n category: \"content\",\n icon: \"move-vertical\",\n keywords: [\"gap\", \"space\", \"padding\"],\n defaultProps: { height: 24 },\n split: \"none\",\n styleGroups: [\"flow\"],\n inspector: [{ title: \"Spacer\", fields: [{ kind: \"number\", prop: \"height\", label: \"Height\", min: 1, max: 600, unit: \"px\" }] }],\n render: ({ h, props, mode }) => h(\"div\", { class: [\"bp-spacer\", mode === \"design\" && \"bp-spacer--design\"], style: { height: `${props.height}px` } })\n});\n\n/* ------------------------------------------------------------------ */\n/* Button / link */\n/* ------------------------------------------------------------------ */\n\nexport const buttonBlock = defineBlock<{ label: string; url: string; variant: \"filled\" | \"outline\" | \"link\"; color: string; align: \"left\" | \"center\" | \"right\"; size: \"sm\" | \"md\" | \"lg\" }>({\n type: \"button\",\n name: \"Button\",\n description: \"A hyperlink styled as a button\",\n category: \"content\",\n icon: \"mouse-pointer-click\",\n keywords: [\"link\", \"cta\", \"url\"],\n defaultProps: { label: \"View online\", url: \"https://\", variant: \"filled\", color: \"$colors.primary\", align: \"left\", size: \"md\" },\n split: \"none\",\n styleGroups: [\"typography\", \"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Button\",\n fields: [\n { kind: \"text\", prop: \"label\", label: \"Label\" },\n { kind: \"text\", prop: \"url\", label: \"URL\", placeholder: \"https://… or {{ token }}\" },\n {\n kind: \"segmented\",\n prop: \"variant\",\n label: \"Style\",\n options: [\n { value: \"filled\", label: \"Filled\" },\n { value: \"outline\", label: \"Outline\" },\n { value: \"link\", label: \"Link\" }\n ]\n },\n { kind: \"color\", prop: \"color\", label: \"Colour\" },\n {\n kind: \"segmented\",\n prop: \"size\",\n label: \"Size\",\n options: [\n { value: \"sm\", label: \"S\" },\n { value: \"md\", label: \"M\" },\n { value: \"lg\", label: \"L\" }\n ]\n },\n alignField\n ]\n }\n ],\n validate: ({ props }) => {\n const url = String(props.url ?? \"\");\n return url && !url.includes(\"{{\") && !isSafeUrl(url) ? [{ severity: \"warning\", code: \"invalid-url\", message: `Button URL \"${url}\" is not a valid http(s) or mailto link`, prop: \"url\" }] : [];\n },\n render: ({ h, css, props, theme, text, style }) => {\n const color = resolveValue(props.color, theme, theme.colors.primary);\n const pad = props.size === \"sm\" ? \"5px 10px\" : props.size === \"lg\" ? \"11px 22px\" : \"8px 16px\";\n const fontSize = props.size === \"sm\" ? style.fontSize - 1 : props.size === \"lg\" ? style.fontSize + 2 : style.fontSize;\n const base: Record<string, string> = { display: \"inline-block\", padding: props.variant === \"link\" ? \"0\" : pad, \"border-radius\": `${theme.radius ?? 6}px`, \"font-weight\": \"600\", \"font-size\": `${fontSize}px`, \"text-decoration\": props.variant === \"link\" ? \"underline\" : \"none\", \"font-family\": style.fontFamily, \"line-height\": \"1.2\" };\n if (props.variant === \"filled\") Object.assign(base, { background: color, color: isDarkColor(color) ? \"#FFFFFF\" : theme.colors.text });\n else if (props.variant === \"outline\") Object.assign(base, { border: `1.5px solid ${color}`, color });\n else Object.assign(base, { color });\n const url = typeof props.url === \"string\" ? props.url : \"\";\n const justify = props.align === \"center\" ? \"center\" : props.align === \"right\" ? \"flex-end\" : \"flex-start\";\n return h(\"div\", { class: \"bp-button\", style: cssText({ ...css, display: \"flex\", \"justify-content\": justify }) }, h(\"a\", { class: \"bp-button__link\", href: isSafeUrl(url) ? url : undefined, rel: \"noopener\", style: base }, text(\"label\", \"Button\")));\n }\n});\n\n/* ------------------------------------------------------------------ */\n/* Callout & quote */\n/* ------------------------------------------------------------------ */\n\nexport const calloutBlock = defineBlock<{ title: string; content: RichTextDoc; tone: \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\"; icon: boolean }>({\n type: \"callout\",\n name: \"Callout\",\n description: \"Highlighted note or warning\",\n category: \"content\",\n icon: \"message-square-warning\",\n keywords: [\"note\", \"warning\", \"alert\", \"notice\", \"info\"],\n defaultProps: () => ({ title: \"Important\", content: createRichText(\"Add the note here.\"), tone: \"info\", icon: true }),\n defaultTextStyle: \"body\",\n defaultFlow: { keepTogether: true },\n split: \"none\",\n styleGroups: [\"typography\", \"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Callout\",\n fields: [\n { kind: \"text\", prop: \"title\", label: \"Title\" },\n { kind: \"richtext\", prop: \"content\", label: \"Content\" },\n {\n kind: \"select\",\n prop: \"tone\",\n label: \"Tone\",\n options: [\n { value: \"info\", label: \"Information\" },\n { value: \"success\", label: \"Success\" },\n { value: \"warning\", label: \"Warning\" },\n { value: \"danger\", label: \"Danger\" },\n { value: \"neutral\", label: \"Neutral\" }\n ]\n },\n { kind: \"toggle\", prop: \"icon\", label: \"Show icon\" }\n ]\n }\n ],\n canvas: { inlineEdit: { prop: \"content\", kind: \"richtext\" }, label: (p) => p.title || \"Callout\" },\n render: ({ h, css, props, theme, text, richText, partAttrs }) => {\n const tones: Record<string, string> = { info: theme.colors.secondary, success: theme.colors.success ?? \"#1E8E5A\", warning: theme.colors.warning ?? \"#C77D0A\", danger: theme.colors.danger ?? \"#C0392B\", neutral: theme.colors.mutedText };\n const accent = tones[props.tone] ?? theme.colors.secondary;\n const glyphs: Record<string, string> = { info: \"i\", warning: \"!\", danger: \"!\" };\n const icon = glyphs[props.tone] ?? (props.tone === \"success\" ? checkMark(11, \"#fff\") : props.tone === \"neutral\" ? dotMark(11, \"#fff\") : \"i\");\n return h(\n \"div\",\n { class: [\"bp-callout\", `bp-callout--${props.tone}`], style: cssText({ ...css, display: \"flex\", gap: \"12px\", padding: css[\"padding\"] ?? \"12px 14px\", \"border-left\": `3px solid ${accent}`, background: css[\"background\"] ?? mixWithWhite(accent), \"border-radius\": `${theme.radius ?? 6}px` }) },\n props.icon ? h(\"div\", { class: \"bp-callout__icon\", style: { color: \"#fff\", background: accent, \"font-weight\": \"700\", \"font-size\": \"11px\", width: \"18px\", height: \"18px\", \"border-radius\": \"9px\", display: \"flex\", \"align-items\": \"center\", \"justify-content\": \"center\", \"flex-shrink\": \"0\", \"margin-top\": \"1px\" } }, icon) : null,\n h(\"div\", { class: \"bp-callout__body\", style: { flex: \"1\", \"min-width\": \"0\" } }, props.title ? h(\"div\", { class: \"bp-callout__title\", style: { \"font-weight\": \"600\", \"margin-bottom\": \"3px\" } }, text(\"title\")) : null, h(\"div\", { class: \"bp-callout__content\", ...partAttrs(\"text\") }, richText(\"content\")))\n );\n }\n});\n\nexport function mixWithWhite(hex: string, amount = 0.92): string {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) return \"transparent\";\n const n = parseInt(m[1]!, 16);\n const c = [(n >> 16) & 255, (n >> 8) & 255, n & 255].map((v) => Math.round(v + (255 - v) * amount));\n return `#${c.map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nexport const quoteBlock = defineBlock<{ content: RichTextDoc; attribution: string }>({\n type: \"quote\",\n name: \"Quote\",\n category: \"content\",\n icon: \"quote\",\n keywords: [\"blockquote\", \"testimonial\", \"citation\"],\n defaultProps: () => ({ content: createRichText(\"A memorable statement.\"), attribution: \"\" }),\n defaultTextStyle: \"lead\",\n defaultStyle: { fontStyle: \"italic\" },\n defaultFlow: { keepTogether: true },\n split: \"none\",\n styleGroups: [\"textStyle\", \"typography\", \"alignment\", \"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Quote\",\n fields: [\n { kind: \"richtext\", prop: \"content\", label: \"Quote\" },\n { kind: \"text\", prop: \"attribution\", label: \"Attribution\", placeholder: \"— Name, role\" }\n ]\n }\n ],\n canvas: { inlineEdit: { prop: \"content\", kind: \"richtext\" } },\n render: ({ h, css, props, theme, richText, text, partAttrs }) =>\n h(\n \"blockquote\",\n { class: \"bp-quote\", style: cssText({ ...css, margin: \"0\", \"padding-left\": \"16px\", \"border-left\": `3px solid ${theme.colors.accent}` }) },\n h(\"div\", { class: \"bp-quote__content\", ...partAttrs(\"text\") }, richText(\"content\")),\n props.attribution ? h(\"div\", { class: \"bp-quote__attribution\", style: { \"font-style\": \"normal\", \"font-size\": `${Math.max(8, Math.round(Number(css[\"font-size\"]?.replace(\"px\", \"\")) * 0.8))}px`, color: theme.colors.mutedText, \"margin-top\": \"6px\" } }, text(\"attribution\")) : null\n )\n});\n\n/* ------------------------------------------------------------------ */\n/* Key/value, KPI */\n/* ------------------------------------------------------------------ */\n\nexport const fieldBlock = defineBlock<{ label: string; value: string; layout: \"stacked\" | \"inline\"; fallback: string; labelWidth: number }>({\n type: \"field\",\n name: \"Field\",\n description: \"A labelled data value\",\n category: \"data\",\n icon: \"tag\",\n keywords: [\"key value\", \"label\", \"dynamic text\", \"binding\", \"data\"],\n defaultProps: { label: \"Label\", value: \"\", layout: \"stacked\", fallback: \"—\", labelWidth: 40 },\n defaultTextStyle: \"body\",\n split: \"none\",\n styleGroups: [\"typography\", \"alignment\", \"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Field\",\n fields: [\n { kind: \"text\", prop: \"label\", label: \"Label\" },\n { kind: \"binding\", prop: \"value\", label: \"Value\", placeholder: \"Pick a field\" },\n { kind: \"text\", prop: \"fallback\", label: \"Fallback when empty\", allowTokens: false },\n {\n kind: \"segmented\",\n prop: \"layout\",\n label: \"Layout\",\n options: [\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"inline\", label: \"Inline\" }\n ]\n },\n { kind: \"number\", prop: \"labelWidth\", label: \"Label width\", min: 10, max: 80, unit: \"%\", when: (p) => p.layout === \"inline\" }\n ]\n }\n ],\n canvas: { label: (p) => p.label || \"Field\" },\n render: ({ h, css, props, theme, text, mode, node }) => {\n const b = node.bindings.value;\n const raw = props.value;\n const display = raw === undefined || raw === null || raw === \"\" ? props.fallback : String(raw);\n const value = mode === \"design\" && b ? h(\"span\", { class: \"bp-token\", \"data-expr\": b.expr, title: b.expr }, b.label) : display;\n const label = h(\"div\", { class: \"bp-field__label\", style: { color: theme.colors.mutedText, \"font-size\": \"0.85em\", \"text-transform\": \"uppercase\", \"letter-spacing\": \"0.04em\", \"font-weight\": \"600\" } }, text(\"label\"));\n const val = h(\"div\", { class: \"bp-field__value\", style: { \"font-weight\": \"500\" } }, value);\n if (props.layout === \"inline\") return h(\"div\", { class: \"bp-field bp-field--inline\", style: cssText({ ...css, display: \"flex\", gap: \"8px\", \"align-items\": \"baseline\" }) }, h(\"div\", { style: { flex: `0 0 ${props.labelWidth}%` } }, label), h(\"div\", { style: { flex: \"1\", \"min-width\": \"0\" } }, val));\n return h(\"div\", { class: \"bp-field\", style: cssText({ ...css, display: \"flex\", \"flex-direction\": \"column\", gap: \"2px\" }) }, label, val);\n }\n});\n\nexport const kpiBlock = defineBlock<{ label: string; value: string; caption: string; trend: string; trendFormat: \"percent\" | \"number\" | \"text\"; accent: string; align: \"left\" | \"center\" | \"right\"; size: \"sm\" | \"md\" | \"lg\" }>({\n type: \"kpi\",\n name: \"Statistic\",\n description: \"Big number with label and trend\",\n category: \"data\",\n icon: \"trending-up\",\n keywords: [\"kpi\", \"metric\", \"number\", \"stat\", \"big number\"],\n defaultProps: { label: \"Portfolio value\", value: \"\", caption: \"\", trend: \"\", trendFormat: \"percent\", accent: \"$colors.primary\", align: \"left\", size: \"md\" },\n defaultTextStyle: \"body\",\n defaultFlow: { keepTogether: true },\n split: \"none\",\n styleGroups: [\"typography\", \"spacing\", \"background\", \"border\", \"flow\"],\n inspector: [\n {\n title: \"Statistic\",\n fields: [\n { kind: \"text\", prop: \"label\", label: \"Label\" },\n { kind: \"binding\", prop: \"value\", label: \"Value\", valueType: [\"number\", \"currency\", \"percent\", \"string\"] },\n { kind: \"binding\", prop: \"trend\", label: \"Trend\", valueType: [\"number\", \"percent\", \"string\"], placeholder: \"e.g. portfolio.change\" },\n {\n kind: \"segmented\",\n prop: \"trendFormat\",\n label: \"Trend format\",\n options: [\n { value: \"percent\", label: \"%\" },\n { value: \"number\", label: \"#\" },\n { value: \"text\", label: \"Aa\" }\n ]\n },\n { kind: \"text\", prop: \"caption\", label: \"Caption\" },\n { kind: \"color\", prop: \"accent\", label: \"Accent\" },\n alignField,\n {\n kind: \"segmented\",\n prop: \"size\",\n label: \"Size\",\n options: [\n { value: \"sm\", label: \"S\" },\n { value: \"md\", label: \"M\" },\n { value: \"lg\", label: \"L\" }\n ]\n }\n ]\n }\n ],\n canvas: { label: (p) => p.label || \"Statistic\" },\n render: ({ h, css, props, theme, text, mode, node, format }) => {\n const accent = resolveValue(props.accent, theme, theme.colors.primary);\n const size = props.size === \"sm\" ? 20 : props.size === \"lg\" ? 36 : 28;\n const b = node.bindings.value;\n const valueNode = h(\"span\", { class: mode === \"design\" && b ? \"bp-cell--bound\" : undefined, title: b?.expr }, props.value === undefined || props.value === null || props.value === \"\" ? \"—\" : String(props.value));\n let trendNode = null;\n const tRaw = props.trend;\n if (tRaw !== undefined && tRaw !== null && tRaw !== \"\") {\n const n = Number(tRaw);\n const positive = Number.isFinite(n) ? n >= 0 : true;\n const label = props.trendFormat === \"percent\" && Number.isFinite(n) ? `${n > 0 ? \"+\" : \"\"}${new Intl.NumberFormat(format.locale, { style: \"percent\", maximumFractionDigits: 1 }).format(n)}` : props.trendFormat === \"number\" && Number.isFinite(n) ? `${n > 0 ? \"+\" : \"\"}${new Intl.NumberFormat(format.locale, { maximumFractionDigits: 2 }).format(n)}` : String(tRaw);\n const tb = node.bindings.trend;\n const trendColor = positive ? theme.colors.success ?? \"#1E8E5A\" : theme.colors.danger ?? \"#C0392B\";\n trendNode = h(\n \"span\",\n { class: [\"bp-kpi__trend\", positive ? \"bp-kpi__trend--up\" : \"bp-kpi__trend--down\", mode === \"design\" && tb ? \"bp-cell--bound\" : \"\"], title: tb?.expr, style: { color: trendColor, \"font-weight\": \"600\", \"font-size\": `${Math.round(size * 0.9)}px`, display: \"inline-flex\", \"align-items\": \"center\", gap: \"4px\", height: `${Math.round(size * 1.05)}px` } },\n triangleMark(positive ? \"up\" : \"down\", Math.max(9, Math.round(size * 0.55)), trendColor),\n h(\"span\", null, label)\n );\n }\n return h(\n \"div\",\n { class: \"bp-kpi\", style: cssText({ ...css, \"text-align\": props.align, \"border-top\": css[\"border\"] ? undefined : `3px solid ${accent}`, \"padding-top\": css[\"padding\"] ? undefined : \"8px\" }) },\n h(\"div\", { class: \"bp-kpi__label\", style: { color: theme.colors.mutedText, \"font-size\": \"0.9em\", \"text-transform\": \"uppercase\", \"letter-spacing\": \"0.05em\", \"font-weight\": \"600\", display: \"flex\", gap: \"6px\", \"align-items\": \"center\", \"justify-content\": props.align === \"center\" ? \"center\" : props.align === \"right\" ? \"flex-end\" : \"flex-start\", \"flex-wrap\": \"wrap\" } }, text(\"label\"), mode === \"design\" && b ? h(\"span\", { class: \"bp-token\", \"data-expr\": b.expr, style: { \"text-transform\": \"none\", \"letter-spacing\": \"0\", \"font-weight\": \"500\" } }, b.label) : null),\n h(\"div\", { class: \"bp-kpi__value\", style: { \"font-size\": `${size}px`, \"font-weight\": \"700\", \"line-height\": \"1.15\", color: theme.colors.text, \"font-family\": theme.typography.headingFont, \"letter-spacing\": \"-0.02em\", \"margin-top\": \"4px\", display: \"flex\", \"align-items\": \"baseline\", gap: \"8px\", \"justify-content\": props.align === \"center\" ? \"center\" : props.align === \"right\" ? \"flex-end\" : \"flex-start\", \"flex-wrap\": \"wrap\" } }, valueNode, trendNode),\n props.caption ? h(\"div\", { class: \"bp-kpi__caption\", style: { color: theme.colors.mutedText, \"font-size\": \"0.9em\", \"margin-top\": \"3px\" } }, text(\"caption\")) : null\n );\n }\n});\n\n/* ------------------------------------------------------------------ */\n/* Signature, date, page number, timestamp */\n/* ------------------------------------------------------------------ */\n\nexport const signatureBlock = defineBlock<{ label: string; name: string; role: string; showDate: boolean; lineWidth: number }>({\n type: \"signature\",\n name: \"Signature\",\n description: \"Signature line with name and date\",\n category: \"content\",\n icon: \"pen-line\",\n keywords: [\"sign\", \"approval\"],\n defaultProps: { label: \"Signed\", name: \"\", role: \"\", showDate: true, lineWidth: 240 },\n defaultTextStyle: \"body\",\n defaultFlow: { keepTogether: true },\n split: \"none\",\n styleGroups: [\"typography\", \"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Signature\",\n fields: [\n { kind: \"text\", prop: \"label\", label: \"Label\" },\n { kind: \"text\", prop: \"name\", label: \"Name\", placeholder: \"{{ adviser.name }}\" },\n { kind: \"text\", prop: \"role\", label: \"Role\" },\n { kind: \"toggle\", prop: \"showDate\", label: \"Date line\" },\n { kind: \"number\", prop: \"lineWidth\", label: \"Line width\", min: 80, max: 600, unit: \"px\" }\n ]\n }\n ],\n render: ({ h, css, props, theme, text }) => {\n const line = (label: string, content: VChild[]) =>\n h(\"div\", { style: { width: `${props.lineWidth}px`, \"max-width\": \"100%\" } }, h(\"div\", { style: { height: \"36px\", \"border-bottom\": `1px solid ${theme.colors.text}` } }), h(\"div\", { style: { \"font-size\": \"0.85em\", color: theme.colors.mutedText, \"margin-top\": \"4px\" } }, label), content.length ? h(\"div\", { style: { \"font-weight\": \"600\", \"margin-top\": \"2px\" } }, content) : null);\n return h(\"div\", { class: \"bp-signature\", style: cssText({ ...css, display: \"flex\", gap: \"32px\", \"flex-wrap\": \"wrap\" }) }, line(props.label || \"Signed\", [...text(\"name\"), ...(props.role ? [h(\"div\", { style: { \"font-weight\": \"400\", color: theme.colors.mutedText } }, text(\"role\"))] : [])]), props.showDate ? line(\"Date\", []) : null);\n }\n});\n\nexport const dateBlock = defineBlock<{ source: \"now\" | \"binding\"; value: string; pattern: string; prefix: string }>({\n type: \"date\",\n name: \"Date\",\n description: \"Today's date or a bound date field\",\n category: \"content\",\n icon: \"calendar\",\n keywords: [\"today\", \"generated\", \"date\"],\n defaultProps: { source: \"now\", value: \"\", pattern: \"d MMMM yyyy\", prefix: \"\" },\n defaultTextStyle: \"body\",\n split: \"none\",\n styleGroups: [\"textStyle\", \"typography\", \"alignment\", \"spacing\", \"flow\"],\n inspector: [\n {\n title: \"Date\",\n fields: [\n {\n kind: \"segmented\",\n prop: \"source\",\n label: \"Source\",\n options: [\n { value: \"now\", label: \"Today\" },\n { value: \"binding\", label: \"Field\" }\n ]\n },\n { kind: \"binding\", prop: \"value\", label: \"Date field\", valueType: [\"date\", \"datetime\"], when: (p) => p.source === \"binding\" },\n { kind: \"text\", prop: \"pattern\", label: \"Format\", placeholder: \"d MMMM yyyy\", allowTokens: false },\n { kind: \"text\", prop: \"prefix\", label: \"Prefix\", placeholder: \"Prepared on \" }\n ]\n }\n ],\n render: ({ h, css, props, format, text, mode, node }) => {\n const d = props.source === \"now\" ? format.now ?? new Date() : props.value;\n const b = node.bindings.value;\n const body = mode === \"design\" && props.source === \"binding\" && b ? h(\"span\", { class: \"bp-token\", \"data-expr\": b.expr }, b.label) : formatDate(d, props.pattern || undefined, format);\n return h(\"div\", { class: \"bp-date\", style: cssText(css) }, text(\"prefix\"), body);\n }\n});\n\nexport const pageNumberBlock = defineBlock<{ format: string; align: \"left\" | \"center\" | \"right\" }>({\n type: \"pageNumber\",\n name: \"Page number\",\n category: \"content\",\n icon: \"hash\",\n keywords: [\"page\", \"of\", \"footer\", \"numbering\"],\n defaultProps: { format: \"Page {{page.number}} of {{page.total}}\", align: \"right\" },\n defaultTextStyle: \"caption\",\n split: \"none\",\n styleGroups: [\"textStyle\", \"typography\", \"spacing\"],\n inspector: [\n {\n title: \"Page number\",\n fields: [\n { kind: \"text\", prop: \"format\", label: \"Format\", placeholder: \"Page {{page.number}} of {{page.total}}\" },\n alignField\n ]\n }\n ],\n render: ({ h, css, props, text }) => h(\"div\", { class: \"bp-page-number\", style: cssText({ ...css, \"text-align\": props.align }) }, text(\"format\"))\n});\n\nexport const timestampBlock = defineBlock<{ prefix: string; pattern: string; align: \"left\" | \"center\" | \"right\" }>({\n type: \"timestamp\",\n name: \"Generated at\",\n description: \"Date and time the document was generated\",\n category: \"content\",\n icon: \"clock\",\n keywords: [\"generated\", \"printed\", \"timestamp\", \"time\"],\n defaultProps: { prefix: \"Generated \", pattern: \"d MMM yyyy, HH:mm\", align: \"left\" },\n defaultTextStyle: \"caption\",\n split: \"none\",\n styleGroups: [\"textStyle\", \"typography\", \"spacing\"],\n inspector: [\n {\n title: \"Generated at\",\n fields: [\n { kind: \"text\", prop: \"prefix\", label: \"Prefix\" },\n { kind: \"text\", prop: \"pattern\", label: \"Format\", allowTokens: false },\n alignField\n ]\n }\n ],\n render: ({ h, css, props, format, text }) => h(\"div\", { class: \"bp-timestamp\", style: cssText({ ...css, \"text-align\": props.align }) }, text(\"prefix\"), formatDate(format.now ?? new Date(), props.pattern || undefined, format, true))\n});\n","/**\n * Small decorative marks, drawn rather than typed.\n *\n * A trend arrow or a tick written as `▲` or `✓` depends on whatever font the\n * renderer ends up using carrying that glyph. The standard PDF faces do not\n * carry either, so a report that looked right in the browser exported with a\n * question mark in place of the arrow. Drawing them as paths removes the\n * dependency entirely, and they stay crisp at any size.\n *\n * Colours are explicit rather than `currentColor`: not every renderer resolves\n * it inside SVG, and these marks are always given a deliberate colour anyway.\n */\nimport { h, type VNode } from \"@broadpaper/core\";\n\nfunction svg(size: number, children: VNode[]): VNode {\n return h(\n \"svg\",\n { width: size, height: size, viewBox: \"0 0 12 12\", xmlns: \"http://www.w3.org/2000/svg\", \"aria-hidden\": \"true\", style: { display: \"block\", \"flex-shrink\": \"0\" } },\n children\n );\n}\n\n/** A solid triangle, for trend indicators. */\nexport function triangleMark(direction: \"up\" | \"down\", size: number, color: string): VNode {\n const d = direction === \"up\" ? \"M6 2 L11 9.5 L1 9.5 Z\" : \"M6 10 L1 2.5 L11 2.5 Z\";\n return svg(size, [h(\"path\", { d, fill: color })]);\n}\n\n/** A tick, for success states. */\nexport function checkMark(size: number, color: string): VNode {\n return svg(size, [h(\"path\", { d: \"M2 6.4 L4.8 9.2 L10 3.2\", fill: \"none\", stroke: color, \"stroke-width\": 1.8, \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" })]);\n}\n\n/** A filled dot, for neutral states. */\nexport function dotMark(size: number, color: string): VNode {\n return svg(size, [h(\"circle\", { cx: 6, cy: 6, r: 2.6, fill: color })]);\n}\n","import { defineBlock, cssText, resolveValue, type ConditionGroup } from \"@broadpaper/core\";\n\nexport const containerBlock = defineBlock<{ padding: number; gap: number | null }>({\n type: \"container\",\n name: \"Container\",\n description: \"Groups blocks with shared padding and background\",\n category: \"layout\",\n icon: \"square-dashed\",\n keywords: [\"group\", \"box\", \"wrapper\"],\n defaultProps: { padding: 0, gap: null },\n container: { accepts: [\"@blocks\", \"@rows\"] },\n split: \"children\",\n styleGroups: [\"spacing\", \"background\", \"border\", \"flow\"],\n inspector: [\n {\n title: \"Container\",\n fields: [\n { kind: \"number\", prop: \"padding\", label: \"Padding\", min: 0, max: 120, unit: \"px\" },\n { kind: \"number\", prop: \"gap\", label: \"Block gap\", min: 0, max: 120, unit: \"px\", description: \"Overrides the document block gap\" }\n ]\n }\n ],\n render: ({ h, css, children, styles, props, node, mode }) =>\n h(\n \"div\",\n { class: \"bp-container\", style: cssText({ ...css, padding: props.padding ? `${props.padding}px` : css[\"padding\"] }) },\n h(\"div\", { class: \"bp-stack\", style: { gap: `${props.gap ?? styles.spacing.blockGap}px` }, \"data-dropzone\": node.nodeId }, children.length === 0 && mode === \"design\" ? h(\"div\", { class: \"bp-empty-column\" }, \"Drop blocks here\") : children)\n )\n});\n\nexport const cardBlock = defineBlock<{ title: string; padding: number | null; accent: boolean; accentColor: string }>({\n type: \"card\",\n name: \"Card\",\n description: \"Panel with border, background and optional title\",\n category: \"layout\",\n icon: \"panel-top\",\n keywords: [\"panel\", \"box\", \"surface\"],\n defaultProps: { title: \"\", padding: null, accent: false, accentColor: \"$colors.primary\" },\n container: { accepts: [\"@blocks\", \"@rows\"] },\n defaultFlow: { keepTogether: true },\n split: \"children\",\n styleGroups: [\"spacing\", \"background\", \"border\", \"flow\"],\n inspector: [\n {\n title: \"Card\",\n fields: [\n { kind: \"text\", prop: \"title\", label: \"Title\" },\n { kind: \"number\", prop: \"padding\", label: \"Padding\", min: 0, max: 120, unit: \"px\" },\n { kind: \"toggle\", prop: \"accent\", label: \"Accent bar\" },\n { kind: \"color\", prop: \"accentColor\", label: \"Accent colour\", when: (p) => !!p.accent }\n ]\n }\n ],\n canvas: { label: (p) => p.title || \"Card\" },\n render: ({ h, css, children, styles, props, theme, text, node, mode }) => {\n const card = styles.card;\n const pad = props.padding ?? card.padding ?? 16;\n const style: Record<string, string | undefined> = {\n ...css,\n background: css[\"background\"] ?? resolveValue(card.background, theme, theme.colors.surface),\n border: css[\"border\"] ?? `${card.borderWidth ?? 1}px solid ${resolveValue(card.borderColor, theme, theme.colors.border)}`,\n \"border-radius\": css[\"border-radius\"] ?? `${card.borderRadius ?? theme.radius ?? 6}px`,\n padding: `${pad}px`,\n \"box-shadow\": card.shadow ? \"0 1px 2px rgba(16,24,40,0.06), 0 1px 3px rgba(16,24,40,0.1)\" : undefined,\n \"border-top\": props.accent ? `3px solid ${resolveValue(props.accentColor, theme, theme.colors.primary)}` : undefined\n };\n return h(\n \"div\",\n { class: \"bp-card\", style: cssText(style) },\n props.title ? h(\"div\", { class: \"bp-card__title\", style: { \"font-family\": theme.typography.headingFont, \"font-weight\": \"600\", \"font-size\": \"1.1em\", \"margin-bottom\": \"8px\", color: theme.colors.primary } }, text(\"title\")) : null,\n h(\"div\", { class: \"bp-stack\", style: { gap: `${styles.spacing.blockGap}px` }, \"data-dropzone\": node.nodeId }, children.length === 0 && mode === \"design\" ? h(\"div\", { class: \"bp-empty-column\" }, \"Drop blocks here\") : children)\n );\n }\n});\n\nexport const pageBreakBlock = defineBlock<Record<string, never>>({\n type: \"pageBreak\",\n name: \"Page break\",\n description: \"Start the following content on a new page\",\n category: \"layout\",\n icon: \"scissors\",\n keywords: [\"break\", \"new page\"],\n defaultProps: {},\n defaultFlow: { breakAfter: \"page\" },\n split: \"none\",\n styleGroups: [],\n render: ({ h, mode }) => (mode === \"design\" ? h(\"div\", { class: \"bp-page-break\" }, h(\"span\", { class: \"bp-page-break__label\" }, \"Page break\")) : h(\"div\", { class: \"bp-page-break bp-page-break--print\", style: { height: \"0\" } }))\n});\n\nexport const keepTogetherBlock = defineBlock<{ label: string }>({\n type: \"keepTogether\",\n name: \"Keep together\",\n description: \"Blocks inside never split across pages\",\n category: \"layout\",\n icon: \"link\",\n keywords: [\"group\", \"no split\", \"together\"],\n defaultProps: { label: \"\" },\n container: { accepts: [\"@blocks\", \"@rows\"] },\n defaultFlow: { keepTogether: true },\n split: \"children\",\n styleGroups: [\"spacing\", \"flow\"],\n render: ({ h, css, children, styles, node, mode }) => h(\"div\", { class: \"bp-keep-together\", style: cssText(css) }, h(\"div\", { class: \"bp-stack\", style: { gap: `${styles.spacing.blockGap}px` }, \"data-dropzone\": node.nodeId }, children.length === 0 && mode === \"design\" ? h(\"div\", { class: \"bp-empty-column\" }, \"Drop blocks here\") : children))\n});\n\n/* ------------------------------------------------------------------ */\n/* Conditional & repeater */\n/* ------------------------------------------------------------------ */\n\nexport const conditionalBlock = defineBlock<{ condition: string | ConditionGroup; label: string }>({\n type: \"conditional\",\n name: \"Conditional\",\n description: \"Show the blocks inside only when a rule is true\",\n category: \"data\",\n icon: \"git-branch\",\n keywords: [\"if\", \"condition\", \"rule\", \"visibility\", \"show when\"],\n defaultProps: () => ({ condition: { op: \"and\", rules: [] }, label: \"\" }),\n container: { accepts: [\"@blocks\", \"@rows\"], conditional: { conditionProp: \"condition\" } },\n split: \"children\",\n styleGroups: [\"spacing\", \"flow\"],\n bindings: [{ prop: \"condition\", kind: \"condition\" }],\n inspector: [{ title: \"Show when\", fields: [{ kind: \"condition\", prop: \"condition\", label: \"Rule\", fullWidth: true }] }],\n canvas: { label: (p) => p.label || \"Conditional\" },\n render: ({ h, css, children, styles, props, node, mode }) => {\n const result = (props as Record<string, unknown>).__conditionResult !== false;\n if (mode === \"preview\" && !result) return null;\n return h(\n \"div\",\n { class: [\"bp-conditional\", !result && \"bp-conditional--false\"], style: cssText(css) },\n mode === \"design\" ? h(\"div\", { class: \"bp-conditional__badge\", contenteditable: \"false\" }, result ? \"Shown when rule is true\" : \"Hidden with sample data\") : null,\n h(\"div\", { class: \"bp-stack\", style: { gap: `${styles.spacing.blockGap}px` }, \"data-dropzone\": node.nodeId }, children.length === 0 && mode === \"design\" ? h(\"div\", { class: \"bp-empty-column\" }, \"Drop conditional blocks here\") : children)\n );\n }\n});\n\nexport const repeaterBlock = defineBlock<{ source: string; alias: string; keepItemTogether: boolean; gap: number | null; limit: number | null; emptyMessage: string; separator: boolean }>({\n type: \"repeater\",\n name: \"Repeater\",\n description: \"Repeats the blocks inside for every item in a list\",\n category: \"data\",\n icon: \"repeat\",\n keywords: [\"loop\", \"for each\", \"list\", \"items\"],\n defaultProps: { source: \"\", alias: \"item\", keepItemTogether: true, gap: null, limit: null, emptyMessage: \"\", separator: false },\n container: { accepts: [\"@blocks\", \"@rows\"], repeat: { collectionProp: \"source\", aliasProp: \"alias\", keepItemTogetherProp: \"keepItemTogether\", limitProp: \"limit\" } },\n split: \"children\",\n styleGroups: [\"spacing\", \"flow\"],\n bindings: [{ prop: \"source\", kind: \"collection\", alias: \"alias\" }, { prop: \"emptyMessage\", kind: \"template\" }],\n inspector: [\n {\n title: \"Repeat\",\n fields: [\n { kind: \"collection\", prop: \"source\", label: \"For each item in\", placeholder: \"Pick a list\" },\n { kind: \"text\", prop: \"alias\", label: \"Item name\", description: (p) => `The name each item goes by inside the repeater, e.g. {{ ${typeof p.alias === \"string\" && p.alias.trim() ? p.alias.trim() : \"item\"}.name }}`, allowTokens: false },\n { kind: \"toggle\", prop: \"keepItemTogether\", label: \"Keep each item on one page\" },\n { kind: \"toggle\", prop: \"separator\", label: \"Divider between items\" },\n { kind: \"number\", prop: \"gap\", label: \"Gap between items\", min: 0, max: 120, unit: \"px\" },\n { kind: \"number\", prop: \"limit\", label: \"Maximum items\", min: 1, max: 10000 },\n { kind: \"text\", prop: \"emptyMessage\", label: \"Message when empty\", description: \"Printed instead of the items when the list is empty.\", fullWidth: true }\n ]\n }\n ],\n canvas: { label: (p) => (p.source ? `Repeat ${p.source}` : \"Repeater\") },\n render: ({ h, css, children, styles, props, node, mode, theme, text }) => {\n const count = Number((props as Record<string, unknown>).__itemCount ?? 0);\n const b = node.bindings.source;\n if (children.length === 0 && mode === \"preview\") {\n return props.emptyMessage ? h(\"div\", { class: \"bp-repeater__empty\", style: cssText({ ...css, color: theme.colors.mutedText }) }, text(\"emptyMessage\")) : null;\n }\n const gap = props.gap ?? styles.spacing.blockGap;\n const items = props.separator\n ? children.flatMap((c, i) => (i === 0 ? [c] : [h(\"div\", { class: \"bp-repeater__separator\", style: { \"border-top\": `1px solid ${theme.colors.border}` } }), c]))\n : children;\n return h(\n \"div\",\n { class: \"bp-repeater\", style: cssText(css) },\n // Design mode draws one iteration and the badge has to admit it, or a\n // three-item repeater and a thirty-item one look identical on the canvas.\n mode === \"design\"\n ? h(\"div\", { class: \"bp-repeater__badge\", contenteditable: \"false\" }, b ? `${b.label} · ${children.length >= count ? `repeats ${count} time${count === 1 ? \"\" : \"s\"}` : `showing ${children.length} of ${count} sample items`}` : \"Choose a list to repeat over\")\n : null,\n h(\"div\", { class: \"bp-stack bp-repeater__items\", style: { gap: `${gap}px` }, \"data-dropzone\": node.nodeId }, items.length === 0 && mode === \"design\" ? h(\"div\", { class: \"bp-empty-column\" }, \"Drop blocks to repeat here\") : items)\n );\n }\n});\n","import { defineBlock, cssText, resolveValue, toNumber, toDisplayString, compareValues, getField, isDarkColor, type Issue, type VNode } from \"@broadpaper/core\";\n\nexport interface TableColumn {\n id: string;\n header: string;\n /** Expression evaluated per row, e.g. `holding.value | currency`. */\n value: string;\n align?: \"left\" | \"center\" | \"right\";\n /** Width as a percentage of the table width; null = auto (equal share of the rest). */\n width?: number | null;\n bold?: boolean;\n /** Summary function for the totals row. */\n total?: \"none\" | \"sum\" | \"avg\" | \"count\" | \"min\" | \"max\";\n /** Expression for the totals cell (overrides `total`), evaluated in the table scope with `rows` available. */\n totalExpr?: string;\n /** Formatting pipe applied to the total, e.g. `currency:\"GBP\"`. */\n totalFormat?: string;\n wrap?: boolean;\n}\n\nexport interface ConditionalFormat {\n id: string;\n /** Column id, or \"*\" for the whole row. */\n columnId: string;\n /** Expression evaluated per row. */\n condition: string;\n color?: string;\n background?: string;\n bold?: boolean;\n}\n\nexport interface TableProps extends Record<string, unknown> {\n source: string;\n alias: string;\n columns: TableColumn[];\n showHeader: boolean;\n repeatHeader: boolean;\n zebra: boolean;\n borders: \"inherit\" | \"all\" | \"horizontal\" | \"outer\" | \"none\";\n compact: boolean;\n fontSize: number | null;\n headerBackground: string;\n headerColor: string;\n sortBy: string;\n sortDir: \"asc\" | \"desc\";\n emptyMessage: string;\n totalsLabel: string;\n conditionalFormats: ConditionalFormat[];\n designRows: number;\n rowLimit: number | null;\n}\n\ninterface Cell {\n text: string;\n style?: Record<string, string>;\n}\n\ninterface ResolvedRows {\n __rows: Array<{ cells: Cell[]; style?: Record<string, string> }>;\n __totals: Cell[] | null;\n __rowCount: number;\n /** Rows actually drawn, which in design mode is a sample of the whole. */\n __rowsShown: number;\n}\n\nfunction defaultColumns(): TableColumn[] {\n return [\n { id: \"c1\", header: \"Name\", value: \"row.name\", width: null },\n { id: \"c2\", header: \"Value\", value: \"row.value | number\", align: \"right\", width: 30, total: \"sum\" }\n ];\n}\n\n/**\n * The name the designer gave each row, which is what their column expressions\n * are written against. Hard-coding \"row\" in the help text was wrong for every\n * table that renamed it — and the demo's holdings table calls its rows `h`.\n */\nfunction aliasOf(props: Record<string, unknown>): string {\n const alias = props.alias;\n return typeof alias === \"string\" && alias.trim() ? alias.trim() : \"row\";\n}\n\n/** A column's heading, for places a person reads rather than the id it is keyed by. */\nfunction columnName(id: string, props: Record<string, unknown>): string {\n if (!id || id === \"*\") return \"Every column\";\n const column = ((props.columns as TableColumn[]) ?? []).find((c) => c.id === id);\n return column?.header || column?.value || id;\n}\n\nexport const tableBlock = defineBlock<TableProps>({\n type: \"table\",\n name: \"Table\",\n description: \"Data table bound to a list, with totals, zebra rows and page-spanning headers\",\n category: \"data\",\n icon: \"table\",\n keywords: [\"grid\", \"rows\", \"columns\", \"data\", \"list\"],\n defaultProps: () => ({\n source: \"\",\n alias: \"row\",\n columns: defaultColumns(),\n showHeader: true,\n repeatHeader: true,\n zebra: true,\n borders: \"inherit\",\n compact: false,\n fontSize: null,\n headerBackground: \"\",\n headerColor: \"\",\n sortBy: \"\",\n sortDir: \"asc\",\n emptyMessage: \"No data\",\n totalsLabel: \"Total\",\n conditionalFormats: [],\n designRows: 3,\n rowLimit: null\n }),\n defaultTextStyle: \"body\",\n defaultFlow: { minOrphans: 2, minWidows: 2 },\n split: \"rows\",\n measure: \"table\",\n styleGroups: [\"typography\", \"spacing\", \"flow\"],\n bindings: [\n { prop: \"source\", kind: \"collection\", alias: \"alias\" },\n { prop: \"columns\", kind: \"list\", items: [{ prop: \"value\", kind: \"value\", perItem: true }, { prop: \"header\", kind: \"template\" }, { prop: \"totalExpr\", kind: \"value\" }] },\n { prop: \"conditionalFormats\", kind: \"list\", items: [{ prop: \"condition\", kind: \"value\", perItem: true }] },\n { prop: \"emptyMessage\", kind: \"template\" },\n { prop: \"totalsLabel\", kind: \"template\" }\n ],\n inspector: [\n {\n title: \"Data\",\n fields: [\n { kind: \"collection\", prop: \"source\", label: \"Rows from\", placeholder: \"Pick a list\" },\n { kind: \"text\", prop: \"alias\", label: \"Row name\", description: (p) => `The name each row goes by in column values, e.g. ${aliasOf(p)}.name`, allowTokens: false },\n { kind: \"text\", prop: \"sortBy\", label: \"Sort by field\", placeholder: \"e.g. value\", allowTokens: false },\n {\n kind: \"segmented\",\n prop: \"sortDir\",\n label: \"Direction\",\n options: [\n { value: \"asc\", label: \"Ascending\" },\n { value: \"desc\", label: \"Descending\" }\n ],\n when: (p) => !!p.sortBy\n },\n { kind: \"number\", prop: \"rowLimit\", label: \"Maximum rows\", min: 1, max: 100000 },\n { kind: \"text\", prop: \"emptyMessage\", label: \"Message when empty\", description: \"Printed instead of the table when the list has no rows.\", fullWidth: true }\n ]\n },\n { title: \"Columns\", fields: [{ kind: \"columns\", prop: \"columns\", label: \"Columns\", fullWidth: true }] },\n {\n title: \"Appearance\",\n collapsed: true,\n fields: [\n { kind: \"toggle\", prop: \"showHeader\", label: \"Header row\" },\n { kind: \"toggle\", prop: \"repeatHeader\", label: \"Repeat header on each page\", when: (p) => p.showHeader !== false },\n { kind: \"toggle\", prop: \"zebra\", label: \"Zebra rows\" },\n { kind: \"toggle\", prop: \"compact\", label: \"Compact rows\" },\n {\n kind: \"select\",\n prop: \"borders\",\n label: \"Borders\",\n options: [\n { value: \"inherit\", label: \"Document default\" },\n { value: \"horizontal\", label: \"Horizontal lines\" },\n { value: \"all\", label: \"Full grid\" },\n { value: \"outer\", label: \"Outer only\" },\n { value: \"none\", label: \"None\" }\n ]\n },\n { kind: \"color\", prop: \"headerBackground\", label: \"Header background\", allowTransparent: true },\n { kind: \"color\", prop: \"headerColor\", label: \"Header text\" },\n { kind: \"number\", prop: \"fontSize\", label: \"Font size\", min: 6, max: 24, unit: \"px\" },\n { kind: \"text\", prop: \"totalsLabel\", label: \"Totals label\" }\n ]\n },\n {\n title: \"Conditional formatting\",\n collapsed: true,\n fields: [\n {\n kind: \"list\",\n prop: \"conditionalFormats\",\n label: \"Rules\",\n itemLabel: \"Rule\",\n fullWidth: true,\n // A rule reads as \"Drift · when abs(a.drift) > 0.03\" rather than \"c5\",\n // which is an internal id the designer never chose and cannot look up.\n itemSummary: (rule, i, props) => {\n const column = columnName(String(rule.columnId ?? \"\"), props);\n const when = String(rule.condition ?? \"\").trim();\n return when ? `${column} · when ${when}` : `${column} · Rule ${i + 1}`;\n },\n fields: [\n {\n kind: \"select\",\n prop: \"columnId\",\n label: \"Column\",\n optionsFrom: (props) => [{ value: \"*\", label: \"Every column\" }, ...((props.columns as TableColumn[]) ?? []).map((c) => ({ value: c.id, label: c.header || c.id }))]\n },\n { kind: \"expression\", prop: \"condition\", label: \"When\", placeholder: \"row.value < 0\", description: (p) => `Checked once per row, e.g. ${aliasOf(p)}.value < 0` },\n { kind: \"color\", prop: \"color\", label: \"Text colour\" },\n { kind: \"color\", prop: \"background\", label: \"Background\", allowTransparent: true },\n { kind: \"toggle\", prop: \"bold\", label: \"Bold\" }\n ]\n }\n ]\n }\n ],\n validate: ({ props, checkExpression }) => {\n const issues: Issue[] = [];\n if (!Array.isArray(props.columns) || props.columns.length === 0) issues.push({ severity: \"warning\", code: \"empty-content\", message: \"Table has no columns\", prop: \"columns\" });\n for (const c of (props.columns as TableColumn[]) ?? []) if (!c.value?.trim()) issues.push({ severity: \"warning\", code: \"missing-required\", message: `Column \"${c.header || c.id}\" has no value`, prop: `columns.${c.id}.value` });\n for (const c of (props.columns as TableColumn[]) ?? []) if (c.totalExpr?.trim()) issues.push(...checkExpression(c.totalExpr, `columns.${c.id}.totalExpr`));\n return issues;\n },\n canvas: { label: (p) => (p.source ? `Table · ${p.source}` : \"Table\") },\n resolve: ({ props, mode, evaluateIn, evaluate, warn, theme }) => {\n const alias = props.alias || \"row\";\n let items = Array.isArray(props.source) ? (props.source as unknown[]) : [];\n if (props.sortBy) {\n const dir = props.sortDir === \"desc\" ? -1 : 1;\n items = [...items].sort((a, b) => compareValues(getField(a, props.sortBy), getField(b, props.sortBy)) * dir);\n }\n const total = items.length;\n if (props.rowLimit) items = items.slice(0, props.rowLimit);\n // Totals always cover the full data set; design mode only shows a few rows.\n const allItems = items;\n if (mode === \"design\") items = items.slice(0, Math.max(1, props.designRows || 3));\n const columns = Array.isArray(props.columns) ? props.columns : [];\n const formats = Array.isArray(props.conditionalFormats) ? props.conditionalFormats : [];\n\n const rows = items.map((item, index) => {\n const vars = { [alias]: item, item, row: item, index: index + 1, first: index === 0, last: index === items.length - 1, count: items.length };\n const rowStyle: Record<string, string> = {};\n const cellStyles: Record<string, Record<string, string>> = {};\n for (const f of formats) {\n if (!f.condition?.trim()) continue;\n let ok = false;\n try {\n ok = !!evaluateIn(f.condition, vars);\n } catch {\n ok = false;\n }\n if (!ok) continue;\n const st: Record<string, string> = {};\n if (f.color) st[\"color\"] = resolveValue(f.color, theme, theme.colors.text);\n if (f.background) st[\"background\"] = resolveValue(f.background, theme, \"transparent\");\n if (f.bold) st[\"font-weight\"] = \"700\";\n if (f.columnId === \"*\" || !f.columnId) Object.assign(rowStyle, st);\n else cellStyles[f.columnId] = { ...(cellStyles[f.columnId] ?? {}), ...st };\n }\n const cells: Cell[] = columns.map((c) => {\n let text = \"\";\n if (c.value?.trim()) {\n try {\n text = toDisplayString(evaluateIn(c.value, vars));\n } catch (e) {\n warn(`Column \"${c.header}\" failed: ${(e as Error).message}`);\n }\n }\n return { text, style: cellStyles[c.id] };\n });\n return { cells, style: Object.keys(rowStyle).length ? rowStyle : undefined };\n });\n\n let totals: Cell[] | null = null;\n if (columns.some((c) => (c.total && c.total !== \"none\") || c.totalExpr?.trim())) {\n totals = columns.map((c, i) => {\n if (c.totalExpr?.trim()) {\n try {\n return { text: toDisplayString(evaluateIn(c.totalExpr, { rows: allItems, [alias + \"s\"]: allItems })) };\n } catch {\n return { text: \"\" };\n }\n }\n if (!c.total || c.total === \"none\") return { text: i === 0 && !columns[0]?.total ? String(props.totalsLabel ?? \"Total\") : \"\" };\n const values = allItems.map((it) => toNumber(evaluateIn(stripPipes(c.value), { [alias]: it, item: it, row: it }))).filter((n): n is number => n !== null);\n let n: number | null = null;\n if (c.total === \"sum\") n = values.reduce((a, b) => a + b, 0);\n else if (c.total === \"avg\") n = values.length ? values.reduce((a, b) => a + b, 0) / values.length : null;\n else if (c.total === \"count\") n = allItems.length;\n else if (c.total === \"min\") n = values.length ? Math.min(...values) : null;\n else if (c.total === \"max\") n = values.length ? Math.max(...values) : null;\n const fmt = c.totalFormat?.trim() || extractPipes(c.value);\n const text = n === null ? \"\" : fmt ? toDisplayString(evaluate(`(${n}) | ${fmt}`)) : toDisplayString(n);\n return { text };\n });\n if (totals[0] && totals[0].text === \"\" && !(columns[0]?.total && columns[0].total !== \"none\")) totals[0] = { text: String(props.totalsLabel ?? \"Total\") };\n }\n\n return { __rows: rows, __totals: totals, __rowCount: total, __rowsShown: rows.length } as unknown as TableProps & ResolvedRows;\n },\n render: ({ h, css, props, theme, styles, mode, text, node, style }) => {\n const p = props as TableProps & Partial<ResolvedRows>;\n const columns = Array.isArray(p.columns) ? p.columns : [];\n const ts = styles.table;\n const fontSize = p.fontSize ?? ts.fontSize ?? style.fontSize;\n const borders = p.borders === \"inherit\" ? ts.borders ?? \"horizontal\" : p.borders;\n const borderColor = resolveValue(ts.borderColor, theme, theme.colors.border);\n const bw = ts.borderWidth ?? 1;\n const padY = p.compact ? Math.max(2, (ts.cellPaddingY ?? 6) - 3) : ts.cellPaddingY ?? 6;\n const padX = ts.cellPaddingX ?? 8;\n const headerBg = p.headerBackground ? resolveValue(p.headerBackground, theme, \"\") : resolveValue(ts.headerBackground, theme, theme.table?.headerBackground ?? \"#F3F4F6\");\n const headerColor = p.headerColor ? resolveValue(p.headerColor, theme, \"\") : resolveValue(ts.headerColor, theme, headerBg && isDarkColor(headerBg) ? \"#FFFFFF\" : theme.colors.text);\n const zebraBg = resolveValue(ts.zebraBackground, theme, theme.table?.zebraBackground ?? \"#FAFAFB\");\n\n const cellBorder = (isHeader: boolean, last: boolean): Record<string, string> => {\n const line = `${bw}px solid ${borderColor}`;\n switch (borders) {\n case \"all\":\n return { border: line };\n case \"horizontal\":\n return { \"border-bottom\": last ? line : line, ...(isHeader ? { \"border-bottom\": `${bw * 2}px solid ${borderColor}` } : {}) };\n case \"outer\":\n return {};\n default:\n return {};\n }\n };\n\n const rows = p.__rows ?? [];\n const rowsVNodes: VNode[] = rows.map((r, i) =>\n h(\n \"tr\",\n { class: [\"bp-table__row\", p.zebra && i % 2 === 1 && \"bp-table__row--alt\"], style: { ...(p.zebra && i % 2 === 1 ? { background: zebraBg } : {}), ...(r.style ?? {}) } },\n r.cells.map((c, ci) => {\n const col = columns[ci];\n return h(\"td\", { class: [\"bp-table__cell\", mode === \"design\" && \"bp-cell--bound\"], style: { padding: `${padY}px ${padX}px`, \"text-align\": col?.align ?? \"left\", \"font-weight\": col?.bold ? \"600\" : undefined, \"vertical-align\": \"top\", \"white-space\": col?.wrap === false ? \"nowrap\" : \"normal\", overflow: \"hidden\", \"text-overflow\": \"ellipsis\", ...cellBorder(false, i === rows.length - 1), ...(c.style ?? {}) } }, c.text);\n })\n )\n );\n\n const specified = columns.reduce((a, c) => a + (c.width ?? 0), 0);\n const autoCount = columns.filter((c) => !c.width).length;\n const autoWidth = autoCount ? Math.max(5, (100 - specified) / autoCount) : 0;\n const colgroup = h(\"colgroup\", null, columns.map((c) => h(\"col\", { style: { width: `${c.width ?? autoWidth}%` } })));\n\n const thead = p.showHeader !== false\n ? h(\"thead\", { class: \"bp-table__head\" }, h(\"tr\", null, columns.map((c) => h(\"th\", { class: \"bp-table__th\", style: { padding: `${padY}px ${padX}px`, \"text-align\": c.align ?? \"left\", background: headerBg || undefined, color: headerColor, \"font-weight\": String(ts.headerFontWeight ?? 600), \"vertical-align\": \"bottom\", ...cellBorder(true, false) } }, ...text(`columns.${columns.indexOf(c)}.header`, c.header)))))\n : null;\n\n const tfoot = p.__totals\n ? h(\"tfoot\", { class: \"bp-table__foot\" }, h(\"tr\", null, p.__totals.map((c, ci) => h(\"td\", { class: \"bp-table__total\", style: { padding: `${padY}px ${padX}px`, \"text-align\": columns[ci]?.align ?? \"left\", \"font-weight\": \"700\", \"border-top\": `${bw * 2}px solid ${borderColor}`, ...(borders === \"all\" ? { border: `${bw}px solid ${borderColor}` } : {}) } }, c.text))))\n : null;\n\n const empty = rows.length === 0;\n const tableStyle: Record<string, string | undefined> = { width: \"100%\", \"border-collapse\": \"collapse\", \"table-layout\": \"fixed\", \"font-size\": `${fontSize}px`, ...(borders === \"outer\" ? { border: `${bw}px solid ${borderColor}` } : {}) };\n const b = node.bindings.source;\n return h(\n \"div\",\n { class: \"bp-table-wrap\", style: cssText(css) },\n // Design mode draws a handful of rows to keep the canvas quick, which is\n // indistinguishable from a table that only has a handful of rows unless\n // the badge says so.\n mode === \"design\" ? h(\"div\", { class: \"bp-table__badge\", contenteditable: \"false\" }, b ? `${b.label} · ${rowSampleNote(p.__rowsShown ?? 0, p.__rowCount ?? 0)}` : \"Choose a list\") : null,\n h(\"table\", { class: \"bp-table\", style: tableStyle }, colgroup, thead, h(\"tbody\", null, empty ? h(\"tr\", null, h(\"td\", { colspan: String(Math.max(1, columns.length)), style: { padding: `${padY * 2}px ${padX}px`, color: theme.colors.mutedText, \"text-align\": \"center\", \"font-style\": \"italic\" } }, ...text(\"emptyMessage\", \"No data\"))) : rowsVNodes), tfoot)\n );\n }\n});\n\n/** \"Showing 3 of 7 sample rows\", or just \"7 rows\" when nothing is being held back. */\nfunction rowSampleNote(shown: number, total: number): string {\n if (total === 0) return \"no rows\";\n if (shown >= total) return `${total} row${total === 1 ? \"\" : \"s\"}`;\n return `showing ${shown} of ${total} sample rows`;\n}\n\nfunction stripPipes(expr: string): string {\n // Remove trailing formatter pipes for numeric aggregation: `row.value | currency` → `row.value`\n const idx = expr.indexOf(\"|\");\n if (idx < 0) return expr;\n // Ignore `||` which the parser treats as \"or\".\n if (expr[idx + 1] === \"|\") return expr;\n return expr.slice(0, idx).trim();\n}\n\nfunction extractPipes(expr: string): string {\n const idx = expr.indexOf(\"|\");\n if (idx < 0 || expr[idx + 1] === \"|\") return \"\";\n return expr.slice(idx + 1).trim();\n}\n\nexport const keyValueListBlock = defineBlock<{ items: Array<{ id: string; label: string; value: string }>; layout: \"inline\" | \"stacked\" | \"grid\"; labelWidth: number; dividers: boolean; columns: number }>({\n type: \"keyValueList\",\n name: \"Key / value list\",\n description: \"A list of labelled values\",\n category: \"data\",\n icon: \"list\",\n keywords: [\"details\", \"properties\", \"definition list\", \"summary\"],\n defaultProps: () => ({\n items: [\n { id: \"k1\", label: \"Name\", value: \"\" },\n { id: \"k2\", label: \"Reference\", value: \"\" }\n ],\n layout: \"inline\",\n labelWidth: 35,\n dividers: true,\n columns: 1\n }),\n defaultTextStyle: \"body\",\n split: \"none\",\n styleGroups: [\"typography\", \"spacing\", \"background\", \"border\", \"flow\"],\n bindings: [{ prop: \"items\", kind: \"list\", items: [{ prop: \"label\", kind: \"template\" }, { prop: \"value\", kind: \"template\" }] }],\n inspector: [\n {\n title: \"Items\",\n fields: [\n { kind: \"keyValues\", prop: \"items\", label: \"Items\", fullWidth: true },\n {\n kind: \"segmented\",\n prop: \"layout\",\n label: \"Layout\",\n options: [\n { value: \"inline\", label: \"Inline\" },\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"grid\", label: \"Grid\" }\n ]\n },\n { kind: \"number\", prop: \"columns\", label: \"Columns\", min: 1, max: 4, when: (p) => p.layout === \"grid\" },\n { kind: \"number\", prop: \"labelWidth\", label: \"Label width\", min: 10, max: 80, unit: \"%\", when: (p) => p.layout === \"inline\" },\n { kind: \"toggle\", prop: \"dividers\", label: \"Dividers\" }\n ]\n }\n ],\n render: ({ h, css, props, theme, text }) => {\n const items = Array.isArray(props.items) ? props.items : [];\n const divider = props.dividers ? `1px solid ${theme.colors.border}` : undefined;\n if (props.layout === \"grid\") {\n return h(\n \"div\",\n { class: \"bp-kv bp-kv--grid\", style: cssText({ ...css, display: \"grid\", \"grid-template-columns\": `repeat(${props.columns || 2}, minmax(0, 1fr))`, gap: \"10px 16px\" }) },\n items.map((it, i) => h(\"div\", { class: \"bp-kv__item\" }, h(\"div\", { class: \"bp-kv__label\", style: { color: theme.colors.mutedText, \"font-size\": \"0.85em\", \"text-transform\": \"uppercase\", \"letter-spacing\": \"0.04em\", \"font-weight\": \"600\" } }, text(`items.${i}.label`, it.label)), h(\"div\", { class: \"bp-kv__value\", style: { \"font-weight\": \"500\" } }, text(`items.${i}.value`, it.value || \"—\"))))\n );\n }\n return h(\n \"div\",\n { class: [\"bp-kv\", `bp-kv--${props.layout}`], style: cssText(css) },\n items.map((it, i) =>\n props.layout === \"inline\"\n ? h(\"div\", { class: \"bp-kv__row\", style: { display: \"flex\", gap: \"8px\", padding: \"5px 0\", \"border-bottom\": i < items.length - 1 ? divider : undefined } }, h(\"div\", { class: \"bp-kv__label\", style: { flex: `0 0 ${props.labelWidth}%`, color: theme.colors.mutedText } }, text(`items.${i}.label`, it.label)), h(\"div\", { class: \"bp-kv__value\", style: { flex: \"1\", \"min-width\": \"0\", \"font-weight\": \"500\" } }, text(`items.${i}.value`, it.value || \"—\")))\n : h(\"div\", { class: \"bp-kv__row\", style: { padding: \"5px 0\", \"border-bottom\": i < items.length - 1 ? divider : undefined } }, h(\"div\", { class: \"bp-kv__label\", style: { color: theme.colors.mutedText, \"font-size\": \"0.85em\" } }, text(`items.${i}.label`, it.label)), h(\"div\", { class: \"bp-kv__value\", style: { \"font-weight\": \"500\" } }, text(`items.${i}.value`, it.value || \"—\")))\n )\n );\n }\n});\n","import { defineBlock, cssText, resolveValue, toNumber, toDisplayString, evaluate, Scope, type Issue } from \"@broadpaper/core\";\nimport { renderChart, type ChartData, type ChartHit, type ChartType } from \"../charts/chart-svg.js\";\n\nexport interface ChartSeries {\n id: string;\n label: string;\n /** Expression evaluated per item. */\n value: string;\n color?: string;\n}\n\nexport interface ChartProps extends Record<string, unknown> {\n chartType: ChartType;\n source: string;\n alias: string;\n label: string;\n series: ChartSeries[];\n height: number;\n title: string;\n showLegend: boolean;\n showValues: boolean;\n showGrid: boolean;\n stacked: boolean;\n smooth: boolean;\n valueFormat: string;\n percentDecimals: number;\n innerLabel: string;\n limit: number | null;\n}\n\nexport const chartBlock = defineBlock<ChartProps>({\n type: \"chart\",\n name: \"Chart\",\n description: \"Bar, line, area, pie or donut chart bound to a list\",\n category: \"visualisation\",\n icon: \"bar-chart-3\",\n keywords: [\"graph\", \"bar\", \"line\", \"pie\", \"donut\", \"area\", \"visualisation\"],\n defaultProps: () => ({\n chartType: \"bar\",\n source: \"\",\n alias: \"item\",\n label: \"item.label\",\n series: [{ id: \"s1\", label: \"Value\", value: \"item.value\" }],\n height: 220,\n title: \"\",\n showLegend: true,\n showValues: false,\n showGrid: true,\n stacked: false,\n smooth: true,\n valueFormat: \"\",\n percentDecimals: 0,\n innerLabel: \"\",\n limit: null\n }),\n defaultTextStyle: \"body\",\n defaultFlow: { keepTogether: true },\n split: \"none\",\n styleGroups: [\"spacing\", \"background\", \"border\", \"flow\"],\n bindings: [\n { prop: \"source\", kind: \"collection\", alias: \"alias\" },\n { prop: \"label\", kind: \"value\", perItem: true },\n { prop: \"series\", kind: \"list\", items: [{ prop: \"value\", kind: \"value\", perItem: true }, { prop: \"label\", kind: \"template\" }] },\n { prop: \"title\", kind: \"template\" },\n { prop: \"innerLabel\", kind: \"template\" }\n ],\n inspector: [\n {\n title: \"Chart\",\n fields: [\n {\n kind: \"segmented\",\n prop: \"chartType\",\n label: \"Type\",\n options: [\n { value: \"bar\", label: \"Bar\", icon: \"bar-chart-3\" },\n { value: \"horizontalBar\", label: \"Horizontal\", icon: \"bar-chart-horizontal\" },\n { value: \"line\", label: \"Line\", icon: \"line-chart\" },\n { value: \"area\", label: \"Area\", icon: \"area-chart\" },\n { value: \"pie\", label: \"Pie\", icon: \"pie-chart\" },\n { value: \"donut\", label: \"Donut\", icon: \"circle-dot\" }\n ]\n },\n { kind: \"text\", prop: \"title\", label: \"Title\" },\n { kind: \"number\", prop: \"height\", label: \"Height\", min: 80, max: 800, unit: \"px\" }\n ]\n },\n {\n title: \"Data\",\n fields: [\n { kind: \"collection\", prop: \"source\", label: \"Data from\", placeholder: \"Pick a list\" },\n { kind: \"text\", prop: \"alias\", label: \"Item name\", description: (p) => `The name each data point goes by, e.g. ${typeof p.alias === \"string\" && p.alias.trim() ? p.alias.trim() : \"item\"}.value`, allowTokens: false },\n { kind: \"expression\", prop: \"label\", label: \"Category label\", placeholder: \"item.name\" },\n { kind: \"series\", prop: \"series\", label: \"Series\", fullWidth: true },\n { kind: \"number\", prop: \"limit\", label: \"Maximum items\", min: 1, max: 1000 },\n { kind: \"text\", prop: \"valueFormat\", label: \"Value format\", placeholder: 'e.g. currency:\"GBP\":0 or percent', allowTokens: false }\n ]\n },\n {\n title: \"Options\",\n fields: [\n { kind: \"toggle\", prop: \"showLegend\", label: \"Legend\" },\n { kind: \"toggle\", prop: \"showValues\", label: \"Value labels\" },\n { kind: \"toggle\", prop: \"showGrid\", label: \"Grid lines\", when: (p) => p.chartType !== \"pie\" && p.chartType !== \"donut\" },\n { kind: \"toggle\", prop: \"stacked\", label: \"Stacked\", when: (p) => [\"bar\", \"horizontalBar\", \"line\", \"area\"].includes(String(p.chartType)) },\n { kind: \"toggle\", prop: \"smooth\", label: \"Smooth lines\", when: (p) => p.chartType === \"line\" || p.chartType === \"area\" },\n { kind: \"number\", prop: \"percentDecimals\", label: \"Percent decimals\", min: 0, max: 3, when: (p) => p.chartType === \"pie\" || p.chartType === \"donut\" },\n { kind: \"text\", prop: \"innerLabel\", label: \"Centre label\", when: (p) => p.chartType === \"donut\" }\n ]\n }\n ],\n validate: ({ props }) => {\n const issues: Issue[] = [];\n if (!Array.isArray(props.series) || props.series.length === 0) issues.push({ severity: \"warning\", code: \"empty-content\", message: \"Chart has no series\", prop: \"series\" });\n return issues;\n },\n canvas: { label: (p) => (p.title ? `Chart · ${p.title}` : \"Chart\") },\n resolve: ({ props, evaluateIn, theme, warn }) => {\n const alias = props.alias || \"item\";\n let items = Array.isArray(props.source) ? (props.source as unknown[]) : [];\n if (props.limit) items = items.slice(0, props.limit);\n const palette = theme.colors.chart ?? [theme.colors.primary, theme.colors.secondary, theme.colors.accent];\n const categories = items.map((it, index) => {\n try {\n return toDisplayString(evaluateIn(props.label || `${alias}.label`, { [alias]: it, item: it, index: index + 1 }));\n } catch {\n return String(index + 1);\n }\n });\n const series = (Array.isArray(props.series) ? props.series : []).map((s, si) => ({\n label: s.label || `Series ${si + 1}`,\n color: s.color ? resolveValue(s.color, theme, palette[si % palette.length]!) : palette[si % palette.length]!,\n values: items.map((it, index) => {\n try {\n return toNumber(evaluateIn(s.value, { [alias]: it, item: it, index: index + 1 }));\n } catch (e) {\n warn(`Series \"${s.label}\" failed: ${(e as Error).message}`);\n return null;\n }\n })\n }));\n if (props.chartType === \"pie\" || props.chartType === \"donut\") {\n // Pie: one colour per category.\n const s0 = series[0];\n if (s0) {\n const colored = items.map((_, i) => ({ ...s0, color: palette[i % palette.length]! }));\n return { __data: { categories, series: colored.length ? [{ ...s0 }, ...colored.slice(1)] : [] }, __palette: palette } as unknown as ChartProps;\n }\n }\n return { __data: { categories, series } as ChartData, __palette: palette } as unknown as ChartProps;\n },\n render: ({ h, css, props, theme, width, mode, node, format, text, style }) => {\n const p = props as ChartProps & { __data?: ChartData; __palette?: string[] };\n const data: ChartData = p.__data ?? { categories: [], series: [] };\n const isPie = p.chartType === \"pie\" || p.chartType === \"donut\";\n if (isPie && data.series.length) {\n const palette = p.__palette ?? theme.colors.chart ?? [];\n data.series = data.categories.map((_, i) => ({ ...data.series[0]!, color: palette[i % Math.max(1, palette.length)] ?? data.series[0]!.color }));\n }\n const formatValue = (n: number) => {\n const f = (p.valueFormat || \"\").trim();\n if (!f) return new Intl.NumberFormat(format.locale, { notation: Math.abs(n) >= 10000 ? \"compact\" : \"standard\", maximumFractionDigits: 2 }).format(n);\n try {\n return toDisplayString(evaluate(`(${n}) | ${f}`, { scope: new Scope({}), format }));\n } catch {\n return String(n);\n }\n };\n const formatPercent = (fr: number) => new Intl.NumberFormat(format.locale, { style: \"percent\", maximumFractionDigits: p.percentDecimals ?? 0, minimumFractionDigits: p.percentDecimals ?? 0 }).format(fr);\n const pad = style.padding;\n const innerWidth = Math.max(40, width - pad.left - pad.right - (style.border ? style.border.width * 2 : 0));\n const b = node.bindings.source;\n // What each mark stands for, in draw order. A screen renderer turns this\n // into hover, focus and a tooltip (see `enableChartInteractions`); a PDF\n // renderer drops it and draws precisely what it drew before. Recording it\n // is the block's job because the block is the only thing that knows which\n // mark is which datum.\n const hits: ChartHit[] = [];\n const svg = data.categories.length\n ? renderChart(data, { type: p.chartType, width: innerWidth, height: p.height, theme, fontFamily: style.fontFamily, showLegend: p.showLegend, showValues: p.showValues, showGrid: p.showGrid, stacked: p.stacked, smooth: p.smooth, formatValue, formatPercent, innerLabel: typeof p.innerLabel === \"string\" && p.innerLabel ? p.innerLabel : undefined, hits })\n : h(\"div\", { class: \"bp-chart__empty\", style: { height: `${p.height}px`, display: \"flex\", \"align-items\": \"center\", \"justify-content\": \"center\", color: theme.colors.mutedText, border: `1px dashed ${theme.colors.border}`, \"border-radius\": `${theme.radius ?? 6}px` } }, mode === \"design\" ? (b ? \"No data in the list\" : \"Choose a list to chart\") : \"\");\n return h(\n \"div\",\n {\n class: [\"bp-chart\", `bp-chart--${p.chartType}`],\n style: cssText(css),\n ...(hits.length ? { \"data-bp-chart\": JSON.stringify({ type: p.chartType, title: typeof p.title === \"string\" ? p.title : \"\", hits }) } : {})\n },\n p.title ? h(\"div\", { class: \"bp-chart__title\", style: { \"font-family\": theme.typography.headingFont, \"font-weight\": \"600\", \"margin-bottom\": \"6px\", color: theme.colors.text } }, text(\"title\")) : null,\n mode === \"design\" && b ? h(\"div\", { class: \"bp-chart__badge\", contenteditable: \"false\" }, b.label) : null,\n svg\n );\n }\n});\n\nexport const progressBlock = defineBlock<{ value: string; max: number; label: string; caption: string; variant: \"bar\" | \"gauge\"; color: string; trackColor: string; showValue: boolean; format: \"percent\" | \"value\" | \"fraction\"; thresholds: Array<{ id: string; upTo: number; color: string }>; height: number }>({\n type: \"progress\",\n name: \"Progress / gauge\",\n description: \"A value against a maximum, as a bar or gauge\",\n category: \"visualisation\",\n icon: \"gauge\",\n keywords: [\"score\", \"meter\", \"gauge\", \"progress\", \"percentage\"],\n defaultProps: () => ({ value: \"\", max: 100, label: \"Score\", caption: \"\", variant: \"bar\", color: \"$colors.primary\", trackColor: \"$colors.border\", showValue: true, format: \"percent\", thresholds: [], height: 10 }),\n defaultTextStyle: \"body\",\n defaultFlow: { keepTogether: true },\n split: \"none\",\n styleGroups: [\"typography\", \"spacing\", \"background\", \"border\", \"flow\"],\n inspector: [\n {\n title: \"Value\",\n fields: [\n { kind: \"binding\", prop: \"value\", label: \"Value\", valueType: [\"number\", \"percent\", \"currency\"] },\n { kind: \"number\", prop: \"max\", label: \"Maximum\", min: 0.0001, max: 1e12 },\n { kind: \"text\", prop: \"label\", label: \"Label\" },\n { kind: \"text\", prop: \"caption\", label: \"Caption\" }\n ]\n },\n {\n title: \"Appearance\",\n fields: [\n {\n kind: \"segmented\",\n prop: \"variant\",\n label: \"Style\",\n options: [\n { value: \"bar\", label: \"Bar\" },\n { value: \"gauge\", label: \"Gauge\" }\n ]\n },\n {\n kind: \"segmented\",\n prop: \"format\",\n label: \"Show as\",\n options: [\n { value: \"percent\", label: \"%\" },\n { value: \"value\", label: \"Value\" },\n { value: \"fraction\", label: \"x / max\" }\n ]\n },\n { kind: \"toggle\", prop: \"showValue\", label: \"Show value\" },\n { kind: \"color\", prop: \"color\", label: \"Colour\" },\n { kind: \"color\", prop: \"trackColor\", label: \"Track\" },\n { kind: \"number\", prop: \"height\", label: \"Bar height\", min: 2, max: 40, unit: \"px\", when: (p) => p.variant === \"bar\" },\n { kind: \"list\", prop: \"thresholds\", label: \"Colour by range\", itemLabel: \"Range\", fullWidth: true, fields: [\n { kind: \"number\", prop: \"upTo\", label: \"Up to\" },\n { kind: \"color\", prop: \"color\", label: \"Colour\" }\n ] }\n ]\n }\n ],\n render: ({ h, css, props, theme, text, mode, node, format }) => {\n const raw = toNumber(props.value);\n const max = Number(props.max) || 100;\n const value = raw ?? 0;\n const frac = Math.max(0, Math.min(1, max > 0 ? value / max : 0));\n let color = resolveValue(props.color, theme, theme.colors.primary);\n const sorted = [...(props.thresholds ?? [])].sort((a, b) => a.upTo - b.upTo);\n for (const t of sorted) {\n if (value <= t.upTo) {\n color = resolveValue(t.color, theme, color);\n break;\n }\n }\n const track = resolveValue(props.trackColor, theme, theme.colors.border);\n const b = node.bindings.value;\n const display = props.format === \"percent\" ? new Intl.NumberFormat(format.locale, { style: \"percent\", maximumFractionDigits: 0 }).format(frac) : props.format === \"fraction\" ? `${new Intl.NumberFormat(format.locale).format(value)} / ${new Intl.NumberFormat(format.locale).format(max)}` : new Intl.NumberFormat(format.locale, { maximumFractionDigits: 2 }).format(value);\n const header = h(\"div\", { style: { display: \"flex\", \"justify-content\": \"space-between\", \"align-items\": \"baseline\", gap: \"8px\", \"margin-bottom\": \"4px\" } }, h(\"span\", { style: { \"font-weight\": \"600\" } }, text(\"label\")), props.showValue ? h(\"span\", { class: [\"bp-progress__value\", mode === \"design\" && b ? \"bp-cell--bound\" : \"\"], title: b?.expr, style: { color: theme.colors.mutedText, \"font-variant-numeric\": \"tabular-nums\" } }, display) : null);\n if (props.variant === \"gauge\") {\n const w = 160;\n const r = 62;\n const cx = w / 2;\n const cy = 70;\n const arcPath = (f: number) => {\n const a0 = Math.PI;\n const sweep = Math.PI * f;\n const a1 = a0 + sweep;\n const x0 = cx + r * Math.cos(a0);\n const y0 = cy + r * Math.sin(a0);\n const x1 = cx + r * Math.cos(a1);\n const y1 = cy + r * Math.sin(a1);\n // The flag describes the *sweep*, not the fraction. This gauge is a\n // half-circle, so its sweep is never more than 180° and the flag is\n // always 0. Setting it from `f > 0.5` asked for an arc longer than a\n // semicircle between two points a semicircle apart, and SVG answers\n // that by moving the centre — so at 9 out of 10 the fill was drawn\n // around a different centre from the track it was supposed to fill.\n const large = sweep > Math.PI ? 1 : 0;\n return `M ${x0} ${y0} A ${r} ${r} 0 ${large} 1 ${x1} ${y1}`;\n };\n return h(\n \"div\",\n { class: \"bp-progress bp-progress--gauge\", style: cssText({ ...css, display: \"flex\", \"flex-direction\": \"column\", \"align-items\": \"center\" }) },\n h(\"svg\", { width: w, height: 80, viewBox: `0 0 ${w} 80`, style: { display: \"block\" } }, h(\"path\", { d: arcPath(1), fill: \"none\", stroke: track, \"stroke-width\": 12, \"stroke-linecap\": \"round\" }), frac > 0 ? h(\"path\", { d: arcPath(frac), fill: \"none\", stroke: color, \"stroke-width\": 12, \"stroke-linecap\": \"round\" }) : null, h(\"text\", { x: cx, y: cy - 4, \"text-anchor\": \"middle\", \"font-size\": 20, \"font-weight\": \"700\", \"font-family\": theme.typography.headingFont, fill: theme.colors.text }, display)),\n h(\"div\", { style: { \"font-weight\": \"600\", \"margin-top\": \"2px\" } }, text(\"label\")),\n props.caption ? h(\"div\", { style: { color: theme.colors.mutedText, \"font-size\": \"0.9em\" } }, text(\"caption\")) : null\n );\n }\n return h(\n \"div\",\n { class: \"bp-progress bp-progress--bar\", style: cssText(css) },\n header,\n // The fill's height is stated in pixels rather than as `100%`: a\n // percentage height needs a parent the layout engine considers to have a\n // definite one, and the PDF engine does not, so the fill came out a\n // hairline in the file while looking right in the browser. The track's\n // own height is the number to use, and it is right here.\n h(\"div\", { class: \"bp-progress__track\", style: { height: `${props.height}px`, background: track, \"border-radius\": `${props.height}px`, overflow: \"hidden\" } }, h(\"div\", { class: \"bp-progress__fill\", style: { width: `${frac * 100}%`, height: `${props.height}px`, background: color, \"border-radius\": `${props.height}px` } })),\n props.caption ? h(\"div\", { style: { color: theme.colors.mutedText, \"font-size\": \"0.9em\", \"margin-top\": \"4px\" } }, text(\"caption\")) : null\n );\n }\n});\n","import { scaleBand, scaleLinear, scalePoint } from \"d3-scale\";\nimport { arc as d3arc, area as d3area, line as d3line, curveMonotoneX, curveLinear, pie as d3pie } from \"d3-shape\";\nimport type { VNode, Theme } from \"@broadpaper/core\";\nimport { h } from \"@broadpaper/core\";\n\nexport type ChartType = \"bar\" | \"horizontalBar\" | \"line\" | \"area\" | \"pie\" | \"donut\";\n\nexport interface ChartSeriesData {\n label: string;\n values: Array<number | null>;\n color: string;\n}\n\nexport interface ChartData {\n categories: string[];\n series: ChartSeriesData[];\n}\n\n/**\n * One thing a reader can point at: a bar, a slice, a marker on a line.\n *\n * The chart records these as it draws, because it is the only code that knows\n * which mark is which datum. Nothing is drawn for them and no geometry is\n * duplicated — the mark itself carries `data-bp-hit=\"<index>\"`, so a screen\n * renderer can find the element and use its real shape, and a PDF renderer can\n * drop the attribute and produce exactly the vectors it produced before.\n */\nexport interface ChartHit {\n /** Index into the chart's category list. */\n categoryIndex: number;\n category: string;\n seriesIndex: number;\n series: string;\n value: number | null;\n /** The value as the report itself formats it. */\n formatted: string;\n color: string;\n /** For pie and donut: this slice's share of the whole. */\n share?: number;\n}\n\nexport interface ChartRenderOptions {\n type: ChartType;\n width: number;\n height: number;\n theme: Theme;\n fontFamily: string;\n showLegend: boolean;\n showValues: boolean;\n showGrid: boolean;\n stacked: boolean;\n smooth: boolean;\n /** Formats axis ticks and value labels. */\n formatValue: (n: number) => string;\n /** Formats pie/donut percentages. */\n formatPercent: (fraction: number) => string;\n innerLabel?: string;\n /**\n * Filled in as the chart draws, in the same order as the `data-bp-hit`\n * indices on the marks. Left out entirely when nobody is going to read it.\n */\n hits?: ChartHit[];\n}\n\nconst FONT_SIZE = 9;\nconst AXIS_COLOR = \"#9AA1AB\";\n\n/**\n * Records a hit and returns the attributes that tie the mark to it.\n *\n * Returns nothing at all when no one asked for hits, so a chart rendered for\n * print is byte-for-byte the chart it was before this existed.\n */\nfunction hit(opts: ChartRenderOptions, entry: ChartHit): Record<string, string> {\n if (!opts.hits) return {};\n opts.hits.push(entry);\n return { \"data-bp-hit\": String(opts.hits.length - 1) };\n}\n\nfunction fmt(n: number): string {\n return Math.round(n * 100) / 100 + \"\";\n}\n\nfunction legend(data: ChartData, opts: ChartRenderOptions, y: number, width: number): { node: VNode | null; height: number } {\n if (!opts.showLegend || data.series.length === 0) return { node: null, height: 0 };\n const items = opts.type === \"pie\" || opts.type === \"donut\" ? data.categories.map((c, i) => ({ label: c, color: colorAt(data, i) })) : data.series.map((s) => ({ label: s.label, color: s.color }));\n const perRow = Math.max(1, Math.floor(width / 120));\n const rows = Math.ceil(items.length / perRow);\n const node = h(\n \"g\",\n { class: \"bp-chart__legend\", transform: `translate(0, ${y})` },\n items.map((it, i) => {\n const col = i % perRow;\n const row = Math.floor(i / perRow);\n const x = (width / perRow) * col;\n return h(\"g\", { transform: `translate(${fmt(x)}, ${row * 16})` }, h(\"rect\", { x: 0, y: 2, width: 10, height: 10, rx: 2, fill: it.color }), h(\"text\", { x: 15, y: 11, \"font-size\": FONT_SIZE + 1, \"font-family\": opts.fontFamily, fill: opts.theme.colors.text }, truncate(it.label, Math.floor(width / perRow / 6))));\n })\n );\n return { node, height: rows * 16 + 4 };\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? s.slice(0, Math.max(1, n - 1)) + \"…\" : s;\n}\n\nexport function colorAt(data: ChartData, i: number): string {\n const s = data.series[0];\n const palette = data.series.map((x) => x.color);\n return palette[i % Math.max(1, palette.length)] ?? s?.color ?? \"#888\";\n}\n\n/** Renders a chart to an SVG VNode. Pure and deterministic. */\nexport function renderChart(data: ChartData, opts: ChartRenderOptions): VNode {\n const { width, height } = opts;\n if (opts.type === \"pie\" || opts.type === \"donut\") return renderPie(data, opts);\n\n const horizontal = opts.type === \"horizontalBar\";\n const lg = legend(data, opts, 0, width);\n const marginTop = lg.height + 6;\n const marginRight = 8;\n const marginBottom = 24;\n const allValues = data.series.flatMap((s) => s.values.map((v) => v ?? 0));\n const stackedTotals = data.categories.map((_, i) => data.series.reduce((a, s) => a + Math.max(0, s.values[i] ?? 0), 0));\n const stackedNeg = data.categories.map((_, i) => data.series.reduce((a, s) => a + Math.min(0, s.values[i] ?? 0), 0));\n const maxV = Math.max(0, ...(opts.stacked ? stackedTotals : allValues));\n const minV = Math.min(0, ...(opts.stacked ? stackedNeg : allValues));\n const vScale = scaleLinear().domain([minV, maxV === minV ? maxV + 1 : maxV]).nice(5);\n const ticks = vScale.ticks(5);\n const tickLabels = ticks.map(opts.formatValue);\n const labelWidth = Math.max(...tickLabels.map((t) => t.length * FONT_SIZE * 0.6), 18);\n const marginLeft = horizontal ? Math.min(width * 0.35, Math.max(...data.categories.map((c) => c.length)) * FONT_SIZE * 0.6 + 8) : labelWidth + 8;\n const plotW = Math.max(10, width - marginLeft - marginRight);\n const plotH = Math.max(10, height - marginTop - marginBottom);\n\n const children: VNode[] = [];\n if (lg.node) children.push(lg.node);\n\n const g = (x: number, y: number, ...kids: Array<VNode | null>) => h(\"g\", { transform: `translate(${fmt(x)}, ${fmt(y)})` }, kids);\n\n if (horizontal) {\n vScale.range([0, plotW]);\n const band = scaleBand<string>().domain(data.categories.map((_, i) => String(i))).range([0, plotH]).paddingInner(0.25).paddingOuter(0.1);\n const inner = scaleBand<string>().domain(data.series.map((_, i) => String(i))).range([0, band.bandwidth()]).padding(0.1);\n const grid = opts.showGrid ? ticks.map((t) => h(\"line\", { x1: vScale(t), x2: vScale(t), y1: 0, y2: plotH, stroke: opts.theme.colors.border, \"stroke-width\": 1 })) : [];\n const axis = ticks.map((t) => h(\"text\", { x: vScale(t), y: plotH + 14, \"text-anchor\": \"middle\", \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: AXIS_COLOR }, opts.formatValue(t)));\n const cats = data.categories.map((c, i) => h(\"text\", { x: -6, y: (band(String(i)) ?? 0) + band.bandwidth() / 2 + 3, \"text-anchor\": \"end\", \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: opts.theme.colors.text }, truncate(c, Math.floor(marginLeft / (FONT_SIZE * 0.6)))));\n const bars: VNode[] = [];\n data.categories.forEach((_, ci) => {\n let posAcc = 0;\n let negAcc = 0;\n data.series.forEach((s, si) => {\n const v = s.values[ci] ?? 0;\n let x0: number, x1: number;\n if (opts.stacked) {\n if (v >= 0) {\n x0 = vScale(posAcc);\n x1 = vScale(posAcc + v);\n posAcc += v;\n } else {\n x0 = vScale(negAcc + v);\n x1 = vScale(negAcc);\n negAcc += v;\n }\n } else {\n x0 = vScale(Math.min(0, v));\n x1 = vScale(Math.max(0, v));\n }\n const y = (band(String(ci)) ?? 0) + (opts.stacked ? 0 : inner(String(si)) ?? 0);\n const bh = opts.stacked ? band.bandwidth() : inner.bandwidth();\n bars.push(h(\"rect\", { x: fmt(x0), y: fmt(y), width: fmt(Math.max(0, x1 - x0)), height: fmt(bh), fill: s.color, rx: 1.5, ...hit(opts, { categoryIndex: ci, category: data.categories[ci] ?? \"\", seriesIndex: si, series: s.label, value: s.values[ci] ?? null, formatted: opts.formatValue(v), color: s.color }) }));\n if (opts.showValues && !opts.stacked) bars.push(h(\"text\", { x: fmt(x1 + 4), y: fmt(y + bh / 2 + 3), \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: opts.theme.colors.text }, opts.formatValue(v)));\n });\n });\n children.push(g(marginLeft, marginTop, ...grid, h(\"line\", { x1: vScale(0), x2: vScale(0), y1: 0, y2: plotH, stroke: AXIS_COLOR }), ...bars, ...axis, ...cats));\n return svg(width, height, children);\n }\n\n vScale.range([plotH, 0]);\n const grid = opts.showGrid ? ticks.map((t) => h(\"line\", { x1: 0, x2: plotW, y1: fmt(vScale(t)), y2: fmt(vScale(t)), stroke: opts.theme.colors.border, \"stroke-width\": 1 })) : [];\n const yAxis = ticks.map((t) => h(\"text\", { x: -6, y: fmt(vScale(t) + 3), \"text-anchor\": \"end\", \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: AXIS_COLOR }, opts.formatValue(t)));\n const maxCatLabels = Math.max(1, Math.floor(plotW / 48));\n const every = Math.ceil(data.categories.length / maxCatLabels);\n\n if (opts.type === \"bar\") {\n const band = scaleBand<string>().domain(data.categories.map((_, i) => String(i))).range([0, plotW]).paddingInner(0.25).paddingOuter(0.1);\n const inner = scaleBand<string>().domain(data.series.map((_, i) => String(i))).range([0, band.bandwidth()]).padding(0.1);\n const bars: VNode[] = [];\n data.categories.forEach((_, ci) => {\n let posAcc = 0;\n let negAcc = 0;\n data.series.forEach((s, si) => {\n const v = s.values[ci] ?? 0;\n let y0: number, y1: number;\n if (opts.stacked) {\n if (v >= 0) {\n y1 = vScale(posAcc);\n y0 = vScale(posAcc + v);\n posAcc += v;\n } else {\n y1 = vScale(negAcc + v);\n y0 = vScale(negAcc);\n negAcc += v;\n }\n } else {\n y0 = vScale(Math.max(0, v));\n y1 = vScale(Math.min(0, v));\n }\n const x = (band(String(ci)) ?? 0) + (opts.stacked ? 0 : inner(String(si)) ?? 0);\n const bw = opts.stacked ? band.bandwidth() : inner.bandwidth();\n bars.push(h(\"rect\", { x: fmt(x), y: fmt(y0), width: fmt(bw), height: fmt(Math.max(0, y1 - y0)), fill: s.color, rx: 1.5, ...hit(opts, { categoryIndex: ci, category: data.categories[ci] ?? \"\", seriesIndex: si, series: s.label, value: s.values[ci] ?? null, formatted: opts.formatValue(v), color: s.color }) }));\n if (opts.showValues && !opts.stacked) bars.push(h(\"text\", { x: fmt(x + bw / 2), y: fmt(y0 - 3), \"text-anchor\": \"middle\", \"font-size\": FONT_SIZE - 1, \"font-family\": opts.fontFamily, fill: opts.theme.colors.text }, opts.formatValue(v)));\n });\n });\n const xAxis = data.categories.map((c, i) => (i % every === 0 ? h(\"text\", { x: fmt((band(String(i)) ?? 0) + band.bandwidth() / 2), y: plotH + 14, \"text-anchor\": \"middle\", \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: AXIS_COLOR }, truncate(c, 10)) : null));\n children.push(g(marginLeft, marginTop, ...grid, ...bars, h(\"line\", { x1: 0, x2: plotW, y1: fmt(vScale(0)), y2: fmt(vScale(0)), stroke: AXIS_COLOR }), ...yAxis, ...xAxis));\n return svg(width, height, children);\n }\n\n // line / area\n const xScale = scalePoint<string>().domain(data.categories.map((_, i) => String(i))).range([0, plotW]).padding(0.15);\n const curve = opts.smooth ? curveMonotoneX : curveLinear;\n const shapes: VNode[] = [];\n const stackBase: number[] = data.categories.map(() => 0);\n data.series.forEach((s, si) => {\n const pts = s.values.map((v, i) => ({ i, v: v ?? 0 }));\n const base = [...stackBase];\n if (opts.stacked) pts.forEach((p) => (stackBase[p.i] = (stackBase[p.i] ?? 0) + p.v));\n const yOf = (p: { i: number; v: number }) => vScale(opts.stacked ? (base[p.i] ?? 0) + p.v : p.v);\n const y0Of = (p: { i: number }) => vScale(opts.stacked ? base[p.i] ?? 0 : 0);\n const l = d3line<{ i: number; v: number }>().x((p) => xScale(String(p.i)) ?? 0).y(yOf).curve(curve);\n if (opts.type === \"area\") {\n const a = d3area<{ i: number; v: number }>().x((p) => xScale(String(p.i)) ?? 0).y0(y0Of).y1(yOf).curve(curve);\n shapes.push(h(\"path\", { d: a(pts) ?? \"\", fill: s.color, \"fill-opacity\": 0.18 }));\n }\n shapes.push(h(\"path\", { d: l(pts) ?? \"\", fill: \"none\", stroke: s.color, \"stroke-width\": 2, \"stroke-linejoin\": \"round\", \"stroke-linecap\": \"round\" }));\n // A marker is drawn only when the points are far enough apart to see, but\n // every point is still something a reader can ask about, so the hit is\n // recorded either way.\n pts.forEach((p) => {\n const attrs = hit(opts, { categoryIndex: p.i, category: data.categories[p.i] ?? \"\", seriesIndex: si, series: s.label, value: s.values[p.i] ?? null, formatted: opts.formatValue(p.v), color: s.color });\n if (pts.length <= 40) shapes.push(h(\"circle\", { cx: fmt(xScale(String(p.i)) ?? 0), cy: fmt(yOf(p)), r: 2.5, fill: \"#fff\", stroke: s.color, \"stroke-width\": 1.5, ...attrs }));\n else if (opts.hits) opts.hits[opts.hits.length - 1]!.value = s.values[p.i] ?? null;\n });\n if (opts.showValues) pts.forEach((p) => shapes.push(h(\"text\", { x: fmt(xScale(String(p.i)) ?? 0), y: fmt(yOf(p) - 6), \"text-anchor\": \"middle\", \"font-size\": FONT_SIZE - 1, \"font-family\": opts.fontFamily, fill: opts.theme.colors.text }, opts.formatValue(p.v))));\n });\n const xAxis = data.categories.map((c, i) => (i % every === 0 ? h(\"text\", { x: fmt(xScale(String(i)) ?? 0), y: plotH + 14, \"text-anchor\": \"middle\", \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: AXIS_COLOR }, truncate(c, 10)) : null));\n children.push(g(marginLeft, marginTop, ...grid, h(\"line\", { x1: 0, x2: plotW, y1: fmt(vScale(0)), y2: fmt(vScale(0)), stroke: AXIS_COLOR }), ...shapes, ...yAxis, ...xAxis));\n return svg(width, height, children);\n}\n\nfunction renderPie(data: ChartData, opts: ChartRenderOptions): VNode {\n const { width, height } = opts;\n const series = data.series[0];\n const values = data.categories.map((_, i) => Math.max(0, series?.values[i] ?? 0));\n const total = values.reduce((a, b) => a + b, 0);\n const legendW = opts.showLegend ? Math.min(160, width * 0.45) : 0;\n const size = Math.min(height, width - legendW);\n const r = Math.max(10, size / 2 - 6);\n const cx = (width - legendW) / 2;\n const cy = height / 2;\n const inner = opts.type === \"donut\" ? r * 0.62 : 0;\n const pie = d3pie<number>().sort(null).value((d) => d);\n const arcs = pie(values);\n const arcGen = d3arc<{ startAngle: number; endAngle: number }>().innerRadius(inner).outerRadius(r).padAngle(0.01).cornerRadius(2);\n const labelArc = d3arc<{ startAngle: number; endAngle: number }>().innerRadius((inner + r) / 2).outerRadius((inner + r) / 2);\n const slices = arcs.map((a, i) => {\n const frac = total > 0 ? values[i]! / total : 0;\n const [lx, ly] = labelArc.centroid(a);\n const attrs = hit(opts, {\n categoryIndex: i,\n category: data.categories[i] ?? \"\",\n seriesIndex: 0,\n series: series?.label ?? \"\",\n value: series?.values[i] ?? null,\n formatted: opts.formatValue(values[i] ?? 0),\n color: colorAt(data, i),\n share: frac\n });\n return h(\"g\", null, h(\"path\", { d: arcGen(a) ?? \"\", fill: colorAt(data, i), ...attrs }), opts.showValues && frac >= 0.06 ? h(\"text\", { x: fmt(lx), y: fmt(ly + 3), \"text-anchor\": \"middle\", \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: \"#fff\", \"font-weight\": \"600\" }, opts.formatPercent(frac)) : null);\n });\n const children: VNode[] = [h(\"g\", { transform: `translate(${fmt(cx)}, ${fmt(cy)})` }, total === 0 ? h(\"circle\", { r, fill: opts.theme.colors.border }) : slices, opts.type === \"donut\" && opts.innerLabel ? h(\"text\", { \"text-anchor\": \"middle\", y: 4, \"font-size\": FONT_SIZE + 3, \"font-weight\": \"700\", \"font-family\": opts.fontFamily, fill: opts.theme.colors.text }, opts.innerLabel) : null)];\n if (opts.showLegend) {\n const items = data.categories.map((c, i) => ({ label: c, color: colorAt(data, i), frac: total > 0 ? values[i]! / total : 0 }));\n const lineH = 15;\n const startY = Math.max(0, cy - (items.length * lineH) / 2);\n children.push(\n h(\n \"g\",\n { transform: `translate(${fmt(width - legendW)}, ${fmt(startY)})` },\n items.map((it, i) => h(\"g\", { transform: `translate(0, ${i * lineH})` }, h(\"rect\", { x: 0, y: 2, width: 9, height: 9, rx: 2, fill: it.color }), h(\"text\", { x: 14, y: 10, \"font-size\": FONT_SIZE, \"font-family\": opts.fontFamily, fill: opts.theme.colors.text }, `${truncate(it.label, Math.floor(legendW / 6) - 6)} ${opts.formatPercent(it.frac)}`)))\n )\n );\n }\n return svg(width, height, children);\n}\n\nfunction svg(width: number, height: number, children: VNode[]): VNode {\n return h(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: fmt(width), height: fmt(height), viewBox: `0 0 ${fmt(width)} ${fmt(height)}`, class: \"bp-chart__svg\", role: \"img\", style: { display: \"block\", overflow: \"visible\" } }, children);\n}\n"],"mappings":"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","names":["h","defineBlock","cssText","defineBlock","h","cssText","defineBlock","cssText","resolveValue","h","defineBlock","cssText","resolveValue","isDarkColor","evaluate","n","fmt","h","defineBlock","cssText","resolveValue","toNumber","toDisplayString","h","grid","svg","xAxis","defineBlock","toDisplayString","resolveValue","toNumber","h","svg","cssText","b"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@broadpaper/blocks",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "BroadPaper built-in blocks: content, layout, data, tables and charts. Framework-free.",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"LICENSE",
|
|
19
|
+
"THIRD-PARTY-NOTICES.md"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"d3-scale": "^4.0.2",
|
|
24
|
+
"d3-shape": "^3.2.0",
|
|
25
|
+
"@broadpaper/core": "0.1.1"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/d3-scale": "^4.0.8",
|
|
29
|
+
"@types/d3-shape": "^3.1.6"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean --external @broadpaper/core",
|
|
33
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
34
|
+
}
|
|
35
|
+
}
|