@pdfme/jsx 6.1.1-dev.23 → 6.1.1-dev.26
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 +15 -0
- package/dist/components.d.ts +2 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +54 -5
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +8 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -62,6 +62,21 @@ it provides its own `jsx-runtime` and `jsx-dev-runtime`.
|
|
|
62
62
|
- Static content currently accepts read-only `Stack`, `Row`, `Box`, `Spacer`, `Text`, `Image`, `Svg`,
|
|
63
63
|
`Rectangle`, `Ellipse`, and `Line` content. `MultiVariableText`, `List`, `Table`, input-backed
|
|
64
64
|
schemas, and `PageBreak` are rejected.
|
|
65
|
+
- `Absolute` can be used inside `Page`, top `Static`, or `Box` as a small manual placement escape
|
|
66
|
+
hatch. It uses the parent layout frame as its coordinate origin and does not advance the
|
|
67
|
+
surrounding stack/row flow. When `width` or `height` is omitted, it uses the remaining parent
|
|
68
|
+
frame size from `x` / `y`. Direct `Stack` / `Row` support is intentionally left for later; wrap
|
|
69
|
+
with an explicit-size `Box` when you need a local manual-placement frame inside flow content.
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<Page margin={12}>
|
|
73
|
+
<Text height={8}>Body starts here</Text>
|
|
74
|
+
<Absolute x={120} y={0} width={60}>
|
|
75
|
+
<Text height={6}>Top-right note</Text>
|
|
76
|
+
</Absolute>
|
|
77
|
+
</Page>
|
|
78
|
+
```
|
|
79
|
+
|
|
65
80
|
- Layout children can use `margin`. `Stack` and `Row` support `alignItems` for simple cross-axis
|
|
66
81
|
alignment without trying to implement full CSS/Flexbox.
|
|
67
82
|
- `Stack` and `Row` support `justifyContent="start" | "center" | "end" | "space-between"` for
|
package/dist/components.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createElementNode } from './node.js';
|
|
2
|
-
import type { BoxProps, EllipseProps, FooterProps, HeaderProps, ImageProps, LineProps, ListProps, MultiVariableTextProps, PageBreakProps, PageProps, RectangleProps, RowProps, SpacerProps, StackProps, StaticProps, SvgProps, TableProps, TextProps } from './types.js';
|
|
2
|
+
import type { AbsoluteProps, BoxProps, EllipseProps, FooterProps, HeaderProps, ImageProps, LineProps, ListProps, MultiVariableTextProps, PageBreakProps, PageProps, RectangleProps, RowProps, SpacerProps, StackProps, StaticProps, SvgProps, TableProps, TextProps } from './types.js';
|
|
3
3
|
export declare const Page: (props: PageProps) => import("./types.js").PdfJsxElement<"page">;
|
|
4
4
|
export declare const Static: (props: StaticProps) => import("./types.js").PdfJsxElement<"static">;
|
|
5
5
|
export declare const Header: (props: HeaderProps) => ReturnType<typeof createElementNode<"static">>;
|
|
6
6
|
export declare const Footer: (props: FooterProps) => ReturnType<typeof createElementNode<"static">>;
|
|
7
|
+
export declare const Absolute: (props: AbsoluteProps) => import("./types.js").PdfJsxElement<"absolute">;
|
|
7
8
|
export declare const Stack: (props: StackProps) => import("./types.js").PdfJsxElement<"stack">;
|
|
8
9
|
export declare const Row: (props: RowProps) => import("./types.js").PdfJsxElement<"row">;
|
|
9
10
|
export declare const Box: (props: BoxProps) => import("./types.js").PdfJsxElement<"box">;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { Box, Ellipse, Footer, Header, Image, Line, List, MultiVariableText, Page, PageBreak, Rectangle, Row, Spacer, Stack, Static, Svg, Table, Text, } from './components.js';
|
|
1
|
+
export { Absolute, Box, Ellipse, Footer, Header, Image, Line, List, MultiVariableText, Page, PageBreak, Rectangle, Row, Spacer, Stack, Static, Svg, Table, Text, } from './components.js';
|
|
2
2
|
export { renderToTemplate } from './render.js';
|
|
3
|
-
export type { BoxProps, BoxSides, CellStyle, EllipseProps, FooterProps, HeaderProps, ImageProps, LineProps, ListItem, ListProps, MultiVariableTextProps, MultiVariableTextValues, PageBreakProps, PageOrientation, PageProps, PageSize, PageSizePreset, PdfJsxChild, PdfJsxElement, RectangleProps, RenderOptions, RenderResult, RowProps, SpacerProps, StackProps, StaticPlacement, StaticProps, SvgProps, TableProps, TextProps, } from './types.js';
|
|
3
|
+
export type { AbsoluteProps, BoxProps, BoxSides, CellStyle, EllipseProps, FooterProps, HeaderProps, ImageProps, LineProps, ListItem, ListProps, MultiVariableTextProps, MultiVariableTextValues, PageBreakProps, PageOrientation, PageProps, PageSize, PageSizePreset, PdfJsxChild, PdfJsxElement, RectangleProps, RenderOptions, RenderResult, RowProps, SpacerProps, StackProps, StaticPlacement, StaticProps, SvgProps, TableProps, TextProps, } from './types.js';
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ var Footer = (props) => createElementNode("static", {
|
|
|
13
13
|
...props,
|
|
14
14
|
placement: "bottom"
|
|
15
15
|
});
|
|
16
|
+
var Absolute = makeBuiltin("absolute");
|
|
16
17
|
var Stack = makeBuiltin("stack");
|
|
17
18
|
var Row = makeBuiltin("row");
|
|
18
19
|
var Box = makeBuiltin("box");
|
|
@@ -45,6 +46,7 @@ var DEFAULT_DYNAMIC_FONT_SIZE = {
|
|
|
45
46
|
var renderToTemplate = async (node, options = {}) => {
|
|
46
47
|
validatePageBreakPlacement(node);
|
|
47
48
|
const expanded = expandPageBreaks(node);
|
|
49
|
+
validateAbsolutePlacement(expanded);
|
|
48
50
|
validateNoTopLevelStatic(expanded);
|
|
49
51
|
const pages = flattenChildren(expanded).filter((child) => isPdfJsxElement(child) && child.kind === "page");
|
|
50
52
|
if (pages.length === 0) throw new Error("@pdfme/jsx: renderToTemplate root must contain at least one <Page>.");
|
|
@@ -211,14 +213,20 @@ var layoutStaticBlocks = async (arg) => {
|
|
|
211
213
|
};
|
|
212
214
|
var layoutChildren = async (children, frame, mode, opts, ctx) => {
|
|
213
215
|
const items = flattenChildren(children);
|
|
214
|
-
const
|
|
216
|
+
const flowItems = items.filter((item) => !isAbsoluteElement(item));
|
|
217
|
+
const widths = mode === "row" ? resolveRowWidths(flowItems, frame.width, opts.gap) : void 0;
|
|
215
218
|
let cursor = 0;
|
|
216
219
|
let crossMax = 0;
|
|
220
|
+
let flowIndex = 0;
|
|
217
221
|
const layoutItems = [];
|
|
218
222
|
for (let i = 0; i < items.length; i += 1) {
|
|
219
223
|
const child = items[i];
|
|
224
|
+
if (isAbsoluteElement(child)) {
|
|
225
|
+
await renderAbsolute(child.props, child.children, frame, ctx);
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
220
228
|
const margin = getChildMargin(child);
|
|
221
|
-
const width = mode === "row" ? widths?.[
|
|
229
|
+
const width = mode === "row" ? widths?.[flowIndex] ?? 0 : resolveStackChildWidth(child, frame.width, margin);
|
|
222
230
|
const childFrame = mode === "stack" ? {
|
|
223
231
|
x: frame.x,
|
|
224
232
|
y: frame.y + cursor,
|
|
@@ -248,7 +256,8 @@ var layoutChildren = async (children, frame, mode, opts, ctx) => {
|
|
|
248
256
|
const dx = resolveAlignOffset(frame.width, outerWidth, opts.alignItems);
|
|
249
257
|
if (dx !== 0) shiftSchemas(ctx.schemas, schemaStart, schemaEnd, dx, 0);
|
|
250
258
|
}
|
|
251
|
-
cursor += mainSize + (
|
|
259
|
+
cursor += mainSize + (flowIndex < flowItems.length - 1 ? opts.gap : 0);
|
|
260
|
+
flowIndex += 1;
|
|
252
261
|
crossMax = Math.max(crossMax, mode === "stack" ? margin.left + size.width + margin.right : margin.top + size.height + margin.bottom);
|
|
253
262
|
}
|
|
254
263
|
const contentMainSize = cursor;
|
|
@@ -304,6 +313,7 @@ var getChildFlexGrow = (child) => {
|
|
|
304
313
|
const flexGrow = props.flexGrow ?? props.flex;
|
|
305
314
|
return typeof flexGrow === "number" ? Math.max(0, flexGrow) : void 0;
|
|
306
315
|
};
|
|
316
|
+
var isAbsoluteElement = (child) => isPdfJsxElement(child) && child.kind === "absolute";
|
|
307
317
|
var getStaticPlacement = (element) => {
|
|
308
318
|
const placement = element.props.placement ?? "top";
|
|
309
319
|
if (placement !== "top" && placement !== "bottom") throw new Error("@pdfme/jsx: <Static> placement must be \"top\" or \"bottom\".");
|
|
@@ -373,12 +383,31 @@ var renderElement = async (element, frame, parentMode, ctx) => {
|
|
|
373
383
|
}, frame, ctx);
|
|
374
384
|
case "table": return renderTable(props, frame, ctx);
|
|
375
385
|
case "static": throw new Error("@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.");
|
|
386
|
+
case "absolute": return renderAbsolute(props, element.children, frame, ctx);
|
|
376
387
|
default: return {
|
|
377
388
|
width: 0,
|
|
378
389
|
height: 0
|
|
379
390
|
};
|
|
380
391
|
}
|
|
381
392
|
};
|
|
393
|
+
var renderAbsolute = async (props, children, frame, ctx) => {
|
|
394
|
+
const x = props.x ?? 0;
|
|
395
|
+
const y = props.y ?? 0;
|
|
396
|
+
await layoutChildren(children, {
|
|
397
|
+
x: frame.x + x,
|
|
398
|
+
y: frame.y + y,
|
|
399
|
+
width: props.width ?? Math.max(0, frame.width - x),
|
|
400
|
+
height: props.height ?? Math.max(0, frame.height - y)
|
|
401
|
+
}, "stack", {
|
|
402
|
+
gap: 0,
|
|
403
|
+
alignItems: "stretch",
|
|
404
|
+
justifyContent: "start"
|
|
405
|
+
}, ctx);
|
|
406
|
+
return {
|
|
407
|
+
width: 0,
|
|
408
|
+
height: 0
|
|
409
|
+
};
|
|
410
|
+
};
|
|
382
411
|
var renderStack = (props, children, frame, ctx) => layoutChildren(children, {
|
|
383
412
|
...frame,
|
|
384
413
|
width: props.width ?? frame.width,
|
|
@@ -901,6 +930,7 @@ var PAGE_BREAK_PARENT_KINDS = new Set([
|
|
|
901
930
|
"box"
|
|
902
931
|
]);
|
|
903
932
|
var STATIC_CONTAINER_KINDS = new Set([
|
|
933
|
+
"absolute",
|
|
904
934
|
"stack",
|
|
905
935
|
"row",
|
|
906
936
|
"box"
|
|
@@ -914,6 +944,11 @@ var STATIC_LEAF_KINDS = new Set([
|
|
|
914
944
|
"ellipse",
|
|
915
945
|
"line"
|
|
916
946
|
]);
|
|
947
|
+
var ABSOLUTE_PARENT_KINDS = new Set([
|
|
948
|
+
"page",
|
|
949
|
+
"static",
|
|
950
|
+
"box"
|
|
951
|
+
]);
|
|
917
952
|
var validatePageBreakPlacement = (node, parentKind = void 0, canBreak = false) => {
|
|
918
953
|
for (const child of flattenForSplitting(node)) {
|
|
919
954
|
if (!isPdfJsxElement(child)) continue;
|
|
@@ -925,13 +960,20 @@ var validatePageBreakPlacement = (node, parentKind = void 0, canBreak = false) =
|
|
|
925
960
|
validatePageBreakPlacement(child.children, child.kind, childCanBreak);
|
|
926
961
|
}
|
|
927
962
|
};
|
|
963
|
+
var validateAbsolutePlacement = (node, parentKind = void 0) => {
|
|
964
|
+
for (const child of flattenForSplitting(node)) {
|
|
965
|
+
if (!isPdfJsxElement(child)) continue;
|
|
966
|
+
if (child.kind === "absolute" && (!parentKind || !ABSOLUTE_PARENT_KINDS.has(parentKind))) throw new Error("@pdfme/jsx: <Absolute> can only be used inside <Page>, <Static>, or <Box>.");
|
|
967
|
+
validateAbsolutePlacement(child.children, child.kind);
|
|
968
|
+
}
|
|
969
|
+
};
|
|
928
970
|
var validateStaticPlacement = (pages) => {
|
|
929
971
|
for (let pageIndex = 0; pageIndex < pages.length; pageIndex += 1) {
|
|
930
972
|
const page = pages[pageIndex];
|
|
931
973
|
for (const child of flattenForSplitting(page?.children ?? [])) {
|
|
932
974
|
if (isPdfJsxElement(child) && child.kind === "static") {
|
|
933
975
|
if (pageIndex !== 0) throw new Error("@pdfme/jsx: <Static> must appear before any <PageBreak> and can only be used inside the first <Page>.");
|
|
934
|
-
getStaticPlacement(child);
|
|
976
|
+
if (getStaticPlacement(child) === "bottom" && hasElementKind(child.children, "absolute")) throw new Error("@pdfme/jsx: <Absolute> is not supported inside bottom <Static>. Use top <Static> or <Page> for fixed page coordinates.");
|
|
935
977
|
validateStaticChildren(child.children);
|
|
936
978
|
continue;
|
|
937
979
|
}
|
|
@@ -946,6 +988,13 @@ var validateNoNestedStatic = (node) => {
|
|
|
946
988
|
validateNoNestedStatic(child);
|
|
947
989
|
}
|
|
948
990
|
};
|
|
991
|
+
var hasElementKind = (node, kind) => {
|
|
992
|
+
for (const child of flattenForSplitting(node)) {
|
|
993
|
+
if (!isPdfJsxElement(child)) continue;
|
|
994
|
+
if (child.kind === kind || hasElementKind(child.children, kind)) return true;
|
|
995
|
+
}
|
|
996
|
+
return false;
|
|
997
|
+
};
|
|
949
998
|
var validateNoTopLevelStatic = (node) => {
|
|
950
999
|
for (const child of flattenChildren(node)) if (isPdfJsxElement(child) && child.kind === "static") throw new Error("@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.");
|
|
951
1000
|
};
|
|
@@ -966,6 +1015,6 @@ var validateStaticLeafProps = (element) => {
|
|
|
966
1015
|
if (props.readOnly === false || props.name != null && props.readOnly !== true) throw new Error("@pdfme/jsx: <Static> children must be read-only.");
|
|
967
1016
|
};
|
|
968
1017
|
//#endregion
|
|
969
|
-
export { Box, Ellipse, Footer, Header, Image, Line, List, MultiVariableText, Page, PageBreak, Rectangle, Row, Spacer, Stack, Static, Svg, Table, Text, renderToTemplate };
|
|
1018
|
+
export { Absolute, Box, Ellipse, Footer, Header, Image, Line, List, MultiVariableText, Page, PageBreak, Rectangle, Row, Spacer, Stack, Static, Svg, Table, Text, renderToTemplate };
|
|
970
1019
|
|
|
971
1020
|
//# sourceMappingURL=index.js.map
|
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 FooterProps,\n HeaderProps,\n ImageProps,\n LineProps,\n ListProps,\n MultiVariableTextProps,\n PageBreakProps,\n PageProps,\n RectangleProps,\n RowProps,\n SpacerProps,\n StackProps,\n StaticProps,\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 Static = makeBuiltin<StaticProps, 'static'>('static');\nexport const Header = (props: HeaderProps): ReturnType<typeof createElementNode<'static'>> =>\n createElementNode('static', { ...props, placement: 'top' });\nexport const Footer = (props: FooterProps): ReturnType<typeof createElementNode<'static'>> =>\n createElementNode('static', { ...props, placement: 'bottom' });\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, isBlankPdf, 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 LayoutJustifyContent,\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 StaticPlacement,\n StaticProps,\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';\ntype LayoutItem = {\n schemaStart: number;\n schemaEnd: number;\n outerHeight: number;\n};\ntype StaticBlocks = Record<StaticPlacement, PdfJsxChild[]>;\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 validateNoTopLevelStatic(expanded);\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 validateStaticPlacement(pages);\n const { pages: bodyPages, blocks: staticBlocks } = extractStaticChildren(pages);\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 const staticSchemas: Schema[] = [];\n const hasStaticChildren = hasStaticBlocks(staticBlocks);\n\n if (hasStaticChildren && options.basePdf != null && !isBlankPdf(options.basePdf)) {\n throw new Error('@pdfme/jsx: <Static> is supported only with a blank basePdf.');\n }\n\n if (hasStaticChildren) {\n await layoutStaticBlocks({\n blocks: staticBlocks,\n frame: { x: 0, y: 0, width: pageSize.width, height: pageSize.height },\n staticSchemas,\n inputs,\n usedNames,\n nameCounters,\n defaultFont: firstPageProps.font,\n font,\n _cache,\n });\n }\n\n for (const page of bodyPages) {\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(\n page.children,\n frame,\n 'stack',\n { gap: 0, alignItems: 'stretch', justifyContent: 'start' },\n ctx,\n );\n pageSchemas.push(ctx.schemas);\n }\n\n const basePdf = options.basePdf ?? {\n width: pageSize.width,\n height: pageSize.height,\n padding: [firstMargin.top, firstMargin.right, firstMargin.bottom, firstMargin.left],\n };\n\n const template: Template = {\n basePdf:\n staticSchemas.length > 0 && isBlankPdf(basePdf)\n ? {\n ...basePdf,\n staticSchema: [...(basePdf.staticSchema ?? []), ...staticSchemas],\n }\n : basePdf,\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 extractStaticChildren = (\n pages: PdfJsxElement<'page'>[],\n): { pages: PdfJsxElement<'page'>[]; blocks: StaticBlocks } => {\n const blocks: StaticBlocks = { top: [], bottom: [] };\n const bodyPages = pages.map((page, pageIndex) => {\n const bodyChildren: PdfJsxChild[] = [];\n for (const child of flattenForSplitting(page.children)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n if (pageIndex === 0) {\n const placement = getStaticPlacement(child as PdfJsxElement<'static'>);\n blocks[placement].push(child.children);\n }\n continue;\n }\n bodyChildren.push(child);\n }\n return cloneElementWithChildren(page, bodyChildren) as PdfJsxElement<'page'>;\n });\n\n return { pages: bodyPages, blocks };\n};\n\nconst hasStaticBlocks = (blocks: StaticBlocks) => blocks.top.length > 0 || blocks.bottom.length > 0;\n\nconst layoutStaticBlocks = async (arg: {\n blocks: StaticBlocks;\n frame: Rect;\n staticSchemas: 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 for (const placement of ['top', 'bottom'] as const) {\n const children = arg.blocks[placement];\n if (children.length === 0) continue;\n\n const schemas: Schema[] = [];\n const ctx: RenderCtx = {\n schemas,\n inputs: arg.inputs,\n usedNames: arg.usedNames,\n nameCounters: arg.nameCounters,\n defaultFont: arg.defaultFont,\n font: arg.font,\n _cache: arg._cache,\n };\n const size = await layoutChildren(\n children,\n arg.frame,\n 'stack',\n {\n gap: 0,\n alignItems: 'stretch',\n justifyContent: 'start',\n },\n ctx,\n );\n\n if (placement === 'bottom') {\n shiftSchemas(schemas, 0, schemas.length, 0, Math.max(0, arg.frame.height - size.height));\n }\n arg.staticSchemas.push(...schemas);\n }\n};\n\nconst layoutChildren = async (\n children: PdfJsxChild | PdfJsxChild[],\n frame: Rect,\n mode: LayoutMode,\n opts: {\n gap: number;\n alignItems: LayoutAlignItems;\n justifyContent: LayoutJustifyContent;\n mainSize?: number;\n crossSize?: number;\n },\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 layoutItems: LayoutItem[] = [];\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 const mainSize =\n mode === 'stack'\n ? margin.top + size.height + margin.bottom\n : margin.left + width + margin.right;\n const outerHeight = margin.top + size.height + margin.bottom;\n\n layoutItems.push({ schemaStart, schemaEnd, outerHeight });\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 }\n\n cursor += mainSize + (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 const contentMainSize = cursor;\n const containerMainSize = opts.mainSize ?? contentMainSize;\n applyJustifyContent(ctx.schemas, layoutItems, mode, contentMainSize, containerMainSize, opts);\n\n if (mode === 'row') {\n const rowHeight = opts.crossSize ?? crossMax;\n for (const item of layoutItems) {\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: containerMainSize, height: rowHeight };\n }\n\n return { width: crossMax, height: containerMainSize };\n};\n\nconst resolveRowWidths = (\n items: (PdfJsxElement | string | number)[],\n frameWidth: number,\n gap: number,\n): number[] => {\n let usedWidth = 0;\n let totalGrow = 0;\n const parts = items.map((item) => {\n const margin = getChildMargin(item);\n const width = getChildWidth(item);\n const flexGrow = getChildFlexGrow(item);\n const grow = flexGrow ?? (width == null ? 1 : 0);\n const basis = width ?? 0;\n usedWidth += basis + margin.left + margin.right;\n totalGrow += grow;\n return { basis, grow };\n });\n\n const remaining = Math.max(0, frameWidth - usedWidth - Math.max(0, items.length - 1) * gap);\n const flexUnit = totalGrow > 0 ? remaining / totalGrow : 0;\n return parts.map(({ basis, grow }) => basis + grow * flexUnit);\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 getChildWidth = (child: PdfJsxElement | string | number): number | undefined => {\n if (typeof child === 'string' || typeof child === 'number') return undefined;\n const width = (child.props as { width?: number }).width;\n return typeof width === 'number' ? width : undefined;\n};\n\nconst getChildFlexGrow = (child: PdfJsxElement | string | number): number | undefined => {\n if (typeof child === 'string' || typeof child === 'number') return undefined;\n const props = child.props as { flex?: number; flexGrow?: number };\n const flexGrow = props.flexGrow ?? props.flex;\n return typeof flexGrow === 'number' ? Math.max(0, flexGrow) : undefined;\n};\n\nconst getStaticPlacement = (element: PdfJsxElement<'static'>): StaticPlacement => {\n const placement = (element.props as StaticProps).placement ?? 'top';\n if (placement !== 'top' && placement !== 'bottom') {\n throw new Error('@pdfme/jsx: <Static> placement must be \"top\" or \"bottom\".');\n }\n return placement;\n};\n\nconst resolveStackChildWidth = (\n child: PdfJsxElement | string | number,\n frameWidth: number,\n margin: Box,\n) => {\n const width = getChildWidth(child);\n if (width != null) return width;\n return Math.max(0, frameWidth - margin.left - margin.right);\n};\n\nconst applyJustifyContent = (\n schemas: Schema[],\n items: LayoutItem[],\n mode: LayoutMode,\n contentMainSize: number,\n containerMainSize: number,\n opts: { justifyContent: LayoutJustifyContent },\n) => {\n // Overflowing content has no extra main-axis space to distribute.\n const extraSpace = Math.max(0, containerMainSize - contentMainSize);\n if (extraSpace === 0 || opts.justifyContent === 'start') return;\n\n const extraGap =\n opts.justifyContent === 'space-between' && items.length > 1\n ? extraSpace / (items.length - 1)\n : 0;\n const startOffset =\n opts.justifyContent === 'center'\n ? extraSpace / 2\n : opts.justifyContent === 'end'\n ? extraSpace\n : 0;\n\n let runningExtraGap = 0;\n for (const item of items) {\n const offset = startOffset + runningExtraGap;\n if (offset !== 0) {\n shiftSchemas(\n schemas,\n item.schemaStart,\n item.schemaEnd,\n mode === 'row' ? offset : 0,\n mode === 'stack' ? offset : 0,\n );\n }\n runningExtraGap += extraGap;\n }\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 const shouldUseResolvedRowWidth = parentMode === 'row' && getChildFlexGrow(element) != null;\n const props = shouldUseResolvedRowWidth\n ? { ...element.props, width: frame.width }\n : element.props;\n\n switch (element.kind) {\n case 'stack':\n return renderStack(props as StackProps, element.children, frame, ctx);\n case 'row':\n return renderRow(props as RowProps, element.children, frame, ctx);\n case 'box':\n return renderBox(props as BoxProps, element.children, frame, parentMode, ctx);\n case 'spacer':\n return Promise.resolve(renderSpacer(props as SpacerProps));\n case 'text':\n return renderText({ ...(props as TextProps), children: element.children }, frame, ctx);\n case 'multiVariableText':\n return renderMultiVariableText(\n { ...(props as MultiVariableTextProps), children: element.children },\n frame,\n ctx,\n );\n case 'image':\n return renderImage(props as ImageProps, frame, ctx);\n case 'svg':\n return renderSvg({ ...(props as SvgProps), children: element.children }, frame, ctx);\n case 'rectangle':\n return renderShape('rectangle', props as RectangleProps, frame, ctx);\n case 'ellipse':\n return renderShape('ellipse', props as EllipseProps, frame, ctx);\n case 'line':\n return renderLine(props as LineProps, frame, ctx);\n case 'list':\n return renderList({ ...(props as ListProps), children: element.children }, frame, ctx);\n case 'table':\n return renderTable(props as TableProps, frame, ctx);\n case 'static':\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\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, height: props.height ?? frame.height },\n 'stack',\n {\n gap: props.gap ?? 0,\n alignItems: props.alignItems ?? 'stretch',\n justifyContent: props.justifyContent ?? 'start',\n mainSize: props.height,\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 {\n gap: props.gap ?? 0,\n alignItems: props.alignItems ?? 'start',\n justifyContent: props.justifyContent ?? 'start',\n mainSize: props.width,\n crossSize: props.height,\n },\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', justifyContent: 'start' },\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']);\nconst STATIC_CONTAINER_KINDS = new Set(['stack', 'row', 'box']);\nconst STATIC_LEAF_KINDS = new Set([\n 'spacer',\n 'text',\n 'image',\n 'svg',\n 'rectangle',\n 'ellipse',\n 'line',\n]);\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\nconst validateStaticPlacement = (pages: PdfJsxElement<'page'>[]) => {\n for (let pageIndex = 0; pageIndex < pages.length; pageIndex += 1) {\n const page = pages[pageIndex];\n for (const child of flattenForSplitting(page?.children ?? [])) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n if (pageIndex !== 0) {\n throw new Error(\n '@pdfme/jsx: <Static> must appear before any <PageBreak> and can only be used inside the first <Page>.',\n );\n }\n // Validate dynamic JavaScript callers before static children are extracted for layout.\n getStaticPlacement(child as PdfJsxElement<'static'>);\n validateStaticChildren(child.children);\n continue;\n }\n validateNoNestedStatic(child);\n }\n }\n};\n\nconst validateNoNestedStatic = (node: PdfJsxChild) => {\n if (!isPdfJsxElement(node)) return;\n for (const child of flattenForSplitting(node.children)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\n }\n validateNoNestedStatic(child);\n }\n};\n\nconst validateNoTopLevelStatic = (node: PdfJsxChild | PdfJsxChild[]) => {\n for (const child of flattenChildren(node)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\n }\n }\n};\n\nconst validateStaticChildren = (children: PdfJsxChild | PdfJsxChild[]) => {\n for (const child of flattenForSplitting(children)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (STATIC_CONTAINER_KINDS.has(child.kind)) {\n validateStaticChildren(child.children);\n continue;\n }\n\n if (!STATIC_LEAF_KINDS.has(child.kind)) {\n throw new Error(\n `@pdfme/jsx: <Static> does not support <${child.kind}> children. Supported: read-only Stack, Row, Box, Spacer, Text, Image, Svg, Rectangle, Ellipse, and Line.`,\n );\n }\n\n validateStaticLeafProps(child);\n }\n};\n\nconst validateStaticLeafProps = (element: PdfJsxElement) => {\n if (element.kind !== 'text' && element.kind !== 'image' && element.kind !== 'svg') return;\n const props = element.props as { name?: unknown; readOnly?: unknown };\n if (props.readOnly === false || (props.name != null && props.readOnly !== true)) {\n throw new Error('@pdfme/jsx: <Static> children must be read-only.');\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 AbsoluteProps,\n BoxProps,\n EllipseProps,\n FooterProps,\n HeaderProps,\n ImageProps,\n LineProps,\n ListProps,\n MultiVariableTextProps,\n PageBreakProps,\n PageProps,\n RectangleProps,\n RowProps,\n SpacerProps,\n StackProps,\n StaticProps,\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 Static = makeBuiltin<StaticProps, 'static'>('static');\nexport const Header = (props: HeaderProps): ReturnType<typeof createElementNode<'static'>> =>\n createElementNode('static', { ...props, placement: 'top' });\nexport const Footer = (props: FooterProps): ReturnType<typeof createElementNode<'static'>> =>\n createElementNode('static', { ...props, placement: 'bottom' });\nexport const Absolute = makeBuiltin<AbsoluteProps, 'absolute'>('absolute');\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, isBlankPdf, 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 AbsoluteProps,\n BoxProps,\n BoxSides,\n CellStyle,\n EllipseProps,\n ImageProps,\n LineProps,\n LayoutAlignItems,\n LayoutJustifyContent,\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 StaticPlacement,\n StaticProps,\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';\ntype LayoutItem = {\n schemaStart: number;\n schemaEnd: number;\n outerHeight: number;\n};\ntype StaticBlocks = Record<StaticPlacement, PdfJsxChild[]>;\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 validateAbsolutePlacement(expanded);\n validateNoTopLevelStatic(expanded);\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 validateStaticPlacement(pages);\n const { pages: bodyPages, blocks: staticBlocks } = extractStaticChildren(pages);\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 const staticSchemas: Schema[] = [];\n const hasStaticChildren = hasStaticBlocks(staticBlocks);\n\n if (hasStaticChildren && options.basePdf != null && !isBlankPdf(options.basePdf)) {\n throw new Error('@pdfme/jsx: <Static> is supported only with a blank basePdf.');\n }\n\n if (hasStaticChildren) {\n await layoutStaticBlocks({\n blocks: staticBlocks,\n frame: { x: 0, y: 0, width: pageSize.width, height: pageSize.height },\n staticSchemas,\n inputs,\n usedNames,\n nameCounters,\n defaultFont: firstPageProps.font,\n font,\n _cache,\n });\n }\n\n for (const page of bodyPages) {\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(\n page.children,\n frame,\n 'stack',\n { gap: 0, alignItems: 'stretch', justifyContent: 'start' },\n ctx,\n );\n pageSchemas.push(ctx.schemas);\n }\n\n const basePdf = options.basePdf ?? {\n width: pageSize.width,\n height: pageSize.height,\n padding: [firstMargin.top, firstMargin.right, firstMargin.bottom, firstMargin.left],\n };\n\n const template: Template = {\n basePdf:\n staticSchemas.length > 0 && isBlankPdf(basePdf)\n ? {\n ...basePdf,\n staticSchema: [...(basePdf.staticSchema ?? []), ...staticSchemas],\n }\n : basePdf,\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 extractStaticChildren = (\n pages: PdfJsxElement<'page'>[],\n): { pages: PdfJsxElement<'page'>[]; blocks: StaticBlocks } => {\n const blocks: StaticBlocks = { top: [], bottom: [] };\n const bodyPages = pages.map((page, pageIndex) => {\n const bodyChildren: PdfJsxChild[] = [];\n for (const child of flattenForSplitting(page.children)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n if (pageIndex === 0) {\n const placement = getStaticPlacement(child as PdfJsxElement<'static'>);\n blocks[placement].push(child.children);\n }\n continue;\n }\n bodyChildren.push(child);\n }\n return cloneElementWithChildren(page, bodyChildren) as PdfJsxElement<'page'>;\n });\n\n return { pages: bodyPages, blocks };\n};\n\nconst hasStaticBlocks = (blocks: StaticBlocks) => blocks.top.length > 0 || blocks.bottom.length > 0;\n\nconst layoutStaticBlocks = async (arg: {\n blocks: StaticBlocks;\n frame: Rect;\n staticSchemas: 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 for (const placement of ['top', 'bottom'] as const) {\n const children = arg.blocks[placement];\n if (children.length === 0) continue;\n\n const schemas: Schema[] = [];\n const ctx: RenderCtx = {\n schemas,\n inputs: arg.inputs,\n usedNames: arg.usedNames,\n nameCounters: arg.nameCounters,\n defaultFont: arg.defaultFont,\n font: arg.font,\n _cache: arg._cache,\n };\n const size = await layoutChildren(\n children,\n arg.frame,\n 'stack',\n {\n gap: 0,\n alignItems: 'stretch',\n justifyContent: 'start',\n },\n ctx,\n );\n\n if (placement === 'bottom') {\n shiftSchemas(schemas, 0, schemas.length, 0, Math.max(0, arg.frame.height - size.height));\n }\n arg.staticSchemas.push(...schemas);\n }\n};\n\nconst layoutChildren = async (\n children: PdfJsxChild | PdfJsxChild[],\n frame: Rect,\n mode: LayoutMode,\n opts: {\n gap: number;\n alignItems: LayoutAlignItems;\n justifyContent: LayoutJustifyContent;\n mainSize?: number;\n crossSize?: number;\n },\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const items = flattenChildren(children);\n const flowItems = items.filter((item) => !isAbsoluteElement(item));\n const widths = mode === 'row' ? resolveRowWidths(flowItems, frame.width, opts.gap) : undefined;\n let cursor = 0;\n let crossMax = 0;\n let flowIndex = 0;\n const layoutItems: LayoutItem[] = [];\n\n for (let i = 0; i < items.length; i += 1) {\n const child = items[i];\n if (isAbsoluteElement(child)) {\n await renderAbsolute(child.props as AbsoluteProps, child.children, frame, ctx);\n continue;\n }\n\n const margin = getChildMargin(child);\n const width =\n mode === 'row'\n ? (widths?.[flowIndex] ?? 0)\n : 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 const mainSize =\n mode === 'stack'\n ? margin.top + size.height + margin.bottom\n : margin.left + width + margin.right;\n const outerHeight = margin.top + size.height + margin.bottom;\n\n layoutItems.push({ schemaStart, schemaEnd, outerHeight });\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 }\n\n // flowIndex tracks the flow-only list so Absolute siblings do not affect gap accounting.\n cursor += mainSize + (flowIndex < flowItems.length - 1 ? opts.gap : 0);\n flowIndex += 1;\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 const contentMainSize = cursor;\n const containerMainSize = opts.mainSize ?? contentMainSize;\n applyJustifyContent(ctx.schemas, layoutItems, mode, contentMainSize, containerMainSize, opts);\n\n if (mode === 'row') {\n const rowHeight = opts.crossSize ?? crossMax;\n for (const item of layoutItems) {\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: containerMainSize, height: rowHeight };\n }\n\n return { width: crossMax, height: containerMainSize };\n};\n\nconst resolveRowWidths = (\n items: (PdfJsxElement | string | number)[],\n frameWidth: number,\n gap: number,\n): number[] => {\n let usedWidth = 0;\n let totalGrow = 0;\n const parts = items.map((item) => {\n const margin = getChildMargin(item);\n const width = getChildWidth(item);\n const flexGrow = getChildFlexGrow(item);\n const grow = flexGrow ?? (width == null ? 1 : 0);\n const basis = width ?? 0;\n usedWidth += basis + margin.left + margin.right;\n totalGrow += grow;\n return { basis, grow };\n });\n\n const remaining = Math.max(0, frameWidth - usedWidth - Math.max(0, items.length - 1) * gap);\n const flexUnit = totalGrow > 0 ? remaining / totalGrow : 0;\n return parts.map(({ basis, grow }) => basis + grow * flexUnit);\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 getChildWidth = (child: PdfJsxElement | string | number): number | undefined => {\n if (typeof child === 'string' || typeof child === 'number') return undefined;\n const width = (child.props as { width?: number }).width;\n return typeof width === 'number' ? width : undefined;\n};\n\nconst getChildFlexGrow = (child: PdfJsxElement | string | number): number | undefined => {\n if (typeof child === 'string' || typeof child === 'number') return undefined;\n const props = child.props as { flex?: number; flexGrow?: number };\n const flexGrow = props.flexGrow ?? props.flex;\n return typeof flexGrow === 'number' ? Math.max(0, flexGrow) : undefined;\n};\n\nconst isAbsoluteElement = (\n child: PdfJsxElement | string | number,\n): child is PdfJsxElement<'absolute'> => isPdfJsxElement(child) && child.kind === 'absolute';\n\nconst getStaticPlacement = (element: PdfJsxElement<'static'>): StaticPlacement => {\n const placement = (element.props as StaticProps).placement ?? 'top';\n if (placement !== 'top' && placement !== 'bottom') {\n throw new Error('@pdfme/jsx: <Static> placement must be \"top\" or \"bottom\".');\n }\n return placement;\n};\n\nconst resolveStackChildWidth = (\n child: PdfJsxElement | string | number,\n frameWidth: number,\n margin: Box,\n) => {\n const width = getChildWidth(child);\n if (width != null) return width;\n return Math.max(0, frameWidth - margin.left - margin.right);\n};\n\nconst applyJustifyContent = (\n schemas: Schema[],\n items: LayoutItem[],\n mode: LayoutMode,\n contentMainSize: number,\n containerMainSize: number,\n opts: { justifyContent: LayoutJustifyContent },\n) => {\n // Overflowing content has no extra main-axis space to distribute.\n const extraSpace = Math.max(0, containerMainSize - contentMainSize);\n if (extraSpace === 0 || opts.justifyContent === 'start') return;\n\n const extraGap =\n opts.justifyContent === 'space-between' && items.length > 1\n ? extraSpace / (items.length - 1)\n : 0;\n const startOffset =\n opts.justifyContent === 'center'\n ? extraSpace / 2\n : opts.justifyContent === 'end'\n ? extraSpace\n : 0;\n\n let runningExtraGap = 0;\n for (const item of items) {\n const offset = startOffset + runningExtraGap;\n if (offset !== 0) {\n shiftSchemas(\n schemas,\n item.schemaStart,\n item.schemaEnd,\n mode === 'row' ? offset : 0,\n mode === 'stack' ? offset : 0,\n );\n }\n runningExtraGap += extraGap;\n }\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 const shouldUseResolvedRowWidth = parentMode === 'row' && getChildFlexGrow(element) != null;\n const props = shouldUseResolvedRowWidth\n ? { ...element.props, width: frame.width }\n : element.props;\n\n switch (element.kind) {\n case 'stack':\n return renderStack(props as StackProps, element.children, frame, ctx);\n case 'row':\n return renderRow(props as RowProps, element.children, frame, ctx);\n case 'box':\n return renderBox(props as BoxProps, element.children, frame, parentMode, ctx);\n case 'spacer':\n return Promise.resolve(renderSpacer(props as SpacerProps));\n case 'text':\n return renderText({ ...(props as TextProps), children: element.children }, frame, ctx);\n case 'multiVariableText':\n return renderMultiVariableText(\n { ...(props as MultiVariableTextProps), children: element.children },\n frame,\n ctx,\n );\n case 'image':\n return renderImage(props as ImageProps, frame, ctx);\n case 'svg':\n return renderSvg({ ...(props as SvgProps), children: element.children }, frame, ctx);\n case 'rectangle':\n return renderShape('rectangle', props as RectangleProps, frame, ctx);\n case 'ellipse':\n return renderShape('ellipse', props as EllipseProps, frame, ctx);\n case 'line':\n return renderLine(props as LineProps, frame, ctx);\n case 'list':\n return renderList({ ...(props as ListProps), children: element.children }, frame, ctx);\n case 'table':\n return renderTable(props as TableProps, frame, ctx);\n case 'static':\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\n case 'absolute':\n return renderAbsolute(props as AbsoluteProps, element.children, frame, ctx);\n default:\n return { width: 0, height: 0 };\n }\n};\n\nconst renderAbsolute = async (\n props: AbsoluteProps,\n children: PdfJsxChild[],\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const x = props.x ?? 0;\n const y = props.y ?? 0;\n const childFrame = {\n x: frame.x + x,\n y: frame.y + y,\n width: props.width ?? Math.max(0, frame.width - x),\n height: props.height ?? Math.max(0, frame.height - y),\n };\n\n await layoutChildren(\n children,\n childFrame,\n 'stack',\n { gap: 0, alignItems: 'stretch', justifyContent: 'start' },\n ctx,\n );\n return { width: 0, height: 0 };\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, height: props.height ?? frame.height },\n 'stack',\n {\n gap: props.gap ?? 0,\n alignItems: props.alignItems ?? 'stretch',\n justifyContent: props.justifyContent ?? 'start',\n mainSize: props.height,\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 {\n gap: props.gap ?? 0,\n alignItems: props.alignItems ?? 'start',\n justifyContent: props.justifyContent ?? 'start',\n mainSize: props.width,\n crossSize: props.height,\n },\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', justifyContent: 'start' },\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']);\nconst STATIC_CONTAINER_KINDS = new Set(['absolute', 'stack', 'row', 'box']);\nconst STATIC_LEAF_KINDS = new Set([\n 'spacer',\n 'text',\n 'image',\n 'svg',\n 'rectangle',\n 'ellipse',\n 'line',\n]);\nconst ABSOLUTE_PARENT_KINDS = new Set(['page', 'static', '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\nconst validateAbsolutePlacement = (\n node: PdfJsxChild | PdfJsxChild[],\n parentKind: string | undefined = undefined,\n) => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (child.kind === 'absolute' && (!parentKind || !ABSOLUTE_PARENT_KINDS.has(parentKind))) {\n throw new Error('@pdfme/jsx: <Absolute> can only be used inside <Page>, <Static>, or <Box>.');\n }\n\n validateAbsolutePlacement(child.children, child.kind);\n }\n};\n\nconst validateStaticPlacement = (pages: PdfJsxElement<'page'>[]) => {\n for (let pageIndex = 0; pageIndex < pages.length; pageIndex += 1) {\n const page = pages[pageIndex];\n for (const child of flattenForSplitting(page?.children ?? [])) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n if (pageIndex !== 0) {\n throw new Error(\n '@pdfme/jsx: <Static> must appear before any <PageBreak> and can only be used inside the first <Page>.',\n );\n }\n // Validate dynamic JavaScript callers before static children are extracted for layout.\n const placement = getStaticPlacement(child as PdfJsxElement<'static'>);\n if (placement === 'bottom' && hasElementKind(child.children, 'absolute')) {\n throw new Error(\n '@pdfme/jsx: <Absolute> is not supported inside bottom <Static>. Use top <Static> or <Page> for fixed page coordinates.',\n );\n }\n validateStaticChildren(child.children);\n continue;\n }\n validateNoNestedStatic(child);\n }\n }\n};\n\nconst validateNoNestedStatic = (node: PdfJsxChild) => {\n if (!isPdfJsxElement(node)) return;\n for (const child of flattenForSplitting(node.children)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\n }\n validateNoNestedStatic(child);\n }\n};\n\nconst hasElementKind = (node: PdfJsxChild | PdfJsxChild[], kind: string): boolean => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n if (child.kind === kind || hasElementKind(child.children, kind)) return true;\n }\n return false;\n};\n\nconst validateNoTopLevelStatic = (node: PdfJsxChild | PdfJsxChild[]) => {\n for (const child of flattenChildren(node)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\n }\n }\n};\n\nconst validateStaticChildren = (children: PdfJsxChild | PdfJsxChild[]) => {\n for (const child of flattenForSplitting(children)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (STATIC_CONTAINER_KINDS.has(child.kind)) {\n validateStaticChildren(child.children);\n continue;\n }\n\n if (!STATIC_LEAF_KINDS.has(child.kind)) {\n throw new Error(\n `@pdfme/jsx: <Static> does not support <${child.kind}> children. Supported: read-only Stack, Row, Box, Spacer, Text, Image, Svg, Rectangle, Ellipse, and Line.`,\n );\n }\n\n validateStaticLeafProps(child);\n }\n};\n\nconst validateStaticLeafProps = (element: PdfJsxElement) => {\n if (element.kind !== 'text' && element.kind !== 'image' && element.kind !== 'svg') return;\n const props = element.props as { name?: unknown; readOnly?: unknown };\n if (props.readOnly === false || (props.name != null && props.readOnly !== true)) {\n throw new Error('@pdfme/jsx: <Static> children must be read-only.');\n }\n};\n"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { BasePdf, Font, PageOrientation, PageSize, Schema, Template } from '@pdfme/common';
|
|
2
2
|
import type { ALIGNMENT, ImageSchema, LIST_STYLE, ListItem as SchemaListItem, LineSchema, CellStyle as SchemaCellStyle, ShapeSchema, SVGSchema, TableSchema, TextSchema, MultiVariableTextSchema } from '@pdfme/schemas/types';
|
|
3
3
|
export type { PageOrientation, PageSize, PageSizePreset } from '@pdfme/common';
|
|
4
|
-
export type BuiltinKind = 'page' | 'static' | 'stack' | 'row' | 'box' | 'spacer' | 'text' | 'multiVariableText' | 'image' | 'svg' | 'rectangle' | 'ellipse' | 'line' | 'list' | 'table' | 'pagebreak';
|
|
4
|
+
export type BuiltinKind = 'page' | 'static' | 'absolute' | 'stack' | 'row' | 'box' | 'spacer' | 'text' | 'multiVariableText' | 'image' | 'svg' | 'rectangle' | 'ellipse' | 'line' | 'list' | 'table' | 'pagebreak';
|
|
5
5
|
export type PdfJsxElement<K extends BuiltinKind = BuiltinKind> = {
|
|
6
6
|
kind: K;
|
|
7
7
|
props: Record<string, unknown>;
|
|
@@ -57,6 +57,13 @@ export type StaticProps = {
|
|
|
57
57
|
};
|
|
58
58
|
export type HeaderProps = Omit<StaticProps, 'placement'>;
|
|
59
59
|
export type FooterProps = Omit<StaticProps, 'placement'>;
|
|
60
|
+
export type AbsoluteProps = {
|
|
61
|
+
x?: number;
|
|
62
|
+
y?: number;
|
|
63
|
+
width?: number;
|
|
64
|
+
height?: number;
|
|
65
|
+
children?: PdfJsxChild;
|
|
66
|
+
};
|
|
60
67
|
export type StackProps = LayoutProps & {
|
|
61
68
|
gap?: number;
|
|
62
69
|
width?: number;
|