@pdfme/jsx 6.1.1-dev.20 → 6.1.1-dev.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/index.js +78 -12
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +10 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -40,6 +40,11 @@ it provides its own `jsx-runtime` and `jsx-dev-runtime`.
|
|
|
40
40
|
content.
|
|
41
41
|
- `Rectangle`, `Ellipse`, and `Line` are static visual schemas for backgrounds, dividers, and simple
|
|
42
42
|
shapes.
|
|
43
|
+
- Layout children can use `margin`. `Stack` and `Row` support `alignItems` for simple cross-axis
|
|
44
|
+
alignment without trying to implement full CSS/Flexbox.
|
|
45
|
+
- `Stack` defaults to `alignItems="stretch"` to preserve full-width stacking. Use an explicit child
|
|
46
|
+
`width` when you want `alignItems="center"` or `"end"` to visibly move that child.
|
|
47
|
+
- `Row` defaults to `alignItems="start"` and intentionally does not support cross-axis stretch yet.
|
|
43
48
|
- `PageBreak` is supported only along a `Page` / `Stack` / `Box` layout path. It is rejected inside
|
|
44
49
|
`Row`, leaf schemas, `List`, and `Table`.
|
|
45
50
|
- All `Page` nodes in one `renderToTemplate` call must use the same page size, orientation, and
|
package/dist/index.js
CHANGED
|
@@ -65,7 +65,10 @@ var renderToTemplate = async (node, options = {}) => {
|
|
|
65
65
|
font,
|
|
66
66
|
_cache
|
|
67
67
|
};
|
|
68
|
-
await layoutChildren(page.children, frame, "stack", {
|
|
68
|
+
await layoutChildren(page.children, frame, "stack", {
|
|
69
|
+
gap: 0,
|
|
70
|
+
alignItems: "stretch"
|
|
71
|
+
}, ctx);
|
|
69
72
|
pageSchemas.push(ctx.schemas);
|
|
70
73
|
}
|
|
71
74
|
return {
|
|
@@ -130,9 +133,11 @@ var layoutChildren = async (children, frame, mode, opts, ctx) => {
|
|
|
130
133
|
const widths = mode === "row" ? resolveRowWidths(items, frame.width, opts.gap) : void 0;
|
|
131
134
|
let cursor = 0;
|
|
132
135
|
let crossMax = 0;
|
|
136
|
+
const rowItems = [];
|
|
133
137
|
for (let i = 0; i < items.length; i += 1) {
|
|
134
138
|
const child = items[i];
|
|
135
|
-
const
|
|
139
|
+
const margin = getChildMargin(child);
|
|
140
|
+
const width = mode === "row" ? widths?.[i] ?? 0 : resolveStackChildWidth(child, frame.width, margin);
|
|
136
141
|
const childFrame = mode === "stack" ? {
|
|
137
142
|
x: frame.x,
|
|
138
143
|
y: frame.y + cursor,
|
|
@@ -144,38 +149,89 @@ var layoutChildren = async (children, frame, mode, opts, ctx) => {
|
|
|
144
149
|
width,
|
|
145
150
|
height: frame.height
|
|
146
151
|
};
|
|
152
|
+
childFrame.x += margin.left;
|
|
153
|
+
childFrame.y += margin.top;
|
|
154
|
+
childFrame.height = Math.max(0, childFrame.height - margin.top - margin.bottom);
|
|
155
|
+
const schemaStart = ctx.schemas.length;
|
|
147
156
|
const size = typeof child === "string" || typeof child === "number" ? await renderText({ children: String(child) }, childFrame, ctx) : await renderElement(child, childFrame, mode, ctx);
|
|
148
|
-
const
|
|
157
|
+
const schemaEnd = ctx.schemas.length;
|
|
158
|
+
if (mode === "stack") {
|
|
159
|
+
const outerWidth = margin.left + size.width + margin.right;
|
|
160
|
+
const dx = resolveAlignOffset(frame.width, outerWidth, opts.alignItems);
|
|
161
|
+
if (dx !== 0) shiftSchemas(ctx.schemas, schemaStart, schemaEnd, dx, 0);
|
|
162
|
+
} else rowItems.push({
|
|
163
|
+
schemaStart,
|
|
164
|
+
schemaEnd,
|
|
165
|
+
outerHeight: margin.top + size.height + margin.bottom
|
|
166
|
+
});
|
|
167
|
+
const advance = mode === "stack" ? margin.top + size.height + margin.bottom : margin.left + width + margin.right;
|
|
149
168
|
cursor += advance + (i < items.length - 1 ? opts.gap : 0);
|
|
150
|
-
crossMax = Math.max(crossMax, mode === "stack" ? size.width : size.height);
|
|
169
|
+
crossMax = Math.max(crossMax, mode === "stack" ? margin.left + size.width + margin.right : margin.top + size.height + margin.bottom);
|
|
151
170
|
}
|
|
152
|
-
|
|
171
|
+
if (mode === "row") {
|
|
172
|
+
const rowHeight = opts.crossSize ?? crossMax;
|
|
173
|
+
for (const item of rowItems) {
|
|
174
|
+
const dy = resolveAlignOffset(rowHeight, item.outerHeight, opts.alignItems);
|
|
175
|
+
if (dy !== 0) shiftSchemas(ctx.schemas, item.schemaStart, item.schemaEnd, 0, dy);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
width: cursor,
|
|
179
|
+
height: rowHeight
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
153
183
|
width: crossMax,
|
|
154
184
|
height: cursor
|
|
155
|
-
} : {
|
|
156
|
-
width: cursor,
|
|
157
|
-
height: crossMax
|
|
158
185
|
};
|
|
159
186
|
};
|
|
160
187
|
var resolveRowWidths = (items, frameWidth, gap) => {
|
|
161
188
|
let fixedWidth = 0;
|
|
162
189
|
let flexCount = 0;
|
|
163
190
|
const widths = items.map((item) => {
|
|
191
|
+
const margin = getChildMargin(item);
|
|
164
192
|
if (typeof item === "string" || typeof item === "number") {
|
|
165
193
|
flexCount += 1;
|
|
194
|
+
fixedWidth += margin.left + margin.right;
|
|
166
195
|
return;
|
|
167
196
|
}
|
|
168
197
|
const width = item.props.width;
|
|
169
198
|
if (typeof width === "number") {
|
|
170
|
-
fixedWidth += width;
|
|
199
|
+
fixedWidth += width + margin.left + margin.right;
|
|
171
200
|
return width;
|
|
172
201
|
}
|
|
173
202
|
flexCount += 1;
|
|
203
|
+
fixedWidth += margin.left + margin.right;
|
|
174
204
|
});
|
|
175
205
|
const remaining = Math.max(0, frameWidth - fixedWidth - Math.max(0, items.length - 1) * gap);
|
|
176
206
|
const flexWidth = flexCount > 0 ? remaining / flexCount : 0;
|
|
177
207
|
return widths.map((width) => width ?? flexWidth);
|
|
178
208
|
};
|
|
209
|
+
var getChildMargin = (child) => {
|
|
210
|
+
if (typeof child === "string" || typeof child === "number") return resolveBoxSides();
|
|
211
|
+
return resolveBoxSides(child.props.margin);
|
|
212
|
+
};
|
|
213
|
+
var resolveStackChildWidth = (child, frameWidth, margin) => {
|
|
214
|
+
if (typeof child !== "string" && typeof child !== "number") {
|
|
215
|
+
const width = child.props.width;
|
|
216
|
+
if (typeof width === "number") return width;
|
|
217
|
+
}
|
|
218
|
+
return Math.max(0, frameWidth - margin.left - margin.right);
|
|
219
|
+
};
|
|
220
|
+
var resolveAlignOffset = (containerSize, itemSize, alignItems) => {
|
|
221
|
+
if (alignItems === "center") return Math.max(0, (containerSize - itemSize) / 2);
|
|
222
|
+
if (alignItems === "end") return Math.max(0, containerSize - itemSize);
|
|
223
|
+
return 0;
|
|
224
|
+
};
|
|
225
|
+
var shiftSchemas = (schemas, start, end, dx, dy) => {
|
|
226
|
+
for (let i = start; i < end; i += 1) {
|
|
227
|
+
const schema = schemas[i];
|
|
228
|
+
if (!schema) continue;
|
|
229
|
+
schema.position = {
|
|
230
|
+
x: schema.position.x + dx,
|
|
231
|
+
y: schema.position.y + dy
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
};
|
|
179
235
|
var renderElement = async (element, frame, parentMode, ctx) => {
|
|
180
236
|
switch (element.kind) {
|
|
181
237
|
case "stack": return renderStack(element.props, element.children, frame, ctx);
|
|
@@ -212,12 +268,19 @@ var renderElement = async (element, frame, parentMode, ctx) => {
|
|
|
212
268
|
var renderStack = (props, children, frame, ctx) => layoutChildren(children, {
|
|
213
269
|
...frame,
|
|
214
270
|
width: props.width ?? frame.width
|
|
215
|
-
}, "stack", {
|
|
271
|
+
}, "stack", {
|
|
272
|
+
gap: props.gap ?? 0,
|
|
273
|
+
alignItems: props.alignItems ?? "stretch"
|
|
274
|
+
}, ctx);
|
|
216
275
|
var renderRow = (props, children, frame, ctx) => layoutChildren(children, {
|
|
217
276
|
...frame,
|
|
218
277
|
width: props.width ?? frame.width,
|
|
219
278
|
height: props.height ?? frame.height
|
|
220
|
-
}, "row", {
|
|
279
|
+
}, "row", {
|
|
280
|
+
gap: props.gap ?? 0,
|
|
281
|
+
alignItems: props.alignItems ?? "start",
|
|
282
|
+
crossSize: props.height
|
|
283
|
+
}, ctx);
|
|
221
284
|
var renderBox = async (props, children, frame, _parentMode, ctx) => {
|
|
222
285
|
const width = props.width ?? frame.width;
|
|
223
286
|
const padding = resolveBoxSides(props.padding);
|
|
@@ -245,7 +308,10 @@ var renderBox = async (props, children, frame, _parentMode, ctx) => {
|
|
|
245
308
|
y: frame.y + padding.top,
|
|
246
309
|
width: width - padding.left - padding.right,
|
|
247
310
|
height: (props.height ?? frame.height) - padding.top - padding.bottom
|
|
248
|
-
}, "stack", {
|
|
311
|
+
}, "stack", {
|
|
312
|
+
gap: 0,
|
|
313
|
+
alignItems: "stretch"
|
|
314
|
+
}, ctx);
|
|
249
315
|
const height = props.height ?? childSize.height + padding.top + padding.bottom;
|
|
250
316
|
if (needsRect) ctx.schemas[beforeCount] = {
|
|
251
317
|
...ctx.schemas[beforeCount],
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/components.ts","../src/render.ts"],"sourcesContent":["import { createElementNode } from './node.js';\nimport type {\n BoxProps,\n EllipseProps,\n ImageProps,\n LineProps,\n ListProps,\n MultiVariableTextProps,\n PageBreakProps,\n PageProps,\n RectangleProps,\n RowProps,\n SpacerProps,\n StackProps,\n SvgProps,\n TableProps,\n TextProps,\n} from './types.js';\n\nconst makeBuiltin =\n <Props extends Record<string, unknown>, K extends Parameters<typeof createElementNode>[0]>(\n kind: K,\n ) =>\n (props: Props): ReturnType<typeof createElementNode<K>> =>\n createElementNode(kind, props);\n\nexport const Page = makeBuiltin<PageProps, 'page'>('page');\nexport const Stack = makeBuiltin<StackProps, 'stack'>('stack');\nexport const Row = makeBuiltin<RowProps, 'row'>('row');\nexport const Box = makeBuiltin<BoxProps, 'box'>('box');\nexport const Spacer = makeBuiltin<SpacerProps, 'spacer'>('spacer');\nexport const Text = makeBuiltin<TextProps, 'text'>('text');\nexport const MultiVariableText = makeBuiltin<MultiVariableTextProps, 'multiVariableText'>(\n 'multiVariableText',\n);\nexport const Image = makeBuiltin<ImageProps, 'image'>('image');\nexport const Svg = makeBuiltin<SvgProps, 'svg'>('svg');\nexport const Rectangle = makeBuiltin<RectangleProps, 'rectangle'>('rectangle');\nexport const Ellipse = makeBuiltin<EllipseProps, 'ellipse'>('ellipse');\nexport const Line = makeBuiltin<LineProps, 'line'>('line');\nexport const List = makeBuiltin<ListProps, 'list'>('list');\nexport const Table = makeBuiltin<TableProps, 'table'>('table');\nexport const PageBreak = (props?: PageBreakProps) => createElementNode('pagebreak', props);\n","import { getDefaultFont, pt2mm, resolvePageSize } from '@pdfme/common';\nimport type { Font, Schema, Template } from '@pdfme/common';\nimport type {\n CellStyle as SchemaCellStyle,\n ImageSchema,\n LineSchema,\n ListSchema,\n MultiVariableTextSchema,\n ShapeSchema,\n SVGSchema,\n TableSchema,\n TextSchema,\n} from '@pdfme/schemas/types';\nimport {\n escapeInlineMarkdown,\n getVariableNames,\n measureTextHeight,\n visitVariables,\n} from '@pdfme/schemas/utils';\nimport { cloneElementWithChildren, isPdfJsxElement, isPdfJsxFragment } from './node.js';\nimport type {\n BoxProps,\n BoxSides,\n CellStyle,\n EllipseProps,\n ImageProps,\n LineProps,\n ListProps,\n MultiVariableTextProps,\n MultiVariableTextValues,\n PageProps,\n PdfJsxChild,\n PdfJsxElement,\n RectangleProps,\n RenderOptions,\n RenderResult,\n RowProps,\n SpacerProps,\n StackProps,\n SvgProps,\n TableProps,\n TextProps,\n} from './types.js';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\ntype RenderCtx = {\n schemas: Schema[];\n inputs: Record<string, string>;\n usedNames: Set<string>;\n nameCounters: Record<string, number>;\n defaultFont?: string;\n font: Font;\n _cache: Map<string | number, unknown>;\n};\n\nconst DEFAULT_FONT_SIZE = 10;\nconst DEFAULT_LINE_HEIGHT = 1;\nconst DEFAULT_CHARACTER_SPACING = 0;\nconst DEFAULT_FONT_COLOR = '#000000';\nconst DEFAULT_VISUAL_HEIGHT = 40;\nconst DEFAULT_LINE_THICKNESS = 0.5;\nconst DEFAULT_LINE_COLOR = '#000000';\nconst DEFAULT_SHAPE_BORDER_COLOR = '#000000';\nconst DEFAULT_DYNAMIC_FONT_SIZE = {\n min: 4,\n max: 72,\n fit: 'vertical',\n} as const satisfies NonNullable<TextSchema['dynamicFontSize']>;\n\nexport const renderToTemplate = async (\n node: PdfJsxChild,\n options: RenderOptions = {},\n): Promise<RenderResult> => {\n validatePageBreakPlacement(node);\n const expanded = expandPageBreaks(node);\n const pages = flattenChildren(expanded).filter(\n (child): child is PdfJsxElement<'page'> => isPdfJsxElement(child) && child.kind === 'page',\n );\n\n if (pages.length === 0) {\n throw new Error('@pdfme/jsx: renderToTemplate root must contain at least one <Page>.');\n }\n\n const firstPageProps = pages[0]?.props as PageProps;\n const firstMargin = resolveBoxSides(firstPageProps.margin);\n const pageSize = resolvePageSize(firstPageProps.size, firstPageProps.orientation);\n validateConsistentPageProps(pages, pageSize, firstMargin);\n const inputs: Record<string, string> = {};\n const usedNames = new Set<string>();\n const nameCounters: Record<string, number> = {};\n const font = options.font ?? getDefaultFont();\n const _cache = new Map<string | number, unknown>();\n const pageSchemas: Schema[][] = [];\n\n for (const page of pages) {\n const props = page.props as PageProps;\n const margin = resolveBoxSides(props.margin);\n const frame = {\n x: margin.left,\n y: margin.top,\n width: pageSize.width - margin.left - margin.right,\n height: pageSize.height - margin.top - margin.bottom,\n };\n const ctx: RenderCtx = {\n schemas: [],\n inputs,\n usedNames,\n nameCounters,\n defaultFont: props.font,\n font,\n _cache,\n };\n await layoutChildren(page.children, frame, 'stack', { gap: 0 }, ctx);\n pageSchemas.push(ctx.schemas);\n }\n\n const template: Template = {\n basePdf: options.basePdf ?? {\n width: pageSize.width,\n height: pageSize.height,\n padding: [firstMargin.top, firstMargin.right, firstMargin.bottom, firstMargin.left],\n },\n schemas: pageSchemas,\n };\n\n return { template, inputs: [inputs] };\n};\n\nconst flattenChildren = (\n children: PdfJsxChild | PdfJsxChild[],\n): (PdfJsxElement | string | number)[] => {\n if (children == null || children === false || children === true) return [];\n if (typeof children === 'string' || typeof children === 'number') return [children];\n if (Array.isArray(children)) return children.flatMap((child) => flattenChildren(child));\n if (isPdfJsxFragment(children)) return flattenChildren(children.children);\n if (isPdfJsxElement(children)) return [children];\n return [];\n};\n\nconst childrenToString = (children: PdfJsxChild | PdfJsxChild[]): string =>\n flattenChildren(children)\n .map((child) => {\n if (typeof child === 'string' || typeof child === 'number') return String(child);\n return childrenToString(child.children);\n })\n .join('');\n\nconst splitChildrenByPageBreak = (children: PdfJsxChild | PdfJsxChild[]): PdfJsxChild[][] => {\n const segments: PdfJsxChild[][] = [[]];\n\n for (const child of flattenForSplitting(children)) {\n if (isPdfJsxElement(child) && child.kind === 'pagebreak') {\n segments.push([]);\n continue;\n }\n\n if (\n isPdfJsxElement(child) &&\n (child.kind === 'page' || child.kind === 'stack' || child.kind === 'box')\n ) {\n const childSegments = splitChildrenByPageBreak(child.children);\n if (childSegments.length === 1) {\n segments[segments.length - 1]?.push(child);\n continue;\n }\n\n segments[segments.length - 1]?.push(cloneElementWithChildren(child, childSegments[0] ?? []));\n for (let i = 1; i < childSegments.length; i += 1) {\n segments.push([cloneElementWithChildren(child, childSegments[i] ?? [])]);\n }\n continue;\n }\n\n segments[segments.length - 1]?.push(child);\n }\n\n return segments;\n};\n\nconst flattenForSplitting = (children: PdfJsxChild | PdfJsxChild[]): PdfJsxChild[] => {\n if (children == null || children === false || children === true) return [];\n if (Array.isArray(children)) return children.flatMap((child) => flattenForSplitting(child));\n if (isPdfJsxFragment(children)) return flattenForSplitting(children.children);\n return [children];\n};\n\nconst expandPageBreaks = (node: PdfJsxChild): PdfJsxChild[] =>\n splitChildrenByPageBreak(node).flat();\n\nconst layoutChildren = async (\n children: PdfJsxChild | PdfJsxChild[],\n frame: Rect,\n mode: 'stack' | 'row',\n opts: { gap: number },\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const items = flattenChildren(children);\n const widths = mode === 'row' ? resolveRowWidths(items, frame.width, opts.gap) : undefined;\n let cursor = 0;\n let crossMax = 0;\n\n for (let i = 0; i < items.length; i += 1) {\n const child = items[i];\n const width = mode === 'row' ? (widths?.[i] ?? 0) : frame.width;\n const childFrame =\n mode === 'stack'\n ? { x: frame.x, y: frame.y + cursor, width, height: Math.max(0, frame.height - cursor) }\n : { x: frame.x + cursor, y: frame.y, width, height: frame.height };\n\n const size =\n typeof child === 'string' || typeof child === 'number'\n ? await renderText({ children: String(child) }, childFrame, ctx)\n : await renderElement(child, childFrame, mode, ctx);\n\n const advance = mode === 'stack' ? size.height : width;\n cursor += advance + (i < items.length - 1 ? opts.gap : 0);\n crossMax = Math.max(crossMax, mode === 'stack' ? size.width : size.height);\n }\n\n return mode === 'stack'\n ? { width: crossMax, height: cursor }\n : { width: cursor, height: crossMax };\n};\n\nconst resolveRowWidths = (\n items: (PdfJsxElement | string | number)[],\n frameWidth: number,\n gap: number,\n): number[] => {\n let fixedWidth = 0;\n let flexCount = 0;\n const widths = items.map((item) => {\n if (typeof item === 'string' || typeof item === 'number') {\n flexCount += 1;\n return undefined;\n }\n const width = (item.props as { width?: number }).width;\n if (typeof width === 'number') {\n fixedWidth += width;\n return width;\n }\n flexCount += 1;\n return undefined;\n });\n\n const remaining = Math.max(0, frameWidth - fixedWidth - Math.max(0, items.length - 1) * gap);\n const flexWidth = flexCount > 0 ? remaining / flexCount : 0;\n return widths.map((width) => width ?? flexWidth);\n};\n\nconst renderElement = async (\n element: PdfJsxElement,\n frame: Rect,\n parentMode: 'stack' | 'row',\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n switch (element.kind) {\n case 'stack':\n return renderStack(element.props as StackProps, element.children, frame, ctx);\n case 'row':\n return renderRow(element.props as RowProps, element.children, frame, ctx);\n case 'box':\n return renderBox(element.props as BoxProps, element.children, frame, parentMode, ctx);\n case 'spacer':\n return Promise.resolve(renderSpacer(element.props as SpacerProps));\n case 'text':\n return renderText(\n { ...(element.props as TextProps), children: element.children },\n frame,\n ctx,\n );\n case 'multiVariableText':\n return renderMultiVariableText(\n { ...(element.props as MultiVariableTextProps), children: element.children },\n frame,\n ctx,\n );\n case 'image':\n return renderImage(element.props as ImageProps, frame, ctx);\n case 'svg':\n return renderSvg({ ...(element.props as SvgProps), children: element.children }, frame, ctx);\n case 'rectangle':\n return renderShape('rectangle', element.props as RectangleProps, frame, ctx);\n case 'ellipse':\n return renderShape('ellipse', element.props as EllipseProps, frame, ctx);\n case 'line':\n return renderLine(element.props as LineProps, frame, ctx);\n case 'list':\n return renderList(\n { ...(element.props as ListProps), children: element.children },\n frame,\n ctx,\n );\n case 'table':\n return renderTable(element.props as TableProps, frame, ctx);\n default:\n return { width: 0, height: 0 };\n }\n};\n\nconst renderStack = (\n props: StackProps,\n children: PdfJsxChild[],\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> =>\n layoutChildren(\n children,\n { ...frame, width: props.width ?? frame.width },\n 'stack',\n {\n gap: props.gap ?? 0,\n },\n ctx,\n );\n\nconst renderRow = (\n props: RowProps,\n children: PdfJsxChild[],\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> =>\n layoutChildren(\n children,\n { ...frame, width: props.width ?? frame.width, height: props.height ?? frame.height },\n 'row',\n { gap: props.gap ?? 0 },\n ctx,\n );\n\nconst renderBox = async (\n props: BoxProps,\n children: PdfJsxChild[],\n frame: Rect,\n _parentMode: 'stack' | 'row',\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const width = props.width ?? frame.width;\n const padding = resolveBoxSides(props.padding);\n const needsRect = Boolean(props.background || props.borderColor || props.borderWidth);\n const beforeCount = ctx.schemas.length;\n\n if (needsRect) {\n ctx.schemas.push({\n name: resolveName(ctx, 'box'),\n type: 'rectangle',\n position: { x: frame.x, y: frame.y },\n width,\n height: 0,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly: true,\n color: props.background ?? '',\n borderColor: props.borderColor ?? '',\n borderWidth: props.borderWidth ?? 0,\n radius: props.radius ?? 0,\n });\n }\n\n const innerFrame = {\n x: frame.x + padding.left,\n y: frame.y + padding.top,\n width: width - padding.left - padding.right,\n height: (props.height ?? frame.height) - padding.top - padding.bottom,\n };\n const childSize = await layoutChildren(children, innerFrame, 'stack', { gap: 0 }, ctx);\n const height = props.height ?? childSize.height + padding.top + padding.bottom;\n\n if (needsRect) {\n ctx.schemas[beforeCount] = { ...ctx.schemas[beforeCount]!, height };\n }\n\n return { width, height };\n};\n\nconst renderSpacer = (props: SpacerProps): { width: number; height: number } => ({\n width: props.width ?? 0,\n height: props.height ?? 0,\n});\n\nconst renderText = async (\n props: TextProps,\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const fontSize = props.size ?? DEFAULT_FONT_SIZE;\n const lineHeight = props.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const width = props.width ?? frame.width;\n const value = childrenToString(props.children);\n const readOnly = props.readOnly ?? props.name == null;\n const textFormat = props.textFormat ?? 'plain';\n\n if (!readOnly && textFormat === 'inline-markdown') {\n throw new Error(\n '@pdfme/jsx: editable <Text> does not support textFormat=\"inline-markdown\". Use read-only <Text> or <MultiVariableText>.',\n );\n }\n const name = resolveName(ctx, 'text', props.name);\n\n const schema: TextSchema = {\n name,\n type: 'text',\n content: value,\n position: { x: frame.x, y: frame.y },\n width,\n height: props.height ?? 0,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n alignment: props.align ?? 'left',\n verticalAlignment: props.valign ?? 'top',\n fontSize,\n fontName: props.font ?? ctx.defaultFont,\n lineHeight,\n characterSpacing: props.spacing ?? DEFAULT_CHARACTER_SPACING,\n fontColor: props.color ?? DEFAULT_FONT_COLOR,\n backgroundColor: props.background ?? '',\n textFormat,\n overflow: props.overflow,\n strikethrough: props.strikethrough ?? false,\n underline: props.underline ?? false,\n };\n\n if (props.borderColor) schema.borderColor = props.borderColor;\n if (props.borderWidth != null) schema.borderWidth = props.borderWidth;\n if (props.dynamicFontSize) {\n schema.dynamicFontSize = {\n min: props.dynamicFontSize.min ?? DEFAULT_DYNAMIC_FONT_SIZE.min,\n max: props.dynamicFontSize.max ?? DEFAULT_DYNAMIC_FONT_SIZE.max,\n fit: props.dynamicFontSize.fit ?? DEFAULT_DYNAMIC_FONT_SIZE.fit,\n };\n }\n if (props.height == null) {\n schema.height = await measureTextHeight({ value, schema, font: ctx.font, _cache: ctx._cache });\n }\n if (!readOnly) ctx.inputs[name] = value;\n ctx.schemas.push(schema);\n\n return { width, height: schema.height };\n};\n\nconst renderMultiVariableText = async (\n props: MultiVariableTextProps,\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const fontSize = props.size ?? DEFAULT_FONT_SIZE;\n const lineHeight = props.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const width = props.width ?? frame.width;\n const templateText = props.text ?? childrenToString(props.children);\n const values = normalizeMultiVariableTextValues(props.values);\n const variables = resolveMultiVariableTextVariables(templateText, props.variables, values);\n const name = resolveName(ctx, 'multiVariableText', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const textFormat = props.textFormat ?? 'plain';\n const content = readOnly\n ? substituteMultiVariableText(templateText, values, textFormat === 'inline-markdown')\n : JSON.stringify(values);\n\n const schema: MultiVariableTextSchema = {\n name,\n type: 'multiVariableText',\n content,\n position: { x: frame.x, y: frame.y },\n width,\n height: props.height ?? 0,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n alignment: props.align ?? 'left',\n verticalAlignment: props.valign ?? 'top',\n fontSize,\n fontName: props.font ?? ctx.defaultFont,\n lineHeight,\n characterSpacing: props.spacing ?? DEFAULT_CHARACTER_SPACING,\n fontColor: props.color ?? DEFAULT_FONT_COLOR,\n backgroundColor: props.background ?? '',\n textFormat,\n overflow: props.overflow,\n strikethrough: props.strikethrough ?? false,\n underline: props.underline ?? false,\n text: templateText,\n variables,\n };\n\n if (props.borderColor) schema.borderColor = props.borderColor;\n if (props.borderWidth != null) schema.borderWidth = props.borderWidth;\n if (props.dynamicFontSize) {\n schema.dynamicFontSize = {\n min: props.dynamicFontSize.min ?? DEFAULT_DYNAMIC_FONT_SIZE.min,\n max: props.dynamicFontSize.max ?? DEFAULT_DYNAMIC_FONT_SIZE.max,\n fit: props.dynamicFontSize.fit ?? DEFAULT_DYNAMIC_FONT_SIZE.fit,\n };\n }\n if (props.height == null) {\n const measureValue = readOnly\n ? content\n : substituteMultiVariableText(templateText, values, textFormat === 'inline-markdown');\n schema.height = await measureTextHeight({\n value: measureValue,\n schema,\n font: ctx.font,\n _cache: ctx._cache,\n });\n }\n if (!readOnly) ctx.inputs[name] = content;\n ctx.schemas.push(schema);\n\n return { width, height: schema.height };\n};\n\nconst renderImage = (\n props: ImageProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_VISUAL_HEIGHT;\n const name = resolveName(ctx, 'image', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const content = props.src ?? '';\n\n const schema: ImageSchema = {\n name,\n type: 'image',\n content,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n };\n\n if (!readOnly) ctx.inputs[name] = content;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderSvg = (\n props: SvgProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_VISUAL_HEIGHT;\n const name = resolveName(ctx, 'svg', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const content = props.svg ?? childrenToString(props.children);\n\n const schema: SVGSchema = {\n name,\n type: 'svg',\n content,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n };\n\n if (!readOnly) ctx.inputs[name] = content;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderShape = (\n type: ShapeSchema['type'],\n props: RectangleProps | EllipseProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_VISUAL_HEIGHT;\n const fill = props.fill ?? '';\n const borderWidth = props.borderWidth ?? (props.borderColor || !fill ? 1 : 0);\n\n const schema: ShapeSchema = {\n name: resolveName(ctx, type, props.name),\n type,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly: true,\n borderWidth,\n borderColor: props.borderColor ?? (borderWidth > 0 ? DEFAULT_SHAPE_BORDER_COLOR : ''),\n color: fill,\n radius: type === 'rectangle' ? ((props as RectangleProps).radius ?? 0) : 0,\n };\n\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderLine = (\n props: LineProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_LINE_THICKNESS;\n\n const schema: LineSchema = {\n name: resolveName(ctx, 'line', props.name),\n type: 'line',\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly: true,\n color: props.color ?? DEFAULT_LINE_COLOR,\n };\n\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderList = (\n props: ListProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const fontSize = props.size ?? DEFAULT_FONT_SIZE;\n const lineHeight = props.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const items = normalizeListItems(props);\n const serialized = JSON.stringify(items.map(serializeListItem));\n const width = props.width ?? frame.width;\n const height =\n props.height ??\n Math.max(1, items.length) * estimateTextHeight(fontSize, lineHeight) +\n Math.max(0, items.length - 1) * (props.itemSpacing ?? 1);\n const name = resolveName(ctx, 'list', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n\n const schema: ListSchema = {\n name,\n type: 'list',\n content: serialized,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n alignment: props.align ?? 'left',\n verticalAlignment: 'top',\n fontSize,\n fontName: props.font ?? ctx.defaultFont,\n lineHeight,\n characterSpacing: props.spacing ?? DEFAULT_CHARACTER_SPACING,\n fontColor: props.color ?? DEFAULT_FONT_COLOR,\n backgroundColor: props.background ?? '',\n listStyle: props.listStyle ?? 'bullet',\n markerWidth: props.markerWidth ?? 6,\n markerGap: props.markerGap ?? 2,\n indentSize: props.indentSize ?? 6,\n itemSpacing: props.itemSpacing ?? 1,\n };\n\n if (!readOnly) ctx.inputs[name] = serialized;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderTable = (\n props: TableProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const rows = (props.rows ?? props.data ?? []).map((row) => row.map(String));\n const width = props.width ?? frame.width;\n const showHead = props.showHead ?? true;\n const headerHeight = props.headerHeight ?? 9;\n const rowHeight = props.rowHeight ?? 6.5;\n const height =\n props.height ?? (showHead ? headerHeight : 0) + Math.max(1, rows.length) * rowHeight;\n const name = resolveName(ctx, 'table', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const value = JSON.stringify(rows);\n\n const schema: TableSchema = {\n name,\n type: 'table',\n content: value,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n showHead,\n repeatHead: props.repeatHead ?? false,\n head: props.head,\n headWidthPercentages: normalizeColumnWidths(props.widths, props.head.length),\n tableStyles: {\n borderColor: props.tableStyles?.borderColor ?? '#000000',\n borderWidth: props.tableStyles?.borderWidth ?? 0.3,\n },\n headStyles: {\n ...defaultCellStyle(props.font ?? ctx.defaultFont, props.fontSize),\n fontColor: '#ffffff',\n backgroundColor: '#2980ba',\n ...normalizeCellStyle(props.headStyles),\n },\n bodyStyles: {\n ...defaultCellStyle(props.font ?? ctx.defaultFont, props.fontSize),\n alternateBackgroundColor: '#f5f5f5',\n ...normalizeCellStyle(props.bodyStyles),\n },\n columnStyles: props.columnStyles ?? {},\n };\n\n if (!readOnly) ctx.inputs[name] = value;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst normalizeListItems = (props: ListProps): { text: string; level: number }[] => {\n if (props.items) {\n return props.items.map((item) =>\n typeof item === 'string'\n ? { text: item, level: 0 }\n : { text: item.text, level: item.level ?? 0 },\n );\n }\n return childrenToString(props.children)\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n .map((text) => ({ text, level: 0 }));\n};\n\nconst serializeListItem = (item: { text: string; level: number }) =>\n `${'\\t'.repeat(Math.max(0, item.level))}${item.text}`;\n\nconst normalizeMultiVariableTextValues = (\n values: MultiVariableTextValues | undefined,\n): Record<string, string> => {\n const normalized: Record<string, string> = {};\n Object.entries(values ?? {}).forEach(([key, value]) => {\n normalized[key] = value == null ? '' : String(value);\n });\n return normalized;\n};\n\nconst resolveMultiVariableTextVariables = (\n templateText: string,\n variables: string[] | undefined,\n values: Record<string, string>,\n) => {\n const result: string[] = [];\n const seen = new Set<string>();\n const add = (name: string) => {\n if (!seen.has(name)) {\n seen.add(name);\n result.push(name);\n }\n };\n\n variables?.forEach(add);\n getVariableNames(templateText).forEach(add);\n Object.keys(values).forEach(add);\n return result;\n};\n\nconst substituteMultiVariableText = (\n templateText: string,\n values: Record<string, string>,\n escapeMarkdown: boolean,\n) => {\n let result = '';\n let lastIndex = 0;\n\n visitVariables(templateText, ({ name, startIndex, endIndex }) => {\n result += templateText.slice(lastIndex, startIndex);\n const value = values[name];\n if (value != null) {\n result += escapeMarkdown ? escapeInlineMarkdown(value) : value;\n }\n lastIndex = endIndex + 1;\n });\n\n return result + templateText.slice(lastIndex);\n};\n\nconst normalizeColumnWidths = (widths: number[] | undefined, columnCount: number): number[] => {\n if (widths && widths.length > 0) return widths;\n if (columnCount <= 0) return [];\n return Array.from({ length: columnCount }, () => 100 / columnCount);\n};\n\nconst defaultCellStyle = (fontName: string | undefined, fontSize = 10): SchemaCellStyle => ({\n fontName,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize,\n lineHeight: 1,\n characterSpacing: 0,\n fontColor: '#000000',\n backgroundColor: '#ffffff',\n borderColor: '#000000',\n borderWidth: { top: 0, right: 0, bottom: 0, left: 0 },\n padding: { top: 5, right: 5, bottom: 5, left: 5 },\n});\n\nconst normalizeCellStyle = (\n style: CellStyle | undefined,\n): Partial<SchemaCellStyle & { alternateBackgroundColor: string }> => {\n if (!style) return {};\n const { borderWidth, padding, ...rest } = style;\n return {\n ...rest,\n ...(borderWidth != null ? { borderWidth: resolveBoxSides(borderWidth) } : {}),\n ...(padding != null ? { padding: resolveBoxSides(padding) } : {}),\n };\n};\n\nconst resolveBoxSides = (value?: number | BoxSides) => {\n if (value == null) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof value === 'number') return { top: value, right: value, bottom: value, left: value };\n const x = value.x ?? 0;\n const y = value.y ?? 0;\n return {\n top: value.top ?? y,\n right: value.right ?? x,\n bottom: value.bottom ?? y,\n left: value.left ?? x,\n };\n};\n\nconst resolveName = (ctx: RenderCtx, prefix: string, userName?: string): string => {\n if (userName) {\n if (ctx.usedNames.has(userName)) {\n throw new Error(`@pdfme/jsx: duplicate schema name \"${userName}\"`);\n }\n ctx.usedNames.add(userName);\n return userName;\n }\n\n let name = '';\n do {\n ctx.nameCounters[prefix] = (ctx.nameCounters[prefix] ?? 0) + 1;\n name = `${prefix}_${ctx.nameCounters[prefix]}`;\n } while (ctx.usedNames.has(name));\n ctx.usedNames.add(name);\n return name;\n};\n\nconst estimateTextHeight = (fontSize: number, lineHeight: number) =>\n Math.max(4, pt2mm(fontSize * lineHeight));\n\nconst validateConsistentPageProps = (\n pages: PdfJsxElement<'page'>[],\n firstPageSize: { width: number; height: number },\n firstMargin: ReturnType<typeof resolveBoxSides>,\n) => {\n for (let i = 1; i < pages.length; i += 1) {\n const props = pages[i]?.props as PageProps;\n const pageSize = resolvePageSize(props.size, props.orientation);\n const margin = resolveBoxSides(props.margin);\n\n if (!isSameSize(pageSize, firstPageSize) || !isSameBoxSides(margin, firstMargin)) {\n throw new Error(\n '@pdfme/jsx: all <Page> nodes must use the same size, orientation, and margin. pdfme templates have one blank basePdf size and padding.',\n );\n }\n }\n};\n\nconst isSameSize = (\n first: { width: number; height: number },\n second: { width: number; height: number },\n) => first.width === second.width && first.height === second.height;\n\nconst isSameBoxSides = (\n first: ReturnType<typeof resolveBoxSides>,\n second: ReturnType<typeof resolveBoxSides>,\n) =>\n first.top === second.top &&\n first.right === second.right &&\n first.bottom === second.bottom &&\n first.left === second.left;\n\nconst PAGE_BREAK_PARENT_KINDS = new Set(['page', 'stack', 'box']);\n\nconst validatePageBreakPlacement = (\n node: PdfJsxChild | PdfJsxChild[],\n parentKind: string | undefined = undefined,\n canBreak = false,\n) => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (child.kind === 'pagebreak') {\n if (!canBreak || !parentKind || !PAGE_BREAK_PARENT_KINDS.has(parentKind)) {\n throw new Error(\n '@pdfme/jsx: <PageBreak> can only be used inside <Page>, <Stack>, or <Box>.',\n );\n }\n continue;\n }\n\n const childCanBreak =\n child.kind === 'page' ? true : canBreak && PAGE_BREAK_PARENT_KINDS.has(child.kind);\n validatePageBreakPlacement(child.children, child.kind, childCanBreak);\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/components.ts","../src/render.ts"],"sourcesContent":["import { createElementNode } from './node.js';\nimport type {\n BoxProps,\n EllipseProps,\n ImageProps,\n LineProps,\n ListProps,\n MultiVariableTextProps,\n PageBreakProps,\n PageProps,\n RectangleProps,\n RowProps,\n SpacerProps,\n StackProps,\n SvgProps,\n TableProps,\n TextProps,\n} from './types.js';\n\nconst makeBuiltin =\n <Props extends Record<string, unknown>, K extends Parameters<typeof createElementNode>[0]>(\n kind: K,\n ) =>\n (props: Props): ReturnType<typeof createElementNode<K>> =>\n createElementNode(kind, props);\n\nexport const Page = makeBuiltin<PageProps, 'page'>('page');\nexport const Stack = makeBuiltin<StackProps, 'stack'>('stack');\nexport const Row = makeBuiltin<RowProps, 'row'>('row');\nexport const Box = makeBuiltin<BoxProps, 'box'>('box');\nexport const Spacer = makeBuiltin<SpacerProps, 'spacer'>('spacer');\nexport const Text = makeBuiltin<TextProps, 'text'>('text');\nexport const MultiVariableText = makeBuiltin<MultiVariableTextProps, 'multiVariableText'>(\n 'multiVariableText',\n);\nexport const Image = makeBuiltin<ImageProps, 'image'>('image');\nexport const Svg = makeBuiltin<SvgProps, 'svg'>('svg');\nexport const Rectangle = makeBuiltin<RectangleProps, 'rectangle'>('rectangle');\nexport const Ellipse = makeBuiltin<EllipseProps, 'ellipse'>('ellipse');\nexport const Line = makeBuiltin<LineProps, 'line'>('line');\nexport const List = makeBuiltin<ListProps, 'list'>('list');\nexport const Table = makeBuiltin<TableProps, 'table'>('table');\nexport const PageBreak = (props?: PageBreakProps) => createElementNode('pagebreak', props);\n","import { getDefaultFont, pt2mm, resolvePageSize } from '@pdfme/common';\nimport type { Font, Schema, Template } from '@pdfme/common';\nimport type {\n CellStyle as SchemaCellStyle,\n ImageSchema,\n LineSchema,\n ListSchema,\n MultiVariableTextSchema,\n ShapeSchema,\n SVGSchema,\n TableSchema,\n TextSchema,\n} from '@pdfme/schemas/types';\nimport {\n escapeInlineMarkdown,\n getVariableNames,\n measureTextHeight,\n visitVariables,\n} from '@pdfme/schemas/utils';\nimport { cloneElementWithChildren, isPdfJsxElement, isPdfJsxFragment } from './node.js';\nimport type {\n BoxProps,\n BoxSides,\n CellStyle,\n EllipseProps,\n ImageProps,\n LineProps,\n LayoutAlignItems,\n ListProps,\n MultiVariableTextProps,\n MultiVariableTextValues,\n PageProps,\n PdfJsxChild,\n PdfJsxElement,\n RectangleProps,\n RenderOptions,\n RenderResult,\n RowProps,\n SpacerProps,\n StackProps,\n SvgProps,\n TableProps,\n TextProps,\n} from './types.js';\n\ntype Rect = { x: number; y: number; width: number; height: number };\ntype Box = ReturnType<typeof resolveBoxSides>;\ntype LayoutMode = 'stack' | 'row';\n\ntype RenderCtx = {\n schemas: Schema[];\n inputs: Record<string, string>;\n usedNames: Set<string>;\n nameCounters: Record<string, number>;\n defaultFont?: string;\n font: Font;\n _cache: Map<string | number, unknown>;\n};\n\nconst DEFAULT_FONT_SIZE = 10;\nconst DEFAULT_LINE_HEIGHT = 1;\nconst DEFAULT_CHARACTER_SPACING = 0;\nconst DEFAULT_FONT_COLOR = '#000000';\nconst DEFAULT_VISUAL_HEIGHT = 40;\nconst DEFAULT_LINE_THICKNESS = 0.5;\nconst DEFAULT_LINE_COLOR = '#000000';\nconst DEFAULT_SHAPE_BORDER_COLOR = '#000000';\nconst DEFAULT_DYNAMIC_FONT_SIZE = {\n min: 4,\n max: 72,\n fit: 'vertical',\n} as const satisfies NonNullable<TextSchema['dynamicFontSize']>;\n\nexport const renderToTemplate = async (\n node: PdfJsxChild,\n options: RenderOptions = {},\n): Promise<RenderResult> => {\n validatePageBreakPlacement(node);\n const expanded = expandPageBreaks(node);\n const pages = flattenChildren(expanded).filter(\n (child): child is PdfJsxElement<'page'> => isPdfJsxElement(child) && child.kind === 'page',\n );\n\n if (pages.length === 0) {\n throw new Error('@pdfme/jsx: renderToTemplate root must contain at least one <Page>.');\n }\n\n const firstPageProps = pages[0]?.props as PageProps;\n const firstMargin = resolveBoxSides(firstPageProps.margin);\n const pageSize = resolvePageSize(firstPageProps.size, firstPageProps.orientation);\n validateConsistentPageProps(pages, pageSize, firstMargin);\n const inputs: Record<string, string> = {};\n const usedNames = new Set<string>();\n const nameCounters: Record<string, number> = {};\n const font = options.font ?? getDefaultFont();\n const _cache = new Map<string | number, unknown>();\n const pageSchemas: Schema[][] = [];\n\n for (const page of pages) {\n const props = page.props as PageProps;\n const margin = resolveBoxSides(props.margin);\n const frame = {\n x: margin.left,\n y: margin.top,\n width: pageSize.width - margin.left - margin.right,\n height: pageSize.height - margin.top - margin.bottom,\n };\n const ctx: RenderCtx = {\n schemas: [],\n inputs,\n usedNames,\n nameCounters,\n defaultFont: props.font,\n font,\n _cache,\n };\n await layoutChildren(page.children, frame, 'stack', { gap: 0, alignItems: 'stretch' }, ctx);\n pageSchemas.push(ctx.schemas);\n }\n\n const template: Template = {\n basePdf: options.basePdf ?? {\n width: pageSize.width,\n height: pageSize.height,\n padding: [firstMargin.top, firstMargin.right, firstMargin.bottom, firstMargin.left],\n },\n schemas: pageSchemas,\n };\n\n return { template, inputs: [inputs] };\n};\n\nconst flattenChildren = (\n children: PdfJsxChild | PdfJsxChild[],\n): (PdfJsxElement | string | number)[] => {\n if (children == null || children === false || children === true) return [];\n if (typeof children === 'string' || typeof children === 'number') return [children];\n if (Array.isArray(children)) return children.flatMap((child) => flattenChildren(child));\n if (isPdfJsxFragment(children)) return flattenChildren(children.children);\n if (isPdfJsxElement(children)) return [children];\n return [];\n};\n\nconst childrenToString = (children: PdfJsxChild | PdfJsxChild[]): string =>\n flattenChildren(children)\n .map((child) => {\n if (typeof child === 'string' || typeof child === 'number') return String(child);\n return childrenToString(child.children);\n })\n .join('');\n\nconst splitChildrenByPageBreak = (children: PdfJsxChild | PdfJsxChild[]): PdfJsxChild[][] => {\n const segments: PdfJsxChild[][] = [[]];\n\n for (const child of flattenForSplitting(children)) {\n if (isPdfJsxElement(child) && child.kind === 'pagebreak') {\n segments.push([]);\n continue;\n }\n\n if (\n isPdfJsxElement(child) &&\n (child.kind === 'page' || child.kind === 'stack' || child.kind === 'box')\n ) {\n const childSegments = splitChildrenByPageBreak(child.children);\n if (childSegments.length === 1) {\n segments[segments.length - 1]?.push(child);\n continue;\n }\n\n segments[segments.length - 1]?.push(cloneElementWithChildren(child, childSegments[0] ?? []));\n for (let i = 1; i < childSegments.length; i += 1) {\n segments.push([cloneElementWithChildren(child, childSegments[i] ?? [])]);\n }\n continue;\n }\n\n segments[segments.length - 1]?.push(child);\n }\n\n return segments;\n};\n\nconst flattenForSplitting = (children: PdfJsxChild | PdfJsxChild[]): PdfJsxChild[] => {\n if (children == null || children === false || children === true) return [];\n if (Array.isArray(children)) return children.flatMap((child) => flattenForSplitting(child));\n if (isPdfJsxFragment(children)) return flattenForSplitting(children.children);\n return [children];\n};\n\nconst expandPageBreaks = (node: PdfJsxChild): PdfJsxChild[] =>\n splitChildrenByPageBreak(node).flat();\n\nconst layoutChildren = async (\n children: PdfJsxChild | PdfJsxChild[],\n frame: Rect,\n mode: LayoutMode,\n opts: { gap: number; alignItems: LayoutAlignItems; crossSize?: number },\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const items = flattenChildren(children);\n const widths = mode === 'row' ? resolveRowWidths(items, frame.width, opts.gap) : undefined;\n let cursor = 0;\n let crossMax = 0;\n const rowItems: { schemaStart: number; schemaEnd: number; outerHeight: number }[] = [];\n\n for (let i = 0; i < items.length; i += 1) {\n const child = items[i];\n const margin = getChildMargin(child);\n const width =\n mode === 'row' ? (widths?.[i] ?? 0) : resolveStackChildWidth(child, frame.width, margin);\n const childFrame =\n mode === 'stack'\n ? { x: frame.x, y: frame.y + cursor, width, height: Math.max(0, frame.height - cursor) }\n : { x: frame.x + cursor, y: frame.y, width, height: frame.height };\n childFrame.x += margin.left;\n childFrame.y += margin.top;\n childFrame.height = Math.max(0, childFrame.height - margin.top - margin.bottom);\n\n const schemaStart = ctx.schemas.length;\n const size =\n typeof child === 'string' || typeof child === 'number'\n ? await renderText({ children: String(child) }, childFrame, ctx)\n : await renderElement(child, childFrame, mode, ctx);\n const schemaEnd = ctx.schemas.length;\n\n if (mode === 'stack') {\n const outerWidth = margin.left + size.width + margin.right;\n const dx = resolveAlignOffset(frame.width, outerWidth, opts.alignItems);\n if (dx !== 0) shiftSchemas(ctx.schemas, schemaStart, schemaEnd, dx, 0);\n } else {\n rowItems.push({\n schemaStart,\n schemaEnd,\n outerHeight: margin.top + size.height + margin.bottom,\n });\n }\n\n const advance =\n mode === 'stack'\n ? margin.top + size.height + margin.bottom\n : margin.left + width + margin.right;\n cursor += advance + (i < items.length - 1 ? opts.gap : 0);\n crossMax = Math.max(\n crossMax,\n mode === 'stack'\n ? margin.left + size.width + margin.right\n : margin.top + size.height + margin.bottom,\n );\n }\n\n if (mode === 'row') {\n const rowHeight = opts.crossSize ?? crossMax;\n for (const item of rowItems) {\n const dy = resolveAlignOffset(rowHeight, item.outerHeight, opts.alignItems);\n if (dy !== 0) shiftSchemas(ctx.schemas, item.schemaStart, item.schemaEnd, 0, dy);\n }\n return { width: cursor, height: rowHeight };\n }\n\n return { width: crossMax, height: cursor };\n};\n\nconst resolveRowWidths = (\n items: (PdfJsxElement | string | number)[],\n frameWidth: number,\n gap: number,\n): number[] => {\n let fixedWidth = 0;\n let flexCount = 0;\n const widths = items.map((item) => {\n const margin = getChildMargin(item);\n if (typeof item === 'string' || typeof item === 'number') {\n flexCount += 1;\n fixedWidth += margin.left + margin.right;\n return undefined;\n }\n const width = (item.props as { width?: number }).width;\n if (typeof width === 'number') {\n fixedWidth += width + margin.left + margin.right;\n return width;\n }\n flexCount += 1;\n fixedWidth += margin.left + margin.right;\n return undefined;\n });\n\n const remaining = Math.max(0, frameWidth - fixedWidth - Math.max(0, items.length - 1) * gap);\n const flexWidth = flexCount > 0 ? remaining / flexCount : 0;\n return widths.map((width) => width ?? flexWidth);\n};\n\nconst getChildMargin = (child: PdfJsxElement | string | number): Box => {\n if (typeof child === 'string' || typeof child === 'number') return resolveBoxSides();\n return resolveBoxSides((child.props as { margin?: number | BoxSides }).margin);\n};\n\nconst resolveStackChildWidth = (\n child: PdfJsxElement | string | number,\n frameWidth: number,\n margin: Box,\n) => {\n if (typeof child !== 'string' && typeof child !== 'number') {\n const width = (child.props as { width?: number }).width;\n if (typeof width === 'number') return width;\n }\n return Math.max(0, frameWidth - margin.left - margin.right);\n};\n\nconst resolveAlignOffset = (\n containerSize: number,\n itemSize: number,\n alignItems: LayoutAlignItems,\n) => {\n // Overflowing children stay pinned to start instead of being pulled outside the frame.\n if (alignItems === 'center') return Math.max(0, (containerSize - itemSize) / 2);\n if (alignItems === 'end') return Math.max(0, containerSize - itemSize);\n return 0;\n};\n\nconst shiftSchemas = (schemas: Schema[], start: number, end: number, dx: number, dy: number) => {\n for (let i = start; i < end; i += 1) {\n const schema = schemas[i];\n if (!schema) continue;\n schema.position = {\n x: schema.position.x + dx,\n y: schema.position.y + dy,\n };\n }\n};\n\nconst renderElement = async (\n element: PdfJsxElement,\n frame: Rect,\n parentMode: LayoutMode,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n switch (element.kind) {\n case 'stack':\n return renderStack(element.props as StackProps, element.children, frame, ctx);\n case 'row':\n return renderRow(element.props as RowProps, element.children, frame, ctx);\n case 'box':\n return renderBox(element.props as BoxProps, element.children, frame, parentMode, ctx);\n case 'spacer':\n return Promise.resolve(renderSpacer(element.props as SpacerProps));\n case 'text':\n return renderText(\n { ...(element.props as TextProps), children: element.children },\n frame,\n ctx,\n );\n case 'multiVariableText':\n return renderMultiVariableText(\n { ...(element.props as MultiVariableTextProps), children: element.children },\n frame,\n ctx,\n );\n case 'image':\n return renderImage(element.props as ImageProps, frame, ctx);\n case 'svg':\n return renderSvg({ ...(element.props as SvgProps), children: element.children }, frame, ctx);\n case 'rectangle':\n return renderShape('rectangle', element.props as RectangleProps, frame, ctx);\n case 'ellipse':\n return renderShape('ellipse', element.props as EllipseProps, frame, ctx);\n case 'line':\n return renderLine(element.props as LineProps, frame, ctx);\n case 'list':\n return renderList(\n { ...(element.props as ListProps), children: element.children },\n frame,\n ctx,\n );\n case 'table':\n return renderTable(element.props as TableProps, frame, ctx);\n default:\n return { width: 0, height: 0 };\n }\n};\n\nconst renderStack = (\n props: StackProps,\n children: PdfJsxChild[],\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> =>\n layoutChildren(\n children,\n { ...frame, width: props.width ?? frame.width },\n 'stack',\n {\n gap: props.gap ?? 0,\n alignItems: props.alignItems ?? 'stretch',\n },\n ctx,\n );\n\nconst renderRow = (\n props: RowProps,\n children: PdfJsxChild[],\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> =>\n layoutChildren(\n children,\n { ...frame, width: props.width ?? frame.width, height: props.height ?? frame.height },\n 'row',\n { gap: props.gap ?? 0, alignItems: props.alignItems ?? 'start', crossSize: props.height },\n ctx,\n );\n\nconst renderBox = async (\n props: BoxProps,\n children: PdfJsxChild[],\n frame: Rect,\n _parentMode: LayoutMode,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const width = props.width ?? frame.width;\n const padding = resolveBoxSides(props.padding);\n const needsRect = Boolean(props.background || props.borderColor || props.borderWidth);\n const beforeCount = ctx.schemas.length;\n\n if (needsRect) {\n ctx.schemas.push({\n name: resolveName(ctx, 'box'),\n type: 'rectangle',\n position: { x: frame.x, y: frame.y },\n width,\n height: 0,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly: true,\n color: props.background ?? '',\n borderColor: props.borderColor ?? '',\n borderWidth: props.borderWidth ?? 0,\n radius: props.radius ?? 0,\n });\n }\n\n const innerFrame = {\n x: frame.x + padding.left,\n y: frame.y + padding.top,\n width: width - padding.left - padding.right,\n height: (props.height ?? frame.height) - padding.top - padding.bottom,\n };\n const childSize = await layoutChildren(\n children,\n innerFrame,\n 'stack',\n { gap: 0, alignItems: 'stretch' },\n ctx,\n );\n const height = props.height ?? childSize.height + padding.top + padding.bottom;\n\n if (needsRect) {\n ctx.schemas[beforeCount] = { ...ctx.schemas[beforeCount]!, height };\n }\n\n return { width, height };\n};\n\nconst renderSpacer = (props: SpacerProps): { width: number; height: number } => ({\n width: props.width ?? 0,\n height: props.height ?? 0,\n});\n\nconst renderText = async (\n props: TextProps,\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const fontSize = props.size ?? DEFAULT_FONT_SIZE;\n const lineHeight = props.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const width = props.width ?? frame.width;\n const value = childrenToString(props.children);\n const readOnly = props.readOnly ?? props.name == null;\n const textFormat = props.textFormat ?? 'plain';\n\n if (!readOnly && textFormat === 'inline-markdown') {\n throw new Error(\n '@pdfme/jsx: editable <Text> does not support textFormat=\"inline-markdown\". Use read-only <Text> or <MultiVariableText>.',\n );\n }\n const name = resolveName(ctx, 'text', props.name);\n\n const schema: TextSchema = {\n name,\n type: 'text',\n content: value,\n position: { x: frame.x, y: frame.y },\n width,\n height: props.height ?? 0,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n alignment: props.align ?? 'left',\n verticalAlignment: props.valign ?? 'top',\n fontSize,\n fontName: props.font ?? ctx.defaultFont,\n lineHeight,\n characterSpacing: props.spacing ?? DEFAULT_CHARACTER_SPACING,\n fontColor: props.color ?? DEFAULT_FONT_COLOR,\n backgroundColor: props.background ?? '',\n textFormat,\n overflow: props.overflow,\n strikethrough: props.strikethrough ?? false,\n underline: props.underline ?? false,\n };\n\n if (props.borderColor) schema.borderColor = props.borderColor;\n if (props.borderWidth != null) schema.borderWidth = props.borderWidth;\n if (props.dynamicFontSize) {\n schema.dynamicFontSize = {\n min: props.dynamicFontSize.min ?? DEFAULT_DYNAMIC_FONT_SIZE.min,\n max: props.dynamicFontSize.max ?? DEFAULT_DYNAMIC_FONT_SIZE.max,\n fit: props.dynamicFontSize.fit ?? DEFAULT_DYNAMIC_FONT_SIZE.fit,\n };\n }\n if (props.height == null) {\n schema.height = await measureTextHeight({ value, schema, font: ctx.font, _cache: ctx._cache });\n }\n if (!readOnly) ctx.inputs[name] = value;\n ctx.schemas.push(schema);\n\n return { width, height: schema.height };\n};\n\nconst renderMultiVariableText = async (\n props: MultiVariableTextProps,\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const fontSize = props.size ?? DEFAULT_FONT_SIZE;\n const lineHeight = props.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const width = props.width ?? frame.width;\n const templateText = props.text ?? childrenToString(props.children);\n const values = normalizeMultiVariableTextValues(props.values);\n const variables = resolveMultiVariableTextVariables(templateText, props.variables, values);\n const name = resolveName(ctx, 'multiVariableText', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const textFormat = props.textFormat ?? 'plain';\n const content = readOnly\n ? substituteMultiVariableText(templateText, values, textFormat === 'inline-markdown')\n : JSON.stringify(values);\n\n const schema: MultiVariableTextSchema = {\n name,\n type: 'multiVariableText',\n content,\n position: { x: frame.x, y: frame.y },\n width,\n height: props.height ?? 0,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n alignment: props.align ?? 'left',\n verticalAlignment: props.valign ?? 'top',\n fontSize,\n fontName: props.font ?? ctx.defaultFont,\n lineHeight,\n characterSpacing: props.spacing ?? DEFAULT_CHARACTER_SPACING,\n fontColor: props.color ?? DEFAULT_FONT_COLOR,\n backgroundColor: props.background ?? '',\n textFormat,\n overflow: props.overflow,\n strikethrough: props.strikethrough ?? false,\n underline: props.underline ?? false,\n text: templateText,\n variables,\n };\n\n if (props.borderColor) schema.borderColor = props.borderColor;\n if (props.borderWidth != null) schema.borderWidth = props.borderWidth;\n if (props.dynamicFontSize) {\n schema.dynamicFontSize = {\n min: props.dynamicFontSize.min ?? DEFAULT_DYNAMIC_FONT_SIZE.min,\n max: props.dynamicFontSize.max ?? DEFAULT_DYNAMIC_FONT_SIZE.max,\n fit: props.dynamicFontSize.fit ?? DEFAULT_DYNAMIC_FONT_SIZE.fit,\n };\n }\n if (props.height == null) {\n const measureValue = readOnly\n ? content\n : substituteMultiVariableText(templateText, values, textFormat === 'inline-markdown');\n schema.height = await measureTextHeight({\n value: measureValue,\n schema,\n font: ctx.font,\n _cache: ctx._cache,\n });\n }\n if (!readOnly) ctx.inputs[name] = content;\n ctx.schemas.push(schema);\n\n return { width, height: schema.height };\n};\n\nconst renderImage = (\n props: ImageProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_VISUAL_HEIGHT;\n const name = resolveName(ctx, 'image', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const content = props.src ?? '';\n\n const schema: ImageSchema = {\n name,\n type: 'image',\n content,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n };\n\n if (!readOnly) ctx.inputs[name] = content;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderSvg = (\n props: SvgProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_VISUAL_HEIGHT;\n const name = resolveName(ctx, 'svg', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const content = props.svg ?? childrenToString(props.children);\n\n const schema: SVGSchema = {\n name,\n type: 'svg',\n content,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n };\n\n if (!readOnly) ctx.inputs[name] = content;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderShape = (\n type: ShapeSchema['type'],\n props: RectangleProps | EllipseProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_VISUAL_HEIGHT;\n const fill = props.fill ?? '';\n const borderWidth = props.borderWidth ?? (props.borderColor || !fill ? 1 : 0);\n\n const schema: ShapeSchema = {\n name: resolveName(ctx, type, props.name),\n type,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly: true,\n borderWidth,\n borderColor: props.borderColor ?? (borderWidth > 0 ? DEFAULT_SHAPE_BORDER_COLOR : ''),\n color: fill,\n radius: type === 'rectangle' ? ((props as RectangleProps).radius ?? 0) : 0,\n };\n\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderLine = (\n props: LineProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const width = props.width ?? frame.width;\n const height = props.height ?? DEFAULT_LINE_THICKNESS;\n\n const schema: LineSchema = {\n name: resolveName(ctx, 'line', props.name),\n type: 'line',\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly: true,\n color: props.color ?? DEFAULT_LINE_COLOR,\n };\n\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderList = (\n props: ListProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const fontSize = props.size ?? DEFAULT_FONT_SIZE;\n const lineHeight = props.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const items = normalizeListItems(props);\n const serialized = JSON.stringify(items.map(serializeListItem));\n const width = props.width ?? frame.width;\n const height =\n props.height ??\n Math.max(1, items.length) * estimateTextHeight(fontSize, lineHeight) +\n Math.max(0, items.length - 1) * (props.itemSpacing ?? 1);\n const name = resolveName(ctx, 'list', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n\n const schema: ListSchema = {\n name,\n type: 'list',\n content: serialized,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n alignment: props.align ?? 'left',\n verticalAlignment: 'top',\n fontSize,\n fontName: props.font ?? ctx.defaultFont,\n lineHeight,\n characterSpacing: props.spacing ?? DEFAULT_CHARACTER_SPACING,\n fontColor: props.color ?? DEFAULT_FONT_COLOR,\n backgroundColor: props.background ?? '',\n listStyle: props.listStyle ?? 'bullet',\n markerWidth: props.markerWidth ?? 6,\n markerGap: props.markerGap ?? 2,\n indentSize: props.indentSize ?? 6,\n itemSpacing: props.itemSpacing ?? 1,\n };\n\n if (!readOnly) ctx.inputs[name] = serialized;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst renderTable = (\n props: TableProps,\n frame: Rect,\n ctx: RenderCtx,\n): { width: number; height: number } => {\n const rows = (props.rows ?? props.data ?? []).map((row) => row.map(String));\n const width = props.width ?? frame.width;\n const showHead = props.showHead ?? true;\n const headerHeight = props.headerHeight ?? 9;\n const rowHeight = props.rowHeight ?? 6.5;\n const height =\n props.height ?? (showHead ? headerHeight : 0) + Math.max(1, rows.length) * rowHeight;\n const name = resolveName(ctx, 'table', props.name);\n const readOnly = props.readOnly ?? props.name == null;\n const value = JSON.stringify(rows);\n\n const schema: TableSchema = {\n name,\n type: 'table',\n content: value,\n position: { x: frame.x, y: frame.y },\n width,\n height,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly,\n required: props.required,\n showHead,\n repeatHead: props.repeatHead ?? false,\n head: props.head,\n headWidthPercentages: normalizeColumnWidths(props.widths, props.head.length),\n tableStyles: {\n borderColor: props.tableStyles?.borderColor ?? '#000000',\n borderWidth: props.tableStyles?.borderWidth ?? 0.3,\n },\n headStyles: {\n ...defaultCellStyle(props.font ?? ctx.defaultFont, props.fontSize),\n fontColor: '#ffffff',\n backgroundColor: '#2980ba',\n ...normalizeCellStyle(props.headStyles),\n },\n bodyStyles: {\n ...defaultCellStyle(props.font ?? ctx.defaultFont, props.fontSize),\n alternateBackgroundColor: '#f5f5f5',\n ...normalizeCellStyle(props.bodyStyles),\n },\n columnStyles: props.columnStyles ?? {},\n };\n\n if (!readOnly) ctx.inputs[name] = value;\n ctx.schemas.push(schema);\n\n return { width, height };\n};\n\nconst normalizeListItems = (props: ListProps): { text: string; level: number }[] => {\n if (props.items) {\n return props.items.map((item) =>\n typeof item === 'string'\n ? { text: item, level: 0 }\n : { text: item.text, level: item.level ?? 0 },\n );\n }\n return childrenToString(props.children)\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n .map((text) => ({ text, level: 0 }));\n};\n\nconst serializeListItem = (item: { text: string; level: number }) =>\n `${'\\t'.repeat(Math.max(0, item.level))}${item.text}`;\n\nconst normalizeMultiVariableTextValues = (\n values: MultiVariableTextValues | undefined,\n): Record<string, string> => {\n const normalized: Record<string, string> = {};\n Object.entries(values ?? {}).forEach(([key, value]) => {\n normalized[key] = value == null ? '' : String(value);\n });\n return normalized;\n};\n\nconst resolveMultiVariableTextVariables = (\n templateText: string,\n variables: string[] | undefined,\n values: Record<string, string>,\n) => {\n const result: string[] = [];\n const seen = new Set<string>();\n const add = (name: string) => {\n if (!seen.has(name)) {\n seen.add(name);\n result.push(name);\n }\n };\n\n variables?.forEach(add);\n getVariableNames(templateText).forEach(add);\n Object.keys(values).forEach(add);\n return result;\n};\n\nconst substituteMultiVariableText = (\n templateText: string,\n values: Record<string, string>,\n escapeMarkdown: boolean,\n) => {\n let result = '';\n let lastIndex = 0;\n\n visitVariables(templateText, ({ name, startIndex, endIndex }) => {\n result += templateText.slice(lastIndex, startIndex);\n const value = values[name];\n if (value != null) {\n result += escapeMarkdown ? escapeInlineMarkdown(value) : value;\n }\n lastIndex = endIndex + 1;\n });\n\n return result + templateText.slice(lastIndex);\n};\n\nconst normalizeColumnWidths = (widths: number[] | undefined, columnCount: number): number[] => {\n if (widths && widths.length > 0) return widths;\n if (columnCount <= 0) return [];\n return Array.from({ length: columnCount }, () => 100 / columnCount);\n};\n\nconst defaultCellStyle = (fontName: string | undefined, fontSize = 10): SchemaCellStyle => ({\n fontName,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize,\n lineHeight: 1,\n characterSpacing: 0,\n fontColor: '#000000',\n backgroundColor: '#ffffff',\n borderColor: '#000000',\n borderWidth: { top: 0, right: 0, bottom: 0, left: 0 },\n padding: { top: 5, right: 5, bottom: 5, left: 5 },\n});\n\nconst normalizeCellStyle = (\n style: CellStyle | undefined,\n): Partial<SchemaCellStyle & { alternateBackgroundColor: string }> => {\n if (!style) return {};\n const { borderWidth, padding, ...rest } = style;\n return {\n ...rest,\n ...(borderWidth != null ? { borderWidth: resolveBoxSides(borderWidth) } : {}),\n ...(padding != null ? { padding: resolveBoxSides(padding) } : {}),\n };\n};\n\nconst resolveBoxSides = (value?: number | BoxSides) => {\n if (value == null) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof value === 'number') return { top: value, right: value, bottom: value, left: value };\n const x = value.x ?? 0;\n const y = value.y ?? 0;\n return {\n top: value.top ?? y,\n right: value.right ?? x,\n bottom: value.bottom ?? y,\n left: value.left ?? x,\n };\n};\n\nconst resolveName = (ctx: RenderCtx, prefix: string, userName?: string): string => {\n if (userName) {\n if (ctx.usedNames.has(userName)) {\n throw new Error(`@pdfme/jsx: duplicate schema name \"${userName}\"`);\n }\n ctx.usedNames.add(userName);\n return userName;\n }\n\n let name = '';\n do {\n ctx.nameCounters[prefix] = (ctx.nameCounters[prefix] ?? 0) + 1;\n name = `${prefix}_${ctx.nameCounters[prefix]}`;\n } while (ctx.usedNames.has(name));\n ctx.usedNames.add(name);\n return name;\n};\n\nconst estimateTextHeight = (fontSize: number, lineHeight: number) =>\n Math.max(4, pt2mm(fontSize * lineHeight));\n\nconst validateConsistentPageProps = (\n pages: PdfJsxElement<'page'>[],\n firstPageSize: { width: number; height: number },\n firstMargin: ReturnType<typeof resolveBoxSides>,\n) => {\n for (let i = 1; i < pages.length; i += 1) {\n const props = pages[i]?.props as PageProps;\n const pageSize = resolvePageSize(props.size, props.orientation);\n const margin = resolveBoxSides(props.margin);\n\n if (!isSameSize(pageSize, firstPageSize) || !isSameBoxSides(margin, firstMargin)) {\n throw new Error(\n '@pdfme/jsx: all <Page> nodes must use the same size, orientation, and margin. pdfme templates have one blank basePdf size and padding.',\n );\n }\n }\n};\n\nconst isSameSize = (\n first: { width: number; height: number },\n second: { width: number; height: number },\n) => first.width === second.width && first.height === second.height;\n\nconst isSameBoxSides = (\n first: ReturnType<typeof resolveBoxSides>,\n second: ReturnType<typeof resolveBoxSides>,\n) =>\n first.top === second.top &&\n first.right === second.right &&\n first.bottom === second.bottom &&\n first.left === second.left;\n\nconst PAGE_BREAK_PARENT_KINDS = new Set(['page', 'stack', 'box']);\n\nconst validatePageBreakPlacement = (\n node: PdfJsxChild | PdfJsxChild[],\n parentKind: string | undefined = undefined,\n canBreak = false,\n) => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (child.kind === 'pagebreak') {\n if (!canBreak || !parentKind || !PAGE_BREAK_PARENT_KINDS.has(parentKind)) {\n throw new Error(\n '@pdfme/jsx: <PageBreak> can only be used inside <Page>, <Stack>, or <Box>.',\n );\n }\n continue;\n }\n\n const childCanBreak =\n child.kind === 'page' ? true : canBreak && PAGE_BREAK_PARENT_KINDS.has(child.kind);\n validatePageBreakPlacement(child.children, child.kind, childCanBreak);\n }\n};\n"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -32,7 +32,11 @@ export type BoxSides = {
|
|
|
32
32
|
/** Vertical shorthand used when top/bottom are omitted. */
|
|
33
33
|
y?: number;
|
|
34
34
|
};
|
|
35
|
-
export type
|
|
35
|
+
export type LayoutAlignItems = 'start' | 'center' | 'end' | 'stretch';
|
|
36
|
+
export type LayoutProps = {
|
|
37
|
+
margin?: number | BoxSides;
|
|
38
|
+
};
|
|
39
|
+
export type CommonProps = LayoutProps & Partial<Pick<Schema, 'rotate' | 'opacity'>>;
|
|
36
40
|
export type PageProps = {
|
|
37
41
|
size?: PageSize;
|
|
38
42
|
orientation?: PageOrientation;
|
|
@@ -40,15 +44,17 @@ export type PageProps = {
|
|
|
40
44
|
font?: string;
|
|
41
45
|
children?: PdfJsxChild;
|
|
42
46
|
};
|
|
43
|
-
export type StackProps = {
|
|
47
|
+
export type StackProps = LayoutProps & {
|
|
44
48
|
gap?: number;
|
|
45
49
|
width?: number;
|
|
50
|
+
alignItems?: LayoutAlignItems;
|
|
46
51
|
children?: PdfJsxChild;
|
|
47
52
|
};
|
|
48
|
-
export type RowProps = {
|
|
53
|
+
export type RowProps = LayoutProps & {
|
|
49
54
|
gap?: number;
|
|
50
55
|
width?: number;
|
|
51
56
|
height?: number;
|
|
57
|
+
alignItems?: Exclude<LayoutAlignItems, 'stretch'>;
|
|
52
58
|
children?: PdfJsxChild;
|
|
53
59
|
};
|
|
54
60
|
export type BoxProps = CommonProps & {
|
|
@@ -61,7 +67,7 @@ export type BoxProps = CommonProps & {
|
|
|
61
67
|
radius?: number;
|
|
62
68
|
children?: PdfJsxChild;
|
|
63
69
|
};
|
|
64
|
-
export type SpacerProps = {
|
|
70
|
+
export type SpacerProps = LayoutProps & {
|
|
65
71
|
width?: number;
|
|
66
72
|
height?: number;
|
|
67
73
|
};
|