@pdfme/schemas 6.1.13-dev.24 → 6.1.13-dev.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/{builtins-8En4EIAG.js → builtins-WchxRSf_.js} +135 -80
  2. package/dist/builtins-WchxRSf_.js.map +1 -0
  3. package/dist/builtins.js +1 -1
  4. package/dist/dynamicLayout.js +4 -4
  5. package/dist/{dynamicTemplate-DQF7c6NR.js → dynamicTemplate-CcnCXHfM.js} +2 -2
  6. package/dist/{dynamicTemplate-DQF7c6NR.js.map → dynamicTemplate-CcnCXHfM.js.map} +1 -1
  7. package/dist/{dynamicTemplate-CCCmLMvQ.js → dynamicTemplate-DEwOv_DE.js} +4 -4
  8. package/dist/{dynamicTemplate-CCCmLMvQ.js.map → dynamicTemplate-DEwOv_DE.js.map} +1 -1
  9. package/dist/{dynamicTemplate-CnK0nlnj.js → dynamicTemplate-DkTVIMNr.js} +2 -2
  10. package/dist/{dynamicTemplate-CnK0nlnj.js.map → dynamicTemplate-DkTVIMNr.js.map} +1 -1
  11. package/dist/graphics/orientation.d.ts +31 -0
  12. package/dist/{helper-4iOJns1p.js → helper-BR4_UZA5.js} +2 -2
  13. package/dist/{helper-4iOJns1p.js.map → helper-BR4_UZA5.js.map} +1 -1
  14. package/dist/index.js +216 -81
  15. package/dist/index.js.map +1 -1
  16. package/dist/lists.js +2 -2
  17. package/dist/{measure-BC7tjAtT.js → measure-BarlRI1L.js} +71 -227
  18. package/dist/measure-BarlRI1L.js.map +1 -0
  19. package/dist/splitRange-B6311Noc.js +10854 -0
  20. package/dist/splitRange-B6311Noc.js.map +1 -0
  21. package/dist/tables.js +2 -2
  22. package/dist/text/helper.d.ts +33 -1
  23. package/dist/text/lineBreak.d.ts +69 -0
  24. package/dist/text/lineBreakClasses.generated.d.ts +11 -0
  25. package/dist/text/richText.d.ts +2 -0
  26. package/dist/text/uiRender.d.ts +3 -1
  27. package/dist/text/wrap.d.ts +67 -0
  28. package/dist/texts.js +3 -3
  29. package/dist/{utils-D_sFXK0U.js → utils-CtRFDAnq.js} +2 -2
  30. package/dist/{utils-D_sFXK0U.js.map → utils-CtRFDAnq.js.map} +1 -1
  31. package/dist/utils.js +2 -2
  32. package/package.json +3 -1
  33. package/dist/builtins-8En4EIAG.js.map +0 -1
  34. package/dist/measure-BC7tjAtT.js.map +0 -1
  35. package/dist/splitRange-BHV0vb0Q.js +0 -504
  36. package/dist/splitRange-BHV0vb0Q.js.map +0 -1
@@ -0,0 +1,67 @@
1
+ /**
2
+ * One visual line produced by the shared wrap engine.
3
+ *
4
+ * `hardBreak` is true for the last line of a source paragraph (including a
5
+ * blank paragraph). Soft-wrapped continuation lines are `hardBreak: false`.
6
+ *
7
+ * Viewer must draw these objects with `white-space: pre` and must not feed
8
+ * `splitTextToSize` facade strings into `pre`: the facade suffixes hard lines
9
+ * with `\n`, which would render as an extra blank line.
10
+ */
11
+ export type WrapLine = {
12
+ text: string;
13
+ hardBreak: boolean;
14
+ };
15
+ export type MeasureTextWidth = (text: string) => number;
16
+ export type StyledRunInput<T> = {
17
+ text: string;
18
+ measure: (text: string) => number;
19
+ style: T;
20
+ };
21
+ export type StyledLayoutSpan<T> = {
22
+ text: string;
23
+ width: number;
24
+ style: T;
25
+ };
26
+ export type StyledLayoutLine<T> = {
27
+ spans: StyledLayoutSpan<T>[];
28
+ text: string;
29
+ width: number;
30
+ hardBreak: boolean;
31
+ };
32
+ export type AlignedLayoutLine<T> = StyledLayoutLine<T> & {
33
+ x: number;
34
+ extraLetterSpacing: number;
35
+ };
36
+ export declare const PARAGRAPH_SPLIT: RegExp;
37
+ export declare const splitParagraphs: (value: string) => string[];
38
+ export declare const splitGraphemes: (text: string) => string[];
39
+ export declare const countGraphemes: (text: string) => number;
40
+ /**
41
+ * Shared wrap for plain text (one style) and inline Markdown (many styles).
42
+ * Break opportunities come from the concatenated visual text; each span is
43
+ * measured with its own font/style.
44
+ */
45
+ export declare const layoutStyledRuns: <T>(runs: StyledRunInput<T>[], maxWidth: number, options?: {
46
+ characterSpacing?: number;
47
+ }) => StyledLayoutLine<T>[];
48
+ export declare const getLineAlignment: (line: {
49
+ text: string;
50
+ width: number;
51
+ hardBreak: boolean;
52
+ }, boxWidth: number, alignment: string) => {
53
+ x: number;
54
+ extraLetterSpacing: number;
55
+ usedWidth: number;
56
+ };
57
+ export declare const alignLayoutLines: <T>(lines: StyledLayoutLine<T>[], boxWidth: number, alignment: string) => AlignedLayoutLine<T>[];
58
+ export declare const wrapText: (value: string, measure: MeasureTextWidth, maxWidth: number) => WrapLine[];
59
+ /**
60
+ * Legacy `splitTextToSize` shape: hard (paragraph-ending) lines are suffixed
61
+ * with `\n` so PDF justify can skip them. Empty hard lines stay `''` — not
62
+ * `'\n'` — matching historical output.
63
+ *
64
+ * Do not join these strings into a `white-space: pre` Viewer. Use `WrapLine`
65
+ * objects instead; the suffix would paint an extra blank line.
66
+ */
67
+ export declare const toLegacySplitLines: (lines: WrapLine[]) => string[];
package/dist/texts.js CHANGED
@@ -1,4 +1,4 @@
1
- import { X as TEXT_OVERFLOW_EXPAND, Z as TEXT_OVERFLOW_VISIBLE, i as TEXT_LINE_SPLIT_UNIT, s as createTextLineSplitRange, u as getTextLineRange } from "./splitRange-BHV0vb0Q.js";
2
- import { o as mergeTextLineRangeValue } from "./measure-BC7tjAtT.js";
3
- import { n as getDynamicLayoutForMultiVariableText, t as getDynamicLayoutForText } from "./dynamicTemplate-CCCmLMvQ.js";
1
+ import { i as TEXT_LINE_SPLIT_UNIT, nt as TEXT_OVERFLOW_VISIBLE, s as createTextLineSplitRange, tt as TEXT_OVERFLOW_EXPAND, u as getTextLineRange } from "./splitRange-B6311Noc.js";
2
+ import { o as mergeTextLineRangeValue } from "./measure-BarlRI1L.js";
3
+ import { n as getDynamicLayoutForMultiVariableText, t as getDynamicLayoutForText } from "./dynamicTemplate-DEwOv_DE.js";
4
4
  export { TEXT_LINE_SPLIT_UNIT, TEXT_OVERFLOW_EXPAND, TEXT_OVERFLOW_VISIBLE, createTextLineSplitRange, getDynamicLayoutForMultiVariableText, getDynamicLayoutForText, getTextLineRange, mergeTextLineRangeValue };
@@ -1,4 +1,4 @@
1
- import { t as getDynamicHeightsForTable$1 } from "./dynamicTemplate-CnK0nlnj.js";
1
+ import { t as getDynamicHeightsForTable$1 } from "./dynamicTemplate-DkTVIMNr.js";
2
2
  import { isHexValid, mm2pt } from "@pdfme/common";
3
3
  import { cmyk, degrees, degreesToRadians, rgb } from "@pdfme/pdf-lib";
4
4
  //#region src/multiVariableText/variables.ts
@@ -250,4 +250,4 @@ var createSvgStr = (icon, attrs) => {
250
250
  //#endregion
251
251
  export { getDynamicHeightsForTable as a, isEditable as c, countUniqueVariableNames as d, getVariableNames as f, createSvgStr as i, readFile as l, convertForPdfLayoutProps as n, hex2PrintingColor as o, visitVariables as p, createErrorElm as r, hex2RgbColor as s, addAlphaToHex as t, rotatePoint as u };
252
252
 
253
- //# sourceMappingURL=utils-D_sFXK0U.js.map
253
+ //# sourceMappingURL=utils-CtRFDAnq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-D_sFXK0U.js","names":[],"sources":["../src/multiVariableText/variables.ts","../src/utils.ts"],"sourcesContent":["export type VariableMatch = {\n name: string;\n startIndex: number;\n endIndex: number;\n};\n\nexport type VariableIndices = Map<number, string>;\n\nexport const visitVariables = (content: string, visitor: (match: VariableMatch) => void): void => {\n let startIndex = -1;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if (char === '{') {\n // Restart from the latest opener so malformed input behaves like /{([^{}]+)}/g\n // without requiring backtracking.\n startIndex = i;\n continue;\n }\n\n if (char === '}' && startIndex !== -1) {\n const name = content.slice(startIndex + 1, i);\n if (name.length > 0) {\n visitor({ name, startIndex, endIndex: i });\n }\n startIndex = -1;\n }\n }\n};\n\nexport const getVariableIndices = (content: string): VariableIndices => {\n const indices: VariableIndices = new Map();\n\n visitVariables(content, ({ name, startIndex }) => {\n indices.set(startIndex, name);\n });\n\n return indices;\n};\n\nexport const countUniqueVariableNames = (content: string): number => {\n const variableNames = new Set<string>();\n\n visitVariables(content, ({ name }) => {\n variableNames.add(name);\n });\n\n return variableNames.size;\n};\n\nexport const getVariableNames = (content: string): string[] => {\n const variableNames: string[] = [];\n\n visitVariables(content, ({ name }) => {\n variableNames.push(name);\n });\n\n return variableNames;\n};\n","import type * as CSS from 'csstype';\nimport { cmyk, degrees, degreesToRadians, rgb, Color } from '@pdfme/pdf-lib';\nimport { Schema, mm2pt, Mode, isHexValid, ColorType } from '@pdfme/common';\nimport { IconNode } from 'lucide';\nimport { getDynamicHeightsForTable as _getDynamicHeightsForTable } from './tables/dynamicTemplate.js';\nexport { measureTextHeight } from './text/measure.js';\nexport { escapeInlineMarkdown } from './text/inlineMarkdown.js';\nexport { getVariableNames, visitVariables } from './multiVariableText/variables.js';\nexport const convertForPdfLayoutProps = ({\n schema,\n pageHeight,\n applyRotateTranslate = true,\n}: {\n schema: Schema;\n pageHeight: number;\n applyRotateTranslate?: boolean;\n}) => {\n const { width: mmWidth, height: mmHeight, position, rotate, opacity } = schema;\n const { x: mmX, y: mmY } = position;\n\n const rotateDegrees = rotate ? -rotate : 0;\n const width = mm2pt(mmWidth);\n const height = mm2pt(mmHeight);\n let x = mm2pt(mmX);\n // PDF coordinate system is from bottom left, UI is top left, so we need to flip the y axis\n let y = pageHeight - mm2pt(mmY) - height;\n\n if (rotateDegrees && applyRotateTranslate) {\n // If rotating we must pivot around the same point as the UI performs its rotation.\n // The UI performs rotation around the objects center point (the pivot point below),\n // pdflib rotates around the bottom left corner of the object.\n // We must therefore adjust the X and Y by rotating the bottom left corner by this pivot point.\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(mmY) - height / 2 };\n const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotateDegrees);\n x = rotatedPoint.x;\n y = rotatedPoint.y;\n }\n\n return {\n position: { x, y },\n height: height,\n width: width,\n rotate: degrees(rotateDegrees),\n opacity,\n };\n};\n\nexport const rotatePoint = (\n point: { x: number; y: number },\n pivot: { x: number; y: number },\n angleDegrees: number,\n): { x: number; y: number } => {\n const angleRadians = degreesToRadians(angleDegrees);\n\n const x =\n Math.cos(angleRadians) * (point.x - pivot.x) -\n Math.sin(angleRadians) * (point.y - pivot.y) +\n pivot.x;\n const y =\n Math.sin(angleRadians) * (point.x - pivot.x) +\n Math.cos(angleRadians) * (point.y - pivot.y) +\n pivot.y;\n\n return { x, y };\n};\n\nexport const getDynamicHeightsForTable = _getDynamicHeightsForTable;\n\n// ----------------------------------------\n\nexport const addAlphaToHex = (hex: string, alphaPercentage: number) => {\n if (!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i.test(hex)) {\n throw new Error('Invalid HEX color code');\n }\n const alphaValue = Math.round((alphaPercentage / 100) * 255);\n let alphaHex = alphaValue.toString(16);\n if (alphaHex.length === 1) alphaHex = '0' + alphaHex;\n return hex + alphaHex;\n};\n\nexport const isEditable = (mode: Mode, schema: Schema) =>\n mode === 'designer' || (mode === 'form' && schema.readOnly !== true);\n\nconst hex2rgb = (hex: string) => {\n if (hex.slice(0, 1) === '#') hex = hex.slice(1);\n if (hex.length === 3)\n hex =\n hex.slice(0, 1) +\n hex.slice(0, 1) +\n hex.slice(1, 2) +\n hex.slice(1, 2) +\n hex.slice(2, 3) +\n hex.slice(2, 3);\n\n return [hex.slice(0, 2), hex.slice(2, 4), hex.slice(4, 6)].map((str) => parseInt(str, 16));\n};\n\nexport const hex2RgbColor = (hexString: string | undefined) => {\n if (hexString) {\n const isValid = isHexValid(hexString);\n\n if (!isValid) {\n throw new Error(`Invalid hex color value ${hexString}`);\n }\n\n const [r, g, b] = hex2rgb(hexString);\n\n return rgb(r / 255, g / 255, b / 255);\n }\n\n return undefined;\n};\n\nconst hex2CmykColor = (hexString: string | undefined) => {\n if (hexString) {\n const isValid = isHexValid(hexString);\n\n if (!isValid) {\n throw new Error(`Invalid hex color value ${hexString}`);\n }\n\n // Remove the # if it's present\n hexString = hexString.replace('#', '');\n\n // Extract the hexadecimal color code and the opacity\n const hexColor = hexString.substring(0, 6);\n const opacityColor = hexString.substring(6, 8);\n const opacity = opacityColor ? parseInt(opacityColor, 16) / 255 : 1;\n\n // Convert the hex values to decimal\n let r = parseInt(hexColor.substring(0, 2), 16) / 255;\n let g = parseInt(hexColor.substring(2, 4), 16) / 255;\n let b = parseInt(hexColor.substring(4, 6), 16) / 255;\n\n // Apply the opacity\n r = r * opacity + (1 - opacity);\n g = g * opacity + (1 - opacity);\n b = b * opacity + (1 - opacity);\n\n // Calculate the CMYK values\n const k = 1 - Math.max(r, g, b);\n const c = k === 1 ? 0 : (1 - r - k) / (1 - k);\n const m = k === 1 ? 0 : (1 - g - k) / (1 - k);\n const y = k === 1 ? 0 : (1 - b - k) / (1 - k);\n\n return cmyk(c, m, y, k);\n }\n\n return undefined;\n};\n\nexport const hex2PrintingColor = (color?: string | Color, colorType?: ColorType) => {\n // if color is already CMYK, RGB or Grayscale, does not required to convert\n if (typeof color === 'object') return color;\n return colorType?.toLowerCase() == 'cmyk' ? hex2CmykColor(color) : hex2RgbColor(color);\n};\n\nexport const readFile = (input: File | FileList | null): Promise<string | ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const fileReader = new FileReader();\n\n fileReader.onload = (e) => {\n if (e.target?.result) {\n resolve(e.target.result);\n }\n };\n\n fileReader.onerror = () => {\n reject(new Error('[@pdfme/schemas] File reading failed'));\n };\n\n let file: File | null = null;\n if (input instanceof FileList && input.length > 0) {\n file = input[0];\n } else if (input instanceof File) {\n file = input;\n }\n\n if (file) {\n fileReader.readAsDataURL(file);\n } else {\n reject(new Error('[@pdfme/schemas] No files provided'));\n }\n });\n\nexport const createErrorElm = () => {\n const container = document.createElement('div');\n const containerStyle: CSS.Properties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n };\n Object.assign(container.style, containerStyle);\n\n const span = document.createElement('span');\n const spanStyle: CSS.Properties = {\n color: 'white',\n background: 'red',\n padding: '0.25rem',\n fontSize: '12pt',\n fontWeight: 'bold',\n borderRadius: '2px',\n fontFamily: \"'Open Sans', sans-serif\",\n };\n Object.assign(span.style, spanStyle);\n\n span.textContent = 'ERROR';\n container.appendChild(span);\n\n return container;\n};\n\nexport const createSvgStr = (icon: IconNode, attrs?: Record<string, string>): string => {\n // In lucide 0.475.0, the icon is an array of elements, not a single SVG element\n // We need to create an SVG wrapper and add the elements as children\n\n const safeTagNames = new Set([\n 'svg',\n 'circle',\n 'ellipse',\n 'g',\n 'line',\n 'path',\n 'polygon',\n 'polyline',\n 'rect',\n ]);\n const safeAttributeNames = new Set([\n 'aria-hidden',\n 'aria-label',\n 'class',\n 'clip-rule',\n 'cx',\n 'cy',\n 'd',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'focusable',\n 'height',\n 'id',\n 'opacity',\n 'points',\n 'preserveAspectRatio',\n 'r',\n 'role',\n 'rx',\n 'ry',\n 'stroke',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'transform',\n 'vector-effect',\n 'viewBox',\n 'width',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'xmlns:xlink',\n 'y',\n 'y1',\n 'y2',\n ]);\n const escapeHtmlAttribute = (value: string): string =>\n value\n .replaceAll('&', '&amp;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n const escapeHtmlText = (value: string): string =>\n value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');\n const toSafeAttributeString = (attributes: Record<string, string>): string =>\n Object.entries(attributes)\n .filter(\n ([key, value]) =>\n safeAttributeNames.has(key) &&\n value !== undefined &&\n value !== null &&\n !key.toLowerCase().startsWith('on'),\n )\n .map(([key, value]) => `${key}=\"${escapeHtmlAttribute(String(value))}\"`)\n .join(' ');\n const toSafeTagName = (tag: unknown): string => {\n const tagName = String(tag);\n if (!safeTagNames.has(tagName)) {\n throw new Error(`Invalid SVG tag name: ${tagName}`);\n }\n return tagName;\n };\n\n // Handle non-array input\n if (!Array.isArray(icon)) {\n return escapeHtmlText(String(icon));\n }\n\n // Create default SVG attributes\n const svgAttrs = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '24',\n height: '24',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n ...attrs,\n };\n const svgAttrString = toSafeAttributeString(svgAttrs);\n\n // Helper function to process a single element\n const processElement = (element: unknown): string => {\n if (!Array.isArray(element)) {\n return escapeHtmlText(String(element));\n }\n\n const [tag, attributes = {}, children = []] = element as [\n unknown,\n Record<string, string>,\n unknown[],\n ];\n const tagName = toSafeTagName(tag);\n const attrString = toSafeAttributeString(attributes);\n\n // Process children recursively\n let childrenString = '';\n\n if (Array.isArray(children) && children.length > 0) {\n childrenString = children.map((child) => processElement(child)).join('');\n }\n\n // Return properly formatted element string\n if (childrenString) {\n return `<${String(tagName)}${attrString ? ' ' + String(attrString) : ''}>${childrenString}</${String(tagName)}>`;\n } else {\n // Self-closing tag for empty children\n return `<${String(tagName)}${attrString ? ' ' + String(attrString) : ''}/>`;\n }\n };\n\n // Process all elements and join them\n const elementsString = Array.isArray(icon)\n ? icon.map((element) => processElement(element)).join('')\n : processElement(icon);\n\n // Return the complete SVG string\n return `<svg ${svgAttrString}>${elementsString}</svg>`;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils-CtRFDAnq.js","names":[],"sources":["../src/multiVariableText/variables.ts","../src/utils.ts"],"sourcesContent":["export type VariableMatch = {\n name: string;\n startIndex: number;\n endIndex: number;\n};\n\nexport type VariableIndices = Map<number, string>;\n\nexport const visitVariables = (content: string, visitor: (match: VariableMatch) => void): void => {\n let startIndex = -1;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if (char === '{') {\n // Restart from the latest opener so malformed input behaves like /{([^{}]+)}/g\n // without requiring backtracking.\n startIndex = i;\n continue;\n }\n\n if (char === '}' && startIndex !== -1) {\n const name = content.slice(startIndex + 1, i);\n if (name.length > 0) {\n visitor({ name, startIndex, endIndex: i });\n }\n startIndex = -1;\n }\n }\n};\n\nexport const getVariableIndices = (content: string): VariableIndices => {\n const indices: VariableIndices = new Map();\n\n visitVariables(content, ({ name, startIndex }) => {\n indices.set(startIndex, name);\n });\n\n return indices;\n};\n\nexport const countUniqueVariableNames = (content: string): number => {\n const variableNames = new Set<string>();\n\n visitVariables(content, ({ name }) => {\n variableNames.add(name);\n });\n\n return variableNames.size;\n};\n\nexport const getVariableNames = (content: string): string[] => {\n const variableNames: string[] = [];\n\n visitVariables(content, ({ name }) => {\n variableNames.push(name);\n });\n\n return variableNames;\n};\n","import type * as CSS from 'csstype';\nimport { cmyk, degrees, degreesToRadians, rgb, Color } from '@pdfme/pdf-lib';\nimport { Schema, mm2pt, Mode, isHexValid, ColorType } from '@pdfme/common';\nimport { IconNode } from 'lucide';\nimport { getDynamicHeightsForTable as _getDynamicHeightsForTable } from './tables/dynamicTemplate.js';\nexport { measureTextHeight } from './text/measure.js';\nexport { escapeInlineMarkdown } from './text/inlineMarkdown.js';\nexport { getVariableNames, visitVariables } from './multiVariableText/variables.js';\nexport const convertForPdfLayoutProps = ({\n schema,\n pageHeight,\n applyRotateTranslate = true,\n}: {\n schema: Schema;\n pageHeight: number;\n applyRotateTranslate?: boolean;\n}) => {\n const { width: mmWidth, height: mmHeight, position, rotate, opacity } = schema;\n const { x: mmX, y: mmY } = position;\n\n const rotateDegrees = rotate ? -rotate : 0;\n const width = mm2pt(mmWidth);\n const height = mm2pt(mmHeight);\n let x = mm2pt(mmX);\n // PDF coordinate system is from bottom left, UI is top left, so we need to flip the y axis\n let y = pageHeight - mm2pt(mmY) - height;\n\n if (rotateDegrees && applyRotateTranslate) {\n // If rotating we must pivot around the same point as the UI performs its rotation.\n // The UI performs rotation around the objects center point (the pivot point below),\n // pdflib rotates around the bottom left corner of the object.\n // We must therefore adjust the X and Y by rotating the bottom left corner by this pivot point.\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(mmY) - height / 2 };\n const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotateDegrees);\n x = rotatedPoint.x;\n y = rotatedPoint.y;\n }\n\n return {\n position: { x, y },\n height: height,\n width: width,\n rotate: degrees(rotateDegrees),\n opacity,\n };\n};\n\nexport const rotatePoint = (\n point: { x: number; y: number },\n pivot: { x: number; y: number },\n angleDegrees: number,\n): { x: number; y: number } => {\n const angleRadians = degreesToRadians(angleDegrees);\n\n const x =\n Math.cos(angleRadians) * (point.x - pivot.x) -\n Math.sin(angleRadians) * (point.y - pivot.y) +\n pivot.x;\n const y =\n Math.sin(angleRadians) * (point.x - pivot.x) +\n Math.cos(angleRadians) * (point.y - pivot.y) +\n pivot.y;\n\n return { x, y };\n};\n\nexport const getDynamicHeightsForTable = _getDynamicHeightsForTable;\n\n// ----------------------------------------\n\nexport const addAlphaToHex = (hex: string, alphaPercentage: number) => {\n if (!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i.test(hex)) {\n throw new Error('Invalid HEX color code');\n }\n const alphaValue = Math.round((alphaPercentage / 100) * 255);\n let alphaHex = alphaValue.toString(16);\n if (alphaHex.length === 1) alphaHex = '0' + alphaHex;\n return hex + alphaHex;\n};\n\nexport const isEditable = (mode: Mode, schema: Schema) =>\n mode === 'designer' || (mode === 'form' && schema.readOnly !== true);\n\nconst hex2rgb = (hex: string) => {\n if (hex.slice(0, 1) === '#') hex = hex.slice(1);\n if (hex.length === 3)\n hex =\n hex.slice(0, 1) +\n hex.slice(0, 1) +\n hex.slice(1, 2) +\n hex.slice(1, 2) +\n hex.slice(2, 3) +\n hex.slice(2, 3);\n\n return [hex.slice(0, 2), hex.slice(2, 4), hex.slice(4, 6)].map((str) => parseInt(str, 16));\n};\n\nexport const hex2RgbColor = (hexString: string | undefined) => {\n if (hexString) {\n const isValid = isHexValid(hexString);\n\n if (!isValid) {\n throw new Error(`Invalid hex color value ${hexString}`);\n }\n\n const [r, g, b] = hex2rgb(hexString);\n\n return rgb(r / 255, g / 255, b / 255);\n }\n\n return undefined;\n};\n\nconst hex2CmykColor = (hexString: string | undefined) => {\n if (hexString) {\n const isValid = isHexValid(hexString);\n\n if (!isValid) {\n throw new Error(`Invalid hex color value ${hexString}`);\n }\n\n // Remove the # if it's present\n hexString = hexString.replace('#', '');\n\n // Extract the hexadecimal color code and the opacity\n const hexColor = hexString.substring(0, 6);\n const opacityColor = hexString.substring(6, 8);\n const opacity = opacityColor ? parseInt(opacityColor, 16) / 255 : 1;\n\n // Convert the hex values to decimal\n let r = parseInt(hexColor.substring(0, 2), 16) / 255;\n let g = parseInt(hexColor.substring(2, 4), 16) / 255;\n let b = parseInt(hexColor.substring(4, 6), 16) / 255;\n\n // Apply the opacity\n r = r * opacity + (1 - opacity);\n g = g * opacity + (1 - opacity);\n b = b * opacity + (1 - opacity);\n\n // Calculate the CMYK values\n const k = 1 - Math.max(r, g, b);\n const c = k === 1 ? 0 : (1 - r - k) / (1 - k);\n const m = k === 1 ? 0 : (1 - g - k) / (1 - k);\n const y = k === 1 ? 0 : (1 - b - k) / (1 - k);\n\n return cmyk(c, m, y, k);\n }\n\n return undefined;\n};\n\nexport const hex2PrintingColor = (color?: string | Color, colorType?: ColorType) => {\n // if color is already CMYK, RGB or Grayscale, does not required to convert\n if (typeof color === 'object') return color;\n return colorType?.toLowerCase() == 'cmyk' ? hex2CmykColor(color) : hex2RgbColor(color);\n};\n\nexport const readFile = (input: File | FileList | null): Promise<string | ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const fileReader = new FileReader();\n\n fileReader.onload = (e) => {\n if (e.target?.result) {\n resolve(e.target.result);\n }\n };\n\n fileReader.onerror = () => {\n reject(new Error('[@pdfme/schemas] File reading failed'));\n };\n\n let file: File | null = null;\n if (input instanceof FileList && input.length > 0) {\n file = input[0];\n } else if (input instanceof File) {\n file = input;\n }\n\n if (file) {\n fileReader.readAsDataURL(file);\n } else {\n reject(new Error('[@pdfme/schemas] No files provided'));\n }\n });\n\nexport const createErrorElm = () => {\n const container = document.createElement('div');\n const containerStyle: CSS.Properties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n };\n Object.assign(container.style, containerStyle);\n\n const span = document.createElement('span');\n const spanStyle: CSS.Properties = {\n color: 'white',\n background: 'red',\n padding: '0.25rem',\n fontSize: '12pt',\n fontWeight: 'bold',\n borderRadius: '2px',\n fontFamily: \"'Open Sans', sans-serif\",\n };\n Object.assign(span.style, spanStyle);\n\n span.textContent = 'ERROR';\n container.appendChild(span);\n\n return container;\n};\n\nexport const createSvgStr = (icon: IconNode, attrs?: Record<string, string>): string => {\n // In lucide 0.475.0, the icon is an array of elements, not a single SVG element\n // We need to create an SVG wrapper and add the elements as children\n\n const safeTagNames = new Set([\n 'svg',\n 'circle',\n 'ellipse',\n 'g',\n 'line',\n 'path',\n 'polygon',\n 'polyline',\n 'rect',\n ]);\n const safeAttributeNames = new Set([\n 'aria-hidden',\n 'aria-label',\n 'class',\n 'clip-rule',\n 'cx',\n 'cy',\n 'd',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'focusable',\n 'height',\n 'id',\n 'opacity',\n 'points',\n 'preserveAspectRatio',\n 'r',\n 'role',\n 'rx',\n 'ry',\n 'stroke',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'transform',\n 'vector-effect',\n 'viewBox',\n 'width',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'xmlns:xlink',\n 'y',\n 'y1',\n 'y2',\n ]);\n const escapeHtmlAttribute = (value: string): string =>\n value\n .replaceAll('&', '&amp;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n const escapeHtmlText = (value: string): string =>\n value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');\n const toSafeAttributeString = (attributes: Record<string, string>): string =>\n Object.entries(attributes)\n .filter(\n ([key, value]) =>\n safeAttributeNames.has(key) &&\n value !== undefined &&\n value !== null &&\n !key.toLowerCase().startsWith('on'),\n )\n .map(([key, value]) => `${key}=\"${escapeHtmlAttribute(String(value))}\"`)\n .join(' ');\n const toSafeTagName = (tag: unknown): string => {\n const tagName = String(tag);\n if (!safeTagNames.has(tagName)) {\n throw new Error(`Invalid SVG tag name: ${tagName}`);\n }\n return tagName;\n };\n\n // Handle non-array input\n if (!Array.isArray(icon)) {\n return escapeHtmlText(String(icon));\n }\n\n // Create default SVG attributes\n const svgAttrs = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '24',\n height: '24',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '2',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n ...attrs,\n };\n const svgAttrString = toSafeAttributeString(svgAttrs);\n\n // Helper function to process a single element\n const processElement = (element: unknown): string => {\n if (!Array.isArray(element)) {\n return escapeHtmlText(String(element));\n }\n\n const [tag, attributes = {}, children = []] = element as [\n unknown,\n Record<string, string>,\n unknown[],\n ];\n const tagName = toSafeTagName(tag);\n const attrString = toSafeAttributeString(attributes);\n\n // Process children recursively\n let childrenString = '';\n\n if (Array.isArray(children) && children.length > 0) {\n childrenString = children.map((child) => processElement(child)).join('');\n }\n\n // Return properly formatted element string\n if (childrenString) {\n return `<${String(tagName)}${attrString ? ' ' + String(attrString) : ''}>${childrenString}</${String(tagName)}>`;\n } else {\n // Self-closing tag for empty children\n return `<${String(tagName)}${attrString ? ' ' + String(attrString) : ''}/>`;\n }\n };\n\n // Process all elements and join them\n const elementsString = Array.isArray(icon)\n ? icon.map((element) => processElement(element)).join('')\n : processElement(icon);\n\n // Return the complete SVG string\n return `<svg ${svgAttrString}>${elementsString}</svg>`;\n};\n"],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -1,3 +1,3 @@
1
- import { h as escapeInlineMarkdown, i as measureTextHeight } from "./measure-BC7tjAtT.js";
2
- import { a as getDynamicHeightsForTable, c as isEditable, f as getVariableNames, i as createSvgStr, l as readFile, n as convertForPdfLayoutProps, o as hex2PrintingColor, p as visitVariables, r as createErrorElm, s as hex2RgbColor, t as addAlphaToHex, u as rotatePoint } from "./utils-D_sFXK0U.js";
1
+ import { i as measureTextHeight, m as escapeInlineMarkdown } from "./measure-BarlRI1L.js";
2
+ import { a as getDynamicHeightsForTable, c as isEditable, f as getVariableNames, i as createSvgStr, l as readFile, n as convertForPdfLayoutProps, o as hex2PrintingColor, p as visitVariables, r as createErrorElm, s as hex2RgbColor, t as addAlphaToHex, u as rotatePoint } from "./utils-CtRFDAnq.js";
3
3
  export { addAlphaToHex, convertForPdfLayoutProps, createErrorElm, createSvgStr, escapeInlineMarkdown, getDynamicHeightsForTable, getVariableNames, hex2PrintingColor, hex2RgbColor, isEditable, measureTextHeight, readFile, rotatePoint, visitVariables };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdfme/schemas",
3
- "version": "6.1.13-dev.24",
3
+ "version": "6.1.13-dev.26",
4
4
  "description": "TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!",
5
5
  "keywords": [
6
6
  "pdf",
@@ -83,12 +83,14 @@
83
83
  "test": "vitest run --config ../../vitest.config.ts"
84
84
  },
85
85
  "dependencies": {
86
+ "@pdf-lib/upng": "^1.0.1",
86
87
  "@pdfme/pdf-lib": "*",
87
88
  "air-datepicker": "^3.6.0",
88
89
  "bwip-js": "^4.11.4",
89
90
  "date-fns": "^4.4.0",
90
91
  "dompurify": "^3.4.14",
91
92
  "fontkit": "^2.0.2",
93
+ "jpeg-js": "^0.4.4",
92
94
  "lucide": "^1.37.0",
93
95
  "signature_pad": "^5.1.4"
94
96
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"builtins-8En4EIAG.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, 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';\nimport { getTextLineRange } from '../splitRange.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 (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0);\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 codePadding = run.code ? CODE_HORIZONTAL_PADDING : 0;\n const textX = x + codePadding;\n const textWidth = runWidth - codePadding * 2;\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n\n if (run.code) {\n const bgX = x;\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,\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: textX,\n y: y + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n if (underline && runWidth > 0) {\n drawDecorationLine({\n page,\n x: textX,\n y: y - textHeight / 12,\n width: textWidth,\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(textX);\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(textX + 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 y: number;\n width: number;\n height: 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 y,\n width,\n height,\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 lineRange = getTextLineRange(schema);\n const lines = applyTextLineRange(allLines, lineRange);\n const lineRangeStart = lineRange?.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 = y + height - 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 { isBlankPdf, type BasePdf } from '@pdfme/common';\nimport { TEXT_OVERFLOW_EXPAND } from './constants.js';\nimport type { TextSchema } from './types.js';\n\nconst TEXT_OVERFLOW_EXPAND_SCHEMA_TYPES = new Set(['text', 'multiVariableText']);\n\ntype TextOverflowSchema = Pick<TextSchema, 'overflow'> & Partial<Pick<TextSchema, 'type'>>;\n\nconst isTextOverflowExpandSchema = (schema: Partial<Pick<TextSchema, 'type'>>) =>\n schema.type === undefined || TEXT_OVERFLOW_EXPAND_SCHEMA_TYPES.has(schema.type);\n\nexport const canUseTextOverflowExpand = (\n schema: Partial<Pick<TextSchema, 'type'>>,\n basePdf?: BasePdf,\n) => !isTextOverflowExpandSchema(schema) || basePdf === undefined || isBlankPdf(basePdf);\n\nexport const isTextOverflowExpand = (schema: TextOverflowSchema, basePdf?: BasePdf) =>\n canUseTextOverflowExpand(schema, basePdf) && schema.overflow === TEXT_OVERFLOW_EXPAND;\n\nexport const shouldUseDynamicFontSize = (\n schema: Pick<TextSchema, 'dynamicFontSize' | 'overflow'> & Partial<Pick<TextSchema, 'type'>>,\n basePdf?: BasePdf,\n) => Boolean(schema.dynamicFontSize) && !isTextOverflowExpand(schema, basePdf);\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';\nimport { getTextLineRange } from '../splitRange.js';\nimport { getBoxContentArea, getBoxInsets, hasBoxDimension } from '../box.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 basePdf,\n colorType,\n fontSize: resolvedFontSize,\n}: {\n value: string;\n fontKitFont: FontKitFont;\n colorType?: ColorType;\n schema: TextSchema;\n basePdf: PDFRenderProps<TextSchema>['basePdf'];\n fontSize?: number;\n}) => {\n const fontSize =\n resolvedFontSize ??\n (shouldUseDynamicFontSize(schema, basePdf)\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, basePdf, _cache } = arg;\n const { font = getDefaultFont(), colorType } = options;\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 (!value) return;\n drawTextBoxDecoration({ page, schema, colorType, x, y, width, height, rotate, pivotPoint });\n\n const fontName = schema.fontName ? schema.fontName : getFallbackFontName(font);\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const contentArea = getBoxContentArea(schema);\n const contentX = x + mm2pt(contentArea.leftInset);\n const contentY = y + mm2pt(contentArea.bottomInset);\n const contentWidth = mm2pt(contentArea.width);\n const contentHeight = mm2pt(contentArea.height);\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, basePdf)\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : undefined;\n const fontProp = getFontProp({\n value: displayValue,\n fontKitFont,\n schema,\n basePdf,\n colorType,\n fontSize: dynamicRichTextFontSize,\n });\n\n const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = fontProp;\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: contentX,\n y: contentY,\n width: contentWidth,\n height: contentHeight,\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: contentWidth,\n }),\n getTextLineRange(schema),\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 = contentHeight - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (contentHeight - otherLinesHeight - firstLineTextHeight + descent) / 2 +\n 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 = contentX;\n if (alignment === 'center') {\n xLine += (contentWidth - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += contentWidth - textWidth;\n }\n\n let yLine = contentY + contentHeight - 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 += (contentWidth - 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\nconst drawTextBoxDecoration = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n schema: TextSchema;\n colorType?: ColorType;\n x: number;\n y: number;\n width: number;\n height: number;\n rotate: ReturnType<typeof convertForPdfLayoutProps>['rotate'];\n pivotPoint: { x: number; y: number };\n}) => {\n const { page, schema, colorType, x, y, width, height, rotate, pivotPoint } = arg;\n const { borderWidth } = getBoxInsets(schema);\n const opacity = schema.opacity ?? 1;\n\n const drawRectangle = (rect: {\n x: number;\n y: number;\n width: number;\n height: number;\n color: NonNullable<ReturnType<typeof hex2PrintingColor>>;\n }) => {\n if (rect.width <= 0 || rect.height <= 0) return;\n const point =\n rotate.angle === 0\n ? { x: rect.x, y: rect.y }\n : rotatePoint({ x: rect.x, y: rect.y }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: point.x,\n y: point.y,\n width: rect.width,\n height: rect.height,\n rotate,\n color: rect.color,\n opacity,\n });\n };\n\n if (schema.backgroundColor) {\n const color = hex2PrintingColor(schema.backgroundColor, colorType);\n if (color) drawRectangle({ x, y, width, height, color });\n }\n\n if (!schema.borderColor || !hasBoxDimension(schema.borderWidth)) return;\n\n const color = hex2PrintingColor(schema.borderColor, colorType);\n if (!color) return;\n\n const top = mm2pt(borderWidth.top);\n const right = mm2pt(borderWidth.right);\n const bottom = mm2pt(borderWidth.bottom);\n const left = mm2pt(borderWidth.left);\n\n drawRectangle({ x, y: y + height - top, width, height: top, color });\n drawRectangle({ x: x + width - right, y, width: right, height, color });\n drawRectangle({ x, y, width, height: bottom, color });\n drawRectangle({ x, y, width: left, height, color });\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 { canUseTextOverflowExpand, isTextOverflowExpand } from './overflow.js';\nimport { createBoxDimension, getBoxDimensionPropPanelSchema } from '../box.js';\n\nconst UseDynamicFontSize = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n, basePdf } = props;\n const isExpand = isTextOverflowExpand(activeSchema as unknown as TextSchema, basePdf);\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, basePdf }) => {\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 canExpandOverflow = canUseTextOverflowExpand(activeTextSchema, basePdf);\n const isExpand = isTextOverflowExpand(activeTextSchema, basePdf);\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 const overflowOptions = [\n { label: i18n('schemas.text.overflowVisible'), value: TEXT_OVERFLOW_VISIBLE },\n ...(canExpandOverflow\n ? [{ label: i18n('schemas.text.overflowExpand'), value: TEXT_OVERFLOW_EXPAND }]\n : []),\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: overflowOptions,\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 borderColor: {\n title: i18n('schemas.borderColor'),\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 borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(0.1),\n },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(),\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 borderColor: '#000000',\n borderWidth: createBoxDimension(0),\n padding: createBoxDimension(0),\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';\nimport { getTextLineRange } from '../splitRange.js';\nimport { getBoxContentArea, getBoxInsets, hasBoxDimension } from '../box.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 {\n value,\n schema,\n basePdf,\n mode,\n onChange,\n stopEditing,\n tabIndex,\n placeholder,\n options,\n _cache,\n } = arg;\n const hasInlineMarkdownFormat = schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const isReadOnlySplitInlineMarkdownFormChunk =\n mode === 'form' && Boolean(getTextLineRange(schema)) && 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, basePdf);\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 const lineRange = getTextLineRange(schema);\n if (lineRange) {\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(getBoxContentArea(schema).width),\n }),\n lineRange,\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 const lineRange = getTextLineRange(schema);\n if (!lineRange) 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(getBoxContentArea(schema).width),\n }),\n lineRange,\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 const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const editable = isEditable(mode, schema);\n\n if (dynamicFontSize === undefined && shouldUseDynamicFontSize(schema, arg.basePdf) && 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 const verticalAlignment = schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT;\n const isTopAligned = verticalAlignment === VERTICAL_ALIGN_TOP;\n\n const container = document.createElement('div');\n const { borderWidth, padding } = getBoxInsets(schema);\n const hasPadding = hasBoxDimension(schema.padding);\n const hasBorder = Boolean(schema.borderColor && hasBoxDimension(schema.borderWidth));\n\n const containerStyle: CSS.Properties = {\n padding: hasPadding\n ? `${padding.top}mm ${padding.right}mm ${padding.bottom}mm ${padding.left}mm`\n : 0,\n resize: 'none',\n backgroundColor: getBackgroundColor(schema),\n border: hasBorder ? undefined : 'none',\n ...(hasBorder\n ? {\n borderTopWidth: `${borderWidth.top}mm`,\n borderRightWidth: `${borderWidth.right}mm`,\n borderBottomWidth: `${borderWidth.bottom}mm`,\n borderLeftWidth: `${borderWidth.left}mm`,\n borderStyle: 'solid',\n borderColor: schema.borderColor,\n }\n : {}),\n ...(hasPadding || hasBorder ? { boxSizing: 'border-box' } : {}),\n display: 'flex',\n flexDirection: 'column',\n justifyContent: mapVerticalAlignToFlex(verticalAlignment),\n width: '100%',\n height: '100%',\n cursor: editable ? '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: `${characterSpacing}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 // Browsers include the final letter-spacing in editable text wrapping, unlike PDF rendering.\n ...(editable && characterSpacing > 0 ? { width: `calc(100% + ${characterSpacing}pt)` } : {}),\n ...(isTopAligned ? { height: '100%' } : {}),\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 = (schema: { backgroundColor?: string }) => {\n if (!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 +0,0 @@
1
- {"version":3,"file":"measure-BC7tjAtT.js","names":[],"sources":["../src/text/inlineMarkdown.ts","../src/text/richText.ts","../src/text/measure.ts"],"sourcesContent":["import { normalizeLinkHref } from '@pdfme/common';\nimport type { RichTextRun } from './types.js';\n\ntype InlineStyle = Omit<RichTextRun, 'text'>;\n\nconst MARKDOWN_ESCAPABLE_CHARS = new Set(['\\\\', '*', '~', '`', '[', ']', '(', ')']);\nconst MARKDOWN_ESCAPE_PATTERN = /[\\\\*~`[\\]()]/g;\nconst MARKDOWN_UNESCAPE_PATTERN = /\\\\([\\\\*~`[\\]()])/g;\n\nconst sameStyle = (a: InlineStyle, b: InlineStyle) =>\n Boolean(a.bold) === Boolean(b.bold) &&\n Boolean(a.italic) === Boolean(b.italic) &&\n Boolean(a.strikethrough) === Boolean(b.strikethrough) &&\n Boolean(a.code) === Boolean(b.code) &&\n a.href === b.href;\n\nconst appendRun = (runs: RichTextRun[], text: string, style: InlineStyle) => {\n if (!text) return;\n\n const lastRun = runs.at(-1);\n if (lastRun && sameStyle(lastRun, style)) {\n lastRun.text += text;\n return;\n }\n\n runs.push({\n text,\n ...(style.bold ? { bold: true } : {}),\n ...(style.italic ? { italic: true } : {}),\n ...(style.strikethrough ? { strikethrough: true } : {}),\n ...(style.code ? { code: true } : {}),\n ...(style.href ? { href: style.href } : {}),\n });\n};\n\nconst findClosingDelimiter = (value: string, delimiter: string, from: number): number => {\n for (let i = from; i < value.length; i++) {\n if (value[i] === '\\\\') {\n i += 1;\n continue;\n }\n\n if (delimiter !== '`' && value[i] === '`') {\n const codeEnd = findClosingDelimiter(value, '`', i + 1);\n if (codeEnd === -1) continue;\n i = codeEnd;\n continue;\n }\n\n if (value.startsWith(delimiter, i)) {\n return i;\n }\n }\n\n return -1;\n};\n\nconst getDelimiter = (value: string, index: number) => {\n if (value[index] === '`') return '`';\n if (value.startsWith('***', index)) return '***';\n if (value.startsWith('**', index)) return '**';\n if (value.startsWith('~~', index)) return '~~';\n if (value[index] === '*') return '*';\n return '';\n};\n\nconst findLinkLabelEnd = (value: string, from: number, to: number): number => {\n for (let index = from; index < to; index += 1) {\n if (value[index] === '\\\\') {\n index += 1;\n continue;\n }\n\n if (value[index] === ']') return index;\n }\n\n return -1;\n};\n\nconst findLinkDestinationEnd = (value: string, from: number, to: number): number => {\n let depth = 0;\n\n for (let index = from; index < to; index += 1) {\n if (value[index] === '\\\\') {\n index += 1;\n continue;\n }\n\n if (value[index] === '(') {\n depth += 1;\n continue;\n }\n\n if (value[index] === ')') {\n if (depth === 0) return index;\n depth -= 1;\n }\n }\n\n return -1;\n};\n\nconst parseLinkAt = (value: string, index: number, to: number) => {\n if (value[index] !== '[') return undefined;\n\n const labelEnd = findLinkLabelEnd(value, index + 1, to);\n if (labelEnd === -1 || value[labelEnd + 1] !== '(') return undefined;\n\n const destinationStart = labelEnd + 2;\n const destinationEnd = findLinkDestinationEnd(value, destinationStart, to);\n if (destinationEnd === -1) return undefined;\n\n const href = value\n .slice(destinationStart, destinationEnd)\n .replace(MARKDOWN_UNESCAPE_PATTERN, '$1');\n const safeHref = normalizeLinkHref(href);\n if (!safeHref) return undefined;\n\n return {\n labelStart: index + 1,\n labelEnd,\n href: safeHref,\n end: destinationEnd + 1,\n };\n};\n\nconst mergeStyle = (style: InlineStyle, delimiter: string): InlineStyle => {\n if (delimiter === '***') {\n return { ...style, bold: true, italic: true };\n }\n if (delimiter === '**') {\n return { ...style, bold: true };\n }\n if (delimiter === '*') {\n return { ...style, italic: true };\n }\n if (delimiter === '~~') {\n return { ...style, strikethrough: true };\n }\n return style;\n};\n\nconst parseRange = (value: string, from: number, to: number, style: InlineStyle): RichTextRun[] => {\n const runs: RichTextRun[] = [];\n let buffer = '';\n\n const flush = () => {\n appendRun(runs, buffer, style);\n buffer = '';\n };\n\n for (let index = from; index < to; index++) {\n const char = value[index];\n\n if (char === '\\\\' && index + 1 < to && MARKDOWN_ESCAPABLE_CHARS.has(value[index + 1])) {\n buffer += value[index + 1];\n index += 1;\n continue;\n }\n\n const link = style.href ? undefined : parseLinkAt(value, index, to);\n if (link) {\n flush();\n const nestedRuns = parseRange(value, link.labelStart, link.labelEnd, {\n ...style,\n href: link.href,\n });\n nestedRuns.forEach((run) => appendRun(runs, run.text, run));\n index = link.end - 1;\n continue;\n }\n\n const delimiter = getDelimiter(value, index);\n if (!delimiter) {\n buffer += char;\n continue;\n }\n\n const closingIndex = findClosingDelimiter(value, delimiter, index + delimiter.length);\n if (closingIndex === -1 || closingIndex + delimiter.length > to) {\n buffer += char;\n continue;\n }\n\n flush();\n\n if (delimiter === '`') {\n appendRun(\n runs,\n value.slice(index + 1, closingIndex).replace(MARKDOWN_UNESCAPE_PATTERN, '$1'),\n { ...style, code: true },\n );\n } else {\n const nestedRuns = parseRange(\n value,\n index + delimiter.length,\n closingIndex,\n mergeStyle(style, delimiter),\n );\n nestedRuns.forEach((run) => appendRun(runs, run.text, run));\n }\n\n index = closingIndex + delimiter.length - 1;\n }\n\n flush();\n return runs;\n};\n\nexport const parseInlineMarkdown = (value: string): RichTextRun[] => {\n if (!value) return [];\n return parseRange(value, 0, value.length, {});\n};\n\nexport const escapeInlineMarkdown = (value: string): string =>\n value.replace(MARKDOWN_ESCAPE_PATTERN, (char) => `\\\\${char}`);\n\nexport const stripInlineMarkdown = (value: string): string =>\n parseInlineMarkdown(value)\n .map((run) => run.text)\n .join('');\n","import { getFallbackFontName, mm2pt, pt2mm, type Font } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_VARIANT_FALLBACK,\n CODE_HORIZONTAL_PADDING,\n DYNAMIC_FIT_HORIZONTAL,\n DYNAMIC_FIT_VERTICAL,\n FONT_SIZE_ADJUSTMENT,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n TEXT_FORMAT_INLINE_MARKDOWN,\n} from './constants.js';\nimport { getFontKitFont, heightOfFontAtSize, widthOfTextAtSize } from './helper.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport type { RichTextRun, TextSchema } from './types.js';\nimport { getBoxContentArea } from '../box.js';\n\nexport type ResolvedRichTextRun = RichTextRun & {\n fontName: string;\n fontKitFont: FontKitFont;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\nexport type RichTextLineRun = ResolvedRichTextRun & {\n width: number;\n};\n\nexport type RichTextLine = {\n runs: RichTextLineRun[];\n width: number;\n hardBreak: boolean;\n};\n\ntype FontVariantResolution = {\n fontName: string;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\ntype RichTextRunPiece = {\n run: ResolvedRichTextRun;\n text: string;\n};\n\nconst richTextWordSegmenter = new Intl.Segmenter(undefined, { granularity: 'word' });\nconst richTextGraphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\nconst getBaseFontName = (schema: TextSchema, font: Font) =>\n schema.fontName && font[schema.fontName] ? schema.fontName : getFallbackFontName(font);\n\nconst getLoadedFontName = (font: Font, fontName?: string) =>\n fontName && font[fontName] ? fontName : undefined;\n\nexport const isInlineMarkdownTextSchema = (schema: TextSchema) =>\n schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN &&\n !(schema.type === 'text' && schema.readOnly !== true);\n\nexport const resolveFontVariant = (\n run: RichTextRun,\n schema: TextSchema,\n font: Font,\n): FontVariantResolution => {\n const baseFontName = getBaseFontName(schema, font);\n const variants = schema.fontVariants ?? {};\n const fallback = schema.fontVariantFallback ?? DEFAULT_FONT_VARIANT_FALLBACK;\n\n let fontName = baseFontName;\n let needsBold = Boolean(run.bold);\n let needsItalic = Boolean(run.italic);\n\n if (run.code) {\n fontName = getLoadedFontName(font, variants.code) ?? baseFontName;\n } else if (run.bold && run.italic) {\n const boldItalic = getLoadedFontName(font, variants.boldItalic);\n const italic = getLoadedFontName(font, variants.italic);\n const bold = getLoadedFontName(font, variants.bold);\n\n if (boldItalic) {\n fontName = boldItalic;\n needsBold = false;\n needsItalic = false;\n } else if (italic) {\n fontName = italic;\n needsItalic = false;\n } else if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.bold) {\n const bold = getLoadedFontName(font, variants.bold);\n if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.italic) {\n const italic = getLoadedFontName(font, variants.italic);\n if (italic) {\n fontName = italic;\n needsItalic = false;\n }\n }\n\n if (\n (needsBold || needsItalic || (run.code && !getLoadedFontName(font, variants.code))) &&\n fallback === FONT_VARIANT_FALLBACK_ERROR\n ) {\n throw new Error(\n `[@pdfme/schemas] Missing font variant for markdown text in field \"${schema.name}\".`,\n );\n }\n\n return {\n fontName,\n syntheticBold: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsBold,\n syntheticItalic: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsItalic,\n };\n};\n\nexport const resolveRichTextRuns = async (arg: {\n runs: RichTextRun[];\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n}): Promise<ResolvedRichTextRun[]> => {\n const { runs, schema, font, _cache } = arg;\n const fontKitCache = new Map<string, FontKitFont>();\n\n const getResolvedFontKitFont = async (fontName: string) => {\n const cached = fontKitCache.get(fontName);\n if (cached) return cached;\n\n const fontKitFont = await getFontKitFont(fontName, font, _cache as Map<string, FontKitFont>);\n fontKitCache.set(fontName, fontKitFont);\n return fontKitFont;\n };\n\n return Promise.all(\n runs.map(async (run) => {\n const resolution = resolveFontVariant(run, schema, font);\n return {\n ...run,\n ...resolution,\n fontKitFont: await getResolvedFontKitFont(resolution.fontName),\n };\n }),\n );\n};\n\nconst measureRunText = (\n run: ResolvedRichTextRun,\n text: string,\n fontSize: number,\n characterSpacing: number,\n) => {\n const syntheticBoldWidth = run.syntheticBold\n ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS\n : 0;\n const syntheticItalicWidth = run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n return (\n widthOfTextAtSize(text, run.fontKitFont, fontSize, characterSpacing) +\n syntheticBoldWidth +\n syntheticItalicWidth +\n (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0)\n );\n};\n\nconst createLine = (): RichTextLine => ({ runs: [], width: 0, hardBreak: false });\n\nconst pushRunToLine = (\n line: RichTextLine,\n run: ResolvedRichTextRun,\n text: string,\n fontSize: number,\n characterSpacing: number,\n) => {\n if (!text) return;\n const width = measureRunText(run, text, fontSize, characterSpacing);\n const lastRun = line.runs[line.runs.length - 1];\n if (lastRun && canMergeRichTextRuns(lastRun, run)) {\n // Adjacent pieces from the same logical rich-text span should stay one run so spacing,\n // inline code padding, and synthetic font offsets are measured for the combined span.\n const previousWidth = lastRun.width;\n lastRun.text += text;\n lastRun.width = measureRunText(lastRun, lastRun.text, fontSize, characterSpacing);\n line.width += lastRun.width - previousWidth;\n return;\n }\n\n if (line.runs.length > 0) line.width += characterSpacing;\n line.runs.push({ ...run, text, width });\n line.width += width;\n};\n\nconst canMergeRichTextRuns = (a: ResolvedRichTextRun, b: ResolvedRichTextRun) =>\n a.fontName === b.fontName &&\n a.fontKitFont === b.fontKitFont &&\n a.syntheticBold === b.syntheticBold &&\n a.syntheticItalic === b.syntheticItalic &&\n a.bold === b.bold &&\n a.italic === b.italic &&\n a.strikethrough === b.strikethrough &&\n a.code === b.code &&\n a.href === b.href;\n\nconst measurePiecesWidth = (\n pieces: RichTextRunPiece[],\n fontSize: number,\n characterSpacing: number,\n) => {\n let width = 0;\n let hasText = false;\n pieces.forEach((piece) => {\n if (!piece.text) return;\n if (hasText) width += characterSpacing;\n width += measureRunText(piece.run, piece.text, fontSize, characterSpacing);\n hasText = true;\n });\n return width;\n};\n\nconst sliceRunPieces = (\n pieces: RichTextRunPiece[],\n startIndex: number,\n endIndex: number,\n): RichTextRunPiece[] => {\n const result: RichTextRunPiece[] = [];\n let offset = 0;\n\n pieces.forEach((piece) => {\n const pieceStart = offset;\n const pieceEnd = pieceStart + piece.text.length;\n const sliceStart = Math.max(startIndex, pieceStart);\n const sliceEnd = Math.min(endIndex, pieceEnd);\n\n if (sliceStart < sliceEnd) {\n result.push({\n run: piece.run,\n text: piece.text.slice(sliceStart - pieceStart, sliceEnd - pieceStart),\n });\n }\n\n offset = pieceEnd;\n });\n\n return result;\n};\n\nconst segmentRunPiecesByWord = (\n runs: ResolvedRichTextRun[],\n onSegment: (pieces: RichTextRunPiece[]) => void,\n onHardBreak: () => void,\n) => {\n let paragraphPieces: RichTextRunPiece[] = [];\n\n const flushParagraph = () => {\n if (paragraphPieces.length === 0) return;\n\n const paragraphText = paragraphPieces.map((piece) => piece.text).join('');\n Array.from(richTextWordSegmenter.segment(paragraphText), ({ segment, index }) => {\n const pieces = sliceRunPieces(paragraphPieces, index, index + segment.length);\n if (pieces.length > 0) onSegment(pieces);\n });\n paragraphPieces = [];\n };\n\n runs.forEach((run) => {\n run.text.split(/(\\r\\n|\\r|\\n)/).forEach((part) => {\n if (part === '\\r\\n' || part === '\\r' || part === '\\n') {\n flushParagraph();\n onHardBreak();\n return;\n }\n\n if (part) paragraphPieces.push({ run, text: part });\n });\n });\n\n flushParagraph();\n};\n\nconst splitIntoGraphemes = (value: string) =>\n Array.from(richTextGraphemeSegmenter.segment(value), ({ segment }) => segment);\n\nexport const countRichTextLineGraphemes = (line: RichTextLine) =>\n splitIntoGraphemes(line.runs.map((run) => run.text).join('')).length;\n\nexport const getRichTextLineText = (line: RichTextLine) =>\n line.runs.map((run) => run.text).join('');\n\nexport const layoutRichTextLines = (arg: {\n runs: ResolvedRichTextRun[];\n fontSize: number;\n characterSpacing: number;\n boxWidthInPt: number;\n}): RichTextLine[] => {\n const { runs, fontSize, characterSpacing, boxWidthInPt } = arg;\n const lines: RichTextLine[] = [];\n let currentLine = createLine();\n\n const pushCurrentLine = (hardBreak: boolean) => {\n currentLine.hardBreak = hardBreak;\n lines.push(currentLine);\n currentLine = createLine();\n };\n\n const pushPiecesToLine = (pieces: RichTextRunPiece[]) => {\n pieces.forEach((piece) => {\n pushRunToLine(currentLine, piece.run, piece.text, fontSize, characterSpacing);\n });\n };\n\n const pushOversizedText = (run: ResolvedRichTextRun, text: string) => {\n let remainingText = text;\n\n while (remainingText.length > 0) {\n const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;\n const remainingWidth = Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0);\n const remainingTextWidth = measureRunText(run, remainingText, fontSize, characterSpacing);\n\n if (\n remainingTextWidth <= remainingWidth ||\n (currentLine.runs.length === 0 && remainingTextWidth <= boxWidthInPt)\n ) {\n pushRunToLine(currentLine, run, remainingText, fontSize, characterSpacing);\n return;\n }\n\n if (currentLine.runs.length > 0 && remainingTextWidth <= boxWidthInPt) {\n pushCurrentLine(false);\n continue;\n }\n\n const graphemes = splitIntoGraphemes(remainingText);\n let fittingText = '';\n let fittingLength = 0;\n\n for (const grapheme of graphemes) {\n const candidate = fittingText + grapheme;\n const candidateWidth = measureRunText(run, candidate, fontSize, characterSpacing);\n const maxWidth = currentLine.runs.length === 0 ? boxWidthInPt : remainingWidth;\n if (candidateWidth > maxWidth) {\n if (fittingText) break;\n if (currentLine.runs.length > 0) break;\n }\n fittingText = candidate;\n fittingLength += grapheme.length;\n if (candidateWidth > maxWidth) break;\n }\n\n if (!fittingText) {\n pushCurrentLine(false);\n continue;\n }\n\n pushRunToLine(currentLine, run, fittingText, fontSize, characterSpacing);\n remainingText = remainingText.slice(fittingLength);\n if (remainingText.length > 0) pushCurrentLine(false);\n }\n };\n\n const pushSegment = (pieces: RichTextRunPiece[]) => {\n const segmentWidth = measurePiecesWidth(pieces, fontSize, characterSpacing);\n const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;\n const remainingWidth = Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0);\n\n if (\n segmentWidth <= remainingWidth ||\n (currentLine.runs.length === 0 && segmentWidth <= boxWidthInPt)\n ) {\n pushPiecesToLine(pieces);\n return;\n }\n\n if (currentLine.runs.length > 0) {\n pushCurrentLine(false);\n if (segmentWidth <= boxWidthInPt) {\n pushPiecesToLine(pieces);\n return;\n }\n }\n\n pieces.forEach((piece) => pushOversizedText(piece.run, piece.text));\n };\n\n segmentRunPiecesByWord(runs, pushSegment, () => pushCurrentLine(true));\n\n if (currentLine.runs.length > 0 || lines.length === 0) {\n pushCurrentLine(false);\n }\n\n return lines;\n};\n\nconst measureParagraphWidths = (\n runs: ResolvedRichTextRun[],\n fontSize: number,\n characterSpacing: number,\n) => {\n const widths: number[] = [];\n let paragraphPieces: RichTextRunPiece[] = [];\n\n const pushWidth = () => {\n widths.push(measurePiecesWidth(paragraphPieces, fontSize, characterSpacing));\n paragraphPieces = [];\n };\n\n runs.forEach((run) => {\n run.text.split(/(\\r\\n|\\r|\\n)/).forEach((part) => {\n if (part === '\\r\\n' || part === '\\r' || part === '\\n') {\n pushWidth();\n return;\n }\n\n if (part) paragraphPieces.push({ run, text: part });\n });\n });\n\n pushWidth();\n return widths;\n};\n\nconst getLineHeightAtSize = (line: RichTextLine, fontSize: number) => {\n if (line.runs.length === 0) return fontSize;\n return Math.max(...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)));\n};\n\nexport const calculateDynamicRichTextFontSize = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n startingFontSize?: number | undefined;\n}) => {\n const { value, schema, font, _cache, startingFontSize } = arg;\n const {\n fontSize: schemaFontSize,\n dynamicFontSize: dynamicFontSizeSetting,\n characterSpacing: schemaCharacterSpacing,\n lineHeight = DEFAULT_LINE_HEIGHT,\n } = schema;\n const { width: boxWidth, height: boxHeight } = getBoxContentArea(schema);\n const fontSize = startingFontSize || schemaFontSize || DEFAULT_FONT_SIZE;\n if (!dynamicFontSizeSetting) return fontSize;\n if (dynamicFontSizeSetting.max < dynamicFontSizeSetting.min) return fontSize;\n\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const characterSpacing = schemaCharacterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const dynamicFontFit = dynamicFontSizeSetting.fit ?? DEFAULT_DYNAMIC_FIT;\n const boxWidthInPt = mm2pt(boxWidth);\n\n let dynamicFontSize = fontSize;\n if (dynamicFontSize < dynamicFontSizeSetting.min) {\n dynamicFontSize = dynamicFontSizeSetting.min;\n } else if (dynamicFontSize > dynamicFontSizeSetting.max) {\n dynamicFontSize = dynamicFontSizeSetting.max;\n }\n\n const calculateConstraints = (size: number) => {\n let totalWidthInMm = 0;\n let totalHeightInMm = 0;\n\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize: size,\n characterSpacing,\n boxWidthInPt,\n });\n\n lines.forEach((line, lineIndex) => {\n if (dynamicFontFit === DYNAMIC_FIT_VERTICAL) {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(line.width));\n }\n\n if (lineIndex === 0) {\n totalHeightInMm += pt2mm(getLineHeightAtSize(line, size) * lineHeight);\n } else {\n totalHeightInMm += pt2mm(size * lineHeight);\n }\n });\n\n if (dynamicFontFit === DYNAMIC_FIT_HORIZONTAL) {\n measureParagraphWidths(resolvedRuns, size, characterSpacing).forEach((paragraphWidth) => {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(paragraphWidth));\n });\n }\n\n return { totalWidthInMm, totalHeightInMm };\n };\n\n const shouldFontGrowToFit = (totalWidthInMm: number, totalHeightInMm: number) => {\n if (dynamicFontSize >= dynamicFontSizeSetting.max) {\n return false;\n }\n if (dynamicFontFit === DYNAMIC_FIT_HORIZONTAL) {\n return totalWidthInMm < boxWidth;\n }\n return totalHeightInMm < boxHeight;\n };\n\n const shouldFontShrinkToFit = (totalWidthInMm: number, totalHeightInMm: number) => {\n if (dynamicFontSize <= dynamicFontSizeSetting.min || dynamicFontSize <= 0) {\n return false;\n }\n return totalWidthInMm > boxWidth || totalHeightInMm > boxHeight;\n };\n\n let { totalWidthInMm, totalHeightInMm } = calculateConstraints(dynamicFontSize);\n\n while (shouldFontGrowToFit(totalWidthInMm, totalHeightInMm)) {\n dynamicFontSize += FONT_SIZE_ADJUSTMENT;\n const { totalWidthInMm: newWidth, totalHeightInMm: newHeight } =\n calculateConstraints(dynamicFontSize);\n\n if (newHeight < boxHeight) {\n totalWidthInMm = newWidth;\n totalHeightInMm = newHeight;\n } else {\n dynamicFontSize -= FONT_SIZE_ADJUSTMENT;\n break;\n }\n }\n\n while (shouldFontShrinkToFit(totalWidthInMm, totalHeightInMm)) {\n dynamicFontSize -= FONT_SIZE_ADJUSTMENT;\n ({ totalWidthInMm, totalHeightInMm } = calculateConstraints(dynamicFontSize));\n }\n\n return dynamicFontSize;\n};\n","import { getDefaultFont, mm2pt, pt2mm, type DynamicLayoutRange, type Font } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { DEFAULT_CHARACTER_SPACING, DEFAULT_FONT_SIZE, DEFAULT_LINE_HEIGHT } from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n heightOfFontAtSize,\n splitTextToSize,\n} from './helper.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n layoutRichTextLines,\n resolveRichTextRuns,\n type RichTextLine,\n} from './richText.js';\nimport type { TextSchema } from './types.js';\nimport { getTextLineRange } from '../splitRange.js';\nimport {\n getBoxContentArea,\n getBoxInsets,\n getBoxVerticalInset,\n getSplitBoxDimension,\n hasBoxDimension,\n} from '../box.js';\n\ntype MeasureTextHeightArgs = {\n value: string;\n schema: TextSchema;\n font?: Font;\n _cache?: Map<string | number, unknown>;\n ignoreDynamicFontSize?: boolean;\n};\n\ntype MeasureTextLinesResult = {\n lines: string[];\n lineHeights: number[];\n};\n\nexport const applyTextLineRange = <T>(lines: T[], range?: DynamicLayoutRange) => {\n if (!range) return lines;\n return lines.slice(range.start, range.end ?? lines.length);\n};\n\nexport const plainTextLinesToValue = (lines: string[]) =>\n lines.map((line) => line.replace(/[\\r\\n]+$/g, '')).join('\\n');\n\nconst splitReplacementTextToLines = (value: string) => {\n const lines: string[] = [];\n let start = 0;\n\n for (let i = 0; i < value.length; i += 1) {\n const charCode = value.charCodeAt(i);\n if (charCode !== 10 && charCode !== 13) continue;\n\n lines.push(value.slice(start, i));\n if (charCode === 13 && value.charCodeAt(i + 1) === 10) i += 1;\n start = i + 1;\n }\n\n lines.push(value.slice(start));\n return lines;\n};\n\nexport const measureTextLines = async ({\n value,\n schema,\n font = getDefaultFont(),\n _cache = new Map<string | number, unknown>(),\n ignoreDynamicFontSize = false,\n}: MeasureTextHeightArgs): Promise<MeasureTextLinesResult> => {\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 boxWidthInPt = mm2pt(getBoxContentArea(schema).width);\n\n if (isInlineMarkdownTextSchema(schema)) {\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const resolvedFontSize =\n schema.dynamicFontSize && schema.height > 0 && !ignoreDynamicFontSize\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : fontSize;\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize: resolvedFontSize,\n characterSpacing,\n boxWidthInPt,\n });\n\n return {\n lines: lines.map((line) => line.runs.map((run) => run.text).join('')),\n lineHeights: measureRichTextLineHeights(lines, resolvedFontSize, lineHeight),\n };\n }\n\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const resolvedFontSize =\n schema.dynamicFontSize && schema.height > 0 && !ignoreDynamicFontSize\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : fontSize;\n const lines = splitTextToSize({\n value,\n characterSpacing,\n fontSize: resolvedFontSize,\n fontKitFont,\n boxWidthInPt,\n });\n\n return {\n lines,\n lineHeights: measurePlainTextLineHeights(lines, fontKitFont, resolvedFontSize, lineHeight),\n };\n};\n\nexport const mergeTextLineRangeValue = async ({\n value,\n replacement,\n schema,\n font = getDefaultFont(),\n _cache = new Map<string | number, unknown>(),\n}: {\n value: string;\n replacement: string;\n schema: TextSchema;\n font?: Font;\n _cache?: Map<string | number, unknown>;\n}) => {\n const range = getTextLineRange(schema);\n if (!range) return replacement;\n\n const { lines } = await measureTextLines({\n value,\n schema,\n font,\n _cache,\n ignoreDynamicFontSize: true,\n });\n const { start, end = lines.length } = range;\n const nextLines = [...lines];\n nextLines.splice(start, end - start, ...splitReplacementTextToLines(replacement));\n return plainTextLinesToValue(nextLines);\n};\n\nexport const measureTextHeight = async (args: MeasureTextHeightArgs): Promise<number> => {\n const { lineHeights } = await measureTextLines(args);\n return sumLineHeights(lineHeights) + getBoxVerticalInset(args.schema);\n};\n\nexport const sumLineHeights = (lineHeights: number[]) =>\n lineHeights.reduce((sum, height) => sum + height, 0);\n\nexport const getTextLineHeightsWithBox = (lineHeights: number[], schema: TextSchema) =>\n lineHeights.map(\n (height, index) =>\n height +\n getTextBoxVerticalInsetForRange(schema, { start: index, end: index + 1 }, lineHeights.length),\n );\n\nexport const getTextSplitBoxStyle = (\n schema: TextSchema,\n range: DynamicLayoutRange,\n totalLines: number,\n) => {\n const { borderWidth, padding } = getBoxInsets(schema);\n return {\n ...(hasBoxDimension(schema.borderWidth)\n ? { borderWidth: getSplitBoxDimension(borderWidth, range, totalLines) }\n : {}),\n ...(hasBoxDimension(schema.padding)\n ? { padding: getSplitBoxDimension(padding, range, totalLines) }\n : {}),\n };\n};\n\nexport const getTextBoxVerticalInsetForRange = (\n schema: TextSchema,\n range: DynamicLayoutRange,\n totalLines: number,\n) => {\n const { borderWidth, padding } = getBoxInsets(schema);\n const splitBorderWidth = getSplitBoxDimension(borderWidth, range, totalLines);\n const splitPadding = getSplitBoxDimension(padding, range, totalLines);\n return splitBorderWidth.top + splitBorderWidth.bottom + splitPadding.top + splitPadding.bottom;\n};\n\nconst measurePlainTextLineHeights = (\n lines: string[],\n fontKitFont: FontKitFont,\n fontSize: number,\n lineHeight: number,\n) => {\n if (lines.length === 0) return [];\n const firstLineHeight = heightOfFontAtSize(fontKitFont, fontSize) * lineHeight;\n const otherLineHeight = fontSize * lineHeight;\n return lines.map((_, index) => pt2mm(index === 0 ? firstLineHeight : otherLineHeight));\n};\n\nconst measureRichTextLineHeights = (\n lines: RichTextLine[],\n fontSize: number,\n lineHeight: number,\n) => {\n if (lines.length === 0) return [];\n return lines.map((line, index) =>\n pt2mm((index === 0 ? getRichTextLineHeight(line, fontSize) : fontSize) * lineHeight),\n );\n};\n\nconst getRichTextLineHeight = (line: RichTextLine, fontSize: number) => {\n if (line.runs.length === 0) return fontSize;\n return Math.max(...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)));\n};\n"],"mappings":"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"}