@pdfme/schemas 6.1.1-dev.5 → 6.1.1-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{builtins-BpOyUs31.js → builtins-pN5NVCSV.js} +130 -530
- package/dist/builtins-pN5NVCSV.js.map +1 -0
- package/dist/builtins.d.ts +1 -1
- package/dist/builtins.js +1 -1
- package/dist/checkbox/index.d.ts +2 -2
- package/dist/dynamicLayout.d.ts +3 -0
- package/dist/dynamicLayout.js +20 -0
- package/dist/dynamicLayout.js.map +1 -0
- package/dist/dynamicTemplate-ByBNu75x.js +71 -0
- package/dist/dynamicTemplate-ByBNu75x.js.map +1 -0
- package/dist/{dynamicTemplate-DslOH4FZ.js → dynamicTemplate-CkrZKlg-.js} +2 -2
- package/dist/{dynamicTemplate-DslOH4FZ.js.map → dynamicTemplate-CkrZKlg-.js.map} +1 -1
- package/dist/{lists-BmAAx0lx.js → dynamicTemplate-Cy07Imb5.js} +2 -2
- package/dist/dynamicTemplate-Cy07Imb5.js.map +1 -0
- package/dist/graphics/image.d.ts +1 -1
- package/dist/graphics/signature.d.ts +1 -1
- package/dist/helper-BaUAusvL.js +40 -0
- package/dist/helper-BaUAusvL.js.map +1 -0
- package/dist/{helper-6FilIoVM.js → helper-CBd9plP_.js} +5 -2
- package/dist/helper-CBd9plP_.js.map +1 -0
- package/dist/index.js +28 -42
- package/dist/index.js.map +1 -1
- package/dist/lists.js +1 -1
- package/dist/measure-h-7PUE2B.js +584 -0
- package/dist/measure-h-7PUE2B.js.map +1 -0
- package/dist/multiVariableText/dynamicTemplate.d.ts +2 -0
- package/dist/radioGroup/index.d.ts +2 -2
- package/dist/select/index.d.ts +2 -2
- package/dist/shapes/line.d.ts +1 -1
- package/dist/shapes/rectAndEllipse.d.ts +1 -2
- package/dist/tables/helper.d.ts +4 -4
- package/dist/tables.js +1 -1
- package/dist/text/constants.d.ts +3 -0
- package/dist/text/dynamicTemplate.d.ts +2 -0
- package/dist/text/measure.d.ts +26 -0
- package/dist/text/overflow.d.ts +3 -0
- package/dist/text/types.d.ts +7 -0
- package/dist/texts.d.ts +4 -0
- package/dist/texts.js +4 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.js +0 -0
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +3 -2
- package/dist/utils.js.map +1 -1
- package/package.json +16 -1
- package/dist/builtins-BpOyUs31.js.map +0 -1
- package/dist/helper-6FilIoVM.js.map +0 -1
- package/dist/lists-BmAAx0lx.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Plugin, Schema } from '@pdfme/common';
|
|
2
|
-
interface
|
|
2
|
+
export interface RadioGroupSchema extends Schema {
|
|
3
3
|
group: string;
|
|
4
4
|
color: string;
|
|
5
5
|
}
|
|
6
|
-
declare const schema: Plugin<
|
|
6
|
+
declare const schema: Plugin<RadioGroupSchema>;
|
|
7
7
|
export default schema;
|
package/dist/select/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Plugin } from '@pdfme/common';
|
|
2
2
|
import { TextSchema } from '../text/types.js';
|
|
3
|
-
interface
|
|
3
|
+
export interface SelectSchema extends TextSchema {
|
|
4
4
|
options: string[];
|
|
5
5
|
}
|
|
6
|
-
declare const schema: Plugin<
|
|
6
|
+
declare const schema: Plugin<SelectSchema>;
|
|
7
7
|
export default schema;
|
package/dist/shapes/line.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Plugin, Schema } from '@pdfme/common';
|
|
2
|
-
interface ShapeSchema extends Schema {
|
|
2
|
+
export interface ShapeSchema extends Schema {
|
|
3
3
|
type: 'ellipse' | 'rectangle';
|
|
4
4
|
borderWidth: number;
|
|
5
5
|
borderColor: string;
|
|
@@ -8,4 +8,3 @@ interface ShapeSchema extends Schema {
|
|
|
8
8
|
}
|
|
9
9
|
export declare const rectangle: Plugin<ShapeSchema>;
|
|
10
10
|
export declare const ellipse: Plugin<ShapeSchema>;
|
|
11
|
-
export {};
|
package/dist/tables/helper.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const getDefaultCellStyles: () => {
|
|
2
2
|
fontName: undefined;
|
|
3
|
-
alignment: import("../
|
|
4
|
-
verticalAlignment: import("../
|
|
3
|
+
alignment: import("../types.js").ALIGNMENT;
|
|
4
|
+
verticalAlignment: import("../types.js").VERTICAL_ALIGNMENT;
|
|
5
5
|
fontSize: number;
|
|
6
6
|
lineHeight: number;
|
|
7
7
|
characterSpacing: number;
|
|
@@ -182,7 +182,7 @@ export declare const getCellPropPanelSchema: (arg: {
|
|
|
182
182
|
props: {
|
|
183
183
|
options: {
|
|
184
184
|
label: string;
|
|
185
|
-
value: import("../
|
|
185
|
+
value: import("../types.js").ALIGNMENT;
|
|
186
186
|
}[];
|
|
187
187
|
};
|
|
188
188
|
span: number;
|
|
@@ -194,7 +194,7 @@ export declare const getCellPropPanelSchema: (arg: {
|
|
|
194
194
|
props: {
|
|
195
195
|
options: {
|
|
196
196
|
label: string;
|
|
197
|
-
value: import("../
|
|
197
|
+
value: import("../types.js").VERTICAL_ALIGNMENT;
|
|
198
198
|
}[];
|
|
199
199
|
};
|
|
200
200
|
span: number;
|
package/dist/tables.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as getDynamicLayoutForTable, t as getDynamicHeightsForTable } from "./dynamicTemplate-
|
|
1
|
+
import { n as getDynamicLayoutForTable, t as getDynamicHeightsForTable } from "./dynamicTemplate-CkrZKlg-.js";
|
|
2
2
|
export { getDynamicHeightsForTable, getDynamicLayoutForTable };
|
package/dist/text/constants.d.ts
CHANGED
|
@@ -16,6 +16,9 @@ export declare const PLACEHOLDER_FONT_COLOR = "#A0A0A0";
|
|
|
16
16
|
export declare const TEXT_FORMAT_PLAIN: "plain";
|
|
17
17
|
export declare const TEXT_FORMAT_INLINE_MARKDOWN: "inline-markdown";
|
|
18
18
|
export declare const DEFAULT_TEXT_FORMAT: "plain";
|
|
19
|
+
export declare const TEXT_OVERFLOW_VISIBLE: "visible";
|
|
20
|
+
export declare const TEXT_OVERFLOW_EXPAND: "expand";
|
|
21
|
+
export declare const DEFAULT_TEXT_OVERFLOW: "visible";
|
|
19
22
|
export declare const FONT_VARIANT_FALLBACK_SYNTHETIC: "synthetic";
|
|
20
23
|
export declare const FONT_VARIANT_FALLBACK_PLAIN: "plain";
|
|
21
24
|
export declare const FONT_VARIANT_FALLBACK_ERROR: "error";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Font } from '@pdfme/common';
|
|
2
|
+
import type { TextLineRange, TextSchema } from './types.js';
|
|
3
|
+
type MeasureTextHeightArgs = {
|
|
4
|
+
value: string;
|
|
5
|
+
schema: TextSchema;
|
|
6
|
+
font?: Font;
|
|
7
|
+
_cache?: Map<string | number, unknown>;
|
|
8
|
+
ignoreDynamicFontSize?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type MeasureTextLinesResult = {
|
|
11
|
+
lines: string[];
|
|
12
|
+
lineHeights: number[];
|
|
13
|
+
};
|
|
14
|
+
export declare const applyTextLineRange: <T>(lines: T[], range?: TextLineRange) => T[];
|
|
15
|
+
export declare const plainTextLinesToValue: (lines: string[]) => string;
|
|
16
|
+
export declare const measureTextLines: ({ value, schema, font, _cache, ignoreDynamicFontSize, }: MeasureTextHeightArgs) => Promise<MeasureTextLinesResult>;
|
|
17
|
+
export declare const mergeTextLineRangeValue: ({ value, replacement, schema, font, _cache, }: {
|
|
18
|
+
value: string;
|
|
19
|
+
replacement: string;
|
|
20
|
+
schema: TextSchema;
|
|
21
|
+
font?: Font;
|
|
22
|
+
_cache?: Map<string | number, unknown>;
|
|
23
|
+
}) => Promise<string>;
|
|
24
|
+
export declare const measureTextHeight: (args: MeasureTextHeightArgs) => Promise<number>;
|
|
25
|
+
export declare const sumLineHeights: (lineHeights: number[]) => number;
|
|
26
|
+
export {};
|
package/dist/text/types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export type ALIGNMENT = 'left' | 'center' | 'right' | 'justify';
|
|
|
4
4
|
export type VERTICAL_ALIGNMENT = 'top' | 'middle' | 'bottom';
|
|
5
5
|
export type DYNAMIC_FONT_SIZE_FIT = 'horizontal' | 'vertical';
|
|
6
6
|
export type TEXT_FORMAT = 'plain' | 'inline-markdown';
|
|
7
|
+
export type TEXT_OVERFLOW = 'visible' | 'expand';
|
|
7
8
|
export type FONT_VARIANT_FALLBACK = 'synthetic' | 'plain' | 'error';
|
|
8
9
|
export type FontVariants = {
|
|
9
10
|
bold?: string;
|
|
@@ -25,6 +26,10 @@ export type FontWidthCalcValues = {
|
|
|
25
26
|
characterSpacing: number;
|
|
26
27
|
boxWidthInPt: number;
|
|
27
28
|
};
|
|
29
|
+
export type TextLineRange = {
|
|
30
|
+
start: number;
|
|
31
|
+
end?: number;
|
|
32
|
+
};
|
|
28
33
|
export type TextSchema = Schema & {
|
|
29
34
|
fontName?: string;
|
|
30
35
|
textFormat?: TEXT_FORMAT;
|
|
@@ -42,6 +47,8 @@ export type TextSchema = Schema & {
|
|
|
42
47
|
max: number;
|
|
43
48
|
fit: DYNAMIC_FONT_SIZE_FIT;
|
|
44
49
|
};
|
|
50
|
+
overflow?: TEXT_OVERFLOW;
|
|
51
|
+
__textLineRange?: TextLineRange;
|
|
45
52
|
fontColor: string;
|
|
46
53
|
backgroundColor: string;
|
|
47
54
|
};
|
package/dist/texts.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { TEXT_OVERFLOW_EXPAND } from './text/constants.js';
|
|
2
|
+
export { getDynamicLayoutForText } from './text/dynamicTemplate.js';
|
|
3
|
+
export { mergeTextLineRangeValue } from './text/measure.js';
|
|
4
|
+
export { getDynamicLayoutForMultiVariableText } from './multiVariableText/dynamicTemplate.js';
|
package/dist/texts.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { N as TEXT_OVERFLOW_EXPAND } from "./helper-CBd9plP_.js";
|
|
2
|
+
import { i as mergeTextLineRangeValue } from "./measure-h-7PUE2B.js";
|
|
3
|
+
import { n as getDynamicLayoutForMultiVariableText, t as getDynamicLayoutForText } from "./dynamicTemplate-ByBNu75x.js";
|
|
4
|
+
export { TEXT_OVERFLOW_EXPAND, getDynamicLayoutForMultiVariableText, getDynamicLayoutForText, mergeTextLineRangeValue };
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type { ALIGNMENT, DYNAMIC_FONT_SIZE_FIT, FONT_VARIANT_FALLBACK, FontVariants, FontWidthCalcValues, RichTextRun, TEXT_FORMAT, TEXT_OVERFLOW, TextSchema, VERTICAL_ALIGNMENT, } from './text/types.js';
|
|
2
|
+
export type { MultiVariableTextSchema } from './multiVariableText/types.js';
|
|
3
|
+
export type { LIST_STYLE, ListItem, ListItemLayout, ListLayout, ListRange, ListSchema, } from './list/types.js';
|
|
4
|
+
export type { CellSchema, CellStyle, Section, Settings, Spacing, Styles, StylesProps, TableInput, TableSchema, } from './tables/types.js';
|
|
5
|
+
export type { BarcodeSchema, BarcodeTypes } from './barcodes/types.js';
|
|
6
|
+
export type { DateSchema } from './date/types.js';
|
|
7
|
+
export type { ImageSchema } from './graphics/image.js';
|
|
8
|
+
export type { SignatureSchema } from './graphics/signature.js';
|
|
9
|
+
export type { SVGSchema } from './graphics/svg.js';
|
|
10
|
+
export type { LineSchema } from './shapes/line.js';
|
|
11
|
+
export type { ShapeSchema } from './shapes/rectAndEllipse.js';
|
|
12
|
+
export type { SelectSchema } from './select/index.js';
|
|
13
|
+
export type { RadioGroupSchema } from './radioGroup/index.js';
|
|
14
|
+
export type { CheckboxSchema } from './checkbox/index.js';
|
package/dist/types.js
ADDED
|
File without changes
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Color } from '@pdfme/pdf-lib';
|
|
2
2
|
import { Schema, Mode, ColorType } from '@pdfme/common';
|
|
3
3
|
import { IconNode } from 'lucide';
|
|
4
|
+
export { measureTextHeight } from './text/measure.js';
|
|
4
5
|
export declare const convertForPdfLayoutProps: ({ schema, pageHeight, applyRotateTranslate, }: {
|
|
5
6
|
schema: Schema;
|
|
6
7
|
pageHeight: number;
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as measureTextHeight } from "./measure-h-7PUE2B.js";
|
|
2
|
+
import { t as getDynamicHeightsForTable$1 } from "./dynamicTemplate-CkrZKlg-.js";
|
|
2
3
|
import { isHexValid, mm2pt } from "@pdfme/common";
|
|
3
4
|
import { cmyk, degrees, degreesToRadians, rgb } from "@pdfme/pdf-lib";
|
|
4
5
|
//#region src/utils.ts
|
|
@@ -210,6 +211,6 @@ var createSvgStr = (icon, attrs) => {
|
|
|
210
211
|
return `<svg ${svgAttrString}>${Array.isArray(icon) ? icon.map((element) => processElement(element)).join("") : processElement(icon)}</svg>`;
|
|
211
212
|
};
|
|
212
213
|
//#endregion
|
|
213
|
-
export { addAlphaToHex, convertForPdfLayoutProps, createErrorElm, createSvgStr, getDynamicHeightsForTable, hex2PrintingColor, hex2RgbColor, isEditable, readFile, rotatePoint };
|
|
214
|
+
export { addAlphaToHex, convertForPdfLayoutProps, createErrorElm, createSvgStr, getDynamicHeightsForTable, hex2PrintingColor, hex2RgbColor, isEditable, measureTextHeight, readFile, rotatePoint };
|
|
214
215
|
|
|
215
216
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["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 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('&', '&')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n const escapeHtmlText = (value: string): string =>\n value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');\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.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["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 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('&', '&')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n const escapeHtmlText = (value: string): string =>\n value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');\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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pdfme/schemas",
|
|
3
|
-
"version": "6.1.1-dev.
|
|
3
|
+
"version": "6.1.1-dev.8",
|
|
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",
|
|
@@ -40,6 +40,11 @@
|
|
|
40
40
|
"import": "./dist/builtins.js",
|
|
41
41
|
"default": "./dist/builtins.js"
|
|
42
42
|
},
|
|
43
|
+
"./dynamicLayout": {
|
|
44
|
+
"types": "./dist/dynamicLayout.d.ts",
|
|
45
|
+
"import": "./dist/dynamicLayout.js",
|
|
46
|
+
"default": "./dist/dynamicLayout.js"
|
|
47
|
+
},
|
|
43
48
|
"./tables": {
|
|
44
49
|
"types": "./dist/tables.d.ts",
|
|
45
50
|
"import": "./dist/tables.js",
|
|
@@ -50,6 +55,16 @@
|
|
|
50
55
|
"import": "./dist/lists.js",
|
|
51
56
|
"default": "./dist/lists.js"
|
|
52
57
|
},
|
|
58
|
+
"./texts": {
|
|
59
|
+
"types": "./dist/texts.d.ts",
|
|
60
|
+
"import": "./dist/texts.js",
|
|
61
|
+
"default": "./dist/texts.js"
|
|
62
|
+
},
|
|
63
|
+
"./types": {
|
|
64
|
+
"types": "./dist/types.d.ts",
|
|
65
|
+
"import": "./dist/types.js",
|
|
66
|
+
"default": "./dist/types.js"
|
|
67
|
+
},
|
|
53
68
|
"./utils": {
|
|
54
69
|
"types": "./dist/utils.d.ts",
|
|
55
70
|
"import": "./dist/utils.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builtins-BpOyUs31.js","names":[],"sources":["../src/text/inlineMarkdown.ts","../src/text/richText.ts","../src/text/linkAnnotation.ts","../src/text/richTextPdfRender.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 { 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 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';\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 );\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 if (line.runs.length > 0) line.width += characterSpacing;\n line.runs.push({ ...run, text, width });\n line.width += width;\n};\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 width: boxWidth,\n height: boxHeight,\n lineHeight = DEFAULT_LINE_HEIGHT,\n } = 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 { normalizeSafeLinkUri } from '@pdfme/common';\nimport type { PDFDocument, PDFPage } from '@pdfme/pdf-lib';\nimport { PDFName, PDFString } from '@pdfme/pdf-lib';\n\nexport type LinkAnnotationRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport const addUriLinkAnnotation = (arg: {\n pdfDoc: PDFDocument;\n page: PDFPage;\n uri: string;\n rect: LinkAnnotationRect;\n borderWidth?: number;\n}) => {\n const { pdfDoc, page, uri, rect, borderWidth = 0 } = arg;\n const safeUri = normalizeSafeLinkUri(uri);\n if (!safeUri || rect.width <= 0 || rect.height <= 0) return;\n\n const annotationRef = pdfDoc.context.register(\n pdfDoc.context.obj({\n Type: PDFName.of('Annot'),\n Subtype: PDFName.of('Link'),\n Rect: [rect.x, rect.y, rect.x + rect.width, rect.y + rect.height],\n Border: [0, 0, borderWidth],\n A: {\n Type: PDFName.of('Action'),\n S: PDFName.of('URI'),\n URI: PDFString.of(safeUri),\n },\n }),\n );\n\n page.node.addAnnot(annotationRef);\n};\n","import type { PDFFont, Rotation } from '@pdfme/pdf-lib';\nimport type { ColorType, Font, PDFRenderProps } from '@pdfme/common';\nimport { getInternalLinkTarget, mm2pt, registerInternalLinkAnnotation } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n CODE_BACKGROUND_COLOR,\n CODE_HORIZONTAL_PADDING,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_TOP,\n} from './constants.js';\nimport { getFontDescentInPt, heightOfFontAtSize, widthOfTextAtSize } from './helper.js';\nimport { addUriLinkAnnotation, type LinkAnnotationRect } from './linkAnnotation.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport {\n countRichTextLineGraphemes,\n layoutRichTextLines,\n resolveRichTextRuns,\n type RichTextLineRun,\n} from './richText.js';\nimport type { TextSchema } from './types.js';\nimport { hex2PrintingColor, rotatePoint } from '../utils.js';\n\ntype TextColor = ReturnType<typeof hex2PrintingColor>;\n\nconst getSyntheticBoldWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticBold ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS : 0;\n\nconst getSyntheticItalicWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n\nconst getRunWidth = (run: RichTextLineRun, fontSize: number, characterSpacing: number) =>\n widthOfTextAtSize(run.text, run.fontKitFont, fontSize, characterSpacing) +\n getSyntheticBoldWidth(run, fontSize) +\n getSyntheticItalicWidth(run, fontSize);\n\nconst getPdfFontFromObj = (run: RichTextLineRun, pdfFontObj: Record<string, PDFFont>) => {\n const pdfFont = pdfFontObj[run.fontName];\n if (!pdfFont) {\n throw new Error(`[@pdfme/schemas] Missing embedded font \"${run.fontName}\".`);\n }\n return pdfFont;\n};\n\nconst embedFontsForRuns = async (\n runs: RichTextLineRun[],\n embedPdfFont: (fontName: string) => Promise<PDFFont>,\n) => {\n const fontNames = Array.from(new Set(runs.map((run) => run.fontName)));\n const pdfFonts = await Promise.all(\n fontNames.map(async (fontName) => [fontName, await embedPdfFont(fontName)] as const),\n );\n return Object.fromEntries(pdfFonts);\n};\n\nconst drawDecorationLine = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n color: TextColor;\n opacity: number | undefined;\n}) => {\n const { page, x, y, width, rotate, pivotPoint, fontSize, color, opacity } = arg;\n if (width <= 0) return;\n\n page.drawLine({\n start: rotatePoint({ x, y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: x + width, y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color,\n opacity,\n });\n};\n\nconst getAxisAlignedRect = (arg: {\n x: number;\n y: number;\n width: number;\n height: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n}): LinkAnnotationRect => {\n const { x, y, width, height, rotate, pivotPoint } = arg;\n if (rotate.angle === 0) return { x, y, width, height };\n\n const points = [\n { x, y },\n { x: x + width, y },\n { x: x + width, y: y + height },\n { x, y: y + height },\n ].map((point) => rotatePoint(point, pivotPoint, rotate.angle));\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n\n return {\n x: minX,\n y: minY,\n width: Math.max(...xs) - minX,\n height: Math.max(...ys) - minY,\n };\n};\n\nconst getLinkAnnotationRect = (arg: {\n run: RichTextLineRun;\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n}): LinkAnnotationRect => {\n const { run, x, y, width, rotate, pivotPoint, fontSize } = arg;\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n const descent = getFontDescentInPt(run.fontKitFont, fontSize);\n const rectY = y + descent;\n const rectHeight = textHeight - descent;\n\n return getAxisAlignedRect({\n x,\n y: rectY,\n width,\n height: rectHeight,\n rotate,\n pivotPoint,\n });\n};\n\nconst drawRun = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n run: RichTextLineRun;\n pdfFont: PDFFont;\n x: number;\n y: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n lineHeight: number;\n color: TextColor;\n opacity: number | undefined;\n colorType: ColorType;\n characterSpacing: number;\n strikethrough: boolean;\n underline: boolean;\n}) => {\n const {\n page,\n pdfLib,\n run,\n pdfFont,\n x,\n y,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing,\n strikethrough,\n underline,\n } = arg;\n const runWidth = getRunWidth(run, fontSize, characterSpacing);\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n\n if (run.code) {\n const padding = CODE_HORIZONTAL_PADDING;\n const bgX = x - padding;\n const bgY = y - textHeight * 0.2;\n const bgPoint =\n rotate.angle === 0\n ? { x: bgX, y: bgY }\n : rotatePoint({ x: bgX, y: bgY }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: bgPoint.x,\n y: bgPoint.y,\n width: runWidth + padding * 2,\n height: textHeight * 1.2,\n rotate,\n color: hex2PrintingColor(CODE_BACKGROUND_COLOR, colorType),\n opacity,\n });\n }\n\n if (strikethrough && runWidth > 0) {\n drawDecorationLine({\n page,\n x,\n y: y + textHeight / 3,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n if (underline && runWidth > 0) {\n drawDecorationLine({\n page,\n x,\n y: y - textHeight / 12,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n const drawAt = (drawX: number) => {\n const point =\n rotate.angle === 0 ? { x: drawX, y } : rotatePoint({ x: drawX, y }, pivotPoint, rotate.angle);\n page.drawText(run.text, {\n x: point.x,\n y: point.y,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFont,\n opacity,\n ...(run.syntheticItalic ? { ySkew: pdfLib.degrees(SYNTHETIC_ITALIC_SKEW_DEGREES) } : {}),\n });\n };\n\n drawAt(x);\n if (run.syntheticBold) {\n const offset = fontSize * SYNTHETIC_BOLD_OFFSET_RATIO;\n for (let i = 1; i <= SYNTHETIC_BOLD_PDF_EXTRA_DRAWS; i++) {\n drawAt(x + offset * i);\n }\n }\n};\n\nexport const renderInlineMarkdownText = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n embedPdfFont: (fontName: string) => Promise<PDFFont>;\n fontKitFont: FontKitFont;\n pdfDoc: PDFRenderProps<TextSchema>['pdfDoc'];\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n _cache: Map<string | number, unknown>;\n colorType: ColorType;\n fontSize: number;\n color: TextColor;\n alignment: string;\n verticalAlignment: string;\n lineHeight: number;\n characterSpacing: number;\n x: number;\n width: number;\n height: number;\n pageHeight: number;\n pivotPoint: { x: number; y: number };\n rotate: Rotation;\n opacity: number | undefined;\n}) => {\n const {\n value,\n schema,\n font,\n embedPdfFont,\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n width,\n height,\n pageHeight,\n pivotPoint,\n rotate,\n opacity,\n } = arg;\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize,\n characterSpacing,\n boxWidthInPt: width,\n });\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 = alignment === 'justify' && !line.hardBreak && rowIndex < lines.length - 1;\n\n if (shouldJustify) {\n const graphemeCount = countRichTextLineGraphemes(line);\n if (graphemeCount > 0) {\n spacing += (width - textWidth) / graphemeCount;\n textWidth = width;\n }\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n const yLine =\n pageHeight - mm2pt(schema.position.y) - yOffset - lineHeight * fontSize * rowIndex;\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n if (schema.strikethrough || schema.underline) {\n const textHeight = Math.max(\n ...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)),\n );\n if (schema.strikethrough) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n if (schema.underline) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n }\n\n line.runs.reduce((currentX, run, runIndex) => {\n const runWidth = getRunWidth(run, fontSize, spacing);\n const pdfFont = getPdfFontFromObj(run, pdfFontObj);\n drawRun({\n page,\n pdfLib,\n run,\n pdfFont,\n x: currentX,\n y: yLine,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing: spacing,\n strikethrough: Boolean(run.strikethrough),\n underline: Boolean(run.href) && !schema.underline,\n });\n if (run.href) {\n const rect = getLinkAnnotationRect({\n run,\n x: currentX,\n y: yLine,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n });\n const targetName = getInternalLinkTarget(run.href);\n if (targetName) {\n registerInternalLinkAnnotation({ _cache, page, targetName, rect });\n } else {\n addUriLinkAnnotation({ pdfDoc, page, uri: run.href, rect });\n }\n }\n\n return currentX + runWidth + (runIndex === line.runs.length - 1 ? 0 : spacing);\n }, xLine);\n });\n};\n","import { 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 { calculateDynamicRichTextFontSize, isInlineMarkdownTextSchema } from './richText.js';\nimport { renderInlineMarkdownText } from './richTextPdfRender.js';\nimport { convertForPdfLayoutProps, rotatePoint, hex2PrintingColor } from '../utils.js';\n\ntype PdfFontCache = Record<string, Promise<PDFFont>>;\n\nconst PDF_FONT_CACHE_KEY = 'text-pdf-font-cache';\n\nconst getPdfFontCache = (\n _cache: Map<string | number, unknown>,\n): PdfFontCache => {\n let pdfFontCache = _cache.get(PDF_FONT_CACHE_KEY) as PdfFontCache | undefined;\n if (!pdfFontCache) {\n pdfFontCache = {};\n _cache.set(PDF_FONT_CACHE_KEY, pdfFontCache);\n }\n\n return pdfFontCache;\n};\n\nconst embedAndGetFont = (arg: {\n pdfDoc: PDFDocument;\n font: Font;\n fontName: string;\n _cache: Map<string | number, unknown>;\n}) => {\n const { pdfDoc, font, fontName, _cache } = arg;\n const pdfFontCache = getPdfFontCache(_cache);\n const cachedFont = pdfFontCache[fontName];\n if (cachedFont) {\n return cachedFont;\n }\n\n const fontValue = font[fontName];\n if (!fontValue) {\n return Promise.reject(new Error(`[@pdfme/schemas] Font \"${fontName}\" is not found.`));\n }\n\n const pdfFontPromise = (async () => {\n let fontData = fontValue.data;\n if (typeof fontData === 'string' && fontData.startsWith('http')) {\n fontData = await fetchRemoteFontData(fontData);\n }\n return pdfDoc.embedFont(fontData, {\n subset: typeof fontValue.subset === 'undefined' ? true : fontValue.subset,\n });\n })();\n\n pdfFontCache[fontName] = pdfFontPromise;\n return pdfFontPromise;\n};\n\nconst getFontProp = ({\n value,\n fontKitFont,\n schema,\n colorType,\n fontSize: resolvedFontSize,\n}: {\n value: string;\n fontKitFont: FontKitFont;\n colorType?: ColorType;\n schema: TextSchema;\n fontSize?: number;\n}) => {\n const fontSize =\n resolvedFontSize ??\n (schema.dynamicFontSize\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE));\n const color = hex2PrintingColor(schema.fontColor || DEFAULT_FONT_COLOR, colorType);\n\n return {\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n verticalAlignment: schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n lineHeight: schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n color,\n };\n};\n\nlet graphemeSegmenter: Intl.Segmenter | undefined;\n\nconst getGraphemeSegmenter = () => {\n graphemeSegmenter ??= new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n return graphemeSegmenter;\n};\n\nexport const pdfRender = async (arg: PDFRenderProps<TextSchema>) => {\n const { value, pdfDoc, pdfLib, page, options, schema, _cache } = arg;\n if (!value) return;\n\n const { font = getDefaultFont(), colorType } = options;\n const fontName = schema.fontName ? schema.fontName : getFallbackFontName(font);\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n\n const pdfFontValuePromise = enableInlineMarkdown\n ? undefined\n : embedAndGetFont({\n pdfDoc,\n font,\n fontName,\n _cache,\n });\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && schema.dynamicFontSize\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : undefined;\n const fontProp = getFontProp({\n value: displayValue,\n fontKitFont,\n schema,\n colorType,\n fontSize: dynamicRichTextFontSize,\n });\n\n const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = fontProp;\n\n const pageHeight = page.getHeight();\n const {\n width,\n height,\n rotate,\n position: { x, y },\n opacity,\n } = convertForPdfLayoutProps({ schema, pageHeight, applyRotateTranslate: false });\n\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(schema.position.y) - height / 2 };\n\n if (schema.backgroundColor) {\n const color = hex2PrintingColor(schema.backgroundColor, colorType);\n if (rotate.angle !== 0) {\n // Apply the same rotation logic as text rendering to match UI behavior\n const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotate.angle);\n page.drawRectangle({ x: rotatedPoint.x, y: rotatedPoint.y, width, height, rotate, color });\n } else {\n page.drawRectangle({ x, y, width, height, rotate, color });\n }\n }\n\n if (enableInlineMarkdown) {\n await renderInlineMarkdownText({\n value,\n schema,\n font,\n embedPdfFont: (fontName) => embedAndGetFont({ pdfDoc, font, fontName, _cache }),\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n width,\n height,\n pageHeight,\n pivotPoint,\n rotate,\n opacity,\n });\n return;\n }\n if (!pdfFontValuePromise) {\n throw new Error('[@pdfme/schemas] Failed to prepare PDF font for text rendering.');\n }\n const pdfFontValue = await pdfFontValuePromise;\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n const lines = splitTextToSize({\n value,\n characterSpacing,\n fontSize,\n fontKitFont,\n boxWidthInPt: width,\n });\n const needsTextWidth = alignment !== 'left' || Boolean(schema.strikethrough || schema.underline);\n const needsTextHeight = Boolean(schema.strikethrough || schema.underline);\n\n // Text lines are rendered from the bottom upwards, we need to adjust the position down\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n const trimmed = line.replace('\\n', '');\n const textWidth = needsTextWidth\n ? widthOfTextAtSize(trimmed, fontKitFont, fontSize, characterSpacing)\n : 0;\n const textHeight = needsTextHeight ? heightOfFontAtSize(fontKitFont, fontSize) : 0;\n const rowYOffset = lineHeight * fontSize * rowIndex;\n\n // Adobe Acrobat Reader shows an error if `drawText` is called with an empty text\n if (line === '') {\n // return; // this also works\n line = '\\r\\n';\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n let yLine = pageHeight - mm2pt(schema.position.y) - yOffset - rowYOffset;\n\n // draw strikethrough\n if (schema.strikethrough && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine + textHeight / 3;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n // draw underline\n if (schema.underline && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine - textHeight / 12;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n if (rotate.angle !== 0) {\n // As we draw each line individually from different points, we must translate each lines position\n // relative to the UI rotation pivot point. see comments in convertForPdfLayoutProps() for more info.\n const rotatedPoint = rotatePoint({ x: xLine, y: yLine }, pivotPoint, rotate.angle);\n xLine = rotatedPoint.x;\n yLine = rotatedPoint.y;\n }\n\n let spacing = characterSpacing;\n if (alignment === 'justify' && line.slice(-1) !== '\\n') {\n // if alignment is `justify` but the end of line is not newline, then adjust the spacing\n const segmenter = getGraphemeSegmenter();\n const iterator = segmenter.segment(trimmed)[Symbol.iterator]();\n const len = Array.from(iterator).length;\n spacing += (width - textWidth) / len;\n }\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n page.drawText(trimmed, {\n x: xLine,\n y: yLine,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFontValue,\n opacity,\n });\n });\n};\n","import {\n Strikethrough,\n Underline,\n AlignLeft,\n AlignCenter,\n AlignRight,\n ArrowUpToLine,\n ArrowDownToLine,\n AlignJustify,\n} from 'lucide';\nimport { createSvgStr } from '../../utils.js';\n\nexport const TextStrikethroughIcon = createSvgStr(Strikethrough);\n\nexport const TextUnderlineIcon = createSvgStr(Underline);\n\nexport const TextAlignLeftIcon = createSvgStr(AlignLeft);\n\nexport const TextAlignCenterIcon = createSvgStr(AlignCenter);\n\nexport const TextAlignRightIcon = createSvgStr(AlignRight);\n\nexport const TextAlignJustifyIcon = createSvgStr(AlignJustify);\n\nexport const TextVerticalAlignTopIcon = createSvgStr(ArrowUpToLine);\n\n// svg icons are material icons from https://www.xicons.org\nexport const TextVerticalAlignMiddleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 24 24\"><path d=\"M8 19h3v4h2v-4h3l-4-4l-4 4zm8-14h-3V1h-2v4H8l4 4l4-4zM4 11v2h16v-2H4z\" fill=\"currentColor\"></path></svg>`;\n\nexport const TextVerticalAlignBottomIcon = createSvgStr(ArrowDownToLine);\n","// No imports needed from @pdfme/common\nimport {\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextAlignJustifyIcon,\n TextStrikethroughIcon,\n TextUnderlineIcon,\n TextVerticalAlignBottomIcon,\n TextVerticalAlignMiddleIcon,\n TextVerticalAlignTopIcon,\n} from './icons/index.js';\nimport {\n ALIGN_CENTER,\n ALIGN_RIGHT,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n ALIGN_JUSTIFY,\n} from './constants.js';\n\nexport enum Formatter {\n STRIKETHROUGH = 'strikethrough',\n UNDERLINE = 'underline',\n ALIGNMENT = 'alignment',\n VERTICAL_ALIGNMENT = 'verticalAlignment',\n}\n\ninterface GroupButtonBoolean {\n key: Formatter;\n icon: string;\n type: 'boolean';\n}\n\ninterface GroupButtonString {\n key: Formatter;\n icon: string;\n type: 'select';\n value: string;\n}\n\ntype GroupButton = GroupButtonBoolean | GroupButtonString;\n\nexport function getExtraFormatterSchema(i18n: (key: string) => string): {\n title: string;\n widget: string;\n buttons: GroupButton[];\n span: number;\n} {\n const buttons: GroupButton[] = [\n { key: Formatter.STRIKETHROUGH, icon: TextStrikethroughIcon, type: 'boolean' },\n { key: Formatter.UNDERLINE, icon: TextUnderlineIcon, type: 'boolean' },\n { key: Formatter.ALIGNMENT, icon: TextAlignLeftIcon, type: 'select', value: DEFAULT_ALIGNMENT },\n { key: Formatter.ALIGNMENT, icon: TextAlignCenterIcon, type: 'select', value: ALIGN_CENTER },\n { key: Formatter.ALIGNMENT, icon: TextAlignRightIcon, type: 'select', value: ALIGN_RIGHT },\n { key: Formatter.ALIGNMENT, icon: TextAlignJustifyIcon, type: 'select', value: ALIGN_JUSTIFY },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignTopIcon,\n type: 'select',\n value: DEFAULT_VERTICAL_ALIGNMENT,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignMiddleIcon,\n type: 'select',\n value: VERTICAL_ALIGN_MIDDLE,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignBottomIcon,\n type: 'select',\n value: VERTICAL_ALIGN_BOTTOM,\n },\n ];\n return {\n title: i18n('schemas.text.format'),\n widget: 'ButtonGroup',\n buttons,\n span: 24,\n };\n}\n","import {\n DEFAULT_FONT_NAME,\n PropPanel,\n PropPanelWidgetProps,\n PropPanelSchema,\n getFallbackFontName,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_COLOR,\n DYNAMIC_FIT_VERTICAL,\n DYNAMIC_FIT_HORIZONTAL,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n DEFAULT_TEXT_FORMAT,\n TEXT_FORMAT_INLINE_MARKDOWN,\n TEXT_FORMAT_PLAIN,\n 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';\n\nconst UseDynamicFontSize = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\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.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nconst UseInlineMarkdown = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n (activeSchema as { textFormat?: unknown })?.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n checkbox.onchange = (e: Event) => {\n const value = (e.target as HTMLInputElement).checked\n ? TEXT_FORMAT_INLINE_MARKDOWN\n : TEXT_FORMAT_PLAIN;\n changeSchemas([{ key: 'textFormat', value, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.inlineMarkdown') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nexport const propPanel: PropPanel<TextSchema> = {\n schema: ({ options, activeSchema, i18n }) => {\n const font = options.font || { [DEFAULT_FONT_NAME]: { data: '', fallback: true } };\n const fontNames = Object.keys(font);\n const fallbackFontName = getFallbackFontName(font);\n\n const enableDynamicFont = Boolean(\n (activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize,\n );\n const activeTextSchema = activeSchema as unknown as TextSchema;\n const hideTextFormat = activeTextSchema.type === 'text' && activeTextSchema.readOnly !== true;\n const enableInlineMarkdown =\n activeTextSchema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN && !hideTextFormat;\n const baseFontName =\n activeTextSchema.fontName && font[activeTextSchema.fontName]\n ? activeTextSchema.fontName\n : fallbackFontName;\n const optionalFontNames = [\n { label: baseFontName, value: '' },\n ...fontNames\n .filter((name) => name !== baseFontName)\n .map((name) => ({ label: name, value: name })),\n ];\n\n const textSchema: Record<string, PropPanelSchema> = {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n disabled: enableDynamicFont,\n props: { min: 0 },\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n props: { min: 0 },\n },\n formatter: getExtraFormatterSchema(i18n),\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n useDynamicFontSize: { type: 'boolean', widget: 'UseDynamicFontSize', bind: false, span: 16 },\n dynamicFontSize: {\n type: 'object',\n widget: 'card',\n column: 3,\n properties: {\n min: {\n title: i18n('schemas.text.min'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n max: {\n title: i18n('schemas.text.max'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n fit: {\n title: i18n('schemas.text.fit'),\n type: 'string',\n widget: 'select',\n hidden: !enableDynamicFont,\n props: {\n options: [\n { label: i18n('schemas.horizontal'), value: DYNAMIC_FIT_HORIZONTAL },\n { label: i18n('schemas.vertical'), value: DYNAMIC_FIT_VERTICAL },\n ],\n },\n },\n },\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n backgroundColor: {\n title: i18n('schemas.bgColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n useInlineMarkdown: {\n type: 'boolean',\n widget: 'UseInlineMarkdown',\n bind: false,\n hidden: hideTextFormat,\n span: enableInlineMarkdown ? 12 : 24,\n },\n fontVariantFallback: {\n title: i18n('schemas.text.variantFallback'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_FONT_VARIANT_FALLBACK,\n hidden: !enableInlineMarkdown,\n props: {\n options: [\n { label: i18n('schemas.text.synthetic'), value: FONT_VARIANT_FALLBACK_SYNTHETIC },\n { label: i18n('schemas.text.plain'), value: FONT_VARIANT_FALLBACK_PLAIN },\n { label: i18n('schemas.text.error'), value: FONT_VARIANT_FALLBACK_ERROR },\n ],\n },\n span: 12,\n },\n fontVariants: {\n title: i18n('schemas.text.markdownFonts'),\n type: 'object',\n widget: 'card',\n column: 2,\n hidden: !enableInlineMarkdown,\n properties: {\n bold: {\n title: i18n('schemas.text.boldFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n italic: {\n title: i18n('schemas.text.italicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n boldItalic: {\n title: i18n('schemas.text.boldItalicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n code: {\n title: i18n('schemas.text.codeFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n },\n },\n };\n\n return textSchema;\n },\n widgets: { UseDynamicFontSize, UseInlineMarkdown },\n defaultSchema: {\n name: '',\n type: 'text',\n content: 'Type Something...',\n position: { x: 0, y: 0 },\n width: 45,\n height: 10,\n // If the value of \"rotate\" is set to undefined or not set at all, rotation will be disabled in the UI.\n // Check this document: https://pdfme.com//docs/custom-schemas#learning-how-to-create-from-pdfmeschemas-code\n rotate: 0,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: DEFAULT_VERTICAL_ALIGNMENT,\n fontSize: DEFAULT_FONT_SIZE,\n textFormat: DEFAULT_TEXT_FORMAT,\n fontVariantFallback: DEFAULT_FONT_VARIANT_FALLBACK,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n dynamicFontSize: undefined,\n fontColor: DEFAULT_FONT_COLOR,\n fontName: undefined,\n backgroundColor: '',\n opacity: DEFAULT_OPACITY,\n strikethrough: false,\n underline: false,\n },\n};\n","import type * as CSS from 'csstype';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n UIRenderProps,\n getDefaultFont,\n getInternalLinkTarget,\n 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} from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n getBrowserVerticalFontAdjustments,\n isFirefox,\n} from './helper.js';\nimport { parseInlineMarkdown, stripInlineMarkdown } from './inlineMarkdown.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n resolveRichTextRuns,\n} from './richText.js';\nimport { isEditable } from '../utils.js';\n\nconst replaceUnsupportedChars = (text: string, fontKitFont: FontKitFont): string => {\n const charSupportCache: { [char: string]: boolean } = {};\n\n const isCharSupported = (char: string): boolean => {\n if (char in charSupportCache) {\n return charSupportCache[char];\n }\n const isSupported = fontKitFont.hasGlyphForCodePoint(char.codePointAt(0) || 0);\n charSupportCache[char] = isSupported;\n return isSupported;\n };\n\n const segments = text.split(/(\\r\\n|\\n|\\r)/);\n\n return segments\n .map((segment) => {\n if (/\\r\\n|\\n|\\r/.test(segment)) {\n return segment;\n }\n\n return Array.from(segment)\n .map((char) => {\n if (/\\s/.test(char) || char.charCodeAt(0) < 32) {\n return char;\n }\n\n return isCharSupported(char) ? char : '〿';\n })\n .join('');\n })\n .join('');\n};\n\nexport const uiRender = async (arg: UIRenderProps<TextSchema>) => {\n const { value, schema, mode, onChange, stopEditing, tabIndex, placeholder, options, _cache } =\n arg;\n const usePlaceholder = isEditable(mode, schema) && 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 enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && schema.dynamicFontSize\n ? await calculateDynamicRichTextFontSize({\n value: usePlaceholder ? (placeholder as string) : value,\n schema,\n font,\n _cache,\n })\n : undefined;\n const textBlock = buildStyledTextContainer(\n arg,\n fontKitFont,\n usePlaceholder ? placeholder : displayValue,\n dynamicRichTextFontSize,\n );\n\n const processedText = replaceUnsupportedChars(value, fontKitFont);\n\n if (!isEditable(mode, schema)) {\n if (enableInlineMarkdown) {\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\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 (schema.dynamicFontSize) {\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\n textBlock.innerHTML = '';\n runs.forEach((run) => {\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\n ? `'${run.fontName}', monospace`\n : 'monospace';\n }\n }\n textBlock.appendChild(span);\n });\n};\n\nexport const buildStyledTextContainer = (\n arg: UIRenderProps<TextSchema>,\n fontKitFont: FontKitFont,\n value: string,\n resolvedDynamicFontSize?: number,\n) => {\n const { schema, rootElement, mode } = arg;\n\n let dynamicFontSize: undefined | number = resolvedDynamicFontSize;\n\n if (dynamicFontSize === undefined && schema.dynamicFontSize && value) {\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value,\n startingFontSize: dynamicFontSize,\n });\n }\n\n // Depending on vertical alignment, we need to move the top or bottom of the font to keep\n // it within it's defined box and align it with the generated pdf.\n const { topAdj, bottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n\n const topAdjustment = topAdj.toString();\n const bottomAdjustment = bottomAdj.toString();\n\n const container = document.createElement('div');\n\n const containerStyle: CSS.Properties = {\n padding: 0,\n resize: 'none',\n backgroundColor: getBackgroundColor(value, schema),\n border: 'none',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: mapVerticalAlignToFlex(schema.verticalAlignment),\n width: '100%',\n height: '100%',\n cursor: isEditable(mode, schema) ? 'text' : 'default',\n };\n Object.assign(container.style, containerStyle);\n rootElement.innerHTML = '';\n rootElement.appendChild(container);\n\n // text decoration\n const textDecorations = [];\n if (schema.strikethrough) textDecorations.push('line-through');\n if (schema.underline) textDecorations.push('underline');\n\n const textBlockStyle: CSS.Properties = {\n // Font formatting styles\n fontFamily: schema.fontName ? `'${schema.fontName}'` : 'inherit',\n color: schema.fontColor ? schema.fontColor : DEFAULT_FONT_COLOR,\n fontSize: `${dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE}pt`,\n letterSpacing: `${schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING}pt`,\n lineHeight: `${schema.lineHeight ?? DEFAULT_LINE_HEIGHT}em`,\n textAlign: schema.alignment ?? DEFAULT_ALIGNMENT,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n // Block layout styles\n resize: 'none',\n border: 'none',\n outline: 'none',\n marginBottom: `${bottomAdjustment}px`,\n paddingTop: `${topAdjustment}px`,\n backgroundColor: 'transparent',\n textDecoration: textDecorations.join(' '),\n };\n\n const textBlock = document.createElement('div');\n textBlock.id = 'text-' + String(schema.id);\n Object.assign(textBlock.style, textBlockStyle);\n\n container.appendChild(textBlock);\n\n return textBlock;\n};\n\n/**\n * Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.\n * This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.\n */\nexport const makeElementPlainTextContentEditable = (element: HTMLElement) => {\n if (!isFirefox()) {\n element.contentEditable = 'plaintext-only';\n return;\n }\n\n element.contentEditable = 'true';\n element.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n document.execCommand('insertLineBreak', false, undefined);\n }\n });\n\n element.addEventListener('paste', (e: ClipboardEvent) => {\n e.preventDefault();\n const paste = e.clipboardData?.getData('text');\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n selection.deleteFromDocument();\n selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));\n selection.collapseToEnd();\n });\n};\n\nexport const mapVerticalAlignToFlex = (verticalAlignmentValue: string | undefined) => {\n switch (verticalAlignmentValue) {\n case VERTICAL_ALIGN_TOP:\n return 'flex-start';\n case VERTICAL_ALIGN_MIDDLE:\n return 'center';\n case VERTICAL_ALIGN_BOTTOM:\n return 'flex-end';\n }\n return 'flex-start';\n};\n\nconst getBackgroundColor = (value: string, schema: { backgroundColor?: string }) => {\n if (!value || !schema.backgroundColor) return 'transparent';\n return schema.backgroundColor;\n};\n","import type { Plugin } from '@pdfme/common';\nimport { pdfRender } from './pdfRender.js';\nimport { propPanel } from './propPanel.js';\nimport { uiRender } from './uiRender.js';\nimport type { TextSchema } from './types.js';\nimport { TextCursorInput } from 'lucide';\nimport { createSvgStr } from '../utils.js';\n\nconst textSchema: Plugin<TextSchema> = {\n pdf: pdfRender,\n ui: uiRender,\n propPanel,\n icon: createSvgStr(TextCursorInput),\n};\n\nexport default textSchema;\n","import text from './text/index.js';\n\n// The default built-in plugin surface is intentionally limited to text.\n// Generator/UI consumers that need image, barcode, table, or other schema types\n// must import and pass those plugins explicitly from `@pdfme/schemas`.\nconst builtInPlugins = { Text: text };\n\nexport { builtInPlugins };\n"],"mappings":"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"}
|