@pdfme/schemas 6.1.1-dev.5 → 6.1.1-dev.8

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.
Files changed (48) hide show
  1. package/dist/{builtins-BpOyUs31.js → builtins-pN5NVCSV.js} +130 -530
  2. package/dist/builtins-pN5NVCSV.js.map +1 -0
  3. package/dist/builtins.d.ts +1 -1
  4. package/dist/builtins.js +1 -1
  5. package/dist/checkbox/index.d.ts +2 -2
  6. package/dist/dynamicLayout.d.ts +3 -0
  7. package/dist/dynamicLayout.js +20 -0
  8. package/dist/dynamicLayout.js.map +1 -0
  9. package/dist/dynamicTemplate-ByBNu75x.js +71 -0
  10. package/dist/dynamicTemplate-ByBNu75x.js.map +1 -0
  11. package/dist/{dynamicTemplate-DslOH4FZ.js → dynamicTemplate-CkrZKlg-.js} +2 -2
  12. package/dist/{dynamicTemplate-DslOH4FZ.js.map → dynamicTemplate-CkrZKlg-.js.map} +1 -1
  13. package/dist/{lists-BmAAx0lx.js → dynamicTemplate-Cy07Imb5.js} +2 -2
  14. package/dist/dynamicTemplate-Cy07Imb5.js.map +1 -0
  15. package/dist/graphics/image.d.ts +1 -1
  16. package/dist/graphics/signature.d.ts +1 -1
  17. package/dist/helper-BaUAusvL.js +40 -0
  18. package/dist/helper-BaUAusvL.js.map +1 -0
  19. package/dist/{helper-6FilIoVM.js → helper-CBd9plP_.js} +5 -2
  20. package/dist/helper-CBd9plP_.js.map +1 -0
  21. package/dist/index.js +28 -42
  22. package/dist/index.js.map +1 -1
  23. package/dist/lists.js +1 -1
  24. package/dist/measure-h-7PUE2B.js +584 -0
  25. package/dist/measure-h-7PUE2B.js.map +1 -0
  26. package/dist/multiVariableText/dynamicTemplate.d.ts +2 -0
  27. package/dist/radioGroup/index.d.ts +2 -2
  28. package/dist/select/index.d.ts +2 -2
  29. package/dist/shapes/line.d.ts +1 -1
  30. package/dist/shapes/rectAndEllipse.d.ts +1 -2
  31. package/dist/tables/helper.d.ts +4 -4
  32. package/dist/tables.js +1 -1
  33. package/dist/text/constants.d.ts +3 -0
  34. package/dist/text/dynamicTemplate.d.ts +2 -0
  35. package/dist/text/measure.d.ts +26 -0
  36. package/dist/text/overflow.d.ts +3 -0
  37. package/dist/text/types.d.ts +7 -0
  38. package/dist/texts.d.ts +4 -0
  39. package/dist/texts.js +4 -0
  40. package/dist/types.d.ts +14 -0
  41. package/dist/types.js +0 -0
  42. package/dist/utils.d.ts +1 -0
  43. package/dist/utils.js +3 -2
  44. package/dist/utils.js.map +1 -1
  45. package/package.json +16 -1
  46. package/dist/builtins-BpOyUs31.js.map +0 -1
  47. package/dist/helper-6FilIoVM.js.map +0 -1
  48. package/dist/lists-BmAAx0lx.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins-pN5NVCSV.js","names":[],"sources":["../src/text/linkAnnotation.ts","../src/text/richTextPdfRender.ts","../src/text/overflow.ts","../src/text/pdfRender.ts","../src/text/icons/index.ts","../src/text/extraFormatter.ts","../src/text/propPanel.ts","../src/text/uiRender.ts","../src/text/index.ts","../src/builtins.ts"],"sourcesContent":["import { normalizeSafeLinkUri } from '@pdfme/common';\nimport type { PDFDocument, PDFPage } from '@pdfme/pdf-lib';\nimport { PDFName, PDFString } from '@pdfme/pdf-lib';\n\nexport type LinkAnnotationRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport const addUriLinkAnnotation = (arg: {\n pdfDoc: PDFDocument;\n page: PDFPage;\n uri: string;\n rect: LinkAnnotationRect;\n borderWidth?: number;\n}) => {\n const { pdfDoc, page, uri, rect, borderWidth = 0 } = arg;\n const safeUri = normalizeSafeLinkUri(uri);\n if (!safeUri || rect.width <= 0 || rect.height <= 0) return;\n\n const annotationRef = pdfDoc.context.register(\n pdfDoc.context.obj({\n Type: PDFName.of('Annot'),\n Subtype: PDFName.of('Link'),\n Rect: [rect.x, rect.y, rect.x + rect.width, rect.y + rect.height],\n Border: [0, 0, borderWidth],\n A: {\n Type: PDFName.of('Action'),\n S: PDFName.of('URI'),\n URI: PDFString.of(safeUri),\n },\n }),\n );\n\n page.node.addAnnot(annotationRef);\n};\n","import type { PDFFont, Rotation } from '@pdfme/pdf-lib';\nimport type { ColorType, Font, PDFRenderProps } from '@pdfme/common';\nimport { getInternalLinkTarget, mm2pt, registerInternalLinkAnnotation } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n CODE_BACKGROUND_COLOR,\n CODE_HORIZONTAL_PADDING,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_TOP,\n} from './constants.js';\nimport { getFontDescentInPt, heightOfFontAtSize, widthOfTextAtSize } from './helper.js';\nimport { addUriLinkAnnotation, type LinkAnnotationRect } from './linkAnnotation.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange } from './measure.js';\nimport {\n countRichTextLineGraphemes,\n layoutRichTextLines,\n resolveRichTextRuns,\n type RichTextLineRun,\n} from './richText.js';\nimport type { TextSchema } from './types.js';\nimport { hex2PrintingColor, rotatePoint } from '../utils.js';\n\ntype TextColor = ReturnType<typeof hex2PrintingColor>;\n\nconst getSyntheticBoldWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticBold ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS : 0;\n\nconst getSyntheticItalicWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n\nconst getRunWidth = (run: RichTextLineRun, fontSize: number, characterSpacing: number) =>\n widthOfTextAtSize(run.text, run.fontKitFont, fontSize, characterSpacing) +\n getSyntheticBoldWidth(run, fontSize) +\n getSyntheticItalicWidth(run, fontSize);\n\nconst getPdfFontFromObj = (run: RichTextLineRun, pdfFontObj: Record<string, PDFFont>) => {\n const pdfFont = pdfFontObj[run.fontName];\n if (!pdfFont) {\n throw new Error(`[@pdfme/schemas] Missing embedded font \"${run.fontName}\".`);\n }\n return pdfFont;\n};\n\nconst embedFontsForRuns = async (\n runs: RichTextLineRun[],\n embedPdfFont: (fontName: string) => Promise<PDFFont>,\n) => {\n const fontNames = Array.from(new Set(runs.map((run) => run.fontName)));\n const pdfFonts = await Promise.all(\n fontNames.map(async (fontName) => [fontName, await embedPdfFont(fontName)] as const),\n );\n return Object.fromEntries(pdfFonts);\n};\n\nconst drawDecorationLine = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n color: TextColor;\n opacity: number | undefined;\n}) => {\n const { page, x, y, width, rotate, pivotPoint, fontSize, color, opacity } = arg;\n if (width <= 0) return;\n\n page.drawLine({\n start: rotatePoint({ x, y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: x + width, y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color,\n opacity,\n });\n};\n\nconst getAxisAlignedRect = (arg: {\n x: number;\n y: number;\n width: number;\n height: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n}): LinkAnnotationRect => {\n const { x, y, width, height, rotate, pivotPoint } = arg;\n if (rotate.angle === 0) return { x, y, width, height };\n\n const points = [\n { x, y },\n { x: x + width, y },\n { x: x + width, y: y + height },\n { x, y: y + height },\n ].map((point) => rotatePoint(point, pivotPoint, rotate.angle));\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n\n return {\n x: minX,\n y: minY,\n width: Math.max(...xs) - minX,\n height: Math.max(...ys) - minY,\n };\n};\n\nconst getLinkAnnotationRect = (arg: {\n run: RichTextLineRun;\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n}): LinkAnnotationRect => {\n const { run, x, y, width, rotate, pivotPoint, fontSize } = arg;\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n const descent = getFontDescentInPt(run.fontKitFont, fontSize);\n const rectY = y + descent;\n const rectHeight = textHeight - descent;\n\n return getAxisAlignedRect({\n x,\n y: rectY,\n width,\n height: rectHeight,\n rotate,\n pivotPoint,\n });\n};\n\nconst drawRun = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n run: RichTextLineRun;\n pdfFont: PDFFont;\n x: number;\n y: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n lineHeight: number;\n color: TextColor;\n opacity: number | undefined;\n colorType: ColorType;\n characterSpacing: number;\n strikethrough: boolean;\n underline: boolean;\n}) => {\n const {\n page,\n pdfLib,\n run,\n pdfFont,\n x,\n y,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing,\n strikethrough,\n underline,\n } = arg;\n const runWidth = getRunWidth(run, fontSize, characterSpacing);\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n\n if (run.code) {\n const padding = CODE_HORIZONTAL_PADDING;\n const bgX = x - padding;\n const bgY = y - textHeight * 0.2;\n const bgPoint =\n rotate.angle === 0\n ? { x: bgX, y: bgY }\n : rotatePoint({ x: bgX, y: bgY }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: bgPoint.x,\n y: bgPoint.y,\n width: runWidth + padding * 2,\n height: textHeight * 1.2,\n rotate,\n color: hex2PrintingColor(CODE_BACKGROUND_COLOR, colorType),\n opacity,\n });\n }\n\n if (strikethrough && runWidth > 0) {\n drawDecorationLine({\n page,\n x,\n y: y + textHeight / 3,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n if (underline && runWidth > 0) {\n drawDecorationLine({\n page,\n x,\n y: y - textHeight / 12,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n const drawAt = (drawX: number) => {\n const point =\n rotate.angle === 0 ? { x: drawX, y } : rotatePoint({ x: drawX, y }, pivotPoint, rotate.angle);\n page.drawText(run.text, {\n x: point.x,\n y: point.y,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFont,\n opacity,\n ...(run.syntheticItalic ? { ySkew: pdfLib.degrees(SYNTHETIC_ITALIC_SKEW_DEGREES) } : {}),\n });\n };\n\n drawAt(x);\n if (run.syntheticBold) {\n const offset = fontSize * SYNTHETIC_BOLD_OFFSET_RATIO;\n for (let i = 1; i <= SYNTHETIC_BOLD_PDF_EXTRA_DRAWS; i++) {\n drawAt(x + offset * i);\n }\n }\n};\n\nexport const renderInlineMarkdownText = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n embedPdfFont: (fontName: string) => Promise<PDFFont>;\n fontKitFont: FontKitFont;\n pdfDoc: PDFRenderProps<TextSchema>['pdfDoc'];\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n _cache: Map<string | number, unknown>;\n colorType: ColorType;\n fontSize: number;\n color: TextColor;\n alignment: string;\n verticalAlignment: string;\n lineHeight: number;\n characterSpacing: number;\n x: number;\n width: number;\n height: number;\n pageHeight: number;\n pivotPoint: { x: number; y: number };\n rotate: Rotation;\n opacity: number | undefined;\n}) => {\n const {\n value,\n schema,\n font,\n embedPdfFont,\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n width,\n height,\n pageHeight,\n pivotPoint,\n rotate,\n opacity,\n } = arg;\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const allLines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize,\n characterSpacing,\n boxWidthInPt: width,\n });\n const lines = applyTextLineRange(allLines, schema.__textLineRange);\n const lineRangeStart = schema.__textLineRange?.start ?? 0;\n const pdfFontObj = await embedFontsForRuns(\n lines.flatMap((line) => line.runs),\n embedPdfFont,\n );\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n if (line.runs.length === 0) return;\n\n let textWidth = line.width;\n let spacing = characterSpacing;\n const shouldJustify =\n alignment === 'justify' && !line.hardBreak && lineRangeStart + rowIndex < allLines.length - 1;\n\n if (shouldJustify) {\n const graphemeCount = countRichTextLineGraphemes(line);\n if (graphemeCount > 0) {\n spacing += (width - textWidth) / graphemeCount;\n textWidth = width;\n }\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n const yLine =\n pageHeight - mm2pt(schema.position.y) - yOffset - lineHeight * fontSize * rowIndex;\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n if (schema.strikethrough || schema.underline) {\n const textHeight = Math.max(\n ...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)),\n );\n if (schema.strikethrough) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n if (schema.underline) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n }\n\n line.runs.reduce((currentX, run, runIndex) => {\n const runWidth = getRunWidth(run, fontSize, spacing);\n const pdfFont = getPdfFontFromObj(run, pdfFontObj);\n drawRun({\n page,\n pdfLib,\n run,\n pdfFont,\n x: currentX,\n y: yLine,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing: spacing,\n strikethrough: Boolean(run.strikethrough),\n underline: Boolean(run.href) && !schema.underline,\n });\n if (run.href) {\n const rect = getLinkAnnotationRect({\n run,\n x: currentX,\n y: yLine,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n });\n const targetName = getInternalLinkTarget(run.href);\n if (targetName) {\n registerInternalLinkAnnotation({ _cache, page, targetName, rect });\n } else {\n addUriLinkAnnotation({ pdfDoc, page, uri: run.href, rect });\n }\n }\n\n return currentX + runWidth + (runIndex === line.runs.length - 1 ? 0 : spacing);\n }, xLine);\n });\n};\n","import { TEXT_OVERFLOW_EXPAND } from './constants.js';\nimport type { TextSchema } from './types.js';\n\nexport const isTextOverflowExpand = (schema: Pick<TextSchema, 'overflow'>) =>\n schema.overflow === TEXT_OVERFLOW_EXPAND;\n\nexport const shouldUseDynamicFontSize = (\n schema: Pick<TextSchema, 'dynamicFontSize' | 'overflow'>,\n) => Boolean(schema.dynamicFontSize) && !isTextOverflowExpand(schema);\n","import { PDFFont, PDFDocument } from '@pdfme/pdf-lib';\nimport type { Font as FontKitFont } from 'fontkit';\nimport type { TextSchema } from './types.js';\nimport {\n PDFRenderProps,\n ColorType,\n Font,\n getDefaultFont,\n getFallbackFontName,\n mm2pt,\n} from '@pdfme/common';\nimport {\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n} from './constants.js';\nimport {\n calculateDynamicFontSize,\n heightOfFontAtSize,\n getFontDescentInPt,\n getFontKitFont,\n fetchRemoteFontData,\n widthOfTextAtSize,\n splitTextToSize,\n} from './helper.js';\nimport { stripInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange } from './measure.js';\nimport { calculateDynamicRichTextFontSize, isInlineMarkdownTextSchema } from './richText.js';\nimport { renderInlineMarkdownText } from './richTextPdfRender.js';\nimport { shouldUseDynamicFontSize } from './overflow.js';\nimport { convertForPdfLayoutProps, rotatePoint, hex2PrintingColor } from '../utils.js';\n\ntype PdfFontCache = Record<string, Promise<PDFFont>>;\n\nconst PDF_FONT_CACHE_KEY = 'text-pdf-font-cache';\n\nconst getPdfFontCache = (_cache: Map<string | number, unknown>): PdfFontCache => {\n let pdfFontCache = _cache.get(PDF_FONT_CACHE_KEY) as PdfFontCache | undefined;\n if (!pdfFontCache) {\n pdfFontCache = {};\n _cache.set(PDF_FONT_CACHE_KEY, pdfFontCache);\n }\n\n return pdfFontCache;\n};\n\nconst embedAndGetFont = (arg: {\n pdfDoc: PDFDocument;\n font: Font;\n fontName: string;\n _cache: Map<string | number, unknown>;\n}) => {\n const { pdfDoc, font, fontName, _cache } = arg;\n const pdfFontCache = getPdfFontCache(_cache);\n const cachedFont = pdfFontCache[fontName];\n if (cachedFont) {\n return cachedFont;\n }\n\n const fontValue = font[fontName];\n if (!fontValue) {\n return Promise.reject(new Error(`[@pdfme/schemas] Font \"${fontName}\" is not found.`));\n }\n\n const pdfFontPromise = (async () => {\n let fontData = fontValue.data;\n if (typeof fontData === 'string' && fontData.startsWith('http')) {\n fontData = await fetchRemoteFontData(fontData);\n }\n return pdfDoc.embedFont(fontData, {\n subset: typeof fontValue.subset === 'undefined' ? true : fontValue.subset,\n });\n })();\n\n pdfFontCache[fontName] = pdfFontPromise;\n return pdfFontPromise;\n};\n\nconst getFontProp = ({\n value,\n fontKitFont,\n schema,\n colorType,\n fontSize: resolvedFontSize,\n}: {\n value: string;\n fontKitFont: FontKitFont;\n colorType?: ColorType;\n schema: TextSchema;\n fontSize?: number;\n}) => {\n const fontSize =\n resolvedFontSize ??\n (shouldUseDynamicFontSize(schema)\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE));\n const color = hex2PrintingColor(schema.fontColor || DEFAULT_FONT_COLOR, colorType);\n\n return {\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n verticalAlignment: schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n lineHeight: schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n color,\n };\n};\n\nlet graphemeSegmenter: Intl.Segmenter | undefined;\n\nconst getGraphemeSegmenter = () => {\n graphemeSegmenter ??= new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n return graphemeSegmenter;\n};\n\nexport const pdfRender = async (arg: PDFRenderProps<TextSchema>) => {\n const { value, pdfDoc, pdfLib, page, options, schema, _cache } = arg;\n if (!value) return;\n\n const { font = getDefaultFont(), colorType } = options;\n const fontName = schema.fontName ? schema.fontName : getFallbackFontName(font);\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n\n const pdfFontValuePromise = enableInlineMarkdown\n ? undefined\n : embedAndGetFont({\n pdfDoc,\n font,\n fontName,\n _cache,\n });\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && shouldUseDynamicFontSize(schema)\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : undefined;\n const fontProp = getFontProp({\n value: displayValue,\n fontKitFont,\n schema,\n colorType,\n fontSize: dynamicRichTextFontSize,\n });\n\n const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = fontProp;\n\n const pageHeight = page.getHeight();\n const {\n width,\n height,\n rotate,\n position: { x, y },\n opacity,\n } = convertForPdfLayoutProps({ schema, pageHeight, applyRotateTranslate: false });\n\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(schema.position.y) - height / 2 };\n\n if (schema.backgroundColor) {\n const color = hex2PrintingColor(schema.backgroundColor, colorType);\n if (rotate.angle !== 0) {\n // Apply the same rotation logic as text rendering to match UI behavior\n const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotate.angle);\n page.drawRectangle({ x: rotatedPoint.x, y: rotatedPoint.y, width, height, rotate, color });\n } else {\n page.drawRectangle({ x, y, width, height, rotate, color });\n }\n }\n\n if (enableInlineMarkdown) {\n await renderInlineMarkdownText({\n value,\n schema,\n font,\n embedPdfFont: (fontName) => embedAndGetFont({ pdfDoc, font, fontName, _cache }),\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n width,\n height,\n pageHeight,\n pivotPoint,\n rotate,\n opacity,\n });\n return;\n }\n if (!pdfFontValuePromise) {\n throw new Error('[@pdfme/schemas] Failed to prepare PDF font for text rendering.');\n }\n const pdfFontValue = await pdfFontValuePromise;\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n const lines = applyTextLineRange(\n splitTextToSize({\n value,\n characterSpacing,\n fontSize,\n fontKitFont,\n boxWidthInPt: width,\n }),\n schema.__textLineRange,\n );\n const needsTextWidth = alignment !== 'left' || Boolean(schema.strikethrough || schema.underline);\n const needsTextHeight = Boolean(schema.strikethrough || schema.underline);\n\n // Text lines are rendered from the bottom upwards, we need to adjust the position down\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n const trimmed = line.replace('\\n', '');\n const textWidth = needsTextWidth\n ? widthOfTextAtSize(trimmed, fontKitFont, fontSize, characterSpacing)\n : 0;\n const textHeight = needsTextHeight ? heightOfFontAtSize(fontKitFont, fontSize) : 0;\n const rowYOffset = lineHeight * fontSize * rowIndex;\n\n // Adobe Acrobat Reader shows an error if `drawText` is called with an empty text\n if (line === '') {\n // return; // this also works\n line = '\\r\\n';\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n let yLine = pageHeight - mm2pt(schema.position.y) - yOffset - rowYOffset;\n\n // draw strikethrough\n if (schema.strikethrough && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine + textHeight / 3;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n // draw underline\n if (schema.underline && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine - textHeight / 12;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n if (rotate.angle !== 0) {\n // As we draw each line individually from different points, we must translate each lines position\n // relative to the UI rotation pivot point. see comments in convertForPdfLayoutProps() for more info.\n const rotatedPoint = rotatePoint({ x: xLine, y: yLine }, pivotPoint, rotate.angle);\n xLine = rotatedPoint.x;\n yLine = rotatedPoint.y;\n }\n\n let spacing = characterSpacing;\n if (alignment === 'justify' && line.slice(-1) !== '\\n') {\n // if alignment is `justify` but the end of line is not newline, then adjust the spacing\n const segmenter = getGraphemeSegmenter();\n const iterator = segmenter.segment(trimmed)[Symbol.iterator]();\n const len = Array.from(iterator).length;\n spacing += (width - textWidth) / len;\n }\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n page.drawText(trimmed, {\n x: xLine,\n y: yLine,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFontValue,\n opacity,\n });\n });\n};\n","import {\n Strikethrough,\n Underline,\n AlignLeft,\n AlignCenter,\n AlignRight,\n ArrowUpToLine,\n ArrowDownToLine,\n AlignJustify,\n} from 'lucide';\nimport { createSvgStr } from '../../utils.js';\n\nexport const TextStrikethroughIcon = createSvgStr(Strikethrough);\n\nexport const TextUnderlineIcon = createSvgStr(Underline);\n\nexport const TextAlignLeftIcon = createSvgStr(AlignLeft);\n\nexport const TextAlignCenterIcon = createSvgStr(AlignCenter);\n\nexport const TextAlignRightIcon = createSvgStr(AlignRight);\n\nexport const TextAlignJustifyIcon = createSvgStr(AlignJustify);\n\nexport const TextVerticalAlignTopIcon = createSvgStr(ArrowUpToLine);\n\n// svg icons are material icons from https://www.xicons.org\nexport const TextVerticalAlignMiddleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 24 24\"><path d=\"M8 19h3v4h2v-4h3l-4-4l-4 4zm8-14h-3V1h-2v4H8l4 4l4-4zM4 11v2h16v-2H4z\" fill=\"currentColor\"></path></svg>`;\n\nexport const TextVerticalAlignBottomIcon = createSvgStr(ArrowDownToLine);\n","// No imports needed from @pdfme/common\nimport {\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextAlignJustifyIcon,\n TextStrikethroughIcon,\n TextUnderlineIcon,\n TextVerticalAlignBottomIcon,\n TextVerticalAlignMiddleIcon,\n TextVerticalAlignTopIcon,\n} from './icons/index.js';\nimport {\n ALIGN_CENTER,\n ALIGN_RIGHT,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n ALIGN_JUSTIFY,\n} from './constants.js';\n\nexport enum Formatter {\n STRIKETHROUGH = 'strikethrough',\n UNDERLINE = 'underline',\n ALIGNMENT = 'alignment',\n VERTICAL_ALIGNMENT = 'verticalAlignment',\n}\n\ninterface GroupButtonBoolean {\n key: Formatter;\n icon: string;\n type: 'boolean';\n}\n\ninterface GroupButtonString {\n key: Formatter;\n icon: string;\n type: 'select';\n value: string;\n}\n\ntype GroupButton = GroupButtonBoolean | GroupButtonString;\n\nexport function getExtraFormatterSchema(i18n: (key: string) => string): {\n title: string;\n widget: string;\n buttons: GroupButton[];\n span: number;\n} {\n const buttons: GroupButton[] = [\n { key: Formatter.STRIKETHROUGH, icon: TextStrikethroughIcon, type: 'boolean' },\n { key: Formatter.UNDERLINE, icon: TextUnderlineIcon, type: 'boolean' },\n { key: Formatter.ALIGNMENT, icon: TextAlignLeftIcon, type: 'select', value: DEFAULT_ALIGNMENT },\n { key: Formatter.ALIGNMENT, icon: TextAlignCenterIcon, type: 'select', value: ALIGN_CENTER },\n { key: Formatter.ALIGNMENT, icon: TextAlignRightIcon, type: 'select', value: ALIGN_RIGHT },\n { key: Formatter.ALIGNMENT, icon: TextAlignJustifyIcon, type: 'select', value: ALIGN_JUSTIFY },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignTopIcon,\n type: 'select',\n value: DEFAULT_VERTICAL_ALIGNMENT,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignMiddleIcon,\n type: 'select',\n value: VERTICAL_ALIGN_MIDDLE,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignBottomIcon,\n type: 'select',\n value: VERTICAL_ALIGN_BOTTOM,\n },\n ];\n return {\n title: i18n('schemas.text.format'),\n widget: 'ButtonGroup',\n buttons,\n span: 24,\n };\n}\n","import {\n DEFAULT_FONT_NAME,\n PropPanel,\n PropPanelWidgetProps,\n PropPanelSchema,\n getFallbackFontName,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_COLOR,\n DYNAMIC_FIT_VERTICAL,\n DYNAMIC_FIT_HORIZONTAL,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n DEFAULT_TEXT_FORMAT,\n TEXT_FORMAT_INLINE_MARKDOWN,\n TEXT_FORMAT_PLAIN,\n TEXT_OVERFLOW_EXPAND,\n TEXT_OVERFLOW_VISIBLE,\n DEFAULT_TEXT_OVERFLOW,\n DEFAULT_FONT_VARIANT_FALLBACK,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n FONT_VARIANT_FALLBACK_SYNTHETIC,\n} from './constants.js';\nimport { DEFAULT_OPACITY, HEX_COLOR_PATTERN } from '../constants.js';\nimport { getExtraFormatterSchema } from './extraFormatter.js';\nimport { isTextOverflowExpand } from './overflow.js';\n\nconst UseDynamicFontSize = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n const isExpand = isTextOverflowExpand(activeSchema as unknown as TextSchema);\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n !isExpand && Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n checkbox.disabled = isExpand;\n checkbox.onchange = (e: Event) => {\n const val = (e.target as HTMLInputElement).checked\n ? {\n min: DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n max: DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n fit: DEFAULT_DYNAMIC_FIT,\n }\n : undefined;\n changeSchemas([{ key: 'dynamicFontSize', value: val, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.dynamicFontSize') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.style.opacity = isExpand ? '0.5' : '1';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nconst UseInlineMarkdown = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n (activeSchema as { textFormat?: unknown })?.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n checkbox.onchange = (e: Event) => {\n const value = (e.target as HTMLInputElement).checked\n ? TEXT_FORMAT_INLINE_MARKDOWN\n : TEXT_FORMAT_PLAIN;\n changeSchemas([{ key: 'textFormat', value, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.inlineMarkdown') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nexport const propPanel: PropPanel<TextSchema> = {\n schema: ({ options, activeSchema, i18n }) => {\n const font = options.font || { [DEFAULT_FONT_NAME]: { data: '', fallback: true } };\n const fontNames = Object.keys(font);\n const fallbackFontName = getFallbackFontName(font);\n\n const activeTextSchema = activeSchema as unknown as TextSchema;\n const isExpand = isTextOverflowExpand(activeTextSchema);\n const enableDynamicFont =\n !isExpand && Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n const hideTextFormat = activeTextSchema.type === 'text' && activeTextSchema.readOnly !== true;\n const enableInlineMarkdown =\n activeTextSchema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN && !hideTextFormat;\n const baseFontName =\n activeTextSchema.fontName && font[activeTextSchema.fontName]\n ? activeTextSchema.fontName\n : fallbackFontName;\n const optionalFontNames = [\n { label: baseFontName, value: '' },\n ...fontNames\n .filter((name) => name !== baseFontName)\n .map((name) => ({ label: name, value: name })),\n ];\n\n const textSchema: Record<string, PropPanelSchema> = {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n disabled: enableDynamicFont,\n props: { min: 0 },\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n props: { min: 0 },\n },\n formatter: getExtraFormatterSchema(i18n),\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n overflow: {\n title: i18n('schemas.text.overflow'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_TEXT_OVERFLOW,\n props: {\n options: [\n { label: i18n('schemas.text.overflowVisible'), value: TEXT_OVERFLOW_VISIBLE },\n { label: i18n('schemas.text.overflowExpand'), value: TEXT_OVERFLOW_EXPAND },\n ],\n },\n span: 8,\n },\n useDynamicFontSize: { type: 'boolean', widget: 'UseDynamicFontSize', bind: false, span: 16 },\n dynamicFontSize: {\n type: 'object',\n widget: 'card',\n column: 3,\n properties: {\n min: {\n title: i18n('schemas.text.min'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n max: {\n title: i18n('schemas.text.max'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n fit: {\n title: i18n('schemas.text.fit'),\n type: 'string',\n widget: 'select',\n hidden: !enableDynamicFont,\n props: {\n options: [\n { label: i18n('schemas.horizontal'), value: DYNAMIC_FIT_HORIZONTAL },\n { label: i18n('schemas.vertical'), value: DYNAMIC_FIT_VERTICAL },\n ],\n },\n },\n },\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n backgroundColor: {\n title: i18n('schemas.bgColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n useInlineMarkdown: {\n type: 'boolean',\n widget: 'UseInlineMarkdown',\n bind: false,\n hidden: hideTextFormat,\n span: enableInlineMarkdown ? 12 : 24,\n },\n fontVariantFallback: {\n title: i18n('schemas.text.variantFallback'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_FONT_VARIANT_FALLBACK,\n hidden: !enableInlineMarkdown,\n props: {\n options: [\n { label: i18n('schemas.text.synthetic'), value: FONT_VARIANT_FALLBACK_SYNTHETIC },\n { label: i18n('schemas.text.plain'), value: FONT_VARIANT_FALLBACK_PLAIN },\n { label: i18n('schemas.text.error'), value: FONT_VARIANT_FALLBACK_ERROR },\n ],\n },\n span: 12,\n },\n fontVariants: {\n title: i18n('schemas.text.markdownFonts'),\n type: 'object',\n widget: 'card',\n column: 2,\n hidden: !enableInlineMarkdown,\n properties: {\n bold: {\n title: i18n('schemas.text.boldFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n italic: {\n title: i18n('schemas.text.italicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n boldItalic: {\n title: i18n('schemas.text.boldItalicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n code: {\n title: i18n('schemas.text.codeFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n },\n },\n };\n\n return textSchema;\n },\n widgets: { UseDynamicFontSize, UseInlineMarkdown },\n defaultSchema: {\n name: '',\n type: 'text',\n content: 'Type Something...',\n position: { x: 0, y: 0 },\n width: 45,\n height: 10,\n // If the value of \"rotate\" is set to undefined or not set at all, rotation will be disabled in the UI.\n // Check this document: https://pdfme.com//docs/custom-schemas#learning-how-to-create-from-pdfmeschemas-code\n rotate: 0,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: DEFAULT_VERTICAL_ALIGNMENT,\n fontSize: DEFAULT_FONT_SIZE,\n textFormat: DEFAULT_TEXT_FORMAT,\n overflow: DEFAULT_TEXT_OVERFLOW,\n fontVariantFallback: DEFAULT_FONT_VARIANT_FALLBACK,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n dynamicFontSize: undefined,\n fontColor: DEFAULT_FONT_COLOR,\n fontName: undefined,\n backgroundColor: '',\n opacity: DEFAULT_OPACITY,\n strikethrough: false,\n underline: false,\n },\n};\n","import type * as CSS from 'csstype';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n UIRenderProps,\n getDefaultFont,\n getInternalLinkTarget,\n mm2pt,\n normalizeLinkHref,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n PLACEHOLDER_FONT_COLOR,\n CODE_BACKGROUND_COLOR,\n SYNTHETIC_BOLD_CSS_TEXT_SHADOW,\n TEXT_FORMAT_INLINE_MARKDOWN,\n} from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n getBrowserVerticalFontAdjustments,\n isFirefox,\n splitTextToSize,\n} from './helper.js';\nimport { parseInlineMarkdown, stripInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange, plainTextLinesToValue } from './measure.js';\nimport { shouldUseDynamicFontSize } from './overflow.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n layoutRichTextLines,\n resolveRichTextRuns,\n} from './richText.js';\nimport { isEditable } from '../utils.js';\n\nconst replaceUnsupportedChars = (text: string, fontKitFont: FontKitFont): string => {\n const charSupportCache: { [char: string]: boolean } = {};\n\n const isCharSupported = (char: string): boolean => {\n if (char in charSupportCache) {\n return charSupportCache[char];\n }\n const isSupported = fontKitFont.hasGlyphForCodePoint(char.codePointAt(0) || 0);\n charSupportCache[char] = isSupported;\n return isSupported;\n };\n\n const segments = text.split(/(\\r\\n|\\n|\\r)/);\n\n return segments\n .map((segment) => {\n if (/\\r\\n|\\n|\\r/.test(segment)) {\n return segment;\n }\n\n return Array.from(segment)\n .map((char) => {\n if (/\\s/.test(char) || char.charCodeAt(0) < 32) {\n return char;\n }\n\n return isCharSupported(char) ? char : '〿';\n })\n .join('');\n })\n .join('');\n};\n\nexport const uiRender = async (arg: UIRenderProps<TextSchema>) => {\n const { value, schema, mode, onChange, stopEditing, tabIndex, placeholder, options, _cache } =\n arg;\n const hasInlineMarkdownFormat = schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const isReadOnlySplitInlineMarkdownFormChunk =\n mode === 'form' && Boolean(schema.__textLineRange) && hasInlineMarkdownFormat;\n const renderInlineMarkdownReadOnlyChunk =\n enableInlineMarkdown || isReadOnlySplitInlineMarkdownFormChunk;\n const editable = isEditable(mode, schema) && !isReadOnlySplitInlineMarkdownFormChunk;\n const usePlaceholder = editable && placeholder && !value;\n const getText = (element: HTMLDivElement) => {\n let text = element.innerText;\n if (text.endsWith('\\n')) {\n // contenteditable adds additional newline char retrieved with innerText\n text = text.slice(0, -1);\n }\n return text;\n };\n const font = options?.font || getDefaultFont();\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, import('fontkit').Font>,\n );\n const enableDynamicFontSize = shouldUseDynamicFontSize(schema);\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && enableDynamicFontSize\n ? await calculateDynamicRichTextFontSize({\n value: usePlaceholder ? (placeholder as string) : value,\n schema,\n font,\n _cache,\n })\n : undefined;\n const textBlock = buildStyledTextContainer(\n isReadOnlySplitInlineMarkdownFormChunk ? { ...arg, mode: 'viewer' } : arg,\n fontKitFont,\n usePlaceholder ? placeholder : displayValue,\n dynamicRichTextFontSize,\n );\n\n const processedText = replaceUnsupportedChars(\n getRangedPlainTextValue({\n value,\n schema,\n fontKitFont,\n fontSize: schema.fontSize ?? DEFAULT_FONT_SIZE,\n }),\n fontKitFont,\n );\n\n if (!editable) {\n if (renderInlineMarkdownReadOnlyChunk) {\n await renderInlineMarkdownReadOnly({\n textBlock,\n value,\n schema,\n font,\n _cache,\n });\n return;\n }\n\n // Read-only mode\n textBlock.innerHTML = processedText\n .split('')\n .map((l, i) => {\n const escaped = l\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n return `<span style=\"letter-spacing:${\n String(value).length === i + 1 ? 0 : 'inherit'\n };\">${escaped}</span>`;\n })\n .join('');\n return;\n }\n\n makeElementPlainTextContentEditable(textBlock);\n textBlock.tabIndex = tabIndex || 0;\n textBlock.innerText = mode === 'designer' ? value : processedText;\n textBlock.addEventListener('blur', (e: Event) => {\n if (onChange) onChange({ key: 'content', value: getText(e.target as HTMLDivElement) });\n if (stopEditing) stopEditing();\n });\n\n if (enableDynamicFontSize) {\n let dynamicFontSize: undefined | number = undefined;\n\n textBlock.addEventListener('keyup', () => {\n setTimeout(() => {\n // Use a regular function instead of an async one since we don't need await\n (() => {\n if (!textBlock.textContent) return;\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value: isInlineMarkdownTextSchema(schema)\n ? stripInlineMarkdown(getText(textBlock))\n : getText(textBlock),\n startingFontSize: dynamicFontSize,\n });\n textBlock.style.fontSize = `${dynamicFontSize}pt`;\n\n const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n textBlock.style.paddingTop = `${newTopAdj}px`;\n textBlock.style.marginBottom = `${newBottomAdj}px`;\n })();\n }, 0);\n });\n }\n\n if (usePlaceholder) {\n textBlock.style.color = PLACEHOLDER_FONT_COLOR;\n textBlock.addEventListener('focus', () => {\n if (textBlock.innerText === placeholder) {\n textBlock.innerText = '';\n textBlock.style.color = schema.fontColor ?? DEFAULT_FONT_COLOR;\n }\n });\n }\n\n if (mode === 'designer') {\n setTimeout(() => {\n textBlock.focus();\n // Set the focus to the end of the editable element when you focus, as we would for a textarea\n const selection = window.getSelection();\n const range = document.createRange();\n if (selection && range) {\n range.selectNodeContents(textBlock);\n range.collapse(false); // Collapse range to the end\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n};\n\nconst renderInlineMarkdownReadOnly = async (arg: {\n textBlock: HTMLDivElement;\n value: string;\n schema: TextSchema;\n font: NonNullable<UIRenderProps<TextSchema>['options']['font']>;\n _cache: Map<string | number, unknown>;\n}) => {\n const { textBlock, value, schema, font, _cache } = arg;\n const runs = await resolveRichTextRuns({\n runs: parseInlineMarkdown(value),\n schema,\n font,\n _cache,\n });\n if (schema.__textLineRange) {\n const lines = applyTextLineRange(\n layoutRichTextLines({\n runs,\n fontSize: schema.fontSize ?? DEFAULT_FONT_SIZE,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n boxWidthInPt: mm2pt(schema.width),\n }),\n schema.__textLineRange,\n );\n\n textBlock.innerHTML = '';\n lines.forEach((line, lineIndex) => {\n line.runs.forEach((run) => {\n appendInlineMarkdownRun({ textBlock, run, schema, font });\n });\n if (lineIndex < lines.length - 1) textBlock.appendChild(document.createElement('br'));\n });\n return;\n }\n\n textBlock.innerHTML = '';\n runs.forEach((run) => {\n appendInlineMarkdownRun({ textBlock, run, schema, font });\n });\n};\n\nconst appendInlineMarkdownRun = (arg: {\n textBlock: HTMLDivElement;\n run: Awaited<ReturnType<typeof resolveRichTextRuns>>[number];\n schema: TextSchema;\n font: NonNullable<UIRenderProps<TextSchema>['options']['font']>;\n}) => {\n const { textBlock, run, schema, font } = arg;\n const href = run.href ? normalizeLinkHref(run.href) : undefined;\n const span = href ? document.createElement('a') : document.createElement('span');\n const processedText = replaceUnsupportedChars(run.text, run.fontKitFont);\n const textDecorations: string[] = [];\n\n span.textContent = processedText;\n if (href) {\n const anchor = span as HTMLAnchorElement;\n anchor.href = href;\n if (!getInternalLinkTarget(href)) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n }\n textDecorations.push('underline');\n }\n if (run.fontName) {\n span.style.fontFamily = `'${run.fontName}'`;\n }\n if (run.syntheticBold) {\n span.style.fontWeight = '800';\n span.style.textShadow = SYNTHETIC_BOLD_CSS_TEXT_SHADOW;\n }\n if (run.syntheticItalic) {\n span.style.fontStyle = 'italic';\n }\n if (run.strikethrough) {\n textDecorations.push('line-through');\n }\n if (textDecorations.length > 0) {\n span.style.textDecoration = textDecorations.join(' ');\n }\n if (run.code) {\n span.style.backgroundColor = CODE_BACKGROUND_COLOR;\n span.style.borderRadius = '2px';\n span.style.padding = '0 0.15em';\n if (!schema.fontVariants?.code || !font[schema.fontVariants.code]) {\n span.style.fontFamily = run.fontName ? `'${run.fontName}', monospace` : 'monospace';\n }\n }\n textBlock.appendChild(span);\n};\n\nconst getRangedPlainTextValue = (arg: {\n value: string;\n schema: TextSchema;\n fontKitFont: FontKitFont;\n fontSize: number;\n}) => {\n const { value, schema, fontKitFont, fontSize } = arg;\n if (!schema.__textLineRange) return value;\n\n const lines = applyTextLineRange(\n splitTextToSize({\n value,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n fontKitFont,\n boxWidthInPt: mm2pt(schema.width),\n }),\n schema.__textLineRange,\n );\n return plainTextLinesToValue(lines);\n};\n\nexport const buildStyledTextContainer = (\n arg: UIRenderProps<TextSchema>,\n fontKitFont: FontKitFont,\n value: string,\n resolvedDynamicFontSize?: number,\n) => {\n const { schema, rootElement, mode } = arg;\n\n let dynamicFontSize: undefined | number = resolvedDynamicFontSize;\n\n if (dynamicFontSize === undefined && shouldUseDynamicFontSize(schema) && value) {\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value,\n startingFontSize: dynamicFontSize,\n });\n }\n\n // Depending on vertical alignment, we need to move the top or bottom of the font to keep\n // it within it's defined box and align it with the generated pdf.\n const { topAdj, bottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n\n const topAdjustment = topAdj.toString();\n const bottomAdjustment = bottomAdj.toString();\n\n const container = document.createElement('div');\n\n const containerStyle: CSS.Properties = {\n padding: 0,\n resize: 'none',\n backgroundColor: getBackgroundColor(value, schema),\n border: 'none',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: mapVerticalAlignToFlex(schema.verticalAlignment),\n width: '100%',\n height: '100%',\n cursor: isEditable(mode, schema) ? 'text' : 'default',\n };\n Object.assign(container.style, containerStyle);\n rootElement.innerHTML = '';\n rootElement.appendChild(container);\n\n // text decoration\n const textDecorations = [];\n if (schema.strikethrough) textDecorations.push('line-through');\n if (schema.underline) textDecorations.push('underline');\n\n const textBlockStyle: CSS.Properties = {\n // Font formatting styles\n fontFamily: schema.fontName ? `'${schema.fontName}'` : 'inherit',\n color: schema.fontColor ? schema.fontColor : DEFAULT_FONT_COLOR,\n fontSize: `${dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE}pt`,\n letterSpacing: `${schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING}pt`,\n lineHeight: `${schema.lineHeight ?? DEFAULT_LINE_HEIGHT}em`,\n textAlign: schema.alignment ?? DEFAULT_ALIGNMENT,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n // Block layout styles\n resize: 'none',\n border: 'none',\n outline: 'none',\n marginBottom: `${bottomAdjustment}px`,\n paddingTop: `${topAdjustment}px`,\n backgroundColor: 'transparent',\n textDecoration: textDecorations.join(' '),\n };\n\n const textBlock = document.createElement('div');\n textBlock.id = 'text-' + String(schema.id);\n Object.assign(textBlock.style, textBlockStyle);\n\n container.appendChild(textBlock);\n\n return textBlock;\n};\n\n/**\n * Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.\n * This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.\n */\nexport const makeElementPlainTextContentEditable = (element: HTMLElement) => {\n if (!isFirefox()) {\n element.contentEditable = 'plaintext-only';\n return;\n }\n\n element.contentEditable = 'true';\n element.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n document.execCommand('insertLineBreak', false, undefined);\n }\n });\n\n element.addEventListener('paste', (e: ClipboardEvent) => {\n e.preventDefault();\n const paste = e.clipboardData?.getData('text');\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n selection.deleteFromDocument();\n selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));\n selection.collapseToEnd();\n });\n};\n\nexport const mapVerticalAlignToFlex = (verticalAlignmentValue: string | undefined) => {\n switch (verticalAlignmentValue) {\n case VERTICAL_ALIGN_TOP:\n return 'flex-start';\n case VERTICAL_ALIGN_MIDDLE:\n return 'center';\n case VERTICAL_ALIGN_BOTTOM:\n return 'flex-end';\n }\n return 'flex-start';\n};\n\nconst getBackgroundColor = (value: string, schema: { backgroundColor?: string }) => {\n if (!value || !schema.backgroundColor) return 'transparent';\n return schema.backgroundColor;\n};\n","import type { Plugin } from '@pdfme/common';\nimport { pdfRender } from './pdfRender.js';\nimport { propPanel } from './propPanel.js';\nimport { uiRender } from './uiRender.js';\nimport type { TextSchema } from './types.js';\nimport { TextCursorInput } from 'lucide';\nimport { createSvgStr } from '../utils.js';\n\nconst textSchema: Plugin<TextSchema> = {\n pdf: pdfRender,\n ui: uiRender,\n propPanel,\n icon: createSvgStr(TextCursorInput),\n};\n\nexport default textSchema;\n","import text from './text/index.js';\n\n// The default built-in plugin surface is intentionally limited to text.\n// Generator/UI consumers that need image, barcode, table, or other schema types\n// must import and pass those plugins explicitly from `@pdfme/schemas`.\nconst builtInPlugins = { Text: text };\n\nexport { builtInPlugins };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  declare const builtInPlugins: {
2
- Text: import("@pdfme/common").Plugin<import("./text/types.js").TextSchema>;
2
+ Text: import("@pdfme/common").Plugin<import("./types.js").TextSchema>;
3
3
  };
4
4
  export { builtInPlugins };
package/dist/builtins.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as builtInPlugins } from "./builtins-BpOyUs31.js";
1
+ import { t as builtInPlugins } from "./builtins-pN5NVCSV.js";
2
2
  export { builtInPlugins };
@@ -1,6 +1,6 @@
1
1
  import { Plugin, Schema } from '@pdfme/common';
2
- interface Checkbox extends Schema {
2
+ export interface CheckboxSchema extends Schema {
3
3
  color: string;
4
4
  }
5
- declare const schema: Plugin<Checkbox>;
5
+ declare const schema: Plugin<CheckboxSchema>;
6
6
  export default schema;
@@ -0,0 +1,3 @@
1
+ import type { DynamicLayoutArgs, DynamicLayoutCallbackResult, Schema } from '@pdfme/common';
2
+ export declare const isDynamicLayoutSchema: (schema: Schema) => boolean;
3
+ export declare const getDynamicLayoutForSchema: (value: string, args: DynamicLayoutArgs) => Promise<DynamicLayoutCallbackResult>;
@@ -0,0 +1,20 @@
1
+ import "./helper-CBd9plP_.js";
2
+ import { n as getDynamicLayoutForTable } from "./dynamicTemplate-CkrZKlg-.js";
3
+ import { t as getDynamicLayoutForList } from "./dynamicTemplate-Cy07Imb5.js";
4
+ import { n as getDynamicLayoutForMultiVariableText, t as getDynamicLayoutForText } from "./dynamicTemplate-ByBNu75x.js";
5
+ //#region src/dynamicLayout.ts
6
+ var isExpandableTextSchema = (schema) => (schema.type === "text" || schema.type === "multiVariableText") && schema.overflow === "expand";
7
+ var isDynamicLayoutSchema = (schema) => schema.type === "table" || schema.type === "list" || isExpandableTextSchema(schema);
8
+ var getDynamicLayoutForSchema = (value, args) => {
9
+ switch (args.schema.type) {
10
+ case "table": return getDynamicLayoutForTable(value, args);
11
+ case "list": return getDynamicLayoutForList(value, args);
12
+ case "text": return getDynamicLayoutForText(value, args);
13
+ case "multiVariableText": return getDynamicLayoutForMultiVariableText(value, args);
14
+ default: return Promise.resolve([args.schema.height]);
15
+ }
16
+ };
17
+ //#endregion
18
+ export { getDynamicLayoutForSchema, isDynamicLayoutSchema };
19
+
20
+ //# sourceMappingURL=dynamicLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicLayout.js","names":[],"sources":["../src/dynamicLayout.ts"],"sourcesContent":["import type { DynamicLayoutArgs, DynamicLayoutCallbackResult, Schema } from '@pdfme/common';\nimport { getDynamicLayoutForList } from './list/dynamicTemplate.js';\nimport { getDynamicLayoutForMultiVariableText } from './multiVariableText/dynamicTemplate.js';\nimport { getDynamicLayoutForTable } from './tables/dynamicTemplate.js';\nimport { TEXT_OVERFLOW_EXPAND } from './text/constants.js';\nimport { getDynamicLayoutForText } from './text/dynamicTemplate.js';\n\nconst isExpandableTextSchema = (schema: Schema) =>\n (schema.type === 'text' || schema.type === 'multiVariableText') &&\n (schema as { overflow?: unknown }).overflow === TEXT_OVERFLOW_EXPAND;\n\nexport const isDynamicLayoutSchema = (schema: Schema) =>\n schema.type === 'table' || schema.type === 'list' || isExpandableTextSchema(schema);\n\nexport const getDynamicLayoutForSchema = (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutCallbackResult> => {\n switch (args.schema.type) {\n case 'table':\n return getDynamicLayoutForTable(value, args);\n case 'list':\n return getDynamicLayoutForList(value, args);\n case 'text':\n return getDynamicLayoutForText(value, args);\n case 'multiVariableText':\n return getDynamicLayoutForMultiVariableText(value, args);\n default:\n return Promise.resolve([args.schema.height]);\n }\n};\n"],"mappings":";;;;;AAOA,IAAM,0BAA0B,YAC7B,OAAO,SAAS,UAAU,OAAO,SAAS,wBAC1C,OAAkC,aAAA;AAErC,IAAa,yBAAyB,WACpC,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU,uBAAuB,OAAO;AAErF,IAAa,6BACX,OACA,SACyC;AACzC,SAAQ,KAAK,OAAO,MAApB;EACE,KAAK,QACH,QAAO,yBAAyB,OAAO,KAAK;EAC9C,KAAK,OACH,QAAO,wBAAwB,OAAO,KAAK;EAC7C,KAAK,OACH,QAAO,wBAAwB,OAAO,KAAK;EAC7C,KAAK,oBACH,QAAO,qCAAqC,OAAO,KAAK;EAC1D,QACE,QAAO,QAAQ,QAAQ,CAAC,KAAK,OAAO,OAAO,CAAC"}
@@ -0,0 +1,71 @@
1
+ import "./helper-CBd9plP_.js";
2
+ import { l as isInlineMarkdownTextSchema, o as sumLineHeights, r as measureTextLines } from "./measure-h-7PUE2B.js";
3
+ import { n as substituteVariablesAsInlineMarkdownLiterals, r as validateVariables, t as substituteVariables } from "./helper-BaUAusvL.js";
4
+ //#region src/multiVariableText/dynamicTemplate.ts
5
+ var getDynamicLayoutForMultiVariableText = async (value, args) => {
6
+ if (args.schema.type !== "multiVariableText") return { heights: [args.schema.height] };
7
+ const schema = args.schema;
8
+ if (schema.overflow !== "expand") return { heights: [schema.height] };
9
+ let renderValue = value;
10
+ if (!schema.readOnly) {
11
+ if (!validateVariables(value, schema)) return { heights: [schema.height] };
12
+ renderValue = isInlineMarkdownTextSchema(schema) ? substituteVariablesAsInlineMarkdownLiterals(schema.text || "", value) : substituteVariables(schema.text || "", value);
13
+ }
14
+ const { lineHeights } = await measureTextLines({
15
+ value: renderValue,
16
+ schema,
17
+ font: args.options.font,
18
+ _cache: args._cache,
19
+ ignoreDynamicFontSize: true
20
+ });
21
+ const measuredHeight = sumLineHeights(lineHeights);
22
+ if (measuredHeight <= schema.height || lineHeights.length === 0) return {
23
+ heights: [schema.height],
24
+ patchSplitSchema: () => ({ dynamicFontSize: void 0 })
25
+ };
26
+ return {
27
+ heights: lineHeights.length === 1 ? [Math.max(schema.height, measuredHeight)] : lineHeights,
28
+ patchSplitSchema: ({ start, end, isSplit }) => ({
29
+ dynamicFontSize: void 0,
30
+ __textLineRange: lineHeights.length === 1 ? void 0 : {
31
+ start,
32
+ end
33
+ },
34
+ __isSplit: isSplit
35
+ })
36
+ };
37
+ };
38
+ //#endregion
39
+ //#region src/text/dynamicTemplate.ts
40
+ var getDynamicLayoutForText = async (value, args) => {
41
+ if (args.schema.type !== "text") return { heights: [args.schema.height] };
42
+ const schema = args.schema;
43
+ if (schema.overflow !== "expand") return { heights: [schema.height] };
44
+ const { lineHeights } = await measureTextLines({
45
+ value,
46
+ schema,
47
+ font: args.options.font,
48
+ _cache: args._cache,
49
+ ignoreDynamicFontSize: true
50
+ });
51
+ const measuredHeight = sumLineHeights(lineHeights);
52
+ if (measuredHeight <= schema.height || lineHeights.length === 0) return {
53
+ heights: [schema.height],
54
+ patchSplitSchema: () => ({ dynamicFontSize: void 0 })
55
+ };
56
+ return {
57
+ heights: lineHeights.length === 1 ? [Math.max(schema.height, measuredHeight)] : lineHeights,
58
+ patchSplitSchema: ({ start, end, isSplit }) => ({
59
+ dynamicFontSize: void 0,
60
+ __textLineRange: lineHeights.length === 1 ? void 0 : {
61
+ start,
62
+ end
63
+ },
64
+ __isSplit: isSplit
65
+ })
66
+ };
67
+ };
68
+ //#endregion
69
+ export { getDynamicLayoutForMultiVariableText as n, getDynamicLayoutForText as t };
70
+
71
+ //# sourceMappingURL=dynamicTemplate-ByBNu75x.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicTemplate-ByBNu75x.js","names":[],"sources":["../src/multiVariableText/dynamicTemplate.ts","../src/text/dynamicTemplate.ts"],"sourcesContent":["import type { DynamicLayoutArgs, DynamicLayoutResult } from '@pdfme/common';\nimport { TEXT_OVERFLOW_EXPAND } from '../text/constants.js';\nimport { measureTextLines, sumLineHeights } from '../text/measure.js';\nimport { isInlineMarkdownTextSchema } from '../text/richText.js';\nimport type { MultiVariableTextSchema } from './types.js';\nimport {\n substituteVariables,\n substituteVariablesAsInlineMarkdownLiterals,\n validateVariables,\n} from './helper.js';\n\nexport const getDynamicLayoutForMultiVariableText = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n if (args.schema.type !== 'multiVariableText') return { heights: [args.schema.height] };\n\n const schema = args.schema as MultiVariableTextSchema;\n if (schema.overflow !== TEXT_OVERFLOW_EXPAND) {\n return { heights: [schema.height] };\n }\n\n let renderValue = value;\n if (!schema.readOnly) {\n if (!validateVariables(value, schema)) {\n return { heights: [schema.height] };\n }\n\n renderValue = isInlineMarkdownTextSchema(schema)\n ? substituteVariablesAsInlineMarkdownLiterals(schema.text || '', value)\n : substituteVariables(schema.text || '', value);\n }\n const { lineHeights } = await measureTextLines({\n value: renderValue,\n schema,\n font: args.options.font,\n _cache: args._cache,\n // `expand` owns the height decision, so measuring against a shrink-to-fit font size\n // would make the field keep its original box instead of growing.\n ignoreDynamicFontSize: true,\n });\n const measuredHeight = sumLineHeights(lineHeights);\n\n if (measuredHeight <= schema.height || lineHeights.length === 0) {\n return {\n heights: [schema.height],\n patchSplitSchema: () => ({ dynamicFontSize: undefined }),\n };\n }\n\n return {\n heights: lineHeights.length === 1 ? [Math.max(schema.height, measuredHeight)] : lineHeights,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n dynamicFontSize: undefined,\n __textLineRange: lineHeights.length === 1 ? undefined : { start, end },\n __isSplit: isSplit,\n }),\n };\n};\n","import type { DynamicLayoutArgs, DynamicLayoutResult } from '@pdfme/common';\nimport { TEXT_OVERFLOW_EXPAND } from './constants.js';\nimport { measureTextLines, sumLineHeights } from './measure.js';\nimport type { TextSchema } from './types.js';\n\nexport const getDynamicLayoutForText = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n if (args.schema.type !== 'text') return { heights: [args.schema.height] };\n\n const schema = args.schema as TextSchema;\n if (schema.overflow !== TEXT_OVERFLOW_EXPAND) {\n return { heights: [schema.height] };\n }\n\n const { lineHeights } = await measureTextLines({\n value,\n schema,\n font: args.options.font,\n _cache: args._cache,\n // `expand` owns the height decision, so measuring against a shrink-to-fit font size\n // would make the field keep its original box instead of growing.\n ignoreDynamicFontSize: true,\n });\n const measuredHeight = sumLineHeights(lineHeights);\n\n if (measuredHeight <= schema.height || lineHeights.length === 0) {\n return {\n heights: [schema.height],\n patchSplitSchema: () => ({ dynamicFontSize: undefined }),\n };\n }\n\n return {\n heights: lineHeights.length === 1 ? [Math.max(schema.height, measuredHeight)] : lineHeights,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n dynamicFontSize: undefined,\n __textLineRange: lineHeights.length === 1 ? undefined : { start, end },\n __isSplit: isSplit,\n }),\n };\n};\n"],"mappings":";;;;AAWA,IAAa,uCAAuC,OAClD,OACA,SACiC;AACjC,KAAI,KAAK,OAAO,SAAS,oBAAqB,QAAO,EAAE,SAAS,CAAC,KAAK,OAAO,OAAO,EAAE;CAEtF,MAAM,SAAS,KAAK;AACpB,KAAI,OAAO,aAAA,SACT,QAAO,EAAE,SAAS,CAAC,OAAO,OAAO,EAAE;CAGrC,IAAI,cAAc;AAClB,KAAI,CAAC,OAAO,UAAU;AACpB,MAAI,CAAC,kBAAkB,OAAO,OAAO,CACnC,QAAO,EAAE,SAAS,CAAC,OAAO,OAAO,EAAE;AAGrC,gBAAc,2BAA2B,OAAO,GAC5C,4CAA4C,OAAO,QAAQ,IAAI,MAAM,GACrE,oBAAoB,OAAO,QAAQ,IAAI,MAAM;;CAEnD,MAAM,EAAE,gBAAgB,MAAM,iBAAiB;EAC7C,OAAO;EACP;EACA,MAAM,KAAK,QAAQ;EACnB,QAAQ,KAAK;EAGb,uBAAuB;EACxB,CAAC;CACF,MAAM,iBAAiB,eAAe,YAAY;AAElD,KAAI,kBAAkB,OAAO,UAAU,YAAY,WAAW,EAC5D,QAAO;EACL,SAAS,CAAC,OAAO,OAAO;EACxB,yBAAyB,EAAE,iBAAiB,KAAA,GAAW;EACxD;AAGH,QAAO;EACL,SAAS,YAAY,WAAW,IAAI,CAAC,KAAK,IAAI,OAAO,QAAQ,eAAe,CAAC,GAAG;EAChF,mBAAmB,EAAE,OAAO,KAAK,eAAe;GAC9C,iBAAiB,KAAA;GACjB,iBAAiB,YAAY,WAAW,IAAI,KAAA,IAAY;IAAE;IAAO;IAAK;GACtE,WAAW;GACZ;EACF;;;;ACpDH,IAAa,0BAA0B,OACrC,OACA,SACiC;AACjC,KAAI,KAAK,OAAO,SAAS,OAAQ,QAAO,EAAE,SAAS,CAAC,KAAK,OAAO,OAAO,EAAE;CAEzE,MAAM,SAAS,KAAK;AACpB,KAAI,OAAO,aAAA,SACT,QAAO,EAAE,SAAS,CAAC,OAAO,OAAO,EAAE;CAGrC,MAAM,EAAE,gBAAgB,MAAM,iBAAiB;EAC7C;EACA;EACA,MAAM,KAAK,QAAQ;EACnB,QAAQ,KAAK;EAGb,uBAAuB;EACxB,CAAC;CACF,MAAM,iBAAiB,eAAe,YAAY;AAElD,KAAI,kBAAkB,OAAO,UAAU,YAAY,WAAW,EAC5D,QAAO;EACL,SAAS,CAAC,OAAO,OAAO;EACxB,yBAAyB,EAAE,iBAAiB,KAAA,GAAW;EACxD;AAGH,QAAO;EACL,SAAS,YAAY,WAAW,IAAI,CAAC,KAAK,IAAI,OAAO,QAAQ,eAAe,CAAC,GAAG;EAChF,mBAAmB,EAAE,OAAO,KAAK,eAAe;GAC9C,iBAAiB,KAAA;GACjB,iBAAiB,YAAY,WAAW,IAAI,KAAA,IAAY;IAAE;IAAO;IAAK;GACtE,WAAW;GACZ;EACF"}
@@ -1,4 +1,4 @@
1
- import { M as VERTICAL_ALIGN_BOTTOM, N as VERTICAL_ALIGN_MIDDLE, a as getFontKitFont, c as splitTextToSize, f as ALIGN_LEFT, g as DEFAULT_ALIGNMENT, l as widthOfTextAtSize, p as ALIGN_RIGHT, u as ALIGN_CENTER, v as DEFAULT_FONT_COLOR } from "./helper-6FilIoVM.js";
1
+ import { F as VERTICAL_ALIGN_BOTTOM, I as VERTICAL_ALIGN_MIDDLE, a as getFontKitFont, c as splitTextToSize, f as ALIGN_LEFT, g as DEFAULT_ALIGNMENT, l as widthOfTextAtSize, p as ALIGN_RIGHT, u as ALIGN_CENTER, v as DEFAULT_FONT_COLOR } from "./helper-CBd9plP_.js";
2
2
  import { cloneDeep, getDefaultFont, getFallbackFontName, isBlankPdf, mm2pt, pt2mm } from "@pdfme/common";
3
3
  //#region \0@oxc-project+runtime@0.127.0/helpers/typeof.js
4
4
  function _typeof(o) {
@@ -798,4 +798,4 @@ var getDynamicLayoutForTable = async (value, args) => {
798
798
  //#endregion
799
799
  export { getCellPropPanelSchema as a, HEX_COLOR_PATTERN as c, getBodyWithRange as i, createSingleTable as l, getDynamicLayoutForTable as n, getColumnStylesPropPanelSchema as o, getBody as r, getDefaultCellStyles as s, getDynamicHeightsForTable as t };
800
800
 
801
- //# sourceMappingURL=dynamicTemplate-DslOH4FZ.js.map
801
+ //# sourceMappingURL=dynamicTemplate-CkrZKlg-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dynamicTemplate-DslOH4FZ.js","names":[],"sources":["../src/tables/classes.ts","../src/tables/tableHelper.ts","../src/constants.ts","../src/tables/helper.ts","../src/tables/dynamicTemplate.ts"],"sourcesContent":["import { Font, mm2pt, pt2mm } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { splitTextToSize, getFontKitFont, widthOfTextAtSize } from '../text/helper.js';\nimport type { Styles, TableInput, Settings, Section, StylesProps } from './types.js';\n\ntype ContentSettings = { body: Row[]; head: Row[]; columns: Column[] };\n\nexport class Cell {\n raw: string;\n text: string[];\n styles: Styles;\n section: Section;\n contentHeight = 0;\n contentWidth = 0;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n\n width = 0;\n height = 0;\n x = 0;\n y = 0;\n\n constructor(raw: string, styles: Styles, section: Section) {\n this.styles = styles;\n this.section = section;\n this.raw = raw;\n const splitRegex = /\\r\\n|\\r|\\n/g;\n this.text = raw.split(splitRegex);\n }\n\n getContentHeight() {\n const lineCount = Array.isArray(this.text) ? this.text.length : 1;\n const lineHeight = pt2mm(this.styles.fontSize) * this.styles.lineHeight;\n const vPadding = this.padding('top') + this.padding('bottom');\n const height = lineCount * lineHeight + vPadding;\n return Math.max(height, this.styles.minCellHeight);\n }\n\n padding(name: 'top' | 'bottom' | 'left' | 'right') {\n return this.styles.cellPadding[name];\n }\n}\n\nexport class Column {\n index: number;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n width = 0;\n\n constructor(index: number) {\n this.index = index;\n }\n\n getMaxCustomCellWidth(table: Table) {\n let max = 0;\n for (const row of table.allRows()) {\n const cell: Cell = row.cells[this.index];\n max = Math.max(max, cell.styles.cellWidth);\n }\n return max;\n }\n}\n\nexport class Row {\n readonly raw: string[];\n readonly index: number;\n readonly section: Section;\n readonly cells: { [key: string]: Cell };\n\n height = 0;\n\n constructor(raw: string[], index: number, section: Section, cells: { [key: string]: Cell }) {\n this.raw = raw;\n this.index = index;\n this.section = section;\n this.cells = cells;\n }\n\n getMaxCellHeight(columns: Column[]) {\n return columns.reduce((acc, column) => Math.max(acc, this.cells[column.index]?.height || 0), 0);\n }\n\n getMinimumRowHeight(columns: Column[]) {\n return columns.reduce((acc: number, column: Column) => {\n const cell = this.cells[column.index];\n if (!cell) return 0;\n const vPadding = cell.padding('top') + cell.padding('bottom');\n const oneRowHeight = vPadding + cell.styles.lineHeight;\n return oneRowHeight > acc ? oneRowHeight : acc;\n }, 0);\n }\n}\n\nexport class Table {\n readonly settings: Settings;\n readonly styles: StylesProps;\n\n readonly columns: Column[];\n readonly head: Row[];\n readonly body: Row[];\n\n constructor(input: TableInput, content: ContentSettings) {\n this.settings = input.settings;\n this.styles = input.styles;\n\n this.columns = content.columns;\n this.head = content.head;\n this.body = content.body;\n }\n\n static async create(arg: {\n input: TableInput;\n content: ContentSettings;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n }) {\n const { input, content, font, _cache } = arg;\n const table = new Table(input, content);\n\n await calculateWidths({ table, font, _cache });\n\n return table;\n }\n\n getHeadHeight() {\n return this.head.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n getBodyHeight() {\n return this.body.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n allRows() {\n return this.head.concat(this.body);\n }\n\n getWidth() {\n return this.settings.tableWidth;\n }\n\n getHeight() {\n return (this.settings.showHead ? this.getHeadHeight() : 0) + this.getBodyHeight();\n }\n}\n\nasync function calculateWidths(arg: {\n table: Table;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n}) {\n const { table, font, _cache } = arg;\n\n const getFontKitFontByFontName = (fontName: string | undefined) =>\n getFontKitFont(fontName, font, _cache);\n\n await calculate(table, getFontKitFontByFontName);\n\n const resizableColumns: Column[] = [];\n let initialTableWidth = 0;\n\n table.columns.forEach((column) => {\n const customWidth = column.getMaxCustomCellWidth(table);\n if (customWidth) {\n // final column width\n column.width = customWidth;\n } else {\n // initial column width (will be resized)\n column.width = column.wrappedWidth;\n resizableColumns.push(column);\n }\n initialTableWidth += column.width;\n });\n\n // width difference that needs to be distributed\n let resizeWidth = table.getWidth() - initialTableWidth;\n\n // first resize attempt: with respect to minReadableWidth and minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) =>\n Math.max(column.minReadableWidth, column.minWidth),\n );\n }\n\n // second resize attempt: ignore minReadableWidth but respect minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) => column.minWidth);\n }\n\n resizeWidth = Math.abs(resizeWidth);\n\n applyColSpans(table);\n await fitContent(table, getFontKitFontByFontName);\n applyRowSpans(table);\n}\n\nfunction applyRowSpans(table: Table) {\n const rowSpanCells: {\n [key: string]: { cell: Cell; left: number; row: Row };\n } = {};\n let colRowSpansLeft = 1;\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n for (const column of table.columns) {\n const data = rowSpanCells[column.index];\n if (colRowSpansLeft > 1) {\n colRowSpansLeft--;\n delete row.cells[column.index];\n } else if (data) {\n data.cell.height += row.height;\n colRowSpansLeft = 1;\n delete row.cells[column.index];\n data.left--;\n if (data.left <= 1) {\n delete rowSpanCells[column.index];\n }\n } else {\n const cell = row.cells[column.index];\n if (!cell) {\n continue;\n }\n cell.height = row.height;\n }\n }\n }\n}\n\nfunction applyColSpans(table: Table) {\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n\n let colSpanCell = null;\n let combinedColSpanWidth = 0;\n let colSpansLeft = 0;\n for (let columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {\n const column = table.columns[columnIndex];\n\n // Width and colspan\n colSpansLeft -= 1;\n if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {\n combinedColSpanWidth += column.width;\n delete row.cells[column.index];\n } else if (colSpanCell) {\n const cell: Cell = colSpanCell;\n delete row.cells[column.index];\n colSpanCell = null;\n cell.width = column.width + combinedColSpanWidth;\n } else {\n const cell = row.cells[column.index];\n if (!cell) continue;\n colSpansLeft = 1;\n combinedColSpanWidth = 0;\n cell.width = column.width + combinedColSpanWidth;\n }\n }\n }\n}\n\nasync function fitContent(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n const rowSpanHeight = { count: 0, height: 0 };\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell: Cell = row.cells[column.index];\n if (!cell) continue;\n\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n cell.text = splitTextToSize({\n value: cell.raw,\n characterSpacing: cell.styles.characterSpacing,\n boxWidthInPt: mm2pt(cell.width),\n fontSize: cell.styles.fontSize,\n fontKitFont,\n });\n\n cell.contentHeight = cell.getContentHeight();\n\n let realContentHeight = cell.contentHeight;\n if (rowSpanHeight && rowSpanHeight.count > 0) {\n if (rowSpanHeight.height > realContentHeight) {\n realContentHeight = rowSpanHeight.height;\n }\n }\n if (realContentHeight > row.height) {\n row.height = realContentHeight;\n }\n }\n rowSpanHeight.count--;\n }\n}\n\nfunction resizeColumns(\n columns: Column[],\n resizeWidth: number,\n getMinWidth: (column: Column) => number,\n) {\n const initialResizeWidth = resizeWidth;\n const sumWrappedWidth = columns.reduce((acc, column) => acc + column.wrappedWidth, 0);\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const ratio = column.wrappedWidth / sumWrappedWidth;\n const suggestedChange = initialResizeWidth * ratio;\n const suggestedWidth = column.width + suggestedChange;\n\n const minWidth = getMinWidth(column);\n const newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;\n\n resizeWidth -= newWidth - column.width;\n column.width = newWidth;\n }\n\n resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;\n\n // Run the resizer again if there's remaining width needs\n // to be distributed and there're columns that can be resized\n if (resizeWidth) {\n const resizableColumns = columns.filter((column) => {\n return resizeWidth < 0\n ? column.width > getMinWidth(column) // check if column can shrink\n : true; // check if column can grow\n });\n\n if (resizableColumns.length) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);\n }\n }\n\n return resizeWidth;\n}\n\nasync function calculate(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n if (!cell) continue;\n\n const hPadding = cell.padding('right') + cell.padding('left');\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n\n cell.contentWidth = getStringWidth(cell, fontKitFont) + hPadding;\n\n const longestWordWidth = getStringWidth(\n Object.assign(cell, { text: cell.text.join(' ').split(/\\s+/) }),\n fontKitFont,\n );\n cell.minReadableWidth = longestWordWidth + hPadding;\n\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n }\n }\n\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n\n // For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.\n // Could probably be improved upon however.\n if (cell) {\n column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);\n column.minWidth = Math.max(column.minWidth, cell.minWidth);\n column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);\n } else {\n // Respect cellWidth set in columnStyles even if there is no cells for this column\n // or if the column only have colspan cells. Since the width of colspan cells\n // does not affect the width of columns, setting columnStyles cellWidth enables the\n // user to at least do it manually.\n\n // Note that this is not perfect for now since for example row and table styles are\n // not accounted for\n const columnStyles = table.styles.columnStyles[column.index] || {};\n const cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;\n if (cellWidth) {\n column.minWidth = cellWidth;\n column.wrappedWidth = cellWidth;\n }\n }\n }\n }\n}\n\nfunction getStringWidth(cell: Cell, fontKitFont: FontKitFont) {\n const text = cell.text;\n const textArr: string[] = Array.isArray(text) ? text : [text];\n const fontSize = cell.styles.fontSize;\n const characterSpacing = cell.styles.characterSpacing;\n const widestLineWidth = textArr\n .map((text) => widthOfTextAtSize(text, fontKitFont, fontSize, characterSpacing))\n .reduce((a, b) => Math.max(a, b), 0);\n\n return widestLineWidth;\n}\n","import {\n Schema,\n isBlankPdf,\n BasePdf,\n CommonOptions,\n getDefaultFont,\n getFallbackFontName,\n cloneDeep,\n} from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport type {\n TableSchema,\n CellStyle,\n Styles,\n Spacing,\n TableInput,\n StylesProps,\n Section,\n} from './types.js';\nimport { Cell, Column, Row, Table } from './classes.js';\n\ntype StyleProp = 'styles' | 'headStyles' | 'bodyStyles' | 'alternateRowStyles' | 'columnStyles';\n\ninterface CreateTableArgs {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}\n\ninterface UserOptions {\n startY: number;\n tableWidth: number;\n margin: Spacing;\n showHead: boolean;\n tableLineWidth?: number;\n tableLineColor?: string;\n head?: string[][];\n body?: string[][];\n\n styles?: Partial<Styles>;\n bodyStyles?: Partial<Styles>;\n headStyles?: Partial<Styles>;\n alternateRowStyles?: Partial<Styles>;\n columnStyles?: {\n [key: string]: Partial<Styles>;\n };\n}\n\nfunction parseSection(\n sectionName: Section,\n sectionRows: string[][],\n columns: Column[],\n styleProps: StylesProps,\n fallbackFontName: string,\n): Row[] {\n const rowSpansLeftForColumn: { [key: string]: { left: number; times: number } } = {};\n const result = sectionRows.map((rawRow, rowIndex) => {\n let skippedRowForRowSpans = 0;\n const cells: { [key: string]: Cell } = {};\n\n let colSpansAdded = 0;\n let columnSpansLeft = 0;\n for (const column of columns) {\n if (\n rowSpansLeftForColumn[column.index] == null ||\n rowSpansLeftForColumn[column.index].left === 0\n ) {\n if (columnSpansLeft === 0) {\n let rawCell;\n if (Array.isArray(rawRow)) {\n rawCell = rawRow[column.index - colSpansAdded - skippedRowForRowSpans];\n } else {\n rawCell = rawRow[column.index];\n }\n const styles = cellStyles(sectionName, column, rowIndex, styleProps, fallbackFontName);\n const cell = new Cell(rawCell, styles, sectionName);\n cells[column.index] = cell;\n\n columnSpansLeft = 0;\n rowSpansLeftForColumn[column.index] = {\n left: 0,\n times: columnSpansLeft,\n };\n } else {\n columnSpansLeft--;\n colSpansAdded++;\n }\n } else {\n rowSpansLeftForColumn[column.index].left--;\n columnSpansLeft = rowSpansLeftForColumn[column.index].times;\n skippedRowForRowSpans++;\n }\n }\n return new Row(rawRow, rowIndex, sectionName, cells);\n });\n return result;\n}\n\nfunction parseContent4Table(input: TableInput, fallbackFontName: string) {\n const content = input.content;\n const columns = content.columns.map((index) => new Column(index));\n const styles = input.styles;\n return {\n columns,\n head: parseSection('head', content.head, columns, styles, fallbackFontName),\n body: parseSection('body', content.body, columns, styles, fallbackFontName),\n };\n}\n\nfunction cellStyles(\n sectionName: Section,\n column: Column,\n rowIndex: number,\n styles: StylesProps,\n fallbackFontName: string,\n) {\n let sectionStyles;\n if (sectionName === 'head') {\n sectionStyles = styles.headStyles;\n } else if (sectionName === 'body') {\n sectionStyles = styles.bodyStyles;\n }\n const otherStyles = Object.assign({}, styles.styles, sectionStyles);\n\n const colStyles = styles.columnStyles[column.index] || {};\n\n const rowStyles =\n sectionName === 'body' && rowIndex % 2 === 0\n ? Object.assign({}, styles.alternateRowStyles)\n : {};\n\n const defaultStyle = {\n fontName: fallbackFontName,\n backgroundColor: '',\n textColor: '#000000',\n lineHeight: 1,\n characterSpacing: 0,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize: 10,\n cellPadding: 5,\n lineColor: '#000000',\n lineWidth: 0,\n minCellHeight: 0,\n minCellWidth: 0,\n };\n return Object.assign(defaultStyle, otherStyles, rowStyles, colStyles) as Styles;\n}\n\nfunction mapCellStyle(style: CellStyle): Partial<Styles> {\n return {\n fontName: style.fontName,\n alignment: style.alignment,\n verticalAlignment: style.verticalAlignment,\n fontSize: style.fontSize,\n lineHeight: style.lineHeight,\n characterSpacing: style.characterSpacing,\n backgroundColor: style.backgroundColor,\n // ---\n textColor: style.fontColor,\n lineColor: style.borderColor,\n lineWidth: style.borderWidth,\n cellPadding: style.padding,\n };\n}\n\nfunction getTableOptions(schema: TableSchema, body: string[][]): UserOptions {\n const columnStylesWidth = schema.headWidthPercentages.reduce(\n (acc, cur, i) => ({ ...acc, [i]: { cellWidth: schema.width * (cur / 100) } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const columnStylesAlignment = Object.entries(schema.columnStyles.alignment || {}).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { alignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const allKeys = new Set([\n ...Object.keys(columnStylesWidth).map(Number),\n ...Object.keys(columnStylesAlignment).map(Number),\n ]);\n const columnStyles = Array.from(allKeys).reduce(\n (acc, key) => {\n const widthStyle = columnStylesWidth[key] || {};\n const alignmentStyle = columnStylesAlignment[key] || {};\n return { ...acc, [key]: { ...widthStyle, ...alignmentStyle } };\n },\n {} as Record<number, Partial<Styles>>,\n );\n\n return {\n head: [schema.head],\n body,\n showHead: schema.showHead,\n startY: schema.position.y,\n tableWidth: schema.width,\n tableLineColor: schema.tableStyles.borderColor,\n tableLineWidth: schema.tableStyles.borderWidth,\n headStyles: mapCellStyle(schema.headStyles),\n bodyStyles: mapCellStyle(schema.bodyStyles),\n alternateRowStyles: { backgroundColor: schema.bodyStyles.alternateBackgroundColor },\n columnStyles,\n margin: { top: 0, right: 0, left: schema.position.x, bottom: 0 },\n };\n}\n\nfunction parseStyles(cInput: UserOptions) {\n const styleOptions: StylesProps = {\n styles: {},\n headStyles: {},\n bodyStyles: {},\n alternateRowStyles: {},\n columnStyles: {},\n };\n for (const prop of Object.keys(styleOptions) as StyleProp[]) {\n if (prop === 'columnStyles') {\n const current = cInput[prop];\n styleOptions.columnStyles = Object.assign({}, current);\n } else {\n const allOptions = [cInput];\n const styles = allOptions.map((opts) => opts[prop] || {});\n styleOptions[prop] = Object.assign({}, styles[0], styles[1], styles[2]);\n }\n }\n return styleOptions;\n}\n\nfunction parseContent4Input(options: UserOptions) {\n const head = options.head || [];\n const body = options.body || [];\n const columns = (head[0] || body[0] || []).map((_, index) => index);\n return { columns, head, body };\n}\n\nfunction parseInput(schema: TableSchema, body: string[][]): TableInput {\n const options = getTableOptions(schema, body);\n const styles = parseStyles(options);\n const settings = {\n startY: options.startY,\n margin: options.margin,\n tableWidth: options.tableWidth,\n showHead: options.showHead,\n tableLineWidth: options.tableLineWidth ?? 0,\n tableLineColor: options.tableLineColor ?? '',\n };\n\n const content = parseContent4Input(options);\n\n return { content, styles, settings };\n}\n\nexport function createSingleTable(body: string[][], args: CreateTableArgs) {\n const { options, _cache, basePdf } = args;\n if (!isBlankPdf(basePdf)) {\n console.warn(\n '[@pdfme/schema/table]' +\n 'When specifying a custom PDF for basePdf, ' +\n 'you cannot use features such as page breaks or re-layout of other elements.' +\n 'To utilize these features, please define basePdf as follows:\\n' +\n '{ width: number; height: number; padding: [number, number, number, number]; }',\n );\n }\n\n const schema = cloneDeep(args.schema) as TableSchema;\n const { start } = schema.__bodyRange || { start: 0 };\n if (start % 2 === 1) {\n const alternateBackgroundColor = schema.bodyStyles.alternateBackgroundColor;\n schema.bodyStyles.alternateBackgroundColor = schema.bodyStyles.backgroundColor;\n schema.bodyStyles.backgroundColor = alternateBackgroundColor;\n }\n schema.showHead =\n schema.showHead === false ? false : !schema.__isSplit || schema.repeatHead === true;\n\n const input = parseInput(schema, body);\n\n const font = options.font || getDefaultFont();\n\n const fallbackFontName = getFallbackFontName(font);\n\n const content = parseContent4Table(input, fallbackFontName);\n\n return Table.create({\n input,\n content,\n font,\n _cache: _cache as unknown as Map<string | number, FontKitFont>,\n });\n}\n","export const DEFAULT_OPACITY = 1;\nexport const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';\n","import {\n DEFAULT_ALIGNMENT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n ALIGN_RIGHT,\n ALIGN_CENTER,\n ALIGN_LEFT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n} from '../text/constants.js';\nimport { HEX_COLOR_PATTERN } from '../constants.js';\n\nexport const getDefaultCellStyles = () => ({\n fontName: undefined,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: VERTICAL_ALIGN_MIDDLE,\n fontSize: DEFAULT_FONT_SIZE,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n fontColor: DEFAULT_FONT_COLOR,\n backgroundColor: '',\n borderColor: '#888888',\n borderWidth: { top: 0.1, bottom: 0.1, left: 0.1, right: 0.1 },\n padding: { top: 5, bottom: 5, left: 5, right: 5 },\n});\n\nconst getBoxDimensionProp = (step = 1) => {\n const getCommonProp = () => ({\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0, step },\n span: 6,\n });\n return {\n top: { title: 'Top', ...getCommonProp() },\n right: { title: 'Right', ...getCommonProp() },\n bottom: { title: 'Bottom', ...getCommonProp() },\n left: { title: 'Left', ...getCommonProp() },\n };\n};\n\nexport const getCellPropPanelSchema = (arg: {\n i18n: (key: string) => string;\n fallbackFontName: string;\n fontNames: string[];\n isBody?: boolean;\n}) => {\n const { i18n, fallbackFontName, fontNames, isBody } = arg;\n\n return {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n alignment: {\n title: i18n('schemas.text.textAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n span: 8,\n },\n verticalAlignment: {\n title: i18n('schemas.text.verticalAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.top'), value: VERTICAL_ALIGN_TOP },\n { label: i18n('schemas.middle'), value: VERTICAL_ALIGN_MIDDLE },\n { label: i18n('schemas.bottom'), value: VERTICAL_ALIGN_BOTTOM },\n ],\n },\n span: 8,\n },\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n backgroundColor: {\n title: i18n('schemas.backgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n ...(isBody\n ? {\n alternateBackgroundColor: {\n title: i18n('schemas.table.alternateBackgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n }\n : {}),\n '-': { type: 'void', widget: 'Divider' },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionProp(0.1),\n },\n '--': { type: 'void', widget: 'Divider' },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionProp(),\n },\n };\n};\n\nexport const getColumnStylesPropPanelSchema = ({\n head,\n i18n,\n}: {\n head: string[];\n i18n: (key: string) => string;\n}) => ({\n alignment: {\n type: 'object',\n widget: 'lineTitle',\n title: i18n('schemas.text.textAlign'),\n column: 3,\n properties: head.reduce(\n (acc, cur, i) =>\n Object.assign(acc, {\n [i]: {\n title: cur || 'Column ' + String(i + 1),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n },\n }),\n {},\n ),\n },\n});\n\nexport const getBody = (value: string | string[][]): string[][] => {\n if (typeof value === 'string') {\n return JSON.parse(value || '[]') as string[][];\n }\n return value || [];\n};\n\nexport const getBodyWithRange = (\n value: string | string[][],\n range?: { start: number; end?: number | undefined },\n) => {\n const body = getBody(value);\n if (!range) return body;\n return body.slice(range.start, range.end);\n};\n","import {\n Schema,\n BasePdf,\n BlankPdf,\n CommonOptions,\n DynamicLayoutArgs,\n DynamicLayoutResult,\n isBlankPdf,\n} from '@pdfme/common';\nimport { createSingleTable } from './tableHelper.js';\nimport { getBodyWithRange, getBody } from './helper.js';\nimport { TableSchema } from './types.js';\n\nexport const getDynamicHeightsForTable = async (\n value: string,\n args: {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n },\n): Promise<number[]> => {\n if (args.schema.type !== 'table') return Promise.resolve([args.schema.height]);\n const schema = args.schema as TableSchema;\n const body =\n schema.__bodyRange?.start === 0 ? getBody(value) : getBodyWithRange(value, schema.__bodyRange);\n const table = await createSingleTable(body, args);\n\n const baseHeights = schema.showHead\n ? table.allRows().map((row) => row.height)\n : [0].concat(table.body.map((row) => row.height));\n\n const headerHeight = schema.showHead ? table.getHeadHeight() : 0;\n const shouldRepeatHeader = schema.repeatHead && isBlankPdf(args.basePdf) && headerHeight > 0;\n\n if (!shouldRepeatHeader) {\n return baseHeights;\n }\n\n const basePdf = args.basePdf as BlankPdf;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n const getPageStartY = (pageIndex: number) => pageIndex * pageContentHeight + paddingTop;\n\n const initialPageIndex = Math.max(\n 0,\n Math.floor((schema.position.y - paddingTop) / pageContentHeight),\n );\n const headRowCount = schema.showHead ? table.head.length : 0;\n const SAFETY_MARGIN = 0.5;\n\n let currentPageIndex = initialPageIndex;\n let currentPageY = schema.position.y;\n let rowsOnCurrentPage = 0;\n\n const result: number[] = [];\n\n for (let i = 0; i < baseHeights.length; i++) {\n const isBodyRow = i >= headRowCount;\n const rowHeight = baseHeights[i];\n\n while (true) {\n const currentPageStartY = getPageStartY(currentPageIndex);\n const remainingHeight = currentPageStartY + pageContentHeight - currentPageY;\n const needsHeader =\n isBodyRow && rowsOnCurrentPage === 0 && currentPageIndex > initialPageIndex;\n const totalRowHeight = rowHeight + (needsHeader ? headerHeight : 0);\n\n if (totalRowHeight > remainingHeight - SAFETY_MARGIN) {\n if (rowsOnCurrentPage === 0 && Math.abs(currentPageY - currentPageStartY) < SAFETY_MARGIN) {\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n break;\n }\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n continue;\n }\n\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n\n if (currentPageY >= currentPageStartY + pageContentHeight - SAFETY_MARGIN) {\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n }\n break;\n }\n }\n\n return result;\n};\n\nexport const getDynamicLayoutForTable = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n const heights = await getDynamicHeightsForTable(value, args);\n\n return {\n heights,\n avoidFirstUnitOnly: true,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n __bodyRange: {\n start: start === 0 ? 0 : start - 1,\n end: end - 1,\n },\n __isSplit: isSplit,\n }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"dynamicTemplate-CkrZKlg-.js","names":[],"sources":["../src/tables/classes.ts","../src/tables/tableHelper.ts","../src/constants.ts","../src/tables/helper.ts","../src/tables/dynamicTemplate.ts"],"sourcesContent":["import { Font, mm2pt, pt2mm } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { splitTextToSize, getFontKitFont, widthOfTextAtSize } from '../text/helper.js';\nimport type { Styles, TableInput, Settings, Section, StylesProps } from './types.js';\n\ntype ContentSettings = { body: Row[]; head: Row[]; columns: Column[] };\n\nexport class Cell {\n raw: string;\n text: string[];\n styles: Styles;\n section: Section;\n contentHeight = 0;\n contentWidth = 0;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n\n width = 0;\n height = 0;\n x = 0;\n y = 0;\n\n constructor(raw: string, styles: Styles, section: Section) {\n this.styles = styles;\n this.section = section;\n this.raw = raw;\n const splitRegex = /\\r\\n|\\r|\\n/g;\n this.text = raw.split(splitRegex);\n }\n\n getContentHeight() {\n const lineCount = Array.isArray(this.text) ? this.text.length : 1;\n const lineHeight = pt2mm(this.styles.fontSize) * this.styles.lineHeight;\n const vPadding = this.padding('top') + this.padding('bottom');\n const height = lineCount * lineHeight + vPadding;\n return Math.max(height, this.styles.minCellHeight);\n }\n\n padding(name: 'top' | 'bottom' | 'left' | 'right') {\n return this.styles.cellPadding[name];\n }\n}\n\nexport class Column {\n index: number;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n width = 0;\n\n constructor(index: number) {\n this.index = index;\n }\n\n getMaxCustomCellWidth(table: Table) {\n let max = 0;\n for (const row of table.allRows()) {\n const cell: Cell = row.cells[this.index];\n max = Math.max(max, cell.styles.cellWidth);\n }\n return max;\n }\n}\n\nexport class Row {\n readonly raw: string[];\n readonly index: number;\n readonly section: Section;\n readonly cells: { [key: string]: Cell };\n\n height = 0;\n\n constructor(raw: string[], index: number, section: Section, cells: { [key: string]: Cell }) {\n this.raw = raw;\n this.index = index;\n this.section = section;\n this.cells = cells;\n }\n\n getMaxCellHeight(columns: Column[]) {\n return columns.reduce((acc, column) => Math.max(acc, this.cells[column.index]?.height || 0), 0);\n }\n\n getMinimumRowHeight(columns: Column[]) {\n return columns.reduce((acc: number, column: Column) => {\n const cell = this.cells[column.index];\n if (!cell) return 0;\n const vPadding = cell.padding('top') + cell.padding('bottom');\n const oneRowHeight = vPadding + cell.styles.lineHeight;\n return oneRowHeight > acc ? oneRowHeight : acc;\n }, 0);\n }\n}\n\nexport class Table {\n readonly settings: Settings;\n readonly styles: StylesProps;\n\n readonly columns: Column[];\n readonly head: Row[];\n readonly body: Row[];\n\n constructor(input: TableInput, content: ContentSettings) {\n this.settings = input.settings;\n this.styles = input.styles;\n\n this.columns = content.columns;\n this.head = content.head;\n this.body = content.body;\n }\n\n static async create(arg: {\n input: TableInput;\n content: ContentSettings;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n }) {\n const { input, content, font, _cache } = arg;\n const table = new Table(input, content);\n\n await calculateWidths({ table, font, _cache });\n\n return table;\n }\n\n getHeadHeight() {\n return this.head.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n getBodyHeight() {\n return this.body.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n allRows() {\n return this.head.concat(this.body);\n }\n\n getWidth() {\n return this.settings.tableWidth;\n }\n\n getHeight() {\n return (this.settings.showHead ? this.getHeadHeight() : 0) + this.getBodyHeight();\n }\n}\n\nasync function calculateWidths(arg: {\n table: Table;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n}) {\n const { table, font, _cache } = arg;\n\n const getFontKitFontByFontName = (fontName: string | undefined) =>\n getFontKitFont(fontName, font, _cache);\n\n await calculate(table, getFontKitFontByFontName);\n\n const resizableColumns: Column[] = [];\n let initialTableWidth = 0;\n\n table.columns.forEach((column) => {\n const customWidth = column.getMaxCustomCellWidth(table);\n if (customWidth) {\n // final column width\n column.width = customWidth;\n } else {\n // initial column width (will be resized)\n column.width = column.wrappedWidth;\n resizableColumns.push(column);\n }\n initialTableWidth += column.width;\n });\n\n // width difference that needs to be distributed\n let resizeWidth = table.getWidth() - initialTableWidth;\n\n // first resize attempt: with respect to minReadableWidth and minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) =>\n Math.max(column.minReadableWidth, column.minWidth),\n );\n }\n\n // second resize attempt: ignore minReadableWidth but respect minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) => column.minWidth);\n }\n\n resizeWidth = Math.abs(resizeWidth);\n\n applyColSpans(table);\n await fitContent(table, getFontKitFontByFontName);\n applyRowSpans(table);\n}\n\nfunction applyRowSpans(table: Table) {\n const rowSpanCells: {\n [key: string]: { cell: Cell; left: number; row: Row };\n } = {};\n let colRowSpansLeft = 1;\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n for (const column of table.columns) {\n const data = rowSpanCells[column.index];\n if (colRowSpansLeft > 1) {\n colRowSpansLeft--;\n delete row.cells[column.index];\n } else if (data) {\n data.cell.height += row.height;\n colRowSpansLeft = 1;\n delete row.cells[column.index];\n data.left--;\n if (data.left <= 1) {\n delete rowSpanCells[column.index];\n }\n } else {\n const cell = row.cells[column.index];\n if (!cell) {\n continue;\n }\n cell.height = row.height;\n }\n }\n }\n}\n\nfunction applyColSpans(table: Table) {\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n\n let colSpanCell = null;\n let combinedColSpanWidth = 0;\n let colSpansLeft = 0;\n for (let columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {\n const column = table.columns[columnIndex];\n\n // Width and colspan\n colSpansLeft -= 1;\n if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {\n combinedColSpanWidth += column.width;\n delete row.cells[column.index];\n } else if (colSpanCell) {\n const cell: Cell = colSpanCell;\n delete row.cells[column.index];\n colSpanCell = null;\n cell.width = column.width + combinedColSpanWidth;\n } else {\n const cell = row.cells[column.index];\n if (!cell) continue;\n colSpansLeft = 1;\n combinedColSpanWidth = 0;\n cell.width = column.width + combinedColSpanWidth;\n }\n }\n }\n}\n\nasync function fitContent(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n const rowSpanHeight = { count: 0, height: 0 };\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell: Cell = row.cells[column.index];\n if (!cell) continue;\n\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n cell.text = splitTextToSize({\n value: cell.raw,\n characterSpacing: cell.styles.characterSpacing,\n boxWidthInPt: mm2pt(cell.width),\n fontSize: cell.styles.fontSize,\n fontKitFont,\n });\n\n cell.contentHeight = cell.getContentHeight();\n\n let realContentHeight = cell.contentHeight;\n if (rowSpanHeight && rowSpanHeight.count > 0) {\n if (rowSpanHeight.height > realContentHeight) {\n realContentHeight = rowSpanHeight.height;\n }\n }\n if (realContentHeight > row.height) {\n row.height = realContentHeight;\n }\n }\n rowSpanHeight.count--;\n }\n}\n\nfunction resizeColumns(\n columns: Column[],\n resizeWidth: number,\n getMinWidth: (column: Column) => number,\n) {\n const initialResizeWidth = resizeWidth;\n const sumWrappedWidth = columns.reduce((acc, column) => acc + column.wrappedWidth, 0);\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const ratio = column.wrappedWidth / sumWrappedWidth;\n const suggestedChange = initialResizeWidth * ratio;\n const suggestedWidth = column.width + suggestedChange;\n\n const minWidth = getMinWidth(column);\n const newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;\n\n resizeWidth -= newWidth - column.width;\n column.width = newWidth;\n }\n\n resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;\n\n // Run the resizer again if there's remaining width needs\n // to be distributed and there're columns that can be resized\n if (resizeWidth) {\n const resizableColumns = columns.filter((column) => {\n return resizeWidth < 0\n ? column.width > getMinWidth(column) // check if column can shrink\n : true; // check if column can grow\n });\n\n if (resizableColumns.length) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);\n }\n }\n\n return resizeWidth;\n}\n\nasync function calculate(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n if (!cell) continue;\n\n const hPadding = cell.padding('right') + cell.padding('left');\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n\n cell.contentWidth = getStringWidth(cell, fontKitFont) + hPadding;\n\n const longestWordWidth = getStringWidth(\n Object.assign(cell, { text: cell.text.join(' ').split(/\\s+/) }),\n fontKitFont,\n );\n cell.minReadableWidth = longestWordWidth + hPadding;\n\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n }\n }\n\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n\n // For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.\n // Could probably be improved upon however.\n if (cell) {\n column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);\n column.minWidth = Math.max(column.minWidth, cell.minWidth);\n column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);\n } else {\n // Respect cellWidth set in columnStyles even if there is no cells for this column\n // or if the column only have colspan cells. Since the width of colspan cells\n // does not affect the width of columns, setting columnStyles cellWidth enables the\n // user to at least do it manually.\n\n // Note that this is not perfect for now since for example row and table styles are\n // not accounted for\n const columnStyles = table.styles.columnStyles[column.index] || {};\n const cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;\n if (cellWidth) {\n column.minWidth = cellWidth;\n column.wrappedWidth = cellWidth;\n }\n }\n }\n }\n}\n\nfunction getStringWidth(cell: Cell, fontKitFont: FontKitFont) {\n const text = cell.text;\n const textArr: string[] = Array.isArray(text) ? text : [text];\n const fontSize = cell.styles.fontSize;\n const characterSpacing = cell.styles.characterSpacing;\n const widestLineWidth = textArr\n .map((text) => widthOfTextAtSize(text, fontKitFont, fontSize, characterSpacing))\n .reduce((a, b) => Math.max(a, b), 0);\n\n return widestLineWidth;\n}\n","import {\n Schema,\n isBlankPdf,\n BasePdf,\n CommonOptions,\n getDefaultFont,\n getFallbackFontName,\n cloneDeep,\n} from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport type {\n TableSchema,\n CellStyle,\n Styles,\n Spacing,\n TableInput,\n StylesProps,\n Section,\n} from './types.js';\nimport { Cell, Column, Row, Table } from './classes.js';\n\ntype StyleProp = 'styles' | 'headStyles' | 'bodyStyles' | 'alternateRowStyles' | 'columnStyles';\n\ninterface CreateTableArgs {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}\n\ninterface UserOptions {\n startY: number;\n tableWidth: number;\n margin: Spacing;\n showHead: boolean;\n tableLineWidth?: number;\n tableLineColor?: string;\n head?: string[][];\n body?: string[][];\n\n styles?: Partial<Styles>;\n bodyStyles?: Partial<Styles>;\n headStyles?: Partial<Styles>;\n alternateRowStyles?: Partial<Styles>;\n columnStyles?: {\n [key: string]: Partial<Styles>;\n };\n}\n\nfunction parseSection(\n sectionName: Section,\n sectionRows: string[][],\n columns: Column[],\n styleProps: StylesProps,\n fallbackFontName: string,\n): Row[] {\n const rowSpansLeftForColumn: { [key: string]: { left: number; times: number } } = {};\n const result = sectionRows.map((rawRow, rowIndex) => {\n let skippedRowForRowSpans = 0;\n const cells: { [key: string]: Cell } = {};\n\n let colSpansAdded = 0;\n let columnSpansLeft = 0;\n for (const column of columns) {\n if (\n rowSpansLeftForColumn[column.index] == null ||\n rowSpansLeftForColumn[column.index].left === 0\n ) {\n if (columnSpansLeft === 0) {\n let rawCell;\n if (Array.isArray(rawRow)) {\n rawCell = rawRow[column.index - colSpansAdded - skippedRowForRowSpans];\n } else {\n rawCell = rawRow[column.index];\n }\n const styles = cellStyles(sectionName, column, rowIndex, styleProps, fallbackFontName);\n const cell = new Cell(rawCell, styles, sectionName);\n cells[column.index] = cell;\n\n columnSpansLeft = 0;\n rowSpansLeftForColumn[column.index] = {\n left: 0,\n times: columnSpansLeft,\n };\n } else {\n columnSpansLeft--;\n colSpansAdded++;\n }\n } else {\n rowSpansLeftForColumn[column.index].left--;\n columnSpansLeft = rowSpansLeftForColumn[column.index].times;\n skippedRowForRowSpans++;\n }\n }\n return new Row(rawRow, rowIndex, sectionName, cells);\n });\n return result;\n}\n\nfunction parseContent4Table(input: TableInput, fallbackFontName: string) {\n const content = input.content;\n const columns = content.columns.map((index) => new Column(index));\n const styles = input.styles;\n return {\n columns,\n head: parseSection('head', content.head, columns, styles, fallbackFontName),\n body: parseSection('body', content.body, columns, styles, fallbackFontName),\n };\n}\n\nfunction cellStyles(\n sectionName: Section,\n column: Column,\n rowIndex: number,\n styles: StylesProps,\n fallbackFontName: string,\n) {\n let sectionStyles;\n if (sectionName === 'head') {\n sectionStyles = styles.headStyles;\n } else if (sectionName === 'body') {\n sectionStyles = styles.bodyStyles;\n }\n const otherStyles = Object.assign({}, styles.styles, sectionStyles);\n\n const colStyles = styles.columnStyles[column.index] || {};\n\n const rowStyles =\n sectionName === 'body' && rowIndex % 2 === 0\n ? Object.assign({}, styles.alternateRowStyles)\n : {};\n\n const defaultStyle = {\n fontName: fallbackFontName,\n backgroundColor: '',\n textColor: '#000000',\n lineHeight: 1,\n characterSpacing: 0,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize: 10,\n cellPadding: 5,\n lineColor: '#000000',\n lineWidth: 0,\n minCellHeight: 0,\n minCellWidth: 0,\n };\n return Object.assign(defaultStyle, otherStyles, rowStyles, colStyles) as Styles;\n}\n\nfunction mapCellStyle(style: CellStyle): Partial<Styles> {\n return {\n fontName: style.fontName,\n alignment: style.alignment,\n verticalAlignment: style.verticalAlignment,\n fontSize: style.fontSize,\n lineHeight: style.lineHeight,\n characterSpacing: style.characterSpacing,\n backgroundColor: style.backgroundColor,\n // ---\n textColor: style.fontColor,\n lineColor: style.borderColor,\n lineWidth: style.borderWidth,\n cellPadding: style.padding,\n };\n}\n\nfunction getTableOptions(schema: TableSchema, body: string[][]): UserOptions {\n const columnStylesWidth = schema.headWidthPercentages.reduce(\n (acc, cur, i) => ({ ...acc, [i]: { cellWidth: schema.width * (cur / 100) } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const columnStylesAlignment = Object.entries(schema.columnStyles.alignment || {}).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { alignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const allKeys = new Set([\n ...Object.keys(columnStylesWidth).map(Number),\n ...Object.keys(columnStylesAlignment).map(Number),\n ]);\n const columnStyles = Array.from(allKeys).reduce(\n (acc, key) => {\n const widthStyle = columnStylesWidth[key] || {};\n const alignmentStyle = columnStylesAlignment[key] || {};\n return { ...acc, [key]: { ...widthStyle, ...alignmentStyle } };\n },\n {} as Record<number, Partial<Styles>>,\n );\n\n return {\n head: [schema.head],\n body,\n showHead: schema.showHead,\n startY: schema.position.y,\n tableWidth: schema.width,\n tableLineColor: schema.tableStyles.borderColor,\n tableLineWidth: schema.tableStyles.borderWidth,\n headStyles: mapCellStyle(schema.headStyles),\n bodyStyles: mapCellStyle(schema.bodyStyles),\n alternateRowStyles: { backgroundColor: schema.bodyStyles.alternateBackgroundColor },\n columnStyles,\n margin: { top: 0, right: 0, left: schema.position.x, bottom: 0 },\n };\n}\n\nfunction parseStyles(cInput: UserOptions) {\n const styleOptions: StylesProps = {\n styles: {},\n headStyles: {},\n bodyStyles: {},\n alternateRowStyles: {},\n columnStyles: {},\n };\n for (const prop of Object.keys(styleOptions) as StyleProp[]) {\n if (prop === 'columnStyles') {\n const current = cInput[prop];\n styleOptions.columnStyles = Object.assign({}, current);\n } else {\n const allOptions = [cInput];\n const styles = allOptions.map((opts) => opts[prop] || {});\n styleOptions[prop] = Object.assign({}, styles[0], styles[1], styles[2]);\n }\n }\n return styleOptions;\n}\n\nfunction parseContent4Input(options: UserOptions) {\n const head = options.head || [];\n const body = options.body || [];\n const columns = (head[0] || body[0] || []).map((_, index) => index);\n return { columns, head, body };\n}\n\nfunction parseInput(schema: TableSchema, body: string[][]): TableInput {\n const options = getTableOptions(schema, body);\n const styles = parseStyles(options);\n const settings = {\n startY: options.startY,\n margin: options.margin,\n tableWidth: options.tableWidth,\n showHead: options.showHead,\n tableLineWidth: options.tableLineWidth ?? 0,\n tableLineColor: options.tableLineColor ?? '',\n };\n\n const content = parseContent4Input(options);\n\n return { content, styles, settings };\n}\n\nexport function createSingleTable(body: string[][], args: CreateTableArgs) {\n const { options, _cache, basePdf } = args;\n if (!isBlankPdf(basePdf)) {\n console.warn(\n '[@pdfme/schema/table]' +\n 'When specifying a custom PDF for basePdf, ' +\n 'you cannot use features such as page breaks or re-layout of other elements.' +\n 'To utilize these features, please define basePdf as follows:\\n' +\n '{ width: number; height: number; padding: [number, number, number, number]; }',\n );\n }\n\n const schema = cloneDeep(args.schema) as TableSchema;\n const { start } = schema.__bodyRange || { start: 0 };\n if (start % 2 === 1) {\n const alternateBackgroundColor = schema.bodyStyles.alternateBackgroundColor;\n schema.bodyStyles.alternateBackgroundColor = schema.bodyStyles.backgroundColor;\n schema.bodyStyles.backgroundColor = alternateBackgroundColor;\n }\n schema.showHead =\n schema.showHead === false ? false : !schema.__isSplit || schema.repeatHead === true;\n\n const input = parseInput(schema, body);\n\n const font = options.font || getDefaultFont();\n\n const fallbackFontName = getFallbackFontName(font);\n\n const content = parseContent4Table(input, fallbackFontName);\n\n return Table.create({\n input,\n content,\n font,\n _cache: _cache as unknown as Map<string | number, FontKitFont>,\n });\n}\n","export const DEFAULT_OPACITY = 1;\nexport const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';\n","import {\n DEFAULT_ALIGNMENT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n ALIGN_RIGHT,\n ALIGN_CENTER,\n ALIGN_LEFT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n} from '../text/constants.js';\nimport { HEX_COLOR_PATTERN } from '../constants.js';\n\nexport const getDefaultCellStyles = () => ({\n fontName: undefined,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: VERTICAL_ALIGN_MIDDLE,\n fontSize: DEFAULT_FONT_SIZE,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n fontColor: DEFAULT_FONT_COLOR,\n backgroundColor: '',\n borderColor: '#888888',\n borderWidth: { top: 0.1, bottom: 0.1, left: 0.1, right: 0.1 },\n padding: { top: 5, bottom: 5, left: 5, right: 5 },\n});\n\nconst getBoxDimensionProp = (step = 1) => {\n const getCommonProp = () => ({\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0, step },\n span: 6,\n });\n return {\n top: { title: 'Top', ...getCommonProp() },\n right: { title: 'Right', ...getCommonProp() },\n bottom: { title: 'Bottom', ...getCommonProp() },\n left: { title: 'Left', ...getCommonProp() },\n };\n};\n\nexport const getCellPropPanelSchema = (arg: {\n i18n: (key: string) => string;\n fallbackFontName: string;\n fontNames: string[];\n isBody?: boolean;\n}) => {\n const { i18n, fallbackFontName, fontNames, isBody } = arg;\n\n return {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n alignment: {\n title: i18n('schemas.text.textAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n span: 8,\n },\n verticalAlignment: {\n title: i18n('schemas.text.verticalAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.top'), value: VERTICAL_ALIGN_TOP },\n { label: i18n('schemas.middle'), value: VERTICAL_ALIGN_MIDDLE },\n { label: i18n('schemas.bottom'), value: VERTICAL_ALIGN_BOTTOM },\n ],\n },\n span: 8,\n },\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n backgroundColor: {\n title: i18n('schemas.backgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n ...(isBody\n ? {\n alternateBackgroundColor: {\n title: i18n('schemas.table.alternateBackgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n }\n : {}),\n '-': { type: 'void', widget: 'Divider' },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionProp(0.1),\n },\n '--': { type: 'void', widget: 'Divider' },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionProp(),\n },\n };\n};\n\nexport const getColumnStylesPropPanelSchema = ({\n head,\n i18n,\n}: {\n head: string[];\n i18n: (key: string) => string;\n}) => ({\n alignment: {\n type: 'object',\n widget: 'lineTitle',\n title: i18n('schemas.text.textAlign'),\n column: 3,\n properties: head.reduce(\n (acc, cur, i) =>\n Object.assign(acc, {\n [i]: {\n title: cur || 'Column ' + String(i + 1),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n },\n }),\n {},\n ),\n },\n});\n\nexport const getBody = (value: string | string[][]): string[][] => {\n if (typeof value === 'string') {\n return JSON.parse(value || '[]') as string[][];\n }\n return value || [];\n};\n\nexport const getBodyWithRange = (\n value: string | string[][],\n range?: { start: number; end?: number | undefined },\n) => {\n const body = getBody(value);\n if (!range) return body;\n return body.slice(range.start, range.end);\n};\n","import {\n Schema,\n BasePdf,\n BlankPdf,\n CommonOptions,\n DynamicLayoutArgs,\n DynamicLayoutResult,\n isBlankPdf,\n} from '@pdfme/common';\nimport { createSingleTable } from './tableHelper.js';\nimport { getBodyWithRange, getBody } from './helper.js';\nimport { TableSchema } from './types.js';\n\nexport const getDynamicHeightsForTable = async (\n value: string,\n args: {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n },\n): Promise<number[]> => {\n if (args.schema.type !== 'table') return Promise.resolve([args.schema.height]);\n const schema = args.schema as TableSchema;\n const body =\n schema.__bodyRange?.start === 0 ? getBody(value) : getBodyWithRange(value, schema.__bodyRange);\n const table = await createSingleTable(body, args);\n\n const baseHeights = schema.showHead\n ? table.allRows().map((row) => row.height)\n : [0].concat(table.body.map((row) => row.height));\n\n const headerHeight = schema.showHead ? table.getHeadHeight() : 0;\n const shouldRepeatHeader = schema.repeatHead && isBlankPdf(args.basePdf) && headerHeight > 0;\n\n if (!shouldRepeatHeader) {\n return baseHeights;\n }\n\n const basePdf = args.basePdf as BlankPdf;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n const getPageStartY = (pageIndex: number) => pageIndex * pageContentHeight + paddingTop;\n\n const initialPageIndex = Math.max(\n 0,\n Math.floor((schema.position.y - paddingTop) / pageContentHeight),\n );\n const headRowCount = schema.showHead ? table.head.length : 0;\n const SAFETY_MARGIN = 0.5;\n\n let currentPageIndex = initialPageIndex;\n let currentPageY = schema.position.y;\n let rowsOnCurrentPage = 0;\n\n const result: number[] = [];\n\n for (let i = 0; i < baseHeights.length; i++) {\n const isBodyRow = i >= headRowCount;\n const rowHeight = baseHeights[i];\n\n while (true) {\n const currentPageStartY = getPageStartY(currentPageIndex);\n const remainingHeight = currentPageStartY + pageContentHeight - currentPageY;\n const needsHeader =\n isBodyRow && rowsOnCurrentPage === 0 && currentPageIndex > initialPageIndex;\n const totalRowHeight = rowHeight + (needsHeader ? headerHeight : 0);\n\n if (totalRowHeight > remainingHeight - SAFETY_MARGIN) {\n if (rowsOnCurrentPage === 0 && Math.abs(currentPageY - currentPageStartY) < SAFETY_MARGIN) {\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n break;\n }\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n continue;\n }\n\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n\n if (currentPageY >= currentPageStartY + pageContentHeight - SAFETY_MARGIN) {\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n }\n break;\n }\n }\n\n return result;\n};\n\nexport const getDynamicLayoutForTable = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n const heights = await getDynamicHeightsForTable(value, args);\n\n return {\n heights,\n avoidFirstUnitOnly: true,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n __bodyRange: {\n start: start === 0 ? 0 : start - 1,\n end: end - 1,\n },\n __isSplit: isSplit,\n }),\n };\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { a as getFontKitFont, c as splitTextToSize } from "./helper-6FilIoVM.js";
1
+ import { a as getFontKitFont, c as splitTextToSize } from "./helper-CBd9plP_.js";
2
2
  import { getDefaultFont, mm2pt, pt2mm } from "@pdfme/common";
3
3
  //#region src/list/constants.ts
4
4
  var LIST_STYLE_BULLET = "bullet";
@@ -114,4 +114,4 @@ var getDynamicLayoutForList = async (value, args) => {
114
114
  //#endregion
115
115
  export { normalizeListItems as a, LIST_STYLE_BULLET as c, normalizeListItemEntries as i, LIST_STYLE_ORDERED as l, calculateListLayout as n, serializeListItems as o, getListMarkers as r, DEFAULT_LIST_STYLE as s, getDynamicLayoutForList as t };
116
116
 
117
- //# sourceMappingURL=lists-BmAAx0lx.js.map
117
+ //# sourceMappingURL=dynamicTemplate-Cy07Imb5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicTemplate-Cy07Imb5.js","names":[],"sources":["../src/list/constants.ts","../src/list/helper.ts","../src/list/dynamicTemplate.ts"],"sourcesContent":["import type { LIST_STYLE } from './types.js';\n\nexport const LIST_STYLE_BULLET = 'bullet' as LIST_STYLE;\nexport const LIST_STYLE_ORDERED = 'ordered' as LIST_STYLE;\nexport const DEFAULT_LIST_STYLE = LIST_STYLE_BULLET;\nexport const DEFAULT_MARKER = '\\u2022';\nexport const DEFAULT_MARKER_WIDTH = 6;\nexport const DEFAULT_MARKER_GAP = 2;\nexport const DEFAULT_INDENT_SIZE = 6;\nexport const DEFAULT_ITEM_SPACING = 1;\nexport const MAX_INDENT_LEVEL = 8;\n","import { CommonOptions, getDefaultFont, mm2pt, pt2mm } from '@pdfme/common';\nimport {\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n} from '../text/constants.js';\nimport { getFontKitFont, splitTextToSize } from '../text/helper.js';\nimport type { ListItem, ListItemLayout, ListLayout, ListSchema } from './types.js';\nimport {\n DEFAULT_INDENT_SIZE,\n DEFAULT_ITEM_SPACING,\n DEFAULT_LIST_STYLE,\n DEFAULT_MARKER,\n DEFAULT_MARKER_GAP,\n DEFAULT_MARKER_WIDTH,\n LIST_STYLE_ORDERED,\n MAX_INDENT_LEVEL,\n} from './constants.js';\n\nexport const normalizeListItems = (value: unknown): string[] => {\n if (Array.isArray(value)) return value.map((item) => String(item));\n\n if (typeof value !== 'string') {\n return value == null ? [] : [String(value)];\n }\n\n const trimmed = value.trim();\n if (!trimmed) return [];\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (Array.isArray(parsed)) return parsed.map((item) => String(item));\n } catch {\n // Fall through to newline parsing.\n }\n\n return value.split(/\\r\\n|\\r|\\n/g);\n};\n\nexport const parseListItem = (value: string): ListItem => {\n const indent = value.match(/^\\t+/)?.[0].length ?? 0;\n return {\n level: Math.min(indent, MAX_INDENT_LEVEL),\n text: value.slice(indent),\n };\n};\n\nexport const normalizeListItemEntries = (value: unknown): ListItem[] =>\n normalizeListItems(value).map(parseListItem);\n\nconst formatListItem = (item: ListItem): string =>\n `${'\\t'.repeat(Math.max(0, item.level))}${item.text}`;\n\nexport const serializeListItems = (items: ListItem[]): string => {\n const lines = items.map(formatListItem);\n return JSON.stringify(lines);\n};\n\nexport const getListMarkers = (schema: ListSchema, items: string[]): string[] => {\n if ((schema.listStyle ?? DEFAULT_LIST_STYLE) !== LIST_STYLE_ORDERED) {\n return items.map(() => DEFAULT_MARKER);\n }\n\n const counters = Array.from({ length: MAX_INDENT_LEVEL + 1 }, () => 0);\n return items.map((rawItem) => {\n const { level } = parseListItem(rawItem);\n counters[level] += 1;\n counters.fill(0, level + 1);\n return `${counters[level]}.`;\n });\n};\n\nexport const calculateListLayout = async (arg: {\n schema: ListSchema;\n items: string[];\n markerItems?: string[];\n startIndex: number;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}): Promise<ListLayout> => {\n const { schema, items, markerItems, startIndex, options, _cache } = arg;\n const markerWidth = schema.markerWidth ?? DEFAULT_MARKER_WIDTH;\n const markerGap = schema.markerGap ?? DEFAULT_MARKER_GAP;\n const indentSize = schema.indentSize ?? DEFAULT_INDENT_SIZE;\n const font = options.font || getDefaultFont();\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string | number, import('fontkit').Font>,\n );\n\n const fontSize = schema.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = schema.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const itemSpacing = schema.itemSpacing ?? DEFAULT_ITEM_SPACING;\n const lineHeightMm = pt2mm(fontSize * lineHeight);\n const markers = markerItems\n ? getListMarkers(schema, markerItems).slice(startIndex, startIndex + items.length)\n : getListMarkers(schema, items);\n\n const layoutItems: ListItemLayout[] = items.map((rawItem, index) => {\n const item = parseListItem(rawItem);\n const markerX = item.level * indentSize;\n const bodyX = markerX + markerWidth + markerGap;\n const bodyWidth = Math.max(schema.width - bodyX, 0);\n const lines = splitTextToSize({\n value: item.text,\n characterSpacing,\n boxWidthInPt: mm2pt(Math.max(bodyWidth, 0.1)),\n fontSize,\n fontKitFont,\n });\n const height =\n Math.max(lines.length, 1) * lineHeightMm + (index === items.length - 1 ? 0 : itemSpacing);\n\n return {\n item: item.text,\n itemIndex: startIndex + index,\n level: item.level,\n marker: markers[index],\n lines,\n height,\n markerX,\n bodyX,\n bodyWidth,\n };\n });\n\n return {\n items: layoutItems,\n totalHeight: layoutItems.reduce((sum, item) => sum + item.height, 0),\n markerWidth,\n markerGap,\n indentSize,\n };\n};\n","import type { DynamicLayoutArgs, DynamicLayoutResult } from '@pdfme/common';\nimport type { ListSchema } from './types.js';\nimport { calculateListLayout, normalizeListItems } from './helper.js';\n\nexport const getDynamicLayoutForList = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n if (args.schema.type !== 'list') return { heights: [args.schema.height] };\n\n const schema = args.schema as ListSchema;\n const items = normalizeListItems(value);\n if (items.length === 0) return { heights: [0] };\n\n const layout = await calculateListLayout({\n schema,\n items,\n startIndex: 0,\n options: args.options,\n _cache: args._cache,\n });\n\n return {\n heights: layout.items.map((item) => item.height),\n avoidFirstUnitOnly: false,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n __itemRange: { start, end },\n __isSplit: isSplit,\n }),\n };\n};\n"],"mappings":"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"}