@pdfme/jsx 6.1.1-dev.8 → 6.1.2-dev.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/components.ts","../src/render.ts"],"sourcesContent":["import { createElementNode } from './node.js';\nimport type {\n BoxProps,\n ListProps,\n PageBreakProps,\n PageProps,\n RowProps,\n SpacerProps,\n StackProps,\n TableProps,\n TextProps,\n} from './types.js';\n\nconst makeBuiltin =\n <Props extends Record<string, unknown>, K extends Parameters<typeof createElementNode>[0]>(\n kind: K,\n ) =>\n (props: Props): ReturnType<typeof createElementNode<K>> =>\n createElementNode(kind, props);\n\nexport const Page = makeBuiltin<PageProps, 'page'>('page');\nexport const Stack = makeBuiltin<StackProps, 'stack'>('stack');\nexport const Row = makeBuiltin<RowProps, 'row'>('row');\nexport const Box = makeBuiltin<BoxProps, 'box'>('box');\nexport const Spacer = makeBuiltin<SpacerProps, 'spacer'>('spacer');\nexport const Text = makeBuiltin<TextProps, 'text'>('text');\nexport const List = makeBuiltin<ListProps, 'list'>('list');\nexport const Table = makeBuiltin<TableProps, 'table'>('table');\nexport const PageBreak = (props?: PageBreakProps) => createElementNode('pagebreak', props);\n","import { getDefaultFont, pt2mm, resolvePageSize } from '@pdfme/common';\nimport type { Font, Schema, Template } from '@pdfme/common';\nimport type {\n CellStyle as SchemaCellStyle,\n ListSchema,\n TableSchema,\n TextSchema,\n} from '@pdfme/schemas/types';\nimport { measureTextHeight } from '@pdfme/schemas/utils';\nimport { cloneElementWithChildren, isPdfJsxElement, isPdfJsxFragment } from './node.js';\nimport type {\n BoxProps,\n BoxSides,\n CellStyle,\n ListProps,\n PageProps,\n PdfJsxChild,\n PdfJsxElement,\n RenderOptions,\n RenderResult,\n RowProps,\n SpacerProps,\n StackProps,\n TableProps,\n TextProps,\n} from './types.js';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\ntype RenderCtx = {\n schemas: Schema[];\n inputs: Record<string, string>;\n usedNames: Set<string>;\n nameCounters: Record<string, number>;\n defaultFont?: string;\n font: Font;\n _cache: Map<string | number, unknown>;\n};\n\nconst DEFAULT_FONT_SIZE = 10;\nconst DEFAULT_LINE_HEIGHT = 1;\nconst DEFAULT_CHARACTER_SPACING = 0;\nconst DEFAULT_FONT_COLOR = '#000000';\nconst DEFAULT_DYNAMIC_FONT_SIZE = {\n min: 4,\n max: 72,\n fit: 'vertical',\n} as const satisfies NonNullable<TextSchema['dynamicFontSize']>;\n\nexport const renderToTemplate = async (\n node: PdfJsxChild,\n options: RenderOptions = {},\n): Promise<RenderResult> => {\n validatePageBreakPlacement(node);\n const expanded = expandPageBreaks(node);\n const pages = flattenChildren(expanded).filter(\n (child): child is PdfJsxElement<'page'> => isPdfJsxElement(child) && child.kind === 'page',\n );\n\n if (pages.length === 0) {\n throw new Error('@pdfme/jsx: renderToTemplate root must contain at least one <Page>.');\n }\n\n const firstPageProps = pages[0]?.props as PageProps;\n const firstMargin = resolveBoxSides(firstPageProps.margin);\n const pageSize = resolvePageSize(firstPageProps.size, firstPageProps.orientation);\n validateConsistentPageProps(pages, pageSize, firstMargin);\n const inputs: Record<string, string> = {};\n const usedNames = new Set<string>();\n const nameCounters: Record<string, number> = {};\n const font = options.font ?? getDefaultFont();\n const _cache = new Map<string | number, unknown>();\n const pageSchemas: Schema[][] = [];\n\n for (const page of pages) {\n const props = page.props as PageProps;\n const margin = resolveBoxSides(props.margin);\n const frame = {\n x: margin.left,\n y: margin.top,\n width: pageSize.width - margin.left - margin.right,\n height: pageSize.height - margin.top - margin.bottom,\n };\n const ctx: RenderCtx = {\n schemas: [],\n inputs,\n usedNames,\n nameCounters,\n defaultFont: props.font,\n font,\n _cache,\n };\n await layoutChildren(page.children, frame, 'stack', { gap: 0 }, ctx);\n pageSchemas.push(ctx.schemas);\n }\n\n const template: Template = {\n basePdf: options.basePdf ?? {\n width: pageSize.width,\n height: pageSize.height,\n padding: [firstMargin.top, firstMargin.right, firstMargin.bottom, firstMargin.left],\n },\n schemas: pageSchemas,\n };\n\n return { template, inputs: [inputs] };\n};\n\nconst flattenChildren = (\n children: PdfJsxChild | PdfJsxChild[],\n): (PdfJsxElement | string | number)[] => {\n if (children == null || children === false || children === true) return [];\n if (typeof children === 'string' || typeof children === 'number') return [children];\n if (Array.isArray(children)) return children.flatMap((child) => flattenChildren(child));\n if (isPdfJsxFragment(children)) return flattenChildren(children.children);\n if (isPdfJsxElement(children)) return [children];\n return [];\n};\n\nconst childrenToString = (children: PdfJsxChild | PdfJsxChild[]): string =>\n flattenChildren(children)\n .map((child) => {\n if (typeof child === 'string' || typeof child === 'number') return String(child);\n return childrenToString(child.children);\n })\n .join('');\n\nconst splitChildrenByPageBreak = (children: PdfJsxChild | PdfJsxChild[]): PdfJsxChild[][] => {\n const segments: PdfJsxChild[][] = [[]];\n\n for (const child of flattenForSplitting(children)) {\n if (isPdfJsxElement(child) && child.kind === 'pagebreak') {\n segments.push([]);\n continue;\n }\n\n if (\n isPdfJsxElement(child) &&\n (child.kind === 'page' || child.kind === 'stack' || child.kind === 'box')\n ) {\n const childSegments = splitChildrenByPageBreak(child.children);\n if (childSegments.length === 1) {\n segments[segments.length - 1]?.push(child);\n continue;\n }\n\n segments[segments.length - 1]?.push(cloneElementWithChildren(child, childSegments[0] ?? []));\n for (let i = 1; i < childSegments.length; i += 1) {\n segments.push([cloneElementWithChildren(child, childSegments[i] ?? [])]);\n }\n continue;\n }\n\n segments[segments.length - 1]?.push(child);\n }\n\n return segments;\n};\n\nconst flattenForSplitting = (children: PdfJsxChild | PdfJsxChild[]): PdfJsxChild[] => {\n if (children == null || children === false || children === true) return [];\n if (Array.isArray(children)) return children.flatMap((child) => flattenForSplitting(child));\n if (isPdfJsxFragment(children)) return flattenForSplitting(children.children);\n return [children];\n};\n\nconst expandPageBreaks = (node: PdfJsxChild): PdfJsxChild[] =>\n splitChildrenByPageBreak(node).flat();\n\nconst layoutChildren = async (\n children: PdfJsxChild | PdfJsxChild[],\n frame: Rect,\n mode: 'stack' | 'row',\n opts: { gap: number },\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const items = flattenChildren(children);\n const widths = mode === 'row' ? resolveRowWidths(items, frame.width, opts.gap) : undefined;\n let cursor = 0;\n let crossMax = 0;\n\n for (let i = 0; i < items.length; i += 1) {\n const child = items[i];\n const width = mode === 'row' ? (widths?.[i] ?? 0) : frame.width;\n const childFrame =\n mode === 'stack'\n ? { x: frame.x, y: frame.y + cursor, width, height: Math.max(0, frame.height - cursor) }\n : { x: frame.x + cursor, y: frame.y, width, height: frame.height };\n\n const size =\n typeof child === 'string' || typeof child === 'number'\n ? await renderText({ children: String(child) }, childFrame, ctx)\n : await renderElement(child, childFrame, mode, ctx);\n\n const advance = mode === 'stack' ? size.height : width;\n cursor += advance + (i < items.length - 1 ? opts.gap : 0);\n crossMax = Math.max(crossMax, mode === 'stack' ? size.width : size.height);\n }\n\n return mode === 'stack'\n ? { width: crossMax, height: cursor }\n : { width: cursor, height: crossMax };\n};\n\nconst resolveRowWidths = (\n items: (PdfJsxElement | string | number)[],\n frameWidth: number,\n gap: number,\n): number[] => {\n let fixedWidth = 0;\n let flexCount = 0;\n const widths = items.map((item) => {\n if (typeof item === 'string' || typeof item === 'number') {\n flexCount += 1;\n return undefined;\n }\n const width = (item.props as { width?: number }).width;\n if (typeof width === 'number') {\n fixedWidth += width;\n return width;\n }\n flexCount += 1;\n return undefined;\n });\n\n const remaining = Math.max(0, frameWidth - fixedWidth - Math.max(0, items.length - 1) * gap);\n const flexWidth = flexCount > 0 ? remaining / flexCount : 0;\n return widths.map((width) => width ?? flexWidth);\n};\n\nconst renderElement = async (\n element: PdfJsxElement,\n frame: Rect,\n parentMode: 'stack' | 'row',\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n switch (element.kind) {\n case 'stack':\n return renderStack(element.props as StackProps, element.children, frame, ctx);\n case 'row':\n return renderRow(element.props as RowProps, element.children, frame, ctx);\n case 'box':\n return renderBox(element.props as BoxProps, element.children, frame, parentMode, ctx);\n case 'spacer':\n return Promise.resolve(renderSpacer(element.props as SpacerProps));\n case 'text':\n return renderText(\n { ...(element.props as TextProps), children: element.children },\n frame,\n ctx,\n );\n case 'list':\n return renderList(\n { ...(element.props as ListProps), children: element.children },\n frame,\n ctx,\n );\n case 'table':\n return renderTable(element.props as TableProps, frame, ctx);\n default:\n return { width: 0, height: 0 };\n }\n};\n\nconst renderStack = (\n props: StackProps,\n children: PdfJsxChild[],\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> =>\n layoutChildren(\n children,\n { ...frame, width: props.width ?? frame.width },\n 'stack',\n {\n gap: props.gap ?? 0,\n },\n ctx,\n );\n\nconst renderRow = (\n props: RowProps,\n children: PdfJsxChild[],\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> =>\n layoutChildren(\n children,\n { ...frame, width: props.width ?? frame.width, height: props.height ?? frame.height },\n 'row',\n { gap: props.gap ?? 0 },\n ctx,\n );\n\nconst renderBox = async (\n props: BoxProps,\n children: PdfJsxChild[],\n frame: Rect,\n _parentMode: 'stack' | 'row',\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const width = props.width ?? frame.width;\n const padding = resolveBoxSides(props.padding);\n const needsRect = Boolean(props.background || props.borderColor || props.borderWidth);\n const beforeCount = ctx.schemas.length;\n\n if (needsRect) {\n ctx.schemas.push({\n name: resolveName(ctx, 'box'),\n type: 'rectangle',\n position: { x: frame.x, y: frame.y },\n width,\n height: 0,\n rotate: props.rotate ?? 0,\n opacity: props.opacity ?? 1,\n readOnly: true,\n color: props.background ?? '',\n borderColor: props.borderColor ?? '',\n borderWidth: props.borderWidth ?? 0,\n radius: props.radius ?? 0,\n });\n }\n\n const innerFrame = {\n x: frame.x + padding.left,\n y: frame.y + padding.top,\n width: width - padding.left - padding.right,\n height: (props.height ?? frame.height) - padding.top - padding.bottom,\n };\n const childSize = await layoutChildren(children, innerFrame, 'stack', { gap: 0 }, ctx);\n const height = props.height ?? childSize.height + padding.top + padding.bottom;\n\n if (needsRect) {\n ctx.schemas[beforeCount] = { ...ctx.schemas[beforeCount]!, height };\n }\n\n return { width, height };\n};\n\nconst renderSpacer = (props: SpacerProps): { width: number; height: number } => ({\n width: props.width ?? 0,\n height: props.height ?? 0,\n});\n\nconst renderText = async (\n props: TextProps,\n frame: Rect,\n ctx: RenderCtx,\n): Promise<{ width: number; height: number }> => {\n const fontSize = props.size ?? DEFAULT_FONT_SIZE;\n const lineHeight = props.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const width = props.width ?? frame.width;\n const value = childrenToString(props.children);\n const name = resolveName(ctx, 'text', props.name);\n const readOnly = props.readOnly ?? props.name == null;\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: props.textFormat ?? 'plain',\n overflow: props.overflow,\n strikethrough: props.strikethrough ?? false,\n underline: props.underline ?? false,\n };\n\n if (props.borderColor) schema.borderColor = props.borderColor;\n if (props.borderWidth != null) schema.borderWidth = props.borderWidth;\n if (props.dynamicFontSize) {\n schema.dynamicFontSize = {\n min: props.dynamicFontSize.min ?? DEFAULT_DYNAMIC_FONT_SIZE.min,\n max: props.dynamicFontSize.max ?? DEFAULT_DYNAMIC_FONT_SIZE.max,\n fit: props.dynamicFontSize.fit ?? DEFAULT_DYNAMIC_FONT_SIZE.fit,\n };\n }\n if (props.height == null) {\n schema.height = await measureTextHeight({ value, schema, font: ctx.font, _cache: ctx._cache });\n }\n if (!readOnly) ctx.inputs[name] = value;\n ctx.schemas.push(schema);\n\n return { width, height: schema.height };\n};\n\nconst 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 normalizeColumnWidths = (widths: number[] | undefined, columnCount: number): number[] => {\n if (widths && widths.length > 0) return widths;\n if (columnCount <= 0) return [];\n return Array.from({ length: columnCount }, () => 100 / columnCount);\n};\n\nconst defaultCellStyle = (fontName: string | undefined, fontSize = 10): SchemaCellStyle => ({\n fontName,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize,\n lineHeight: 1,\n characterSpacing: 0,\n fontColor: '#000000',\n backgroundColor: '#ffffff',\n borderColor: '#000000',\n borderWidth: { top: 0, right: 0, bottom: 0, left: 0 },\n padding: { top: 5, right: 5, bottom: 5, left: 5 },\n});\n\nconst normalizeCellStyle = (\n style: CellStyle | undefined,\n): Partial<SchemaCellStyle & { alternateBackgroundColor: string }> => {\n if (!style) return {};\n const { borderWidth, padding, ...rest } = style;\n return {\n ...rest,\n ...(borderWidth != null ? { borderWidth: resolveBoxSides(borderWidth) } : {}),\n ...(padding != null ? { padding: resolveBoxSides(padding) } : {}),\n };\n};\n\nconst resolveBoxSides = (value?: number | BoxSides) => {\n if (value == null) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof value === 'number') return { top: value, right: value, bottom: value, left: value };\n const x = value.x ?? 0;\n const y = value.y ?? 0;\n return {\n top: value.top ?? y,\n right: value.right ?? x,\n bottom: value.bottom ?? y,\n left: value.left ?? x,\n };\n};\n\nconst resolveName = (ctx: RenderCtx, prefix: string, userName?: string): string => {\n if (userName) {\n if (ctx.usedNames.has(userName)) {\n throw new Error(`@pdfme/jsx: duplicate schema name \"${userName}\"`);\n }\n ctx.usedNames.add(userName);\n return userName;\n }\n\n let name = '';\n do {\n ctx.nameCounters[prefix] = (ctx.nameCounters[prefix] ?? 0) + 1;\n name = `${prefix}_${ctx.nameCounters[prefix]}`;\n } while (ctx.usedNames.has(name));\n ctx.usedNames.add(name);\n return name;\n};\n\nconst estimateTextHeight = (fontSize: number, lineHeight: number) =>\n Math.max(4, pt2mm(fontSize * lineHeight));\n\nconst validateConsistentPageProps = (\n pages: PdfJsxElement<'page'>[],\n firstPageSize: { width: number; height: number },\n firstMargin: ReturnType<typeof resolveBoxSides>,\n) => {\n for (let i = 1; i < pages.length; i += 1) {\n const props = pages[i]?.props as PageProps;\n const pageSize = resolvePageSize(props.size, props.orientation);\n const margin = resolveBoxSides(props.margin);\n\n if (!isSameSize(pageSize, firstPageSize) || !isSameBoxSides(margin, firstMargin)) {\n throw new Error(\n '@pdfme/jsx: all <Page> nodes must use the same size, orientation, and margin. pdfme templates have one blank basePdf size and padding.',\n );\n }\n }\n};\n\nconst isSameSize = (\n first: { width: number; height: number },\n second: { width: number; height: number },\n) => first.width === second.width && first.height === second.height;\n\nconst isSameBoxSides = (\n first: ReturnType<typeof resolveBoxSides>,\n second: ReturnType<typeof resolveBoxSides>,\n) =>\n first.top === second.top &&\n first.right === second.right &&\n first.bottom === second.bottom &&\n first.left === second.left;\n\nconst PAGE_BREAK_PARENT_KINDS = new Set(['page', 'stack', 'box']);\n\nconst validatePageBreakPlacement = (\n node: PdfJsxChild | PdfJsxChild[],\n parentKind: string | undefined = undefined,\n canBreak = false,\n) => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (child.kind === 'pagebreak') {\n if (!canBreak || !parentKind || !PAGE_BREAK_PARENT_KINDS.has(parentKind)) {\n throw new Error(\n '@pdfme/jsx: <PageBreak> can only be used inside <Page>, <Stack>, or <Box>.',\n );\n }\n continue;\n }\n\n const childCanBreak =\n child.kind === 'page' ? true : canBreak && PAGE_BREAK_PARENT_KINDS.has(child.kind);\n validatePageBreakPlacement(child.children, child.kind, childCanBreak);\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components.ts","../src/render.ts"],"sourcesContent":["import { createElementNode } from './node.js';\nimport type {\n 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: 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', 'static', 'box']);\n\nconst validatePageBreakPlacement = (\n node: PdfJsxChild | PdfJsxChild[],\n parentKind: string | undefined = undefined,\n canBreak = false,\n) => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (child.kind === 'pagebreak') {\n if (!canBreak || !parentKind || !PAGE_BREAK_PARENT_KINDS.has(parentKind)) {\n throw new Error(\n '@pdfme/jsx: <PageBreak> can only be used inside <Page>, <Stack>, or <Box>.',\n );\n }\n continue;\n }\n\n const childCanBreak =\n child.kind === 'page' ? true : canBreak && PAGE_BREAK_PARENT_KINDS.has(child.kind);\n validatePageBreakPlacement(child.children, child.kind, childCanBreak);\n }\n};\n\nconst validateAbsolutePlacement = (\n node: PdfJsxChild | PdfJsxChild[],\n parentKind: string | undefined = undefined,\n) => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (child.kind === 'absolute' && (!parentKind || !ABSOLUTE_PARENT_KINDS.has(parentKind))) {\n throw new Error('@pdfme/jsx: <Absolute> can only be used inside <Page>, <Static>, or <Box>.');\n }\n\n validateAbsolutePlacement(child.children, child.kind);\n }\n};\n\nconst validateStaticPlacement = (pages: PdfJsxElement<'page'>[]) => {\n for (let pageIndex = 0; pageIndex < pages.length; pageIndex += 1) {\n const page = pages[pageIndex];\n for (const child of flattenForSplitting(page?.children ?? [])) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n if (pageIndex !== 0) {\n throw new Error(\n '@pdfme/jsx: <Static> must appear before any <PageBreak> and can only be used inside the first <Page>.',\n );\n }\n // Validate dynamic JavaScript callers before static children are extracted for layout.\n const placement = getStaticPlacement(child as PdfJsxElement<'static'>);\n if (placement === 'bottom' && hasElementKind(child.children, 'absolute')) {\n throw new Error(\n '@pdfme/jsx: <Absolute> is not supported inside bottom <Static>. Use top <Static> or <Page> for fixed page coordinates.',\n );\n }\n validateStaticChildren(child.children);\n continue;\n }\n validateNoNestedStatic(child);\n }\n }\n};\n\nconst validateNoNestedStatic = (node: PdfJsxChild) => {\n if (!isPdfJsxElement(node)) return;\n for (const child of flattenForSplitting(node.children)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\n }\n validateNoNestedStatic(child);\n }\n};\n\nconst hasElementKind = (node: PdfJsxChild | PdfJsxChild[], kind: string): boolean => {\n for (const child of flattenForSplitting(node)) {\n if (!isPdfJsxElement(child)) continue;\n if (child.kind === kind || hasElementKind(child.children, kind)) return true;\n }\n return false;\n};\n\nconst validateNoTopLevelStatic = (node: PdfJsxChild | PdfJsxChild[]) => {\n for (const child of flattenChildren(node)) {\n if (isPdfJsxElement(child) && child.kind === 'static') {\n throw new Error(\n '@pdfme/jsx: <Static> can only be used as a direct child of the first <Page>.',\n );\n }\n }\n};\n\nconst validateStaticChildren = (children: PdfJsxChild | PdfJsxChild[]) => {\n for (const child of flattenForSplitting(children)) {\n if (!isPdfJsxElement(child)) continue;\n\n if (STATIC_CONTAINER_KINDS.has(child.kind)) {\n validateStaticChildren(child.children);\n continue;\n }\n\n if (!STATIC_LEAF_KINDS.has(child.kind)) {\n throw new Error(\n `@pdfme/jsx: <Static> does not support <${child.kind}> children. Supported: read-only Stack, Row, Box, Spacer, Text, Image, Svg, Rectangle, Ellipse, and Line.`,\n );\n }\n\n validateStaticLeafProps(child);\n }\n};\n\nconst validateStaticLeafProps = (element: PdfJsxElement) => {\n if (element.kind !== 'text' && element.kind !== 'image' && element.kind !== 'svg') return;\n const props = element.props as { name?: unknown; readOnly?: unknown };\n if (props.readOnly === false || (props.name != null && props.readOnly !== true)) {\n throw new Error('@pdfme/jsx: <Static> children must be read-only.');\n }\n};\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { BasePdf, Font, PageOrientation, PageSize, Schema, Template } from '@pdfme/common';
2
- import type { ALIGNMENT, LIST_STYLE, ListItem as SchemaListItem, CellStyle as SchemaCellStyle, TableSchema, TextSchema } from '@pdfme/schemas/types';
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' | 'stack' | 'row' | 'box' | 'spacer' | 'text' | 'list' | 'table' | 'pagebreak';
4
+ export type BuiltinKind = 'page' | 'static' | 'absolute' | 'stack' | 'row' | 'box' | 'spacer' | 'text' | 'multiVariableText' | 'image' | 'svg' | 'rectangle' | 'ellipse' | 'line' | 'list' | 'table' | 'pagebreak';
5
5
  export type PdfJsxElement<K extends BuiltinKind = BuiltinKind> = {
6
6
  kind: K;
7
7
  props: Record<string, unknown>;
@@ -32,7 +32,16 @@ export type BoxSides = {
32
32
  /** Vertical shorthand used when top/bottom are omitted. */
33
33
  y?: number;
34
34
  };
35
- export type CommonProps = Partial<Pick<Schema, 'rotate' | 'opacity'>>;
35
+ export type LayoutAlignItems = 'start' | 'center' | 'end' | 'stretch';
36
+ export type LayoutJustifyContent = 'start' | 'center' | 'end' | 'space-between';
37
+ export type LayoutProps = {
38
+ margin?: number | BoxSides;
39
+ /** Row-only grow weight. Explicit width is used as the basis when present. */
40
+ flexGrow?: number;
41
+ /** Short alias for flexGrow. */
42
+ flex?: number;
43
+ };
44
+ export type CommonProps = LayoutProps & Partial<Pick<Schema, 'rotate' | 'opacity'>>;
36
45
  export type PageProps = {
37
46
  size?: PageSize;
38
47
  orientation?: PageOrientation;
@@ -40,15 +49,35 @@ export type PageProps = {
40
49
  font?: string;
41
50
  children?: PdfJsxChild;
42
51
  };
43
- export type StackProps = {
52
+ export type StaticPlacement = 'top' | 'bottom';
53
+ export type StaticProps = {
54
+ /** Page edge used to anchor this read-only static block. Defaults to top. */
55
+ placement?: StaticPlacement;
56
+ children?: PdfJsxChild;
57
+ };
58
+ export type HeaderProps = Omit<StaticProps, 'placement'>;
59
+ export type FooterProps = Omit<StaticProps, 'placement'>;
60
+ export type AbsoluteProps = {
61
+ x?: number;
62
+ y?: number;
63
+ width?: number;
64
+ height?: number;
65
+ children?: PdfJsxChild;
66
+ };
67
+ export type StackProps = LayoutProps & {
44
68
  gap?: number;
45
69
  width?: number;
70
+ height?: number;
71
+ alignItems?: LayoutAlignItems;
72
+ justifyContent?: LayoutJustifyContent;
46
73
  children?: PdfJsxChild;
47
74
  };
48
- export type RowProps = {
75
+ export type RowProps = LayoutProps & {
49
76
  gap?: number;
50
77
  width?: number;
51
78
  height?: number;
79
+ alignItems?: Exclude<LayoutAlignItems, 'stretch'>;
80
+ justifyContent?: LayoutJustifyContent;
52
81
  children?: PdfJsxChild;
53
82
  };
54
83
  export type BoxProps = CommonProps & {
@@ -61,7 +90,7 @@ export type BoxProps = CommonProps & {
61
90
  radius?: number;
62
91
  children?: PdfJsxChild;
63
92
  };
64
- export type SpacerProps = {
93
+ export type SpacerProps = LayoutProps & {
65
94
  width?: number;
66
95
  height?: number;
67
96
  };
@@ -76,9 +105,46 @@ export type TextProps = CommonProps & TextSchemaProps & {
76
105
  color?: TextSchema['fontColor'];
77
106
  background?: TextSchema['backgroundColor'];
78
107
  borderColor?: string;
79
- borderWidth?: number;
108
+ borderWidth?: number | BoxSides;
109
+ padding?: number | BoxSides;
80
110
  dynamicFontSize?: Partial<NonNullable<TextSchema['dynamicFontSize']>>;
81
111
  };
112
+ export type MultiVariableTextValues = Record<string, string | number | boolean | null | undefined>;
113
+ type MultiVariableTextSchemaProps = Partial<Pick<MultiVariableTextSchema, 'name' | 'width' | 'height' | 'lineHeight' | 'strikethrough' | 'underline' | 'readOnly' | 'required' | 'textFormat' | 'overflow'>>;
114
+ export type MultiVariableTextProps = CommonProps & MultiVariableTextSchemaProps & {
115
+ children?: PdfJsxChild;
116
+ text?: string;
117
+ variables?: string[];
118
+ values?: MultiVariableTextValues;
119
+ size?: MultiVariableTextSchema['fontSize'];
120
+ font?: MultiVariableTextSchema['fontName'];
121
+ align?: MultiVariableTextSchema['alignment'];
122
+ valign?: MultiVariableTextSchema['verticalAlignment'];
123
+ spacing?: MultiVariableTextSchema['characterSpacing'];
124
+ color?: MultiVariableTextSchema['fontColor'];
125
+ background?: MultiVariableTextSchema['backgroundColor'];
126
+ borderColor?: string;
127
+ borderWidth?: number | BoxSides;
128
+ padding?: number | BoxSides;
129
+ dynamicFontSize?: Partial<NonNullable<MultiVariableTextSchema['dynamicFontSize']>>;
130
+ };
131
+ type ImageSchemaProps = Partial<Pick<ImageSchema, 'name' | 'width' | 'height' | 'readOnly' | 'required'>>;
132
+ export type ImageProps = CommonProps & ImageSchemaProps & {
133
+ src?: string;
134
+ };
135
+ type SvgSchemaProps = Partial<Pick<SVGSchema, 'name' | 'width' | 'height' | 'readOnly' | 'required'>>;
136
+ export type SvgProps = SvgSchemaProps & {
137
+ svg?: string;
138
+ children?: PdfJsxChild;
139
+ } & CommonProps;
140
+ type ShapeSchemaProps = Partial<Pick<ShapeSchema, 'name' | 'width' | 'height' | 'borderWidth' | 'borderColor' | 'radius'>>;
141
+ export type RectangleProps = CommonProps & ShapeSchemaProps & {
142
+ fill?: ShapeSchema['color'];
143
+ };
144
+ export type EllipseProps = CommonProps & Omit<ShapeSchemaProps, 'radius'> & {
145
+ fill?: ShapeSchema['color'];
146
+ };
147
+ export type LineProps = CommonProps & Partial<Pick<LineSchema, 'name' | 'width' | 'height' | 'color'>>;
82
148
  export type ListItem = string | {
83
149
  text: SchemaListItem['text'];
84
150
  level?: SchemaListItem['level'];
@@ -113,8 +179,11 @@ export type TableProps = CommonProps & {
113
179
  head: string[];
114
180
  rows?: (string | number)[][];
115
181
  data?: (string | number)[][];
116
- /** Column width percentages passed to pdfme headWidthPercentages. */
117
- widths?: number[];
182
+ /**
183
+ * Relative column width weights, not millimeter widths. Values are normalized to pdfme
184
+ * headWidthPercentages. Missing or invalid weights default to 1.
185
+ */
186
+ columnWeights?: number[];
118
187
  width?: number;
119
188
  height?: number;
120
189
  font?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdfme/jsx",
3
- "version": "6.1.1-dev.8",
3
+ "version": "6.1.2-dev.3",
4
4
  "description": "Author pdfme templates with JSX stacking layout primitives.",
5
5
  "keywords": [
6
6
  "jsx",