@pdfme/jsx 6.1.2 → 6.1.3-dev.2

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 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
- <Page margin={{ x: 12, y: 16 }}>
11
- <Stack gap={4}>
12
- <Text size={18}>Invoice</Text>
13
- <Text name="customerName">Alice</Text>
14
- <MultiVariableText
15
- name="message"
16
- text="Hello **{name}**, status: `{status}`"
17
- values={{ name: 'Alice **literal**', status: 'draft' }}
18
- textFormat="inline-markdown"
19
- />
20
- </Stack>
21
- </Page>,
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
- - `Static`, `Header`, and `Footer` can be used as direct children of the first `Page` to render
44
- read-only header/footer style content into blank `basePdf.staticSchema`. Their children use page
45
- coordinates, not page margin coordinates, and custom `basePdf` is not supported.
46
- - `Header` is a shorthand for `<Static placement="top">`; `Footer` is a shorthand for
47
- `<Static placement="bottom">`.
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
- <Header>
51
- <Text height={8}>Header</Text>
52
- </Header>
53
- <Footer>
54
- <Text height={8}>Footer</Text>
55
- </Footer>
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 top and bottom static
61
- content together exceed the page height, they may overlap.
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 placement escape
66
- hatch. It uses the parent layout frame as its coordinate origin and does not advance the
67
- surrounding stack/row flow. When `width` or `height` is omitted, it uses the remaining parent
68
- frame size from `x` / `y`. Direct `Stack` / `Row` support is intentionally left for later; wrap
69
- with an explicit-size `Box` when you need a local manual-placement frame inside flow content.
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 widths` are percentages passed to pdfme `headWidthPercentages`, for example
106
- `widths={[70, 30]}`.
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.
@@ -1,9 +1,9 @@
1
- import { createElementNode } from './node.js';
2
- import type { AbsoluteProps, BoxProps, EllipseProps, FooterProps, HeaderProps, ImageProps, LineProps, ListProps, MultiVariableTextProps, PageBreakProps, PageProps, RectangleProps, RowProps, SpacerProps, StackProps, StaticProps, SvgProps, TableProps, TextProps } from './types.js';
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) => ReturnType<typeof createElementNode<"static">>;
6
- export declare const Footer: (props: FooterProps) => ReturnType<typeof createElementNode<"static">>;
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-BeNL0xMl.js";
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 = (props) => createElementNode("static", {
9
- ...props,
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 expanded = expandPageBreaks(node);
49
- validateAbsolutePlacement(expanded);
50
- validateNoTopLevelStatic(expanded);
51
- const pages = flattenChildren(expanded).filter((child) => isPdfJsxElement(child) && child.kind === "page");
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> is supported only with a blank basePdf.");
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
- frame: {
71
- x: 0,
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 bodyPages) {
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 extractStaticChildren = (pages) => {
171
- const blocks = {
172
- top: [],
173
- bottom: []
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
- pages: pages.map((page, pageIndex) => {
177
- const bodyChildren = [];
178
- for (const child of flattenForSplitting(page.children)) {
179
- if (isPdfJsxElement(child) && child.kind === "static") {
180
- if (pageIndex === 0) blocks[getStaticPlacement(child)].push(child.children);
181
- continue;
182
- }
183
- bodyChildren.push(child);
184
- }
185
- return cloneElementWithChildren(page, bodyChildren);
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 hasStaticBlocks = (blocks) => blocks.top.length > 0 || blocks.bottom.length > 0;
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
- for (const placement of ["top", "bottom"]) {
193
- const children = arg.blocks[placement];
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 ctx = {
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
- const size = await layoutChildren(children, arg.frame, "stack", {
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 "static": throw new Error("@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.");
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: normalizeColumnWidths(props.widths, props.head.length),
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 normalizeColumnWidths = (widths, columnCount) => {
846
- if (widths && widths.length > 0) return widths;
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 = (pages) => {
973
- for (let pageIndex = 0; pageIndex < pages.length; pageIndex += 1) {
974
- const page = pages[pageIndex];
975
- for (const child of flattenForSplitting(page?.children ?? [])) {
976
- if (isPdfJsxElement(child) && child.kind === "static") {
977
- if (pageIndex !== 0) throw new Error("@pdfme/jsx: <Static> must appear before any <PageBreak> and can only be used inside the first <Page>.");
978
- if (getStaticPlacement(child) === "bottom" && hasElementKind(child.children, "absolute")) throw new Error("@pdfme/jsx: <Absolute> is not supported inside bottom <Static>. Use top <Static> or <Page> for fixed page coordinates.");
979
- validateStaticChildren(child.children);
980
- continue;
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
- validateNoNestedStatic(child);
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 validateNoNestedStatic = (node) => {
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 === "static") throw new Error("@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.");
990
- validateNoNestedStatic(child);
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":";;;;AAwBA,IAAM,eAEF,UAED,UACC,kBAAkB,MAAM,KAAK;AAEjC,IAAa,WAAW,YAAuC,UAAU;AACzE,IAAa,OAAO,YAA+B,MAAM;AACzD,IAAa,SAAS,YAAmC,QAAQ;AACjE,IAAa,SAAS,YAAmC,QAAQ;AACjE,IAAa,SAAS,YAAmC,QAAQ;AACjE,IAAa,WAAW,YAAuC,UAAU;AACzE,IAAa,QAAQ,YAAiC,OAAO;AAC7D,IAAa,MAAM,YAA6B,KAAK;AACrD,IAAa,MAAM,YAA6B,KAAK;AACrD,IAAa,SAAS,YAAmC,QAAQ;AACjE,IAAa,OAAO,YAA+B,MAAM;AACzD,IAAa,oBAAoB,YAC/B,mBACF;AACA,IAAa,QAAQ,YAAiC,OAAO;AAC7D,IAAa,MAAM,YAA6B,KAAK;AACrD,IAAa,YAAY,YAAyC,WAAW;AAC7E,IAAa,UAAU,YAAqC,SAAS;AACrE,IAAa,OAAO,YAA+B,MAAM;AACzD,IAAa,OAAO,YAA+B,MAAM;AACzD,IAAa,QAAQ,YAAiC,OAAO;AAC7D,IAAa,aAAa,UAA2B,kBAAkB,aAAa,KAAK;;;AC4BzF,IAAM,oBAAoB;AAC1B,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AAClC,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAC/B,IAAM,qBAAqB;AAC3B,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;CAChC,KAAK;CACL,KAAK;CACL,KAAK;AACP;AAEA,IAAa,mBAAmB,OAC9B,MACA,UAAyB,CAAC,MACA;CAC1B,2BAA2B,IAAI;CAC/B,MAAM,OAAO,kBAAkB,IAAI;CACnC,0BAA0B,KAAK,QAAQ;CACvC,wBAAwB,KAAK,UAAU,KAAK,WAAW;CACvD,MAAM,EAAE,OAAO,UAAU,QAAQ,iBAAiB,wBAAwB,IAAI;CAC9E,MAAM,QAAQ,SAAS,KAAK,SAAS,0BAA0B,MAAM,KAAK,aAAa,CAAC;CAExF,IAAI,MAAM,WAAW,GACnB,MAAM,IAAI,MAAM,qEAAqE;CAGvF,MAAM,iBAAiB,MAAM,IAAI;CACjC,MAAM,cAAc,gBAAgB,eAAe,MAAM;CACzD,MAAM,WAAW,gBAAgB,eAAe,MAAM,eAAe,WAAW;CAChF,4BAA4B,OAAO,UAAU,WAAW;CACxD,MAAM,SAAiC,CAAC;CACxC,MAAM,4BAAY,IAAI,IAAY;CAClC,MAAM,eAAuC,CAAC;CAC9C,MAAM,OAAO,QAAQ,QAAQ,eAAe;CAC5C,MAAM,yBAAS,IAAI,IAA8B;CACjD,MAAM,cAA0B,CAAC;CACjC,MAAM,gBAA0B,CAAC;CACjC,MAAM,oBAAoB,gBAAgB,YAAY;CAEtD,IAAI,qBAAqB,QAAQ,WAAW,QAAQ,CAAC,WAAW,QAAQ,OAAO,GAC7E,MAAM,IAAI,MACR,uFACF;CAGF,IAAI,mBACF,MAAM,mBAAmB;EACvB,QAAQ;EACR,QAAQ;EACR;EACA;EACA;EACA;EACA;EACA,aAAa,eAAe;EAC5B;EACA;CACF,CAAC;CAGH,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,KAAK;EACnB,MAAM,SAAS,gBAAgB,MAAM,MAAM;EAC3C,MAAM,QAAQ;GACZ,GAAG,OAAO;GACV,GAAG,OAAO;GACV,OAAO,SAAS,QAAQ,OAAO,OAAO,OAAO;GAC7C,QAAQ,SAAS,SAAS,OAAO,MAAM,OAAO;EAChD;EACA,MAAM,MAAiB;GACrB,SAAS,CAAC;GACV;GACA;GACA;GACA,aAAa,MAAM;GACnB;GACA;EACF;EACA,MAAM,eACJ,KAAK,UACL,OACA,SACA;GAAE,KAAK;GAAG,YAAY;GAAW,gBAAgB;EAAQ,GACzD,GACF;EACA,YAAY,KAAK,IAAI,OAAO;CAC9B;CAEA,MAAM,UAAU,QAAQ,WAAW;EACjC,OAAO,SAAS;EAChB,QAAQ,SAAS;EACjB,SAAS;GAAC,YAAY;GAAK,YAAY;GAAO,YAAY;GAAQ,YAAY;EAAI;CACpF;CAaA,OAAO;EAAE,UAAA;GAVP,SACE,cAAc,SAAS,KAAK,WAAW,OAAO,IAC1C;IACE,GAAG;IACH,cAAc,CAAC,GAAI,QAAQ,gBAAgB,CAAC,GAAI,GAAG,aAAa;GAClE,IACA;GACN,SAAS;EAGF;EAAU,QAAQ,CAAC,MAAM;CAAE;AACtC;AAEA,IAAM,mBACJ,aACwC;CACxC,IAAI,YAAY,QAAQ,aAAa,SAAS,aAAa,MAAM,OAAO,CAAC;CACzE,IAAI,OAAO,aAAa,YAAY,OAAO,aAAa,UAAU,OAAO,CAAC,QAAQ;CAClF,IAAI,MAAM,QAAQ,QAAQ,GAAG,OAAO,SAAS,SAAS,UAAU,gBAAgB,KAAK,CAAC;CACtF,IAAI,iBAAiB,QAAQ,GAAG,OAAO,gBAAgB,SAAS,QAAQ;CACxE,IAAI,gBAAgB,QAAQ,GAAG,OAAO,CAAC,QAAQ;CAC/C,OAAO,CAAC;AACV;AAEA,IAAM,oBAAoB,aACxB,gBAAgB,QAAQ,EACrB,KAAK,UAAU;CACd,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU,OAAO,OAAO,KAAK;CAC/E,OAAO,iBAAiB,MAAM,QAAQ;AACxC,CAAC,EACA,KAAK,EAAE;AAEZ,IAAM,4BAA4B,aAA2D;CAC3F,MAAM,WAA4B,CAAC,CAAC,CAAC;CAErC,KAAK,MAAM,SAAS,oBAAoB,QAAQ,GAAG;EACjD,IAAI,gBAAgB,KAAK,KAAK,MAAM,SAAS,aAAa;GACxD,SAAS,KAAK,CAAC,CAAC;GAChB;EACF;EAEA,IACE,gBAAgB,KAAK,MACpB,MAAM,SAAS,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS,QACnE;GACA,MAAM,gBAAgB,yBAAyB,MAAM,QAAQ;GAC7D,IAAI,cAAc,WAAW,GAAG;IAC9B,SAAS,SAAS,SAAS,IAAI,KAAK,KAAK;IACzC;GACF;GAEA,SAAS,SAAS,SAAS,IAAI,KAAK,yBAAyB,OAAO,cAAc,MAAM,CAAC,CAAC,CAAC;GAC3F,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAC7C,SAAS,KAAK,CAAC,yBAAyB,OAAO,cAAc,MAAM,CAAC,CAAC,CAAC,CAAC;GAEzE;EACF;EAEA,SAAS,SAAS,SAAS,IAAI,KAAK,KAAK;CAC3C;CAEA,OAAO;AACT;AAEA,IAAM,uBAAuB,aAAyD;CACpF,IAAI,YAAY,QAAQ,aAAa,SAAS,aAAa,MAAM,OAAO,CAAC;CACzE,IAAI,MAAM,QAAQ,QAAQ,GAAG,OAAO,SAAS,SAAS,UAAU,oBAAoB,KAAK,CAAC;CAC1F,IAAI,iBAAiB,QAAQ,GAAG,OAAO,oBAAoB,SAAS,QAAQ;CAC5E,OAAO,CAAC,QAAQ;AAClB;AAEA,IAAM,oBAAoB,SACxB,yBAAyB,IAAI,EAAE,KAAK;AAEtC,IAAM,sBAAsB,IAAI,IAAI;CAAC;CAAU;CAAU;AAAQ,CAAC;AAElE,IAAM,iCAA+C;CACnD,QAAQ,CAAC;CACT,QAAQ,CAAC;CACT,cAAc,CAAC;CACf,WAAW,CAAC;AACd;AAEA,IAAM,qBAAqB,SAAkC;CAC3D,MAAM,mBAAmB,gBAAgB,IAAI;CAC7C,MAAM,YAAY,iBAAiB,QAChC,UACC,gBAAgB,KAAK,KAAK,MAAM,SAAS,UAC7C;CAEA,IAAI,UAAU,WAAW,GACvB,OAAO;EAAE,UAAU,iBAAiB,IAAI;EAAG,aAAa;CAAM;CAGhE,IAAI,UAAU,SAAS,GACrB,MAAM,IAAI,MAAM,oDAAoD;CAGtE,IAAI,iBAAiB,MAAM,UAAU,UAAU,UAAU,EAAE,GACzD,MAAM,IAAI,MAAM,uDAAuD;CAGzE,MAAM,WAAW,UAAU;CAC3B,OAAO;EACL,UAAU,iBAAiB,SAAS,QAAQ;EAC5C,eAAe,SAAS;EACxB,aAAa;CACf;AACF;AAEA,IAAM,2BACJ,SAC6D;CAC7D,MAAM,SAAS,wBAAwB;CACvC,MAAM,QAAiC,CAAC;CAExC,KAAK,MAAM,SAAS,gBAAgB,KAAK,QAAQ,GAAG;EAClD,IAAI,CAAC,gBAAgB,KAAK,GAAG;EAE7B,IAAI,MAAM,SAAS,QAAQ;GACzB,MAAM,KAAK,KAA8B;GACzC;EACF;EAEA,IAAI,CAAC,KAAK,eAAe,CAAC,oBAAoB,IAAI,MAAM,IAAI,GAAG;EAE/D,IAAI,MAAM,SAAS,UACjB,OAAO,OAAO,KAAK,GAAG,MAAM,QAAQ;OAC/B,IAAI,MAAM,SAAS,UACxB,OAAO,OAAO,KAAK,GAAG,MAAM,QAAQ;OAC/B,IAAI,MAAM,SAAS,UAExB,OADkB,mBAAmB,KAC9B,MAAc,QAAQ,cAAc,gBAAgB,KAAK,GAAG,MAAM,QAAQ;CAErF;CAEA,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,6BACJ,MACA,kBAC0B;CAC1B,IAAI,CAAC,eAAe,OAAO;CAC3B,MAAM,EAAE,UAAU,WAAW,GAAG,UAAU;CAC1C,OAAO;EACL,GAAG;EACH,OAAO;GACL,GAAG;GACH,GAAG,KAAK;EACV;CACF;AACF;AAEA,IAAM,mBAAmB,WACvB,OAAO,OAAO,SAAS,KACvB,OAAO,OAAO,SAAS,KACvB,OAAO,UAAU,SAAS,KAC1B,OAAO,aAAa,SAAS;AAE/B,IAAM,qBAAqB,OAAO,QAW5B;CACJ,MAAM,eAAe,KAAK,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAI,OAAO,OAAO,IAAI,OAAO,KAAK;CACxF,MAAM,cACJ;EACE;GACE,UAAU,IAAI,OAAO;GACrB,OAAO;IAAE,GAAG;IAAG,GAAG;IAAG,OAAO,IAAI,SAAS;IAAO,QAAQ,IAAI,SAAS;GAAO;EAC9E;EACA;GACE,UAAU,IAAI,OAAO;GACrB,OAAO;IACL,GAAG,IAAI,OAAO;IACd,GAAG;IACH,OAAO;IACP,QAAQ,IAAI,OAAO;GACrB;EACF;EACA;GACE,UAAU,IAAI,OAAO;GACrB,OAAO;IACL,GAAG,IAAI,OAAO;IACd,GAAG,IAAI,SAAS,SAAS,IAAI,OAAO;IACpC,OAAO;IACP,QAAQ,IAAI,OAAO;GACrB;EACF;EACA;GACE,UAAU,IAAI,OAAO;GACrB,OAAO;IAAE,GAAG;IAAG,GAAG;IAAG,OAAO,IAAI,SAAS;IAAO,QAAQ,IAAI,SAAS;GAAO;GAC5E,WAAW;EACb;CACF;CAEF,KAAK,MAAM,EAAE,UAAU,OAAO,eAAe,aAAa;EACxD,IAAI,SAAS,WAAW,GAAG;EAE3B,MAAM,UAAoB,CAAC;EAU3B,MAAM,OAAO,MAAM,eACjB,UACA,OACA,SACA;GACE,KAAK;GACL,YAAY;GACZ,gBAAgB;EAClB,GACA;GAjBA;GACA,QAAQ,IAAI;GACZ,WAAW,IAAI;GACf,cAAc,IAAI;GAClB,aAAa,IAAI;GACjB,MAAM,IAAI;GACV,QAAQ,IAAI;EAWZ,CACF;EAEA,IAAI,cAAc,UAChB,aAAa,SAAS,GAAG,QAAQ,QAAQ,GAAG,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,MAAM,CAAC;EAErF,IAAI,cAAc,KAAK,GAAG,OAAO;CACnC;AACF;AAEA,IAAM,iBAAiB,OACrB,UACA,OACA,MACA,MAOA,QAC+C;CAC/C,MAAM,QAAQ,gBAAgB,QAAQ;CACtC,MAAM,YAAY,MAAM,QAAQ,SAAS,CAAC,kBAAkB,IAAI,CAAC;CACjE,MAAM,SAAS,SAAS,QAAQ,iBAAiB,WAAW,MAAM,OAAO,KAAK,GAAG,IAAI,KAAA;CACrF,IAAI,SAAS;CACb,IAAI,WAAW;CACf,IAAI,YAAY;CAChB,MAAM,cAA4B,CAAC;CAEnC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,QAAQ,MAAM;EACpB,IAAI,kBAAkB,KAAK,GAAG;GAC5B,MAAM,eAAe,MAAM,OAAwB,MAAM,UAAU,OAAO,GAAG;GAC7E;EACF;EAEA,MAAM,SAAS,eAAe,KAAK;EACnC,MAAM,QACJ,SAAS,QACJ,SAAS,cAAc,IACxB,uBAAuB,OAAO,MAAM,OAAO,MAAM;EACvD,MAAM,aACJ,SAAS,UACL;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM,IAAI;GAAQ;GAAO,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,MAAM;EAAE,IACrF;GAAE,GAAG,MAAM,IAAI;GAAQ,GAAG,MAAM;GAAG;GAAO,QAAQ,MAAM;EAAO;EACrE,WAAW,KAAK,OAAO;EACvB,WAAW,KAAK,OAAO;EACvB,WAAW,SAAS,KAAK,IAAI,GAAG,WAAW,SAAS,OAAO,MAAM,OAAO,MAAM;EAE9E,MAAM,cAAc,IAAI,QAAQ;EAChC,MAAM,OACJ,OAAO,UAAU,YAAY,OAAO,UAAU,WAC1C,MAAM,WAAW,EAAE,UAAU,OAAO,KAAK,EAAE,GAAG,YAAY,GAAG,IAC7D,MAAM,cAAc,OAAO,YAAY,MAAM,GAAG;EACtD,MAAM,YAAY,IAAI,QAAQ;EAE9B,MAAM,WACJ,SAAS,UACL,OAAO,MAAM,KAAK,SAAS,OAAO,SAClC,OAAO,OAAO,QAAQ,OAAO;EACnC,MAAM,cAAc,OAAO,MAAM,KAAK,SAAS,OAAO;EAEtD,YAAY,KAAK;GAAE;GAAa;GAAW;EAAY,CAAC;EAExD,IAAI,SAAS,SAAS;GACpB,MAAM,aAAa,OAAO,OAAO,KAAK,QAAQ,OAAO;GACrD,MAAM,KAAK,mBAAmB,MAAM,OAAO,YAAY,KAAK,UAAU;GACtE,IAAI,OAAO,GAAG,aAAa,IAAI,SAAS,aAAa,WAAW,IAAI,CAAC;EACvE;EAGA,UAAU,YAAY,YAAY,UAAU,SAAS,IAAI,KAAK,MAAM;EACpE,aAAa;EACb,WAAW,KAAK,IACd,UACA,SAAS,UACL,OAAO,OAAO,KAAK,QAAQ,OAAO,QAClC,OAAO,MAAM,KAAK,SAAS,OAAO,MACxC;CACF;CAEA,MAAM,kBAAkB;CACxB,MAAM,oBAAoB,KAAK,YAAY;CAC3C,oBAAoB,IAAI,SAAS,aAAa,MAAM,iBAAiB,mBAAmB,IAAI;CAE5F,IAAI,SAAS,OAAO;EAClB,MAAM,YAAY,KAAK,aAAa;EACpC,KAAK,MAAM,QAAQ,aAAa;GAC9B,MAAM,KAAK,mBAAmB,WAAW,KAAK,aAAa,KAAK,UAAU;GAC1E,IAAI,OAAO,GAAG,aAAa,IAAI,SAAS,KAAK,aAAa,KAAK,WAAW,GAAG,EAAE;EACjF;EACA,OAAO;GAAE,OAAO;GAAmB,QAAQ;EAAU;CACvD;CAEA,OAAO;EAAE,OAAO;EAAU,QAAQ;CAAkB;AACtD;AAEA,IAAM,oBACJ,OACA,YACA,QACa;CACb,IAAI,YAAY;CAChB,IAAI,YAAY;CAChB,MAAM,QAAQ,MAAM,KAAK,SAAS;EAChC,MAAM,SAAS,eAAe,IAAI;EAClC,MAAM,QAAQ,cAAc,IAAI;EAEhC,MAAM,OADW,iBAAiB,IACrB,MAAa,SAAS,OAAO,IAAI;EAC9C,MAAM,QAAQ,SAAS;EACvB,aAAa,QAAQ,OAAO,OAAO,OAAO;EAC1C,aAAa;EACb,OAAO;GAAE;GAAO;EAAK;CACvB,CAAC;CAED,MAAM,YAAY,KAAK,IAAI,GAAG,aAAa,YAAY,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,GAAG;CAC1F,MAAM,WAAW,YAAY,IAAI,YAAY,YAAY;CACzD,OAAO,MAAM,KAAK,EAAE,OAAO,WAAW,QAAQ,OAAO,QAAQ;AAC/D;AAEA,IAAM,kBAAkB,UAAgD;CACtE,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU,OAAO,gBAAgB;CACnF,OAAO,gBAAiB,MAAM,MAAyC,MAAM;AAC/E;AAEA,IAAM,iBAAiB,UAA+D;CACpF,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU,OAAO,KAAA;CACnE,MAAM,QAAS,MAAM,MAA6B;CAClD,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;AAEA,IAAM,oBAAoB,UAA+D;CACvF,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU,OAAO,KAAA;CACnE,MAAM,QAAQ,MAAM;CACpB,MAAM,WAAW,MAAM,YAAY,MAAM;CACzC,OAAO,OAAO,aAAa,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,KAAA;AAChE;AAEA,IAAM,qBACJ,UACuC,gBAAgB,KAAK,KAAK,MAAM,SAAS;AAElF,IAAM,sBAAsB,YAAsD;CAChF,MAAM,YAAa,QAAQ,MAAsB,aAAa;CAC9D,IAAI,cAAc,SAAS,cAAc,UACvC,MAAM,IAAI,MAAM,+DAA2D;CAE7E,OAAO;AACT;AAEA,IAAM,0BACJ,OACA,YACA,WACG;CACH,MAAM,QAAQ,cAAc,KAAK;CACjC,IAAI,SAAS,MAAM,OAAO;CAC1B,OAAO,KAAK,IAAI,GAAG,aAAa,OAAO,OAAO,OAAO,KAAK;AAC5D;AAEA,IAAM,uBACJ,SACA,OACA,MACA,iBACA,mBACA,SACG;CAEH,MAAM,aAAa,KAAK,IAAI,GAAG,oBAAoB,eAAe;CAClE,IAAI,eAAe,KAAK,KAAK,mBAAmB,SAAS;CAEzD,MAAM,WACJ,KAAK,mBAAmB,mBAAmB,MAAM,SAAS,IACtD,cAAc,MAAM,SAAS,KAC7B;CACN,MAAM,cACJ,KAAK,mBAAmB,WACpB,aAAa,IACb,KAAK,mBAAmB,QACtB,aACA;CAER,IAAI,kBAAkB;CACtB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,cAAc;EAC7B,IAAI,WAAW,GACb,aACE,SACA,KAAK,aACL,KAAK,WACL,SAAS,QAAQ,SAAS,GAC1B,SAAS,UAAU,SAAS,CAC9B;EAEF,mBAAmB;CACrB;AACF;AAEA,IAAM,sBACJ,eACA,UACA,eACG;CAEH,IAAI,eAAe,UAAU,OAAO,KAAK,IAAI,IAAI,gBAAgB,YAAY,CAAC;CAC9E,IAAI,eAAe,OAAO,OAAO,KAAK,IAAI,GAAG,gBAAgB,QAAQ;CACrE,OAAO;AACT;AAEA,IAAM,gBAAgB,SAAmB,OAAe,KAAa,IAAY,OAAe;CAC9F,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK,GAAG;EACnC,MAAM,SAAS,QAAQ;EACvB,IAAI,CAAC,QAAQ;EACb,OAAO,WAAW;GAChB,GAAG,OAAO,SAAS,IAAI;GACvB,GAAG,OAAO,SAAS,IAAI;EACzB;CACF;AACF;AAEA,IAAM,gBAAgB,OACpB,SACA,OACA,YACA,QAC+C;CAE/C,MAAM,QAD4B,eAAe,SAAS,iBAAiB,OAAO,KAAK,OAEnF;EAAE,GAAG,QAAQ;EAAO,OAAO,MAAM;CAAM,IACvC,QAAQ;CAEZ,QAAQ,QAAQ,MAAhB;EACE,KAAK,SACH,OAAO,YAAY,OAAqB,QAAQ,UAAU,OAAO,GAAG;EACtE,KAAK,OACH,OAAO,UAAU,OAAmB,QAAQ,UAAU,OAAO,GAAG;EAClE,KAAK,OACH,OAAO,UAAU,OAAmB,QAAQ,UAAU,OAAO,YAAY,GAAG;EAC9E,KAAK,UACH,OAAO,QAAQ,QAAQ,aAAa,KAAoB,CAAC;EAC3D,KAAK,QACH,OAAO,WAAW;GAAE,GAAI;GAAqB,UAAU,QAAQ;EAAS,GAAG,OAAO,GAAG;EACvF,KAAK,qBACH,OAAO,wBACL;GAAE,GAAI;GAAkC,UAAU,QAAQ;EAAS,GACnE,OACA,GACF;EACF,KAAK,SACH,OAAO,YAAY,OAAqB,OAAO,GAAG;EACpD,KAAK,OACH,OAAO,UAAU;GAAE,GAAI;GAAoB,UAAU,QAAQ;EAAS,GAAG,OAAO,GAAG;EACrF,KAAK,aACH,OAAO,YAAY,aAAa,OAAyB,OAAO,GAAG;EACrE,KAAK,WACH,OAAO,YAAY,WAAW,OAAuB,OAAO,GAAG;EACjE,KAAK,QACH,OAAO,WAAW,OAAoB,OAAO,GAAG;EAClD,KAAK,QACH,OAAO,WAAW;GAAE,GAAI;GAAqB,UAAU,QAAQ;EAAS,GAAG,OAAO,GAAG;EACvF,KAAK,SACH,OAAO,YAAY,OAAqB,OAAO,GAAG;EACpD,KAAK,YACH,MAAM,IAAI,MAAM,kDAAkD;EACpE,KAAK;EACL,KAAK;EACL,KAAK,UACH,MAAM,IAAI,MACR,iGACF;EACF,KAAK,YACH,OAAO,eAAe,OAAwB,QAAQ,UAAU,OAAO,GAAG;EAC5E,SACE,OAAO;GAAE,OAAO;GAAG,QAAQ;EAAE;CACjC;AACF;AAEA,IAAM,iBAAiB,OACrB,OACA,UACA,OACA,QAC+C;CAC/C,MAAM,IAAI,MAAM,KAAK;CACrB,MAAM,IAAI,MAAM,KAAK;CAQrB,MAAM,eACJ,UACA;EARA,GAAG,MAAM,IAAI;EACb,GAAG,MAAM,IAAI;EACb,OAAO,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,QAAQ,CAAC;EACjD,QAAQ,MAAM,UAAU,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC;CAKpD,GACA,SACA;EAAE,KAAK;EAAG,YAAY;EAAW,gBAAgB;CAAQ,GACzD,GACF;CACA,OAAO;EAAE,OAAO;EAAG,QAAQ;CAAE;AAC/B;AAEA,IAAM,eACJ,OACA,UACA,OACA,QAEA,eACE,UACA;CAAE,GAAG;CAAO,OAAO,MAAM,SAAS,MAAM;CAAO,QAAQ,MAAM,UAAU,MAAM;AAAO,GACpF,SACA;CACE,KAAK,MAAM,OAAO;CAClB,YAAY,MAAM,cAAc;CAChC,gBAAgB,MAAM,kBAAkB;CACxC,UAAU,MAAM;AAClB,GACA,GACF;AAEF,IAAM,aACJ,OACA,UACA,OACA,QAEA,eACE,UACA;CAAE,GAAG;CAAO,OAAO,MAAM,SAAS,MAAM;CAAO,QAAQ,MAAM,UAAU,MAAM;AAAO,GACpF,OACA;CACE,KAAK,MAAM,OAAO;CAClB,YAAY,MAAM,cAAc;CAChC,gBAAgB,MAAM,kBAAkB;CACxC,UAAU,MAAM;CAChB,WAAW,MAAM;AACnB,GACA,GACF;AAEF,IAAM,YAAY,OAChB,OACA,UACA,OACA,aACA,QAC+C;CAC/C,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,UAAU,gBAAgB,MAAM,OAAO;CAC7C,MAAM,YAAY,QAAQ,MAAM,cAAc,MAAM,eAAe,MAAM,WAAW;CACpF,MAAM,cAAc,IAAI,QAAQ;CAEhC,IAAI,WACF,IAAI,QAAQ,KAAK;EACf,MAAM,YAAY,KAAK,KAAK;EAC5B,MAAM;EACN,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA,QAAQ;EACR,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B,UAAU;EACV,OAAO,MAAM,cAAc;EAC3B,aAAa,MAAM,eAAe;EAClC,aAAa,MAAM,eAAe;EAClC,QAAQ,MAAM,UAAU;CAC1B,CAAC;CASH,MAAM,YAAY,MAAM,eACtB,UACA;EAPA,GAAG,MAAM,IAAI,QAAQ;EACrB,GAAG,MAAM,IAAI,QAAQ;EACrB,OAAO,QAAQ,QAAQ,OAAO,QAAQ;EACtC,SAAS,MAAM,UAAU,MAAM,UAAU,QAAQ,MAAM,QAAQ;CAI/D,GACA,SACA;EAAE,KAAK;EAAG,YAAY;EAAW,gBAAgB;CAAQ,GACzD,GACF;CACA,MAAM,SAAS,MAAM,UAAU,UAAU,SAAS,QAAQ,MAAM,QAAQ;CAExE,IAAI,WACF,IAAI,QAAQ,eAAe;EAAE,GAAG,IAAI,QAAQ;EAAe;CAAO;CAGpE,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,gBAAgB,WAA2D;CAC/E,OAAO,MAAM,SAAS;CACtB,QAAQ,MAAM,UAAU;AAC1B;AAEA,IAAM,aAAa,OACjB,OACA,OACA,QAC+C;CAC/C,MAAM,WAAW,MAAM,QAAQ;CAC/B,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,QAAQ,iBAAiB,MAAM,QAAQ;CAC7C,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ;CACjD,MAAM,aAAa,MAAM,cAAc;CAEvC,IAAI,CAAC,YAAY,eAAe,mBAC9B,MAAM,IAAI,MACR,2HACF;CAEF,MAAM,OAAO,YAAY,KAAK,QAAQ,MAAM,IAAI;CAEhD,MAAM,SAAqB;EACzB;EACA,MAAM;EACN,SAAS;EACT,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA,QAAQ,MAAM,UAAU;EACxB,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B;EACA,UAAU,MAAM;EAChB,WAAW,MAAM,SAAS;EAC1B,mBAAmB,MAAM,UAAU;EACnC;EACA,UAAU,MAAM,QAAQ,IAAI;EAC5B;EACA,kBAAkB,MAAM,WAAW;EACnC,WAAW,MAAM,SAAS;EAC1B,iBAAiB,MAAM,cAAc;EACrC;EACA,UAAU,MAAM;EAChB,eAAe,MAAM,iBAAiB;EACtC,WAAW,MAAM,aAAa;CAChC;CAEA,IAAI,MAAM,aAAa,OAAO,cAAc,MAAM;CAClD,IAAI,MAAM,eAAe,MAAM,OAAO,cAAc,gBAAgB,MAAM,WAAW;CACrF,IAAI,MAAM,WAAW,MAAM,OAAO,UAAU,gBAAgB,MAAM,OAAO;CACzE,IAAI,MAAM,iBACR,OAAO,kBAAkB;EACvB,KAAK,MAAM,gBAAgB,OAAO,0BAA0B;EAC5D,KAAK,MAAM,gBAAgB,OAAO,0BAA0B;EAC5D,KAAK,MAAM,gBAAgB,OAAO,0BAA0B;CAC9D;CAEF,IAAI,MAAM,UAAU,MAClB,OAAO,SAAS,MAAM,kBAAkB;EAAE;EAAO;EAAQ,MAAM,IAAI;EAAM,QAAQ,IAAI;CAAO,CAAC;CAE/F,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ;CAClC,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO,QAAQ,OAAO;CAAO;AACxC;AAEA,IAAM,0BAA0B,OAC9B,OACA,OACA,QAC+C;CAC/C,MAAM,WAAW,MAAM,QAAQ;CAC/B,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,eAAe,MAAM,QAAQ,iBAAiB,MAAM,QAAQ;CAClE,MAAM,SAAS,iCAAiC,MAAM,MAAM;CAC5D,MAAM,YAAY,kCAAkC,cAAc,MAAM,WAAW,MAAM;CACzF,MAAM,OAAO,YAAY,KAAK,qBAAqB,MAAM,IAAI;CAC7D,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ;CACjD,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,UAAU,WACZ,4BAA4B,cAAc,QAAQ,eAAe,iBAAiB,IAClF,KAAK,UAAU,MAAM;CAEzB,MAAM,SAAkC;EACtC;EACA,MAAM;EACN;EACA,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA,QAAQ,MAAM,UAAU;EACxB,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B;EACA,UAAU,MAAM;EAChB,WAAW,MAAM,SAAS;EAC1B,mBAAmB,MAAM,UAAU;EACnC;EACA,UAAU,MAAM,QAAQ,IAAI;EAC5B;EACA,kBAAkB,MAAM,WAAW;EACnC,WAAW,MAAM,SAAS;EAC1B,iBAAiB,MAAM,cAAc;EACrC;EACA,UAAU,MAAM;EAChB,eAAe,MAAM,iBAAiB;EACtC,WAAW,MAAM,aAAa;EAC9B,MAAM;EACN;CACF;CAEA,IAAI,MAAM,aAAa,OAAO,cAAc,MAAM;CAClD,IAAI,MAAM,eAAe,MAAM,OAAO,cAAc,gBAAgB,MAAM,WAAW;CACrF,IAAI,MAAM,WAAW,MAAM,OAAO,UAAU,gBAAgB,MAAM,OAAO;CACzE,IAAI,MAAM,iBACR,OAAO,kBAAkB;EACvB,KAAK,MAAM,gBAAgB,OAAO,0BAA0B;EAC5D,KAAK,MAAM,gBAAgB,OAAO,0BAA0B;EAC5D,KAAK,MAAM,gBAAgB,OAAO,0BAA0B;CAC9D;CAEF,IAAI,MAAM,UAAU,MAIlB,OAAO,SAAS,MAAM,kBAAkB;EACtC,OAJmB,WACjB,UACA,4BAA4B,cAAc,QAAQ,eAAe,iBAAiB;EAGpF;EACA,MAAM,IAAI;EACV,QAAQ,IAAI;CACd,CAAC;CAEH,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ;CAClC,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO,QAAQ,OAAO;CAAO;AACxC;AAEA,IAAM,eACJ,OACA,OACA,QACsC;CACtC,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,OAAO,YAAY,KAAK,SAAS,MAAM,IAAI;CACjD,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ;CACjD,MAAM,UAAU,MAAM,OAAO;CAE7B,MAAM,SAAsB;EAC1B;EACA,MAAM;EACN;EACA,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA;EACA,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B;EACA,UAAU,MAAM;CAClB;CAEA,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ;CAClC,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,aACJ,OACA,OACA,QACsC;CACtC,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,OAAO,YAAY,KAAK,OAAO,MAAM,IAAI;CAC/C,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ;CACjD,MAAM,UAAU,MAAM,OAAO,iBAAiB,MAAM,QAAQ;CAE5D,MAAM,SAAoB;EACxB;EACA,MAAM;EACN;EACA,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA;EACA,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B;EACA,UAAU,MAAM;CAClB;CAEA,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ;CAClC,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,eACJ,MACA,OACA,OACA,QACsC;CACtC,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,cAAc,MAAM,gBAAgB,MAAM,eAAe,CAAC,OAAO,IAAI;CAE3E,MAAM,SAAsB;EAC1B,MAAM,YAAY,KAAK,MAAM,MAAM,IAAI;EACvC;EACA,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA;EACA,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B,UAAU;EACV;EACA,aAAa,MAAM,gBAAgB,cAAc,IAAI,6BAA6B;EAClF,OAAO;EACP,QAAQ,SAAS,cAAgB,MAAyB,UAAU,IAAK;CAC3E;CAEA,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,cACJ,OACA,OACA,QACsC;CACtC,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,SAAS,MAAM,UAAU;CAE/B,MAAM,SAAqB;EACzB,MAAM,YAAY,KAAK,QAAQ,MAAM,IAAI;EACzC,MAAM;EACN,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA;EACA,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B,UAAU;EACV,OAAO,MAAM,SAAS;CACxB;CAEA,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,cACJ,OACA,OACA,QACsC;CACtC,MAAM,WAAW,MAAM,QAAQ;CAC/B,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,QAAQ,mBAAmB,KAAK;CACtC,MAAM,aAAa,KAAK,UAAU,MAAM,IAAI,iBAAiB,CAAC;CAC9D,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,SACJ,MAAM,UACN,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI,mBAAmB,UAAU,UAAU,IACjE,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,MAAM,eAAe;CAC1D,MAAM,OAAO,YAAY,KAAK,QAAQ,MAAM,IAAI;CAChD,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ;CAEjD,MAAM,SAAqB;EACzB;EACA,MAAM;EACN,SAAS;EACT,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA;EACA,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B;EACA,UAAU,MAAM;EAChB,WAAW,MAAM,SAAS;EAC1B,mBAAmB;EACnB;EACA,UAAU,MAAM,QAAQ,IAAI;EAC5B;EACA,kBAAkB,MAAM,WAAW;EACnC,WAAW,MAAM,SAAS;EAC1B,iBAAiB,MAAM,cAAc;EACrC,WAAW,MAAM,aAAa;EAC9B,aAAa,MAAM,eAAe;EAClC,WAAW,MAAM,aAAa;EAC9B,YAAY,MAAM,cAAc;EAChC,aAAa,MAAM,eAAe;CACpC;CAEA,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ;CAClC,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,eACJ,OACA,OACA,QACsC;CACtC,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,MAAM,CAAC;CAC1E,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,WAAW,MAAM,YAAY;CACnC,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,SACJ,MAAM,WAAW,WAAW,eAAe,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI;CAC7E,MAAM,OAAO,YAAY,KAAK,SAAS,MAAM,IAAI;CACjD,MAAM,WAAW,MAAM,YAAY,MAAM,QAAQ;CACjD,MAAM,QAAQ,KAAK,UAAU,IAAI;CAEjC,MAAM,SAAsB;EAC1B;EACA,MAAM;EACN,SAAS;EACT,UAAU;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACnC;EACA;EACA,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM,WAAW;EAC1B;EACA,UAAU,MAAM;EAChB;EACA,YAAY,MAAM,cAAc;EAChC,MAAM,MAAM;EACZ,sBAAsB,uBAAuB,MAAM,eAAe,MAAM,KAAK,MAAM;EACnF,aAAa;GACX,aAAa,MAAM,aAAa,eAAe;GAC/C,aAAa,MAAM,aAAa,eAAe;EACjD;EACA,YAAY;GACV,GAAG,iBAAiB,MAAM,QAAQ,IAAI,aAAa,MAAM,QAAQ;GACjE,WAAW;GACX,iBAAiB;GACjB,GAAG,mBAAmB,MAAM,UAAU;EACxC;EACA,YAAY;GACV,GAAG,iBAAiB,MAAM,QAAQ,IAAI,aAAa,MAAM,QAAQ;GACjE,0BAA0B;GAC1B,GAAG,mBAAmB,MAAM,UAAU;EACxC;EACA,cAAc,MAAM,gBAAgB,CAAC;CACvC;CAEA,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ;CAClC,IAAI,QAAQ,KAAK,MAAM;CAEvB,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,IAAM,sBAAsB,UAAwD;CAClF,IAAI,MAAM,OACR,OAAO,MAAM,MAAM,KAAK,SACtB,OAAO,SAAS,WACZ;EAAE,MAAM;EAAM,OAAO;CAAE,IACvB;EAAE,MAAM,KAAK;EAAM,OAAO,KAAK,SAAS;CAAE,CAChD;CAEF,OAAO,iBAAiB,MAAM,QAAQ,EACnC,MAAM,IAAI,EACV,KAAK,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,KAAK,UAAU;EAAE;EAAM,OAAO;CAAE,EAAE;AACvC;AAEA,IAAM,qBAAqB,SACzB,GAAG,IAAK,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK;AAEjD,IAAM,oCACJ,WAC2B;CAC3B,MAAM,aAAqC,CAAC;CAC5C,OAAO,QAAQ,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,WAAW;EACrD,WAAW,OAAO,SAAS,OAAO,KAAK,OAAO,KAAK;CACrD,CAAC;CACD,OAAO;AACT;AAEA,IAAM,qCACJ,cACA,WACA,WACG;CACH,MAAM,SAAmB,CAAC;CAC1B,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,OAAO,SAAiB;EAC5B,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG;GACnB,KAAK,IAAI,IAAI;GACb,OAAO,KAAK,IAAI;EAClB;CACF;CAEA,WAAW,QAAQ,GAAG;CACtB,iBAAiB,YAAY,EAAE,QAAQ,GAAG;CAC1C,OAAO,KAAK,MAAM,EAAE,QAAQ,GAAG;CAC/B,OAAO;AACT;AAEA,IAAM,+BACJ,cACA,QACA,mBACG;CACH,IAAI,SAAS;CACb,IAAI,YAAY;CAEhB,eAAe,eAAe,EAAE,MAAM,YAAY,eAAe;EAC/D,UAAU,aAAa,MAAM,WAAW,UAAU;EAClD,MAAM,QAAQ,OAAO;EACrB,IAAI,SAAS,MACX,UAAU,iBAAiB,qBAAqB,KAAK,IAAI;EAE3D,YAAY,WAAW;CACzB,CAAC;CAED,OAAO,SAAS,aAAa,MAAM,SAAS;AAC9C;AAEA,IAAM,0BACJ,eACA,gBACa;CACb,IAAI,iBAAiB,cAAc,SAAS,GAAG;EAC7C,MAAM,mBAAmB,MAAM,KAAK,EAAE,QAAQ,YAAY,IAAI,GAAG,UAAU;GACzE,MAAM,QAAQ,cAAc;GAC5B,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;EACpF,CAAC;EAED,MAAM,aAAa,iBAAiB,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC;EACzE,IAAI,aAAa,GAAG,OAAO,iBAAiB,KAAK,UAAW,QAAQ,aAAc,GAAG;CACvF;CAEA,IAAI,eAAe,GAAG,OAAO,CAAC;CAC9B,OAAO,MAAM,KAAK,EAAE,QAAQ,YAAY,SAAS,MAAM,WAAW;AACpE;AAEA,IAAM,oBAAoB,UAA8B,WAAW,QAAyB;CAC1F;CACA,WAAW;CACX,mBAAmB;CACnB;CACA,YAAY;CACZ,kBAAkB;CAClB,WAAW;CACX,iBAAiB;CACjB,aAAa;CACb,aAAa;EAAE,KAAK;EAAG,OAAO;EAAG,QAAQ;EAAG,MAAM;CAAE;CACpD,SAAS;EAAE,KAAK;EAAG,OAAO;EAAG,QAAQ;EAAG,MAAM;CAAE;AAClD;AAEA,IAAM,sBACJ,UACoE;CACpE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,MAAM,EAAE,aAAa,SAAS,GAAG,SAAS;CAC1C,OAAO;EACL,GAAG;EACH,GAAI,eAAe,OAAO,EAAE,aAAa,gBAAgB,WAAW,EAAE,IAAI,CAAC;EAC3E,GAAI,WAAW,OAAO,EAAE,SAAS,gBAAgB,OAAO,EAAE,IAAI,CAAC;CACjE;AACF;AAEA,IAAM,mBAAmB,UAA8B;CACrD,IAAI,SAAS,MAAM,OAAO;EAAE,KAAK;EAAG,OAAO;EAAG,QAAQ;EAAG,MAAM;CAAE;CACjE,IAAI,OAAO,UAAU,UAAU,OAAO;EAAE,KAAK;EAAO,OAAO;EAAO,QAAQ;EAAO,MAAM;CAAM;CAC7F,MAAM,IAAI,MAAM,KAAK;CACrB,MAAM,IAAI,MAAM,KAAK;CACrB,OAAO;EACL,KAAK,MAAM,OAAO;EAClB,OAAO,MAAM,SAAS;EACtB,QAAQ,MAAM,UAAU;EACxB,MAAM,MAAM,QAAQ;CACtB;AACF;AAEA,IAAM,eAAe,KAAgB,QAAgB,aAA8B;CACjF,IAAI,UAAU;EACZ,IAAI,IAAI,UAAU,IAAI,QAAQ,GAC5B,MAAM,IAAI,MAAM,sCAAsC,SAAS,EAAE;EAEnE,IAAI,UAAU,IAAI,QAAQ;EAC1B,OAAO;CACT;CAEA,IAAI,OAAO;CACX,GAAG;EACD,IAAI,aAAa,WAAW,IAAI,aAAa,WAAW,KAAK;EAC7D,OAAO,GAAG,OAAO,GAAG,IAAI,aAAa;CACvC,SAAS,IAAI,UAAU,IAAI,IAAI;CAC/B,IAAI,UAAU,IAAI,IAAI;CACtB,OAAO;AACT;AAEA,IAAM,sBAAsB,UAAkB,eAC5C,KAAK,IAAI,GAAG,MAAM,WAAW,UAAU,CAAC;AAE1C,IAAM,+BACJ,OACA,eACA,gBACG;CACH,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,QAAQ,MAAM,IAAI;EACxB,MAAM,WAAW,gBAAgB,MAAM,MAAM,MAAM,WAAW;EAC9D,MAAM,SAAS,gBAAgB,MAAM,MAAM;EAE3C,IAAI,CAAC,WAAW,UAAU,aAAa,KAAK,CAAC,eAAe,QAAQ,WAAW,GAC7E,MAAM,IAAI,MACR,wIACF;CAEJ;AACF;AAEA,IAAM,cACJ,OACA,WACG,MAAM,UAAU,OAAO,SAAS,MAAM,WAAW,OAAO;AAE7D,IAAM,kBACJ,OACA,WAEA,MAAM,QAAQ,OAAO,OACrB,MAAM,UAAU,OAAO,SACvB,MAAM,WAAW,OAAO,UACxB,MAAM,SAAS,OAAO;AAExB,IAAM,0BAA0B,IAAI,IAAI;CAAC;CAAQ;CAAS;AAAK,CAAC;AAChE,IAAM,yBAAyB,IAAI,IAAI;CAAC;CAAY;CAAS;CAAO;AAAK,CAAC;AAC1E,IAAM,oBAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,IAAM,wBAAwB,IAAI,IAAI;CAAC;CAAQ;CAAU;CAAU;CAAU;AAAK,CAAC;AACnF,IAAM,qBAAqB,IAAI,IAAI;CAAC;CAAU;CAAU;AAAQ,CAAC;AAEjE,IAAM,8BACJ,MACA,aAAiC,KAAA,GACjC,WAAW,UACR;CACH,KAAK,MAAM,SAAS,oBAAoB,IAAI,GAAG;EAC7C,IAAI,CAAC,gBAAgB,KAAK,GAAG;EAE7B,IAAI,MAAM,SAAS,aAAa;GAC9B,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,wBAAwB,IAAI,UAAU,GACrE,MAAM,IAAI,MACR,4EACF;GAEF;EACF;EAEA,MAAM,gBACJ,MAAM,SAAS,SAAS,OAAO,YAAY,wBAAwB,IAAI,MAAM,IAAI;EACnF,2BAA2B,MAAM,UAAU,MAAM,MAAM,aAAa;CACtE;AACF;AAEA,IAAM,6BACJ,MACA,aAAiC,KAAA,MAC9B;CACH,KAAK,MAAM,SAAS,oBAAoB,IAAI,GAAG;EAC7C,IAAI,CAAC,gBAAgB,KAAK,GAAG;EAE7B,IAAI,MAAM,SAAS,eAAe,CAAC,cAAc,CAAC,sBAAsB,IAAI,UAAU,IACpF,MAAM,IAAI,MACR,gGACF;EAGF,0BAA0B,MAAM,UAAU,MAAM,IAAI;CACtD;AACF;AAEA,IAAM,2BAA2B,UAAyB,gBAAyB;CACjF,KAAK,MAAM,SAAS,gBAAgB,QAAQ,GAAG;EAC7C,IAAI,CAAC,gBAAgB,KAAK,GAAG;GAC3B,IAAI,eAAe,OAAO,KAAK,EAAE,KAAK,MAAM,IAC1C,MAAM,IAAI,MACR,kFACF;GAEF;EACF;EAEA,IAAI,mBAAmB,IAAI,MAAM,IAAI,GAAG;GACtC,IAAI,CAAC,aACH,MAAM,IAAI,MACR,iGACF;GAEF,IAAI,MAAM,SAAS;QAEC,mBAAmB,KACjC,MAAc,YAAY,eAAe,MAAM,UAAU,UAAU,GACrE,MAAM,IAAI,MACR,6IACF;GAAA;GAGJ,uBAAuB,MAAM,QAAQ;GACrC;EACF;EAEA,IAAI,eAAe,MAAM,SAAS,QAChC,MAAM,IAAI,MACR,kFACF;EAGF,4BAA4B,KAAK;CACnC;AACF;AAEA,IAAM,+BAA+B,SAAsB;CACzD,IAAI,CAAC,gBAAgB,IAAI,GAAG;CAC5B,KAAK,MAAM,SAAS,oBAAoB,KAAK,QAAQ,GAAG;EACtD,IAAI,gBAAgB,KAAK,KAAK,mBAAmB,IAAI,MAAM,IAAI,GAC7D,MAAM,IAAI,MACR,iGACF;EAEF,4BAA4B,KAAK;CACnC;AACF;AAEA,IAAM,kBAAkB,MAAmC,SAA0B;CACnF,KAAK,MAAM,SAAS,oBAAoB,IAAI,GAAG;EAC7C,IAAI,CAAC,gBAAgB,KAAK,GAAG;EAC7B,IAAI,MAAM,SAAS,QAAQ,eAAe,MAAM,UAAU,IAAI,GAAG,OAAO;CAC1E;CACA,OAAO;AACT;AAEA,IAAM,0BAA0B,aAA0C;CACxE,KAAK,MAAM,SAAS,oBAAoB,QAAQ,GAAG;EACjD,IAAI,CAAC,gBAAgB,KAAK,GAAG;EAE7B,IAAI,uBAAuB,IAAI,MAAM,IAAI,GAAG;GAC1C,uBAAuB,MAAM,QAAQ;GACrC;EACF;EAEA,IAAI,CAAC,kBAAkB,IAAI,MAAM,IAAI,GACnC,MAAM,IAAI,MACR,0CAA0C,MAAM,KAAK,0GACvD;EAGF,wBAAwB,KAAK;CAC/B;AACF;AAEA,IAAM,2BAA2B,YAA2B;CAC1D,IAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,WAAW,QAAQ,SAAS,OAAO;CACnF,MAAM,QAAQ,QAAQ;CACtB,IAAI,MAAM,aAAa,SAAU,MAAM,QAAQ,QAAQ,MAAM,aAAa,MACxE,MAAM,IAAI,MAAM,kDAAkD;AAEtE"}
@@ -1,3 +1,3 @@
1
- import { t as Fragment } from "./node-BeNL0xMl.js";
1
+ import { t as Fragment } from "./node-B6TrQFvN.js";
2
2
  import { jsx, jsxs } from "./jsx-runtime.js";
3
3
  export { Fragment, jsx, jsx as jsxDEV, jsxs };
@@ -1,4 +1,4 @@
1
- import { i as createFragmentNode, t as Fragment } from "./node-BeNL0xMl.js";
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);
@@ -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;AAChB,KAAI,SAAS,SAAU,QAAO,mBAAmB,OAAO,IAAI;AAC5D,KAAI,OAAO,SAAS,WAAY,QAAO,KAAK;EAAE,GAAG;EAAO;EAAK,CAAC;AAC9D,OAAM,IAAI,MAAM,8EAA8E;;AAGhG,IAAa,OAAO"}
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-BeNL0xMl.js.map
30
+ //# sourceMappingURL=node-B6TrQFvN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-BeNL0xMl.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,sBAAsB;AAEzD,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;AACrE,KAAI,aAAa,KAAA,EAAW,QAAO,EAAE;AACrC,QAAO,MAAM,QAAQ,SAAS,GAAI,WAA6B,CAAC,SAAwB;;AAG1F,IAAa,qBACX,MACA,UACA,QACqB;CACrB,MAAM,EAAE,UAAU,GAAG,UAAU,YAAY,EAAE;AAC7C,QAAO;EACL;EACA;EACA,UAAU,kBAAkB,SAAS;EACrC;EACD;;AAGH,IAAa,sBACX,UACA,SACoB;CACpB,MAAM;CACN,UAAU,kBAAkB,UAAU,SAAS;CAC/C;CACD;AAED,IAAa,4BACX,SACA,cACmB;CACnB,GAAG;CACH;CACD"}
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 read-only static block. Defaults to top. */
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 = Omit<StaticProps, 'placement'>;
59
- export type FooterProps = Omit<StaticProps, 'placement'>;
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
- /** Column width percentages passed to pdfme headWidthPercentages. */
183
- widths?: number[];
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdfme/jsx",
3
- "version": "6.1.2",
3
+ "version": "6.1.3-dev.2",
4
4
  "description": "Author pdfme templates with JSX stacking layout primitives.",
5
5
  "keywords": [
6
6
  "jsx",