@pdfme/jsx 6.1.2 → 6.1.3
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 +51 -33
- package/dist/components.d.ts +4 -4
- package/dist/index.d.ts +2 -2
- package/dist/index.js +154 -71
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.js +1 -1
- package/dist/jsx-runtime.js +1 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/{node-BeNL0xMl.js → node-B6TrQFvN.js} +1 -1
- package/dist/{node-BeNL0xMl.js.map → node-B6TrQFvN.js.map} +1 -1
- package/dist/types.d.ts +20 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,21 +4,23 @@ Small JSX authoring layer for creating pdfme templates from stacking layout prim
|
|
|
4
4
|
|
|
5
5
|
```tsx
|
|
6
6
|
/** @jsxImportSource @pdfme/jsx */
|
|
7
|
-
import { MultiVariableText, Page, Stack, Text, renderToTemplate } from '@pdfme/jsx';
|
|
7
|
+
import { Document, MultiVariableText, Page, Stack, Text, renderToTemplate } from '@pdfme/jsx';
|
|
8
8
|
|
|
9
9
|
const { template, inputs } = await renderToTemplate(
|
|
10
|
-
<
|
|
11
|
-
<
|
|
12
|
-
<
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
10
|
+
<Document margin={{ x: 12, y: 16 }}>
|
|
11
|
+
<Page>
|
|
12
|
+
<Stack gap={4}>
|
|
13
|
+
<Text size={18}>Invoice</Text>
|
|
14
|
+
<Text name="customerName">Alice</Text>
|
|
15
|
+
<MultiVariableText
|
|
16
|
+
name="message"
|
|
17
|
+
text="Hello **{name}**, status: `{status}`"
|
|
18
|
+
values={{ name: 'Alice **literal**', status: 'draft' }}
|
|
19
|
+
textFormat="inline-markdown"
|
|
20
|
+
/>
|
|
21
|
+
</Stack>
|
|
22
|
+
</Page>
|
|
23
|
+
</Document>,
|
|
22
24
|
);
|
|
23
25
|
```
|
|
24
26
|
|
|
@@ -40,33 +42,47 @@ it provides its own `jsx-runtime` and `jsx-dev-runtime`.
|
|
|
40
42
|
content.
|
|
41
43
|
- `Rectangle`, `Ellipse`, and `Line` are static visual schemas for backgrounds, dividers, and simple
|
|
42
44
|
shapes.
|
|
43
|
-
- `
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
- `Document` is the root component for document-level settings and repeated static content. It can
|
|
46
|
+
contain `Header`, `Footer`, `Static`, and `Page` children.
|
|
47
|
+
- `Document` props are defaults, not deep-merged style objects. If a `Page` specifies `margin`,
|
|
48
|
+
`size`, `orientation`, or `font`, that `Page` value replaces the `Document` value for that prop.
|
|
49
|
+
The generated blank `basePdf.padding` comes from the resolved margin of the first rendered page.
|
|
50
|
+
- `Header` and `Footer` render read-only content into blank `basePdf.staticSchema`. `Header` uses the
|
|
51
|
+
top margin area and `Footer` uses the bottom margin area, so body content stays inside the `Page`
|
|
52
|
+
margin frame.
|
|
53
|
+
- `Static` is a lower-level repeated overlay that uses full-page coordinates. It is useful for
|
|
54
|
+
watermarks and other fixed page-coordinate content. Custom `basePdf` is not supported when
|
|
55
|
+
document static content is present.
|
|
48
56
|
|
|
49
57
|
```tsx
|
|
50
|
-
<
|
|
51
|
-
<
|
|
52
|
-
</
|
|
53
|
-
|
|
54
|
-
<
|
|
55
|
-
</
|
|
58
|
+
<Document size="A4" margin={{ x: 16, y: 18 }}>
|
|
59
|
+
<Header>
|
|
60
|
+
<Text height={8}>Header</Text>
|
|
61
|
+
</Header>
|
|
62
|
+
<Footer>
|
|
63
|
+
<Text height={8}>Footer</Text>
|
|
64
|
+
</Footer>
|
|
65
|
+
<Page>
|
|
66
|
+
<Text height={8}>Body</Text>
|
|
67
|
+
</Page>
|
|
68
|
+
</Document>
|
|
56
69
|
```
|
|
57
70
|
|
|
71
|
+
- `Header`, `Footer`, and `Static` must be direct children of `Document`. They are intentionally not
|
|
72
|
+
allowed inside `Page`, because they render into document-level `staticSchema` and are repeated on
|
|
73
|
+
every page.
|
|
58
74
|
- Multiple `Static` blocks with the same placement are concatenated in declaration order. Top blocks
|
|
59
75
|
start at the top of the page; bottom blocks are stacked together in declaration order and anchored
|
|
60
|
-
to the page bottom, so the last bottom block sits at the page edge. If
|
|
61
|
-
|
|
76
|
+
to the page bottom, so the last bottom block sits at the page edge. If static content overlaps the
|
|
77
|
+
header/footer/body areas, pdfme will draw the schemas in static schema order.
|
|
62
78
|
- Static content currently accepts read-only `Stack`, `Row`, `Box`, `Spacer`, `Text`, `Image`, `Svg`,
|
|
63
79
|
`Rectangle`, `Ellipse`, and `Line` content. `MultiVariableText`, `List`, `Table`, input-backed
|
|
64
80
|
schemas, and `PageBreak` are rejected.
|
|
65
|
-
- `Absolute` can be used inside `Page`, top `Static`, or `Box` as a small manual
|
|
66
|
-
hatch. It uses the parent layout frame as its coordinate origin and does not
|
|
67
|
-
surrounding stack/row flow. When `width` or `height` is omitted, it uses the remaining
|
|
68
|
-
frame size from `x` / `y`. Direct `Stack` / `Row` support is intentionally left for later;
|
|
69
|
-
with an explicit-size `Box` when you need a local manual-placement frame inside flow content.
|
|
81
|
+
- `Absolute` can be used inside `Page`, `Header`, `Footer`, top `Static`, or `Box` as a small manual
|
|
82
|
+
placement escape hatch. It uses the parent layout frame as its coordinate origin and does not
|
|
83
|
+
advance the surrounding stack/row flow. When `width` or `height` is omitted, it uses the remaining
|
|
84
|
+
parent frame size from `x` / `y`. Direct `Stack` / `Row` support is intentionally left for later;
|
|
85
|
+
wrap with an explicit-size `Box` when you need a local manual-placement frame inside flow content.
|
|
70
86
|
|
|
71
87
|
```tsx
|
|
72
88
|
<Page margin={12}>
|
|
@@ -102,5 +118,7 @@ it provides its own `jsx-runtime` and `jsx-dev-runtime`.
|
|
|
102
118
|
`Row`, leaf schemas, `List`, and `Table`.
|
|
103
119
|
- All `Page` nodes in one `renderToTemplate` call must use the same page size, orientation, and
|
|
104
120
|
margin because a pdfme blank `basePdf` has one shared size and padding.
|
|
105
|
-
- `Table
|
|
106
|
-
`
|
|
121
|
+
- `Table columnWeights` are relative column width weights, not millimeter widths. They are
|
|
122
|
+
normalized to pdfme `headWidthPercentages`, for example `columnWeights={[70, 30]}`.
|
|
123
|
+
Missing or invalid weights default to `1`, so pass one weight per column when you need exact
|
|
124
|
+
ratios. Earlier beta builds used `widths`; use `columnWeights` going forward.
|
package/dist/components.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import type { AbsoluteProps, BoxProps, DocumentProps, EllipseProps, FooterProps, HeaderProps, ImageProps, LineProps, ListProps, MultiVariableTextProps, PageBreakProps, PageProps, RectangleProps, RowProps, SpacerProps, StackProps, StaticProps, SvgProps, TableProps, TextProps } from './types.js';
|
|
2
|
+
export declare const Document: (props: DocumentProps) => import("./types.js").PdfJsxElement<"document">;
|
|
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
|
-
export declare const Header: (props: HeaderProps) =>
|
|
6
|
-
export declare const Footer: (props: FooterProps) =>
|
|
5
|
+
export declare const Header: (props: HeaderProps) => import("./types.js").PdfJsxElement<"header">;
|
|
6
|
+
export declare const Footer: (props: FooterProps) => import("./types.js").PdfJsxElement<"footer">;
|
|
7
7
|
export declare const Absolute: (props: AbsoluteProps) => import("./types.js").PdfJsxElement<"absolute">;
|
|
8
8
|
export declare const Stack: (props: StackProps) => import("./types.js").PdfJsxElement<"stack">;
|
|
9
9
|
export declare const Row: (props: RowProps) => import("./types.js").PdfJsxElement<"row">;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { Absolute, 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, Document, 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 { 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';
|
|
3
|
+
export type { AbsoluteProps, BoxProps, BoxSides, CellStyle, DocumentProps, 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
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
import { a as isPdfJsxElement, n as cloneElementWithChildren, o as isPdfJsxFragment, r as createElementNode } from "./node-
|
|
1
|
+
import { a as isPdfJsxElement, n as cloneElementWithChildren, o as isPdfJsxFragment, r as createElementNode } from "./node-B6TrQFvN.js";
|
|
2
2
|
import { getDefaultFont, isBlankPdf, pt2mm, resolvePageSize } from "@pdfme/common";
|
|
3
3
|
import { escapeInlineMarkdown, getVariableNames, measureTextHeight, visitVariables } from "@pdfme/schemas/utils";
|
|
4
4
|
//#region src/components.ts
|
|
5
5
|
var makeBuiltin = (kind) => (props) => createElementNode(kind, props);
|
|
6
|
+
var Document = makeBuiltin("document");
|
|
6
7
|
var Page = makeBuiltin("page");
|
|
7
8
|
var Static = makeBuiltin("static");
|
|
8
|
-
var Header = (
|
|
9
|
-
|
|
10
|
-
placement: "top"
|
|
11
|
-
});
|
|
12
|
-
var Footer = (props) => createElementNode("static", {
|
|
13
|
-
...props,
|
|
14
|
-
placement: "bottom"
|
|
15
|
-
});
|
|
9
|
+
var Header = makeBuiltin("header");
|
|
10
|
+
var Footer = makeBuiltin("footer");
|
|
16
11
|
var Absolute = makeBuiltin("absolute");
|
|
17
12
|
var Stack = makeBuiltin("stack");
|
|
18
13
|
var Row = makeBuiltin("row");
|
|
@@ -45,17 +40,16 @@ var DEFAULT_DYNAMIC_FONT_SIZE = {
|
|
|
45
40
|
};
|
|
46
41
|
var renderToTemplate = async (node, options = {}) => {
|
|
47
42
|
validatePageBreakPlacement(node);
|
|
48
|
-
const
|
|
49
|
-
validateAbsolutePlacement(
|
|
50
|
-
|
|
51
|
-
const pages
|
|
43
|
+
const root = resolveRenderRoot(node);
|
|
44
|
+
validateAbsolutePlacement(root.children);
|
|
45
|
+
validateStaticPlacement(root.children, root.hasDocument);
|
|
46
|
+
const { pages: rawPages, blocks: staticBlocks } = extractDocumentChildren(root);
|
|
47
|
+
const pages = rawPages.map((page) => applyDocumentPageDefaults(page, root.documentProps));
|
|
52
48
|
if (pages.length === 0) throw new Error("@pdfme/jsx: renderToTemplate root must contain at least one <Page>.");
|
|
53
49
|
const firstPageProps = pages[0]?.props;
|
|
54
50
|
const firstMargin = resolveBoxSides(firstPageProps.margin);
|
|
55
51
|
const pageSize = resolvePageSize(firstPageProps.size, firstPageProps.orientation);
|
|
56
52
|
validateConsistentPageProps(pages, pageSize, firstMargin);
|
|
57
|
-
validateStaticPlacement(pages);
|
|
58
|
-
const { pages: bodyPages, blocks: staticBlocks } = extractStaticChildren(pages);
|
|
59
53
|
const inputs = {};
|
|
60
54
|
const usedNames = /* @__PURE__ */ new Set();
|
|
61
55
|
const nameCounters = {};
|
|
@@ -64,15 +58,11 @@ var renderToTemplate = async (node, options = {}) => {
|
|
|
64
58
|
const pageSchemas = [];
|
|
65
59
|
const staticSchemas = [];
|
|
66
60
|
const hasStaticChildren = hasStaticBlocks(staticBlocks);
|
|
67
|
-
if (hasStaticChildren && options.basePdf != null && !isBlankPdf(options.basePdf)) throw new Error("@pdfme/jsx: <Static>
|
|
61
|
+
if (hasStaticChildren && options.basePdf != null && !isBlankPdf(options.basePdf)) throw new Error("@pdfme/jsx: <Header>, <Footer>, and <Static> are supported only with a blank basePdf.");
|
|
68
62
|
if (hasStaticChildren) await layoutStaticBlocks({
|
|
69
63
|
blocks: staticBlocks,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
y: 0,
|
|
73
|
-
width: pageSize.width,
|
|
74
|
-
height: pageSize.height
|
|
75
|
-
},
|
|
64
|
+
margin: firstMargin,
|
|
65
|
+
pageSize,
|
|
76
66
|
staticSchemas,
|
|
77
67
|
inputs,
|
|
78
68
|
usedNames,
|
|
@@ -81,7 +71,7 @@ var renderToTemplate = async (node, options = {}) => {
|
|
|
81
71
|
font,
|
|
82
72
|
_cache
|
|
83
73
|
});
|
|
84
|
-
for (const page of
|
|
74
|
+
for (const page of pages) {
|
|
85
75
|
const props = page.props;
|
|
86
76
|
const margin = resolveBoxSides(props.margin);
|
|
87
77
|
const frame = {
|
|
@@ -167,33 +157,113 @@ var flattenForSplitting = (children) => {
|
|
|
167
157
|
return [children];
|
|
168
158
|
};
|
|
169
159
|
var expandPageBreaks = (node) => splitChildrenByPageBreak(node).flat();
|
|
170
|
-
var
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
160
|
+
var STATIC_DIRECT_KINDS = new Set([
|
|
161
|
+
"header",
|
|
162
|
+
"footer",
|
|
163
|
+
"static"
|
|
164
|
+
]);
|
|
165
|
+
var createEmptyStaticBlocks = () => ({
|
|
166
|
+
footer: [],
|
|
167
|
+
header: [],
|
|
168
|
+
staticBottom: [],
|
|
169
|
+
staticTop: []
|
|
170
|
+
});
|
|
171
|
+
var resolveRenderRoot = (node) => {
|
|
172
|
+
const topLevelChildren = flattenChildren(node);
|
|
173
|
+
const documents = topLevelChildren.filter((child) => isPdfJsxElement(child) && child.kind === "document");
|
|
174
|
+
if (documents.length === 0) return {
|
|
175
|
+
children: expandPageBreaks(node),
|
|
176
|
+
hasDocument: false
|
|
174
177
|
};
|
|
178
|
+
if (documents.length > 1) throw new Error("@pdfme/jsx: only one <Document> root is supported.");
|
|
179
|
+
if (topLevelChildren.some((child) => child !== documents[0])) throw new Error("@pdfme/jsx: <Document> must be the only root element.");
|
|
180
|
+
const document = documents[0];
|
|
175
181
|
return {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
182
|
+
children: expandPageBreaks(document.children),
|
|
183
|
+
documentProps: document.props,
|
|
184
|
+
hasDocument: true
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
var extractDocumentChildren = (root) => {
|
|
188
|
+
const blocks = createEmptyStaticBlocks();
|
|
189
|
+
const pages = [];
|
|
190
|
+
for (const child of flattenChildren(root.children)) {
|
|
191
|
+
if (!isPdfJsxElement(child)) continue;
|
|
192
|
+
if (child.kind === "page") {
|
|
193
|
+
pages.push(child);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (!root.hasDocument || !STATIC_DIRECT_KINDS.has(child.kind)) continue;
|
|
197
|
+
if (child.kind === "header") blocks.header.push(...child.children);
|
|
198
|
+
else if (child.kind === "footer") blocks.footer.push(...child.children);
|
|
199
|
+
else if (child.kind === "static") blocks[getStaticPlacement(child) === "top" ? "staticTop" : "staticBottom"].push(...child.children);
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
pages,
|
|
187
203
|
blocks
|
|
188
204
|
};
|
|
189
205
|
};
|
|
190
|
-
var
|
|
206
|
+
var applyDocumentPageDefaults = (page, documentProps) => {
|
|
207
|
+
if (!documentProps) return page;
|
|
208
|
+
const { children: _children, ...props } = documentProps;
|
|
209
|
+
return {
|
|
210
|
+
...page,
|
|
211
|
+
props: {
|
|
212
|
+
...props,
|
|
213
|
+
...page.props
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
var hasStaticBlocks = (blocks) => blocks.header.length > 0 || blocks.footer.length > 0 || blocks.staticTop.length > 0 || blocks.staticBottom.length > 0;
|
|
191
218
|
var layoutStaticBlocks = async (arg) => {
|
|
192
|
-
|
|
193
|
-
|
|
219
|
+
const contentWidth = Math.max(0, arg.pageSize.width - arg.margin.left - arg.margin.right);
|
|
220
|
+
const blockFrames = [
|
|
221
|
+
{
|
|
222
|
+
children: arg.blocks.staticTop,
|
|
223
|
+
frame: {
|
|
224
|
+
x: 0,
|
|
225
|
+
y: 0,
|
|
226
|
+
width: arg.pageSize.width,
|
|
227
|
+
height: arg.pageSize.height
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
children: arg.blocks.header,
|
|
232
|
+
frame: {
|
|
233
|
+
x: arg.margin.left,
|
|
234
|
+
y: 0,
|
|
235
|
+
width: contentWidth,
|
|
236
|
+
height: arg.margin.top
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
children: arg.blocks.footer,
|
|
241
|
+
frame: {
|
|
242
|
+
x: arg.margin.left,
|
|
243
|
+
y: arg.pageSize.height - arg.margin.bottom,
|
|
244
|
+
width: contentWidth,
|
|
245
|
+
height: arg.margin.bottom
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
children: arg.blocks.staticBottom,
|
|
250
|
+
frame: {
|
|
251
|
+
x: 0,
|
|
252
|
+
y: 0,
|
|
253
|
+
width: arg.pageSize.width,
|
|
254
|
+
height: arg.pageSize.height
|
|
255
|
+
},
|
|
256
|
+
placement: "bottom"
|
|
257
|
+
}
|
|
258
|
+
];
|
|
259
|
+
for (const { children, frame, placement } of blockFrames) {
|
|
194
260
|
if (children.length === 0) continue;
|
|
195
261
|
const schemas = [];
|
|
196
|
-
const
|
|
262
|
+
const size = await layoutChildren(children, frame, "stack", {
|
|
263
|
+
gap: 0,
|
|
264
|
+
alignItems: "stretch",
|
|
265
|
+
justifyContent: "start"
|
|
266
|
+
}, {
|
|
197
267
|
schemas,
|
|
198
268
|
inputs: arg.inputs,
|
|
199
269
|
usedNames: arg.usedNames,
|
|
@@ -201,13 +271,8 @@ var layoutStaticBlocks = async (arg) => {
|
|
|
201
271
|
defaultFont: arg.defaultFont,
|
|
202
272
|
font: arg.font,
|
|
203
273
|
_cache: arg._cache
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
gap: 0,
|
|
207
|
-
alignItems: "stretch",
|
|
208
|
-
justifyContent: "start"
|
|
209
|
-
}, ctx);
|
|
210
|
-
if (placement === "bottom") shiftSchemas(schemas, 0, schemas.length, 0, Math.max(0, arg.frame.height - size.height));
|
|
274
|
+
});
|
|
275
|
+
if (placement === "bottom") shiftSchemas(schemas, 0, schemas.length, 0, Math.max(0, frame.height - size.height));
|
|
211
276
|
arg.staticSchemas.push(...schemas);
|
|
212
277
|
}
|
|
213
278
|
};
|
|
@@ -382,7 +447,10 @@ var renderElement = async (element, frame, parentMode, ctx) => {
|
|
|
382
447
|
children: element.children
|
|
383
448
|
}, frame, ctx);
|
|
384
449
|
case "table": return renderTable(props, frame, ctx);
|
|
385
|
-
case "
|
|
450
|
+
case "document": throw new Error("@pdfme/jsx: <Document> must be the root element.");
|
|
451
|
+
case "header":
|
|
452
|
+
case "footer":
|
|
453
|
+
case "static": throw new Error("@pdfme/jsx: <Header>, <Footer>, and <Static> can only be used as direct children of <Document>.");
|
|
386
454
|
case "absolute": return renderAbsolute(props, element.children, frame, ctx);
|
|
387
455
|
default: return {
|
|
388
456
|
width: 0,
|
|
@@ -771,7 +839,7 @@ var renderTable = (props, frame, ctx) => {
|
|
|
771
839
|
showHead,
|
|
772
840
|
repeatHead: props.repeatHead ?? false,
|
|
773
841
|
head: props.head,
|
|
774
|
-
headWidthPercentages:
|
|
842
|
+
headWidthPercentages: normalizeColumnWeights(props.columnWeights, props.head.length),
|
|
775
843
|
tableStyles: {
|
|
776
844
|
borderColor: props.tableStyles?.borderColor ?? "#000000",
|
|
777
845
|
borderWidth: props.tableStyles?.borderWidth ?? .3
|
|
@@ -842,8 +910,15 @@ var substituteMultiVariableText = (templateText, values, escapeMarkdown) => {
|
|
|
842
910
|
});
|
|
843
911
|
return result + templateText.slice(lastIndex);
|
|
844
912
|
};
|
|
845
|
-
var
|
|
846
|
-
if (
|
|
913
|
+
var normalizeColumnWeights = (columnWeights, columnCount) => {
|
|
914
|
+
if (columnWeights && columnWeights.length > 0) {
|
|
915
|
+
const normalizedWidths = Array.from({ length: columnCount }, (_, index) => {
|
|
916
|
+
const width = columnWeights[index];
|
|
917
|
+
return typeof width === "number" && Number.isFinite(width) && width > 0 ? width : 1;
|
|
918
|
+
});
|
|
919
|
+
const totalWidth = normalizedWidths.reduce((sum, width) => sum + width, 0);
|
|
920
|
+
if (totalWidth > 0) return normalizedWidths.map((width) => width / totalWidth * 100);
|
|
921
|
+
}
|
|
847
922
|
if (columnCount <= 0) return [];
|
|
848
923
|
return Array.from({ length: columnCount }, () => 100 / columnCount);
|
|
849
924
|
};
|
|
@@ -948,9 +1023,16 @@ var STATIC_LEAF_KINDS = new Set([
|
|
|
948
1023
|
]);
|
|
949
1024
|
var ABSOLUTE_PARENT_KINDS = new Set([
|
|
950
1025
|
"page",
|
|
1026
|
+
"header",
|
|
1027
|
+
"footer",
|
|
951
1028
|
"static",
|
|
952
1029
|
"box"
|
|
953
1030
|
]);
|
|
1031
|
+
var STATIC_BLOCK_KINDS = new Set([
|
|
1032
|
+
"header",
|
|
1033
|
+
"footer",
|
|
1034
|
+
"static"
|
|
1035
|
+
]);
|
|
954
1036
|
var validatePageBreakPlacement = (node, parentKind = void 0, canBreak = false) => {
|
|
955
1037
|
for (const child of flattenForSplitting(node)) {
|
|
956
1038
|
if (!isPdfJsxElement(child)) continue;
|
|
@@ -965,29 +1047,33 @@ var validatePageBreakPlacement = (node, parentKind = void 0, canBreak = false) =
|
|
|
965
1047
|
var validateAbsolutePlacement = (node, parentKind = void 0) => {
|
|
966
1048
|
for (const child of flattenForSplitting(node)) {
|
|
967
1049
|
if (!isPdfJsxElement(child)) continue;
|
|
968
|
-
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>.");
|
|
1050
|
+
if (child.kind === "absolute" && (!parentKind || !ABSOLUTE_PARENT_KINDS.has(parentKind))) throw new Error("@pdfme/jsx: <Absolute> can only be used inside <Page>, <Header>, <Footer>, <Static>, or <Box>.");
|
|
969
1051
|
validateAbsolutePlacement(child.children, child.kind);
|
|
970
1052
|
}
|
|
971
1053
|
};
|
|
972
|
-
var validateStaticPlacement = (
|
|
973
|
-
for (
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1054
|
+
var validateStaticPlacement = (children, hasDocument) => {
|
|
1055
|
+
for (const child of flattenChildren(children)) {
|
|
1056
|
+
if (!isPdfJsxElement(child)) {
|
|
1057
|
+
if (hasDocument && String(child).trim() !== "") throw new Error("@pdfme/jsx: <Document> children must be <Header>, <Footer>, <Static>, or <Page>.");
|
|
1058
|
+
continue;
|
|
1059
|
+
}
|
|
1060
|
+
if (STATIC_BLOCK_KINDS.has(child.kind)) {
|
|
1061
|
+
if (!hasDocument) throw new Error("@pdfme/jsx: <Header>, <Footer>, and <Static> can only be used as direct children of <Document>.");
|
|
1062
|
+
if (child.kind === "static") {
|
|
1063
|
+
if (getStaticPlacement(child) === "bottom" && hasElementKind(child.children, "absolute")) throw new Error("@pdfme/jsx: <Absolute> is not supported inside bottom <Static>. Use top <Static>, <Header>, <Footer>, or <Page> for fixed page coordinates.");
|
|
981
1064
|
}
|
|
982
|
-
|
|
1065
|
+
validateStaticChildren(child.children);
|
|
1066
|
+
continue;
|
|
983
1067
|
}
|
|
1068
|
+
if (hasDocument && child.kind !== "page") throw new Error("@pdfme/jsx: <Document> children must be <Header>, <Footer>, <Static>, or <Page>.");
|
|
1069
|
+
validateNoNestedStaticBlock(child);
|
|
984
1070
|
}
|
|
985
1071
|
};
|
|
986
|
-
var
|
|
1072
|
+
var validateNoNestedStaticBlock = (node) => {
|
|
987
1073
|
if (!isPdfJsxElement(node)) return;
|
|
988
1074
|
for (const child of flattenForSplitting(node.children)) {
|
|
989
|
-
if (isPdfJsxElement(child) && child.kind
|
|
990
|
-
|
|
1075
|
+
if (isPdfJsxElement(child) && STATIC_BLOCK_KINDS.has(child.kind)) throw new Error("@pdfme/jsx: <Header>, <Footer>, and <Static> can only be used as direct children of <Document>.");
|
|
1076
|
+
validateNoNestedStaticBlock(child);
|
|
991
1077
|
}
|
|
992
1078
|
};
|
|
993
1079
|
var hasElementKind = (node, kind) => {
|
|
@@ -997,9 +1083,6 @@ var hasElementKind = (node, kind) => {
|
|
|
997
1083
|
}
|
|
998
1084
|
return false;
|
|
999
1085
|
};
|
|
1000
|
-
var validateNoTopLevelStatic = (node) => {
|
|
1001
|
-
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>.");
|
|
1002
|
-
};
|
|
1003
1086
|
var validateStaticChildren = (children) => {
|
|
1004
1087
|
for (const child of flattenForSplitting(children)) {
|
|
1005
1088
|
if (!isPdfJsxElement(child)) continue;
|
|
@@ -1017,6 +1100,6 @@ var validateStaticLeafProps = (element) => {
|
|
|
1017
1100
|
if (props.readOnly === false || props.name != null && props.readOnly !== true) throw new Error("@pdfme/jsx: <Static> children must be read-only.");
|
|
1018
1101
|
};
|
|
1019
1102
|
//#endregion
|
|
1020
|
-
export { Absolute, Box, Ellipse, Footer, Header, Image, Line, List, MultiVariableText, Page, PageBreak, Rectangle, Row, Spacer, Stack, Static, Svg, Table, Text, renderToTemplate };
|
|
1103
|
+
export { Absolute, Box, Document, Ellipse, Footer, Header, Image, Line, List, MultiVariableText, Page, PageBreak, Rectangle, Row, Spacer, Stack, Static, Svg, Table, Text, renderToTemplate };
|
|
1021
1104
|
|
|
1022
1105
|
//# 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 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 = resolveBoxSides(props.borderWidth);\n if (props.padding != null) schema.padding = resolveBoxSides(props.padding);\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 = resolveBoxSides(props.borderWidth);\n if (props.padding != null) schema.padding = resolveBoxSides(props.padding);\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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"}
|
|
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 DocumentProps,\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 Document = makeBuiltin<DocumentProps, 'document'>('document');\nexport const Page = makeBuiltin<PageProps, 'page'>('page');\nexport const Static = makeBuiltin<StaticProps, 'static'>('static');\nexport const Header = makeBuiltin<HeaderProps, 'header'>('header');\nexport const Footer = makeBuiltin<FooterProps, 'footer'>('footer');\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 DocumentProps,\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 = {\n footer: PdfJsxChild[];\n header: PdfJsxChild[];\n staticBottom: PdfJsxChild[];\n staticTop: PdfJsxChild[];\n};\ntype RenderRoot = {\n children: PdfJsxChild[];\n documentProps?: DocumentProps;\n hasDocument: boolean;\n};\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 root = resolveRenderRoot(node);\n validateAbsolutePlacement(root.children);\n validateStaticPlacement(root.children, root.hasDocument);\n const { pages: rawPages, blocks: staticBlocks } = extractDocumentChildren(root);\n const pages = rawPages.map((page) => applyDocumentPageDefaults(page, root.documentProps));\n\n if (pages.length === 0) {\n throw new Error('@pdfme/jsx: renderToTemplate root must contain at least one <Page>.');\n }\n\n const firstPageProps = pages[0]?.props as PageProps;\n const firstMargin = resolveBoxSides(firstPageProps.margin);\n const pageSize = resolvePageSize(firstPageProps.size, firstPageProps.orientation);\n validateConsistentPageProps(pages, pageSize, firstMargin);\n const inputs: Record<string, string> = {};\n const usedNames = new Set<string>();\n const nameCounters: Record<string, number> = {};\n const font = options.font ?? getDefaultFont();\n const _cache = new Map<string | number, unknown>();\n const pageSchemas: Schema[][] = [];\n const staticSchemas: Schema[] = [];\n const hasStaticChildren = hasStaticBlocks(staticBlocks);\n\n if (hasStaticChildren && options.basePdf != null && !isBlankPdf(options.basePdf)) {\n throw new Error(\n '@pdfme/jsx: <Header>, <Footer>, and <Static> are supported only with a blank basePdf.',\n );\n }\n\n if (hasStaticChildren) {\n await layoutStaticBlocks({\n blocks: staticBlocks,\n margin: firstMargin,\n pageSize,\n staticSchemas,\n inputs,\n usedNames,\n nameCounters,\n defaultFont: firstPageProps.font,\n font,\n _cache,\n });\n }\n\n for (const page of pages) {\n const props = page.props as PageProps;\n const margin = resolveBoxSides(props.margin);\n const frame = {\n x: margin.left,\n y: margin.top,\n width: pageSize.width - margin.left - margin.right,\n height: pageSize.height - margin.top - margin.bottom,\n };\n const ctx: RenderCtx = {\n schemas: [],\n inputs,\n usedNames,\n nameCounters,\n defaultFont: props.font,\n font,\n _cache,\n };\n await layoutChildren(\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 STATIC_DIRECT_KINDS = new Set(['header', 'footer', 'static']);\n\nconst createEmptyStaticBlocks = (): StaticBlocks => ({\n footer: [],\n header: [],\n staticBottom: [],\n staticTop: [],\n});\n\nconst resolveRenderRoot = (node: PdfJsxChild): RenderRoot => {\n const topLevelChildren = flattenChildren(node);\n const documents = topLevelChildren.filter(\n (child): child is PdfJsxElement<'document'> =>\n isPdfJsxElement(child) && child.kind === 'document',\n );\n\n if (documents.length === 0) {\n return { children: expandPageBreaks(node), hasDocument: false };\n }\n\n if (documents.length > 1) {\n throw new Error('@pdfme/jsx: only one <Document> root is supported.');\n }\n\n if (topLevelChildren.some((child) => child !== documents[0])) {\n throw new Error('@pdfme/jsx: <Document> must be the only root element.');\n }\n\n const document = documents[0];\n return {\n children: expandPageBreaks(document.children),\n documentProps: document.props as DocumentProps,\n hasDocument: true,\n };\n};\n\nconst extractDocumentChildren = (\n root: RenderRoot,\n): { pages: PdfJsxElement<'page'>[]; blocks: StaticBlocks } => {\n const blocks = createEmptyStaticBlocks();\n const pages: PdfJsxElement<'page'>[] = [];\n\n for (const child of flattenChildren(root.children)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (child.kind === 'page') {\n pages.push(child as PdfJsxElement<'page'>);\n continue;\n }\n\n if (!root.hasDocument || !STATIC_DIRECT_KINDS.has(child.kind)) continue;\n\n if (child.kind === 'header') {\n blocks.header.push(...child.children);\n } else if (child.kind === 'footer') {\n blocks.footer.push(...child.children);\n } else if (child.kind === 'static') {\n const placement = getStaticPlacement(child as PdfJsxElement<'static'>);\n blocks[placement === 'top' ? 'staticTop' : 'staticBottom'].push(...child.children);\n }\n }\n\n return { pages, blocks };\n};\n\nconst applyDocumentPageDefaults = (\n page: PdfJsxElement<'page'>,\n documentProps: DocumentProps | undefined,\n): PdfJsxElement<'page'> => {\n if (!documentProps) return page;\n const { children: _children, ...props } = documentProps;\n return {\n ...page,\n props: {\n ...props,\n ...page.props,\n },\n };\n};\n\nconst hasStaticBlocks = (blocks: StaticBlocks) =>\n blocks.header.length > 0 ||\n blocks.footer.length > 0 ||\n blocks.staticTop.length > 0 ||\n blocks.staticBottom.length > 0;\n\nconst layoutStaticBlocks = async (arg: {\n blocks: StaticBlocks;\n margin: Box;\n pageSize: { width: number; height: number };\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 const contentWidth = Math.max(0, arg.pageSize.width - arg.margin.left - arg.margin.right);\n const blockFrames: Array<{ children: PdfJsxChild[]; frame: Rect; placement?: StaticPlacement }> =\n [\n {\n children: arg.blocks.staticTop,\n frame: { x: 0, y: 0, width: arg.pageSize.width, height: arg.pageSize.height },\n },\n {\n children: arg.blocks.header,\n frame: {\n x: arg.margin.left,\n y: 0,\n width: contentWidth,\n height: arg.margin.top,\n },\n },\n {\n children: arg.blocks.footer,\n frame: {\n x: arg.margin.left,\n y: arg.pageSize.height - arg.margin.bottom,\n width: contentWidth,\n height: arg.margin.bottom,\n },\n },\n {\n children: arg.blocks.staticBottom,\n frame: { x: 0, y: 0, width: arg.pageSize.width, height: arg.pageSize.height },\n placement: 'bottom',\n },\n ];\n\n for (const { children, frame, placement } of blockFrames) {\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 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, 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 'document':\n throw new Error('@pdfme/jsx: <Document> must be the root element.');\n case 'header':\n case 'footer':\n case 'static':\n throw new Error(\n '@pdfme/jsx: <Header>, <Footer>, and <Static> can only be used as direct children of <Document>.',\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 = resolveBoxSides(props.borderWidth);\n if (props.padding != null) schema.padding = resolveBoxSides(props.padding);\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 = resolveBoxSides(props.borderWidth);\n if (props.padding != null) schema.padding = resolveBoxSides(props.padding);\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: normalizeColumnWeights(props.columnWeights, 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 normalizeColumnWeights = (\n columnWeights: number[] | undefined,\n columnCount: number,\n): number[] => {\n if (columnWeights && columnWeights.length > 0) {\n const normalizedWidths = Array.from({ length: columnCount }, (_, index) => {\n const width = columnWeights[index];\n return typeof width === 'number' && Number.isFinite(width) && width > 0 ? width : 1;\n });\n\n const totalWidth = normalizedWidths.reduce((sum, width) => sum + width, 0);\n if (totalWidth > 0) return normalizedWidths.map((width) => (width / totalWidth) * 100);\n }\n\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', 'header', 'footer', 'static', 'box']);\nconst STATIC_BLOCK_KINDS = new Set(['header', 'footer', 'static']);\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(\n '@pdfme/jsx: <Absolute> can only be used inside <Page>, <Header>, <Footer>, <Static>, or <Box>.',\n );\n }\n\n validateAbsolutePlacement(child.children, child.kind);\n }\n};\n\nconst validateStaticPlacement = (children: PdfJsxChild[], hasDocument: boolean) => {\n for (const child of flattenChildren(children)) {\n if (!isPdfJsxElement(child)) {\n if (hasDocument && String(child).trim() !== '') {\n throw new Error(\n '@pdfme/jsx: <Document> children must be <Header>, <Footer>, <Static>, or <Page>.',\n );\n }\n continue;\n }\n\n if (STATIC_BLOCK_KINDS.has(child.kind)) {\n if (!hasDocument) {\n throw new Error(\n '@pdfme/jsx: <Header>, <Footer>, and <Static> can only be used as direct children of <Document>.',\n );\n }\n if (child.kind === 'static') {\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>, <Header>, <Footer>, or <Page> for fixed page coordinates.',\n );\n }\n }\n validateStaticChildren(child.children);\n continue;\n }\n\n if (hasDocument && child.kind !== 'page') {\n throw new Error(\n '@pdfme/jsx: <Document> children must be <Header>, <Footer>, <Static>, or <Page>.',\n );\n }\n\n validateNoNestedStaticBlock(child);\n }\n};\n\nconst validateNoNestedStaticBlock = (node: PdfJsxChild) => {\n if (!isPdfJsxElement(node)) return;\n for (const child of flattenForSplitting(node.children)) {\n if (isPdfJsxElement(child) && STATIC_BLOCK_KINDS.has(child.kind)) {\n throw new Error(\n '@pdfme/jsx: <Header>, <Footer>, and <Static> can only be used as direct children of <Document>.',\n );\n }\n validateNoNestedStaticBlock(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 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/jsx-dev-runtime.js
CHANGED
package/dist/jsx-runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as createFragmentNode, t as Fragment } from "./node-
|
|
1
|
+
import { i as createFragmentNode, t as Fragment } from "./node-B6TrQFvN.js";
|
|
2
2
|
//#region src/jsx-runtime.ts
|
|
3
3
|
var jsx = (type, props, key) => {
|
|
4
4
|
if (type === Fragment) return createFragmentNode(props, key);
|
package/dist/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","names":[],"sources":["../src/jsx-runtime.ts"],"sourcesContent":["import { createFragmentNode, Fragment } from './node.js';\nimport type { PdfJsxChild, PdfJsxElement, PdfJsxFragment } from './types.js';\n\ntype Component = (props: Record<string, unknown>) => PdfJsxChild;\n\nexport { Fragment };\n\nexport const jsx = (\n type: Component | typeof Fragment,\n props: Record<string, unknown> | null,\n key?: string | number | null,\n): PdfJsxChild => {\n if (type === Fragment) return createFragmentNode(props, key);\n if (typeof type === 'function') return type({ ...props, key });\n throw new Error('@pdfme/jsx: intrinsic JSX elements are not supported. Use pdfme components.');\n};\n\nexport const jsxs = jsx;\n\nexport namespace JSX {\n export type Element = PdfJsxElement | PdfJsxFragment;\n export interface ElementChildrenAttribute {\n children: unknown;\n }\n export interface IntrinsicElements {}\n}\n"],"mappings":";;AAOA,IAAa,OACX,MACA,OACA,QACgB;
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","names":[],"sources":["../src/jsx-runtime.ts"],"sourcesContent":["import { createFragmentNode, Fragment } from './node.js';\nimport type { PdfJsxChild, PdfJsxElement, PdfJsxFragment } from './types.js';\n\ntype Component = (props: Record<string, unknown>) => PdfJsxChild;\n\nexport { Fragment };\n\nexport const jsx = (\n type: Component | typeof Fragment,\n props: Record<string, unknown> | null,\n key?: string | number | null,\n): PdfJsxChild => {\n if (type === Fragment) return createFragmentNode(props, key);\n if (typeof type === 'function') return type({ ...props, key });\n throw new Error('@pdfme/jsx: intrinsic JSX elements are not supported. Use pdfme components.');\n};\n\nexport const jsxs = jsx;\n\nexport namespace JSX {\n export type Element = PdfJsxElement | PdfJsxFragment;\n export interface ElementChildrenAttribute {\n children: unknown;\n }\n export interface IntrinsicElements {}\n}\n"],"mappings":";;AAOA,IAAa,OACX,MACA,OACA,QACgB;CAChB,IAAI,SAAS,UAAU,OAAO,mBAAmB,OAAO,GAAG;CAC3D,IAAI,OAAO,SAAS,YAAY,OAAO,KAAK;EAAE,GAAG;EAAO;CAAI,CAAC;CAC7D,MAAM,IAAI,MAAM,6EAA6E;AAC/F;AAEA,IAAa,OAAO"}
|
|
@@ -27,4 +27,4 @@ var cloneElementWithChildren = (element, children) => ({
|
|
|
27
27
|
//#endregion
|
|
28
28
|
export { isPdfJsxElement as a, createFragmentNode as i, cloneElementWithChildren as n, isPdfJsxFragment as o, createElementNode as r, Fragment as t };
|
|
29
29
|
|
|
30
|
-
//# sourceMappingURL=node-
|
|
30
|
+
//# sourceMappingURL=node-B6TrQFvN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-
|
|
1
|
+
{"version":3,"file":"node-B6TrQFvN.js","names":[],"sources":["../src/node.ts"],"sourcesContent":["import type { BuiltinKind, PdfJsxChild, PdfJsxElement, PdfJsxFragment } from './types.js';\n\nexport const Fragment = Symbol.for('@pdfme/jsx.fragment');\n\nexport const isPdfJsxElement = (value: unknown): value is PdfJsxElement =>\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n typeof (value as { kind?: unknown }).kind === 'string';\n\nexport const isPdfJsxFragment = (value: unknown): value is PdfJsxFragment =>\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n (value as { kind?: unknown }).kind === 'fragment';\n\nexport const normalizeChildren = (children: unknown): PdfJsxChild[] => {\n if (children === undefined) return [];\n return Array.isArray(children) ? (children as PdfJsxChild[]) : [children as PdfJsxChild];\n};\n\nexport const createElementNode = <K extends BuiltinKind>(\n kind: K,\n rawProps: Record<string, unknown> | null | undefined,\n key?: string | number | null,\n): PdfJsxElement<K> => {\n const { children, ...props } = rawProps ?? {};\n return {\n kind,\n props,\n children: normalizeChildren(children),\n key,\n };\n};\n\nexport const createFragmentNode = (\n rawProps: Record<string, unknown> | null | undefined,\n key?: string | number | null,\n): PdfJsxFragment => ({\n kind: 'fragment',\n children: normalizeChildren(rawProps?.children),\n key,\n});\n\nexport const cloneElementWithChildren = (\n element: PdfJsxElement,\n children: PdfJsxChild[],\n): PdfJsxElement => ({\n ...element,\n children,\n});\n"],"mappings":";AAEA,IAAa,WAAW,OAAO,IAAI,qBAAqB;AAExD,IAAa,mBAAmB,UAC9B,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAA6B,SAAS;AAEhD,IAAa,oBAAoB,UAC/B,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAA6B,SAAS;AAEzC,IAAa,qBAAqB,aAAqC;CACrE,IAAI,aAAa,KAAA,GAAW,OAAO,CAAC;CACpC,OAAO,MAAM,QAAQ,QAAQ,IAAK,WAA6B,CAAC,QAAuB;AACzF;AAEA,IAAa,qBACX,MACA,UACA,QACqB;CACrB,MAAM,EAAE,UAAU,GAAG,UAAU,YAAY,CAAC;CAC5C,OAAO;EACL;EACA;EACA,UAAU,kBAAkB,QAAQ;EACpC;CACF;AACF;AAEA,IAAa,sBACX,UACA,SACoB;CACpB,MAAM;CACN,UAAU,kBAAkB,UAAU,QAAQ;CAC9C;AACF;AAEA,IAAa,4BACX,SACA,cACmB;CACnB,GAAG;CACH;AACF"}
|
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' | 'absolute' | 'stack' | 'row' | 'box' | 'spacer' | 'text' | 'multiVariableText' | 'image' | 'svg' | 'rectangle' | 'ellipse' | 'line' | 'list' | 'table' | 'pagebreak';
|
|
4
|
+
export type BuiltinKind = 'document' | 'page' | 'header' | 'footer' | '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>;
|
|
@@ -42,6 +42,13 @@ export type LayoutProps = {
|
|
|
42
42
|
flex?: number;
|
|
43
43
|
};
|
|
44
44
|
export type CommonProps = LayoutProps & Partial<Pick<Schema, 'rotate' | 'opacity'>>;
|
|
45
|
+
export type DocumentProps = {
|
|
46
|
+
size?: PageSize;
|
|
47
|
+
orientation?: PageOrientation;
|
|
48
|
+
margin?: number | BoxSides;
|
|
49
|
+
font?: string;
|
|
50
|
+
children?: PdfJsxChild;
|
|
51
|
+
};
|
|
45
52
|
export type PageProps = {
|
|
46
53
|
size?: PageSize;
|
|
47
54
|
orientation?: PageOrientation;
|
|
@@ -51,12 +58,16 @@ export type PageProps = {
|
|
|
51
58
|
};
|
|
52
59
|
export type StaticPlacement = 'top' | 'bottom';
|
|
53
60
|
export type StaticProps = {
|
|
54
|
-
/** Page edge used to anchor this
|
|
61
|
+
/** Page edge used to anchor this low-level repeated block. Defaults to top. */
|
|
55
62
|
placement?: StaticPlacement;
|
|
56
63
|
children?: PdfJsxChild;
|
|
57
64
|
};
|
|
58
|
-
export type HeaderProps =
|
|
59
|
-
|
|
65
|
+
export type HeaderProps = {
|
|
66
|
+
children?: PdfJsxChild;
|
|
67
|
+
};
|
|
68
|
+
export type FooterProps = {
|
|
69
|
+
children?: PdfJsxChild;
|
|
70
|
+
};
|
|
60
71
|
export type AbsoluteProps = {
|
|
61
72
|
x?: number;
|
|
62
73
|
y?: number;
|
|
@@ -179,8 +190,11 @@ export type TableProps = CommonProps & {
|
|
|
179
190
|
head: string[];
|
|
180
191
|
rows?: (string | number)[][];
|
|
181
192
|
data?: (string | number)[][];
|
|
182
|
-
/**
|
|
183
|
-
|
|
193
|
+
/**
|
|
194
|
+
* Relative column width weights, not millimeter widths. Values are normalized to pdfme
|
|
195
|
+
* headWidthPercentages. Missing or invalid weights default to 1.
|
|
196
|
+
*/
|
|
197
|
+
columnWeights?: number[];
|
|
184
198
|
width?: number;
|
|
185
199
|
height?: number;
|
|
186
200
|
font?: string;
|