@pdfme/schemas 6.1.13-dev.35 → 6.1.13-dev.37
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-D75m2smy.js → builtins-C-2wyB_3.js} +2 -2
- package/dist/{builtins-D75m2smy.js.map → builtins-C-2wyB_3.js.map} +1 -1
- package/dist/builtins.js +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/{utils-CtRFDAnq.js → utils-CPYF2FY_.js} +17 -14
- package/dist/utils-CPYF2FY_.js.map +1 -0
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +2 -2
- package/package.json +1 -1
- package/dist/utils-CtRFDAnq.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { $ as TEXT_FORMAT_INLINE_MARKDOWN, B as DEFAULT_DYNAMIC_FIT, C as getLineAlignment, D as getBoxContentArea, E as createBoxDimension, G as DYNAMIC_FIT_HORIZONTAL, H as DEFAULT_FONT_VARIANT_FALLBACK, I as ALIGN_RIGHT, J as FONT_VARIANT_FALLBACK_PLAIN, K as DYNAMIC_FIT_VERTICAL, L as CODE_BACKGROUND_COLOR, M as hasBoxDimension, N as ALIGN_CENTER, O as getBoxDimensionPropPanelSchema, P as ALIGN_JUSTIFY, Q as SYNTHETIC_BOLD_OFFSET_RATIO, R as CODE_HORIZONTAL_PADDING, S as wrapTextToSize, T as splitGraphemes, U as DEFAULT_TEXT_FORMAT, V as DEFAULT_FONT_COLOR, W as DEFAULT_TEXT_OVERFLOW, X as PLACEHOLDER_FONT_COLOR, Y as FONT_VARIANT_FALLBACK_SYNTHETIC, Z as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, b as splitTextToSize, d as calculateDynamicFontSize, et as TEXT_FORMAT_PLAIN, f as fetchRemoteFontData, g as getFontKitFont, h as getFontDescentInPt, it as VERTICAL_ALIGN_MIDDLE, k as getBoxInsets, m as getBrowserVerticalFontAdjustments, nt as TEXT_OVERFLOW_VISIBLE, q as FONT_VARIANT_FALLBACK_ERROR, rt as VERTICAL_ALIGN_BOTTOM, tt as TEXT_OVERFLOW_EXPAND, u as getTextLineRange, v as heightOfFontAtSize, x as widthOfTextAtSize, y as isFirefox, z as DEFAULT_ALIGNMENT } from "./splitRange-B6311Noc.js";
|
|
2
2
|
import { d as layoutRichTextLines, g as stripInlineMarkdown, h as parseInlineMarkdown, l as calculateDynamicRichTextFontSize, p as resolveRichTextRuns, s as plainTextLinesToValue, t as applyTextLineRange, u as isInlineMarkdownTextSchema } from "./measure-BarlRI1L.js";
|
|
3
3
|
import { c as HEX_COLOR_PATTERN } from "./dynamicTemplate-DkTVIMNr.js";
|
|
4
|
-
import { c as isEditable, i as createSvgStr, n as convertForPdfLayoutProps, o as hex2PrintingColor
|
|
4
|
+
import { c as isEditable, d as rotatePoint, i as createSvgStr, n as convertForPdfLayoutProps, o as hex2PrintingColor } from "./utils-CPYF2FY_.js";
|
|
5
5
|
import { DEFAULT_FONT_NAME, getDefaultFont, getFallbackFontName, getInternalLinkTarget, isBlankPdf, mm2pt, normalizeLinkHref, normalizeSafeLinkUri, registerInternalLinkAnnotation } from "@pdfme/common";
|
|
6
6
|
import { PDFName, PDFString } from "@pdfme/pdf-lib";
|
|
7
7
|
import { AlignCenter, AlignJustify, AlignLeft, AlignRight, ArrowDownToLine, ArrowUpToLine, Strikethrough, TextCursorInput, Underline } from "lucide";
|
|
@@ -1386,4 +1386,4 @@ var builtInPlugins = { Text: textSchema };
|
|
|
1386
1386
|
//#endregion
|
|
1387
1387
|
export { mapVerticalAlignToFlex as a, Formatter as c, embedAndGetFont as d, makeElementPlainTextContentEditable as i, getExtraFormatterSchema as l, textSchema as n, uiRender as o, buildStyledTextContainer as r, propPanel as s, builtInPlugins as t, pdfRender as u };
|
|
1388
1388
|
|
|
1389
|
-
//# sourceMappingURL=builtins-
|
|
1389
|
+
//# sourceMappingURL=builtins-C-2wyB_3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtins-D75m2smy.js","names":[],"sources":["../src/text/linkAnnotation.ts","../src/text/richTextPdfRender.ts","../src/text/overflow.ts","../src/pdfFont.ts","../src/text/pdfRender.ts","../src/text/icons/index.ts","../src/text/extraFormatter.ts","../src/text/propPanel.ts","../src/text/uiRender.ts","../src/text/index.ts","../src/builtins.ts"],"sourcesContent":["import { normalizeSafeLinkUri } from '@pdfme/common';\nimport type { PDFDocument, PDFPage } from '@pdfme/pdf-lib';\nimport { PDFName, PDFString } from '@pdfme/pdf-lib';\n\nexport type LinkAnnotationRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport const addUriLinkAnnotation = (arg: {\n pdfDoc: PDFDocument;\n page: PDFPage;\n uri: string;\n rect: LinkAnnotationRect;\n borderWidth?: number;\n}) => {\n const { pdfDoc, page, uri, rect, borderWidth = 0 } = arg;\n const safeUri = normalizeSafeLinkUri(uri);\n if (!safeUri || rect.width <= 0 || rect.height <= 0) return;\n\n const annotationRef = pdfDoc.context.register(\n pdfDoc.context.obj({\n Type: PDFName.of('Annot'),\n Subtype: PDFName.of('Link'),\n Rect: [rect.x, rect.y, rect.x + rect.width, rect.y + rect.height],\n Border: [0, 0, borderWidth],\n A: {\n Type: PDFName.of('Action'),\n S: PDFName.of('URI'),\n URI: PDFString.of(safeUri),\n },\n }),\n );\n\n page.node.addAnnot(annotationRef);\n};\n","import type { PDFFont, Rotation } from '@pdfme/pdf-lib';\nimport type { ColorType, Font, PDFRenderProps } from '@pdfme/common';\nimport { getInternalLinkTarget, registerInternalLinkAnnotation } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n CODE_BACKGROUND_COLOR,\n CODE_HORIZONTAL_PADDING,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_TOP,\n} from './constants.js';\nimport { getFontDescentInPt, heightOfFontAtSize, widthOfTextAtSize } from './helper.js';\nimport { addUriLinkAnnotation, type LinkAnnotationRect } from './linkAnnotation.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange } from './measure.js';\nimport { layoutRichTextLines, resolveRichTextRuns, type RichTextLineRun } from './richText.js';\nimport { getLineAlignment } from './wrap.js';\nimport type { TextSchema } from './types.js';\nimport { hex2PrintingColor, rotatePoint } from '../utils.js';\nimport { getTextLineRange } from '../splitRange.js';\n\ntype TextColor = ReturnType<typeof hex2PrintingColor>;\n\nconst getSyntheticBoldWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticBold ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS : 0;\n\nconst getSyntheticItalicWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n\nconst getRunWidth = (run: RichTextLineRun, fontSize: number, characterSpacing: number) =>\n widthOfTextAtSize(run.text, run.fontKitFont, fontSize, characterSpacing) +\n getSyntheticBoldWidth(run, fontSize) +\n getSyntheticItalicWidth(run, fontSize) +\n (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0);\n\nconst getPdfFontFromObj = (run: RichTextLineRun, pdfFontObj: Record<string, PDFFont>) => {\n const pdfFont = pdfFontObj[run.fontName];\n if (!pdfFont) {\n throw new Error(`[@pdfme/schemas] Missing embedded font \"${run.fontName}\".`);\n }\n return pdfFont;\n};\n\nconst embedFontsForRuns = async (\n runs: RichTextLineRun[],\n embedPdfFont: (fontName: string) => Promise<PDFFont>,\n) => {\n const fontNames = Array.from(new Set(runs.map((run) => run.fontName)));\n const pdfFonts = await Promise.all(\n fontNames.map(async (fontName) => [fontName, await embedPdfFont(fontName)] as const),\n );\n return Object.fromEntries(pdfFonts);\n};\n\nconst drawDecorationLine = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n color: TextColor;\n opacity: number | undefined;\n}) => {\n const { page, x, y, width, rotate, pivotPoint, fontSize, color, opacity } = arg;\n if (width <= 0) return;\n\n page.drawLine({\n start: rotatePoint({ x, y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: x + width, y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color,\n opacity,\n });\n};\n\nconst getAxisAlignedRect = (arg: {\n x: number;\n y: number;\n width: number;\n height: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n}): LinkAnnotationRect => {\n const { x, y, width, height, rotate, pivotPoint } = arg;\n if (rotate.angle === 0) return { x, y, width, height };\n\n const points = [\n { x, y },\n { x: x + width, y },\n { x: x + width, y: y + height },\n { x, y: y + height },\n ].map((point) => rotatePoint(point, pivotPoint, rotate.angle));\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n\n return {\n x: minX,\n y: minY,\n width: Math.max(...xs) - minX,\n height: Math.max(...ys) - minY,\n };\n};\n\nconst getLinkAnnotationRect = (arg: {\n run: RichTextLineRun;\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n}): LinkAnnotationRect => {\n const { run, x, y, width, rotate, pivotPoint, fontSize } = arg;\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n const descent = getFontDescentInPt(run.fontKitFont, fontSize);\n const rectY = y + descent;\n const rectHeight = textHeight - descent;\n\n return getAxisAlignedRect({\n x,\n y: rectY,\n width,\n height: rectHeight,\n rotate,\n pivotPoint,\n });\n};\n\nconst drawRun = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n run: RichTextLineRun;\n pdfFont: PDFFont;\n x: number;\n y: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n lineHeight: number;\n color: TextColor;\n opacity: number | undefined;\n colorType: ColorType;\n characterSpacing: number;\n strikethrough: boolean;\n underline: boolean;\n}) => {\n const {\n page,\n pdfLib,\n run,\n pdfFont,\n x,\n y,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing,\n strikethrough,\n underline,\n } = arg;\n const runWidth = getRunWidth(run, fontSize, characterSpacing);\n const codePadding = run.code ? CODE_HORIZONTAL_PADDING : 0;\n const textX = x + codePadding;\n const textWidth = runWidth - codePadding * 2;\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n\n if (run.code) {\n const bgX = x;\n const bgY = y - textHeight * 0.2;\n const bgPoint =\n rotate.angle === 0\n ? { x: bgX, y: bgY }\n : rotatePoint({ x: bgX, y: bgY }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: bgPoint.x,\n y: bgPoint.y,\n width: runWidth,\n height: textHeight * 1.2,\n rotate,\n color: hex2PrintingColor(CODE_BACKGROUND_COLOR, colorType),\n opacity,\n });\n }\n\n if (strikethrough && runWidth > 0) {\n drawDecorationLine({\n page,\n x: textX,\n y: y + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n if (underline && runWidth > 0) {\n drawDecorationLine({\n page,\n x: textX,\n y: y - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n const drawAt = (drawX: number) => {\n const point =\n rotate.angle === 0 ? { x: drawX, y } : rotatePoint({ x: drawX, y }, pivotPoint, rotate.angle);\n page.drawText(run.text, {\n x: point.x,\n y: point.y,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFont,\n opacity,\n ...(run.syntheticItalic ? { ySkew: pdfLib.degrees(SYNTHETIC_ITALIC_SKEW_DEGREES) } : {}),\n });\n };\n\n drawAt(textX);\n if (run.syntheticBold) {\n const offset = fontSize * SYNTHETIC_BOLD_OFFSET_RATIO;\n for (let i = 1; i <= SYNTHETIC_BOLD_PDF_EXTRA_DRAWS; i++) {\n drawAt(textX + offset * i);\n }\n }\n};\n\nexport const renderInlineMarkdownText = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n embedPdfFont: (fontName: string) => Promise<PDFFont>;\n fontKitFont: FontKitFont;\n pdfDoc: PDFRenderProps<TextSchema>['pdfDoc'];\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n _cache: Map<string | number, unknown>;\n colorType: ColorType;\n fontSize: number;\n color: TextColor;\n alignment: string;\n verticalAlignment: string;\n lineHeight: number;\n characterSpacing: number;\n x: number;\n y: number;\n width: number;\n height: number;\n pivotPoint: { x: number; y: number };\n rotate: Rotation;\n opacity: number | undefined;\n}) => {\n const {\n value,\n schema,\n font,\n embedPdfFont,\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n y,\n width,\n height,\n pivotPoint,\n rotate,\n opacity,\n } = arg;\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const allLines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize,\n characterSpacing,\n boxWidthInPt: width,\n });\n const lineRange = getTextLineRange(schema);\n const lines = applyTextLineRange(allLines, lineRange);\n const 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 const alignmentMetrics = getLineAlignment(\n {\n text: line.runs.map((run) => run.text).join(''),\n width: line.width,\n hardBreak: line.hardBreak,\n },\n width,\n alignment,\n );\n const textWidth = alignmentMetrics.usedWidth;\n const spacing = characterSpacing + alignmentMetrics.extraLetterSpacing;\n const xLine = x + alignmentMetrics.x;\n\n const yLine = y + height - yOffset - lineHeight * fontSize * rowIndex;\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n if (schema.strikethrough || schema.underline) {\n const textHeight = Math.max(\n ...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)),\n );\n if (schema.strikethrough) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n if (schema.underline) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n }\n\n line.runs.reduce((currentX, run, runIndex) => {\n const runWidth = getRunWidth(run, fontSize, spacing);\n const pdfFont = getPdfFontFromObj(run, pdfFontObj);\n drawRun({\n page,\n pdfLib,\n run,\n pdfFont,\n x: currentX,\n y: yLine,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing: spacing,\n strikethrough: Boolean(run.strikethrough),\n underline: Boolean(run.href) && !schema.underline,\n });\n if (run.href) {\n const rect = getLinkAnnotationRect({\n run,\n x: currentX,\n y: yLine,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n });\n const targetName = getInternalLinkTarget(run.href);\n if (targetName) {\n registerInternalLinkAnnotation({ _cache, page, targetName, rect });\n } else {\n addUriLinkAnnotation({ pdfDoc, page, uri: run.href, rect });\n }\n }\n\n return currentX + runWidth + (runIndex === line.runs.length - 1 ? 0 : spacing);\n }, xLine);\n });\n};\n","import { isBlankPdf, type BasePdf } from '@pdfme/common';\nimport { TEXT_OVERFLOW_EXPAND } from './constants.js';\nimport type { TextSchema } from './types.js';\n\nconst TEXT_OVERFLOW_EXPAND_SCHEMA_TYPES = new Set(['text', 'multiVariableText']);\n\ntype TextOverflowSchema = Pick<TextSchema, 'overflow'> & Partial<Pick<TextSchema, 'type'>>;\n\nconst isTextOverflowExpandSchema = (schema: Partial<Pick<TextSchema, 'type'>>) =>\n schema.type === undefined || TEXT_OVERFLOW_EXPAND_SCHEMA_TYPES.has(schema.type);\n\nexport const canUseTextOverflowExpand = (\n schema: Partial<Pick<TextSchema, 'type'>>,\n basePdf?: BasePdf,\n) => !isTextOverflowExpandSchema(schema) || basePdf === undefined || isBlankPdf(basePdf);\n\nexport const isTextOverflowExpand = (schema: TextOverflowSchema, basePdf?: BasePdf) =>\n canUseTextOverflowExpand(schema, basePdf) && schema.overflow === TEXT_OVERFLOW_EXPAND;\n\nexport const shouldUseDynamicFontSize = (\n schema: Pick<TextSchema, 'dynamicFontSize' | 'overflow'> & Partial<Pick<TextSchema, 'type'>>,\n basePdf?: BasePdf,\n) => Boolean(schema.dynamicFontSize) && !isTextOverflowExpand(schema, basePdf);\n","import { PDFFont, PDFDocument } from '@pdfme/pdf-lib';\nimport { Font } from '@pdfme/common';\nimport { fetchRemoteFontData } from './text/helper.js';\n\ntype PdfFontCache = Record<string, Promise<PDFFont>>;\n\nconst PDF_FONT_CACHE_KEY = 'schemas-pdf-font-cache';\n\nconst getPdfFontCache = (_cache: Map<string | number, unknown>): PdfFontCache => {\n let pdfFontCache = _cache.get(PDF_FONT_CACHE_KEY) as PdfFontCache | undefined;\n if (!pdfFontCache) {\n pdfFontCache = {};\n _cache.set(PDF_FONT_CACHE_KEY, pdfFontCache);\n }\n\n return pdfFontCache;\n};\n\nexport const 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","import type { Font as FontKitFont } from 'fontkit';\nimport type { TextSchema } from './types.js';\nimport {\n PDFRenderProps,\n ColorType,\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 widthOfTextAtSize,\n wrapTextToSize,\n} from './helper.js';\nimport { getLineAlignment } from './wrap.js';\nimport { stripInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange } from './measure.js';\nimport { calculateDynamicRichTextFontSize, isInlineMarkdownTextSchema } from './richText.js';\nimport { renderInlineMarkdownText } from './richTextPdfRender.js';\nimport { shouldUseDynamicFontSize } from './overflow.js';\nimport { convertForPdfLayoutProps, rotatePoint, hex2PrintingColor } from '../utils.js';\nimport { getTextLineRange } from '../splitRange.js';\nimport { getBoxContentArea, getBoxInsets, hasBoxDimension } from '../box.js';\nimport { embedAndGetFont } from '../pdfFont.js';\n\nconst getFontProp = ({\n value,\n fontKitFont,\n schema,\n basePdf,\n colorType,\n fontSize: resolvedFontSize,\n}: {\n value: string;\n fontKitFont: FontKitFont;\n colorType?: ColorType;\n schema: TextSchema;\n basePdf: PDFRenderProps<TextSchema>['basePdf'];\n fontSize?: number;\n}) => {\n const fontSize =\n resolvedFontSize ??\n (shouldUseDynamicFontSize(schema, basePdf)\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE));\n const color = hex2PrintingColor(schema.fontColor || DEFAULT_FONT_COLOR, colorType);\n\n return {\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n verticalAlignment: schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n lineHeight: schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n color,\n };\n};\n\nexport const pdfRender = async (arg: PDFRenderProps<TextSchema>) => {\n const { value, pdfDoc, pdfLib, page, options, schema, basePdf, _cache } = arg;\n const { font = getDefaultFont(), colorType } = options;\n\n const pageHeight = page.getHeight();\n const {\n width,\n height,\n rotate,\n position: { x, y },\n opacity,\n } = convertForPdfLayoutProps({ schema, pageHeight, applyRotateTranslate: false });\n\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(schema.position.y) - height / 2 };\n\n if (!value) return;\n drawTextBoxDecoration({ page, schema, colorType, x, y, width, height, rotate, pivotPoint });\n\n const fontName = schema.fontName ? schema.fontName : getFallbackFontName(font);\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const contentArea = getBoxContentArea(schema);\n const contentX = x + mm2pt(contentArea.leftInset);\n const contentY = y + mm2pt(contentArea.bottomInset);\n const contentWidth = mm2pt(contentArea.width);\n const contentHeight = mm2pt(contentArea.height);\n\n const pdfFontValuePromise = enableInlineMarkdown\n ? undefined\n : embedAndGetFont({\n pdfDoc,\n font,\n fontName,\n _cache,\n });\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && shouldUseDynamicFontSize(schema, basePdf)\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : undefined;\n const fontProp = getFontProp({\n value: displayValue,\n fontKitFont,\n schema,\n basePdf,\n colorType,\n fontSize: dynamicRichTextFontSize,\n });\n\n const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = fontProp;\n\n if (enableInlineMarkdown) {\n await renderInlineMarkdownText({\n value,\n schema,\n font,\n embedPdfFont: (fontName) => embedAndGetFont({ pdfDoc, font, fontName, _cache }),\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x: contentX,\n y: contentY,\n width: contentWidth,\n height: contentHeight,\n pivotPoint,\n rotate,\n opacity,\n });\n return;\n }\n if (!pdfFontValuePromise) {\n throw new Error('[@pdfme/schemas] Failed to prepare PDF font for text rendering.');\n }\n const pdfFontValue = await pdfFontValuePromise;\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n const lines = applyTextLineRange(\n wrapTextToSize({\n value,\n characterSpacing,\n fontSize,\n fontKitFont,\n boxWidthInPt: contentWidth,\n }),\n getTextLineRange(schema),\n );\n const needsTextWidth = alignment !== 'left' || Boolean(schema.strikethrough || schema.underline);\n const needsTextHeight = Boolean(schema.strikethrough || schema.underline);\n\n // Text lines are rendered from the bottom upwards, we need to adjust the position down\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = contentHeight - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (contentHeight - otherLinesHeight - firstLineTextHeight + descent) / 2 +\n firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n const trimmed = line.text;\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 const alignmentMetrics = getLineAlignment(\n { text: trimmed, width: textWidth, hardBreak: line.hardBreak },\n contentWidth,\n alignment,\n );\n\n // Adobe Acrobat Reader shows an error if `drawText` is called with an empty text\n const drawText = trimmed === '' ? '\\r\\n' : trimmed;\n\n let xLine = contentX + alignmentMetrics.x;\n let yLine = contentY + contentHeight - yOffset - rowYOffset;\n\n // draw strikethrough\n if (schema.strikethrough && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine + textHeight / 3;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n // draw underline\n if (schema.underline && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine - textHeight / 12;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n if (rotate.angle !== 0) {\n // As we draw each line individually from different points, we must translate each lines position\n // relative to the UI rotation pivot point. see comments in convertForPdfLayoutProps() for more info.\n const rotatedPoint = rotatePoint({ x: xLine, y: yLine }, pivotPoint, rotate.angle);\n xLine = rotatedPoint.x;\n yLine = rotatedPoint.y;\n }\n\n page.pushOperators(\n pdfLib.setCharacterSpacing(characterSpacing + alignmentMetrics.extraLetterSpacing),\n );\n\n page.drawText(drawText, {\n x: xLine,\n y: yLine,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFontValue,\n opacity,\n });\n });\n};\n\nconst drawTextBoxDecoration = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n schema: TextSchema;\n colorType?: ColorType;\n x: number;\n y: number;\n width: number;\n height: number;\n rotate: ReturnType<typeof convertForPdfLayoutProps>['rotate'];\n pivotPoint: { x: number; y: number };\n}) => {\n const { page, schema, colorType, x, y, width, height, rotate, pivotPoint } = arg;\n const { borderWidth } = getBoxInsets(schema);\n const opacity = schema.opacity ?? 1;\n\n const drawRectangle = (rect: {\n x: number;\n y: number;\n width: number;\n height: number;\n color: NonNullable<ReturnType<typeof hex2PrintingColor>>;\n }) => {\n if (rect.width <= 0 || rect.height <= 0) return;\n const point =\n rotate.angle === 0\n ? { x: rect.x, y: rect.y }\n : rotatePoint({ x: rect.x, y: rect.y }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: point.x,\n y: point.y,\n width: rect.width,\n height: rect.height,\n rotate,\n color: rect.color,\n opacity,\n });\n };\n\n if (schema.backgroundColor) {\n const color = hex2PrintingColor(schema.backgroundColor, colorType);\n if (color) drawRectangle({ x, y, width, height, color });\n }\n\n if (!schema.borderColor || !hasBoxDimension(schema.borderWidth)) return;\n\n const color = hex2PrintingColor(schema.borderColor, colorType);\n if (!color) return;\n\n const top = mm2pt(borderWidth.top);\n const right = mm2pt(borderWidth.right);\n const bottom = mm2pt(borderWidth.bottom);\n const left = mm2pt(borderWidth.left);\n\n drawRectangle({ x, y: y + height - top, width, height: top, color });\n drawRectangle({ x: x + width - right, y, width: right, height, color });\n drawRectangle({ x, y, width, height: bottom, color });\n drawRectangle({ x, y, width: left, height, color });\n};\n","import {\n Strikethrough,\n Underline,\n AlignLeft,\n AlignCenter,\n AlignRight,\n ArrowUpToLine,\n ArrowDownToLine,\n AlignJustify,\n} from 'lucide';\nimport { createSvgStr } from '../../utils.js';\n\nexport const TextStrikethroughIcon = createSvgStr(Strikethrough);\n\nexport const TextUnderlineIcon = createSvgStr(Underline);\n\nexport const TextAlignLeftIcon = createSvgStr(AlignLeft);\n\nexport const TextAlignCenterIcon = createSvgStr(AlignCenter);\n\nexport const TextAlignRightIcon = createSvgStr(AlignRight);\n\nexport const TextAlignJustifyIcon = createSvgStr(AlignJustify);\n\nexport const TextVerticalAlignTopIcon = createSvgStr(ArrowUpToLine);\n\n// svg icons are material icons from https://www.xicons.org\nexport const TextVerticalAlignMiddleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 24 24\"><path d=\"M8 19h3v4h2v-4h3l-4-4l-4 4zm8-14h-3V1h-2v4H8l4 4l4-4zM4 11v2h16v-2H4z\" fill=\"currentColor\"></path></svg>`;\n\nexport const TextVerticalAlignBottomIcon = createSvgStr(ArrowDownToLine);\n","// No imports needed from @pdfme/common\nimport {\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextAlignJustifyIcon,\n TextStrikethroughIcon,\n TextUnderlineIcon,\n TextVerticalAlignBottomIcon,\n TextVerticalAlignMiddleIcon,\n TextVerticalAlignTopIcon,\n} from './icons/index.js';\nimport {\n ALIGN_CENTER,\n ALIGN_RIGHT,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n ALIGN_JUSTIFY,\n} from './constants.js';\n\nexport enum Formatter {\n STRIKETHROUGH = 'strikethrough',\n UNDERLINE = 'underline',\n ALIGNMENT = 'alignment',\n VERTICAL_ALIGNMENT = 'verticalAlignment',\n}\n\ninterface GroupButtonBoolean {\n key: Formatter;\n icon: string;\n type: 'boolean';\n}\n\ninterface GroupButtonString {\n key: Formatter;\n icon: string;\n type: 'select';\n value: string;\n}\n\ntype GroupButton = GroupButtonBoolean | GroupButtonString;\n\nexport function getExtraFormatterSchema(i18n: (key: string) => string): {\n title: string;\n widget: string;\n buttons: GroupButton[];\n span: number;\n} {\n const buttons: GroupButton[] = [\n { key: Formatter.STRIKETHROUGH, icon: TextStrikethroughIcon, type: 'boolean' },\n { key: Formatter.UNDERLINE, icon: TextUnderlineIcon, type: 'boolean' },\n { key: Formatter.ALIGNMENT, icon: TextAlignLeftIcon, type: 'select', value: DEFAULT_ALIGNMENT },\n { key: Formatter.ALIGNMENT, icon: TextAlignCenterIcon, type: 'select', value: ALIGN_CENTER },\n { key: Formatter.ALIGNMENT, icon: TextAlignRightIcon, type: 'select', value: ALIGN_RIGHT },\n { key: Formatter.ALIGNMENT, icon: TextAlignJustifyIcon, type: 'select', value: ALIGN_JUSTIFY },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignTopIcon,\n type: 'select',\n value: DEFAULT_VERTICAL_ALIGNMENT,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignMiddleIcon,\n type: 'select',\n value: VERTICAL_ALIGN_MIDDLE,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignBottomIcon,\n type: 'select',\n value: VERTICAL_ALIGN_BOTTOM,\n },\n ];\n return {\n title: i18n('schemas.text.format'),\n widget: 'ButtonGroup',\n buttons,\n span: 24,\n };\n}\n","import {\n DEFAULT_FONT_NAME,\n PropPanel,\n PropPanelWidgetProps,\n PropPanelSchema,\n getFallbackFontName,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_COLOR,\n DYNAMIC_FIT_VERTICAL,\n DYNAMIC_FIT_HORIZONTAL,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n DEFAULT_TEXT_FORMAT,\n TEXT_FORMAT_INLINE_MARKDOWN,\n TEXT_FORMAT_PLAIN,\n TEXT_OVERFLOW_EXPAND,\n TEXT_OVERFLOW_VISIBLE,\n DEFAULT_TEXT_OVERFLOW,\n DEFAULT_FONT_VARIANT_FALLBACK,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n FONT_VARIANT_FALLBACK_SYNTHETIC,\n} from './constants.js';\nimport { DEFAULT_OPACITY, HEX_COLOR_PATTERN } from '../constants.js';\nimport { getExtraFormatterSchema } from './extraFormatter.js';\nimport { canUseTextOverflowExpand, isTextOverflowExpand } from './overflow.js';\nimport { createBoxDimension, getBoxDimensionPropPanelSchema } from '../box.js';\n\nconst UseDynamicFontSize = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n, basePdf } = props;\n const isExpand = isTextOverflowExpand(activeSchema as unknown as TextSchema, basePdf);\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n !isExpand && Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n checkbox.disabled = isExpand;\n checkbox.onchange = (e: Event) => {\n const val = (e.target as HTMLInputElement).checked\n ? {\n min: DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n max: DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n fit: DEFAULT_DYNAMIC_FIT,\n }\n : undefined;\n changeSchemas([{ key: 'dynamicFontSize', value: val, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.dynamicFontSize') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.style.opacity = isExpand ? '0.5' : '1';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nconst UseInlineMarkdown = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n (activeSchema as { textFormat?: unknown })?.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n checkbox.onchange = (e: Event) => {\n const value = (e.target as HTMLInputElement).checked\n ? TEXT_FORMAT_INLINE_MARKDOWN\n : TEXT_FORMAT_PLAIN;\n changeSchemas([{ key: 'textFormat', value, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.inlineMarkdown') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nexport const propPanel: PropPanel<TextSchema> = {\n schema: ({ options, activeSchema, i18n, basePdf }) => {\n const font = options.font || { [DEFAULT_FONT_NAME]: { data: '', fallback: true } };\n const fontNames = Object.keys(font);\n const fallbackFontName = getFallbackFontName(font);\n\n const activeTextSchema = activeSchema as unknown as TextSchema;\n const canExpandOverflow = canUseTextOverflowExpand(activeTextSchema, basePdf);\n const isExpand = isTextOverflowExpand(activeTextSchema, basePdf);\n const enableDynamicFont =\n !isExpand && Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n const hideTextFormat = activeTextSchema.type === 'text' && activeTextSchema.readOnly !== true;\n const enableInlineMarkdown =\n activeTextSchema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN && !hideTextFormat;\n const baseFontName =\n activeTextSchema.fontName && font[activeTextSchema.fontName]\n ? activeTextSchema.fontName\n : fallbackFontName;\n const optionalFontNames = [\n { label: baseFontName, value: '' },\n ...fontNames\n .filter((name) => name !== baseFontName)\n .map((name) => ({ label: name, value: name })),\n ];\n const overflowOptions = [\n { label: i18n('schemas.text.overflowVisible'), value: TEXT_OVERFLOW_VISIBLE },\n ...(canExpandOverflow\n ? [{ label: i18n('schemas.text.overflowExpand'), value: TEXT_OVERFLOW_EXPAND }]\n : []),\n ];\n\n const textSchema: Record<string, PropPanelSchema> = {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n disabled: enableDynamicFont,\n props: { min: 0 },\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n props: { min: 0 },\n },\n formatter: getExtraFormatterSchema(i18n),\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n overflow: {\n title: i18n('schemas.text.overflow'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_TEXT_OVERFLOW,\n props: {\n options: overflowOptions,\n },\n span: 8,\n },\n useDynamicFontSize: { type: 'boolean', widget: 'UseDynamicFontSize', bind: false, span: 16 },\n dynamicFontSize: {\n type: 'object',\n widget: 'card',\n column: 3,\n properties: {\n min: {\n title: i18n('schemas.text.min'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n max: {\n title: i18n('schemas.text.max'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n fit: {\n title: i18n('schemas.text.fit'),\n type: 'string',\n widget: 'select',\n hidden: !enableDynamicFont,\n props: {\n options: [\n { label: i18n('schemas.horizontal'), value: DYNAMIC_FIT_HORIZONTAL },\n { label: i18n('schemas.vertical'), value: DYNAMIC_FIT_VERTICAL },\n ],\n },\n },\n },\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n backgroundColor: {\n title: i18n('schemas.bgColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(0.1),\n },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(),\n },\n useInlineMarkdown: {\n type: 'boolean',\n widget: 'UseInlineMarkdown',\n bind: false,\n hidden: hideTextFormat,\n span: enableInlineMarkdown ? 12 : 24,\n },\n fontVariantFallback: {\n title: i18n('schemas.text.variantFallback'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_FONT_VARIANT_FALLBACK,\n hidden: !enableInlineMarkdown,\n props: {\n options: [\n { label: i18n('schemas.text.synthetic'), value: FONT_VARIANT_FALLBACK_SYNTHETIC },\n { label: i18n('schemas.text.plain'), value: FONT_VARIANT_FALLBACK_PLAIN },\n { label: i18n('schemas.text.error'), value: FONT_VARIANT_FALLBACK_ERROR },\n ],\n },\n span: 12,\n },\n fontVariants: {\n title: i18n('schemas.text.markdownFonts'),\n type: 'object',\n widget: 'card',\n column: 2,\n hidden: !enableInlineMarkdown,\n properties: {\n bold: {\n title: i18n('schemas.text.boldFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n italic: {\n title: i18n('schemas.text.italicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n boldItalic: {\n title: i18n('schemas.text.boldItalicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n code: {\n title: i18n('schemas.text.codeFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n },\n },\n };\n\n return textSchema;\n },\n widgets: { UseDynamicFontSize, UseInlineMarkdown },\n defaultSchema: {\n name: '',\n type: 'text',\n content: 'Type Something...',\n position: { x: 0, y: 0 },\n width: 45,\n height: 10,\n // If the value of \"rotate\" is set to undefined or not set at all, rotation will be disabled in the UI.\n // Check this document: https://pdfme.com//docs/custom-schemas#learning-how-to-create-from-pdfmeschemas-code\n rotate: 0,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: DEFAULT_VERTICAL_ALIGNMENT,\n fontSize: DEFAULT_FONT_SIZE,\n textFormat: DEFAULT_TEXT_FORMAT,\n overflow: DEFAULT_TEXT_OVERFLOW,\n fontVariantFallback: DEFAULT_FONT_VARIANT_FALLBACK,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n dynamicFontSize: undefined,\n fontColor: DEFAULT_FONT_COLOR,\n fontName: undefined,\n backgroundColor: '',\n borderColor: '#000000',\n borderWidth: createBoxDimension(0),\n padding: createBoxDimension(0),\n opacity: DEFAULT_OPACITY,\n strikethrough: false,\n underline: false,\n },\n};\n","import type * as CSS from 'csstype';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n UIRenderProps,\n getDefaultFont,\n getInternalLinkTarget,\n mm2pt,\n normalizeLinkHref,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n PLACEHOLDER_FONT_COLOR,\n CODE_BACKGROUND_COLOR,\n CODE_HORIZONTAL_PADDING,\n SYNTHETIC_BOLD_CSS_TEXT_SHADOW,\n TEXT_FORMAT_INLINE_MARKDOWN,\n ALIGN_JUSTIFY,\n} from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n getBrowserVerticalFontAdjustments,\n isFirefox,\n splitTextToSize,\n wrapTextToSize,\n widthOfTextAtSize,\n} from './helper.js';\nimport { getLineAlignment, splitGraphemes, type WrapLine } from './wrap.js';\nimport { parseInlineMarkdown, stripInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange, plainTextLinesToValue } from './measure.js';\nimport { shouldUseDynamicFontSize } from './overflow.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n layoutRichTextLines,\n resolveRichTextRuns,\n} from './richText.js';\nimport { isEditable } from '../utils.js';\nimport { getTextLineRange } from '../splitRange.js';\nimport { getBoxContentArea, getBoxInsets, hasBoxDimension } from '../box.js';\n\nconst replaceUnsupportedChars = (text: string, fontKitFont: FontKitFont): string => {\n const charSupportCache: { [char: string]: boolean } = {};\n\n const isCharSupported = (char: string): boolean => {\n if (char in charSupportCache) {\n return charSupportCache[char];\n }\n const isSupported = fontKitFont.hasGlyphForCodePoint(char.codePointAt(0) || 0);\n charSupportCache[char] = isSupported;\n return isSupported;\n };\n\n const segments = text.split(/(\\r\\n|\\n|\\r)/);\n\n return segments\n .map((segment) => {\n if (/\\r\\n|\\n|\\r/.test(segment)) {\n return segment;\n }\n\n return Array.from(segment)\n .map((char) => {\n if (/\\s/.test(char) || char.charCodeAt(0) < 32) {\n return char;\n }\n\n return isCharSupported(char) ? char : '〿';\n })\n .join('');\n })\n .join('');\n};\n\nexport const uiRender = async (arg: UIRenderProps<TextSchema>) => {\n const {\n value,\n schema,\n basePdf,\n mode,\n onChange,\n stopEditing,\n tabIndex,\n placeholder,\n options,\n _cache,\n } = arg;\n const hasInlineMarkdownFormat = schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const isReadOnlySplitInlineMarkdownFormChunk =\n mode === 'form' && Boolean(getTextLineRange(schema)) && hasInlineMarkdownFormat;\n const renderInlineMarkdownReadOnlyChunk =\n enableInlineMarkdown || isReadOnlySplitInlineMarkdownFormChunk;\n const editable = isEditable(mode, schema) && !isReadOnlySplitInlineMarkdownFormChunk;\n const usePlaceholder = editable && placeholder && !value;\n const getText = (element: HTMLDivElement) => {\n let text = element.innerText;\n if (text.endsWith('\\n')) {\n // contenteditable adds additional newline char retrieved with innerText\n text = text.slice(0, -1);\n }\n return text;\n };\n const font = options?.font || getDefaultFont();\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, import('fontkit').Font>,\n );\n const enableDynamicFontSize = shouldUseDynamicFontSize(schema, basePdf);\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && enableDynamicFontSize\n ? await calculateDynamicRichTextFontSize({\n value: usePlaceholder ? (placeholder as string) : value,\n schema,\n font,\n _cache,\n })\n : undefined;\n const resolvedPlainFontSize =\n !enableInlineMarkdown && enableDynamicFontSize && (usePlaceholder ? placeholder : displayValue)\n ? calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value: usePlaceholder ? (placeholder as string) : displayValue,\n })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE);\n const useComputedWrapLines = !editable;\n const textBlock = buildStyledTextContainer(\n isReadOnlySplitInlineMarkdownFormChunk ? { ...arg, mode: 'viewer' } : arg,\n fontKitFont,\n usePlaceholder ? placeholder : displayValue,\n dynamicRichTextFontSize ?? resolvedPlainFontSize,\n { useComputedWrapLines },\n );\n\n const processedText = replaceUnsupportedChars(\n getRangedPlainTextValue({\n value,\n schema,\n fontKitFont,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n }),\n fontKitFont,\n );\n\n if (!editable) {\n if (renderInlineMarkdownReadOnlyChunk) {\n await renderInlineMarkdownReadOnly({\n textBlock,\n value,\n schema,\n font,\n _cache,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n });\n return;\n }\n\n renderReadOnlyPlainLines({\n textBlock,\n lines: applyTextLineRange(\n wrapTextToSize({\n value,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n fontKitFont,\n boxWidthInPt: mm2pt(getBoxContentArea(schema).width),\n }),\n getTextLineRange(schema),\n ),\n fontKitFont,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n boxWidthInPt: mm2pt(getBoxContentArea(schema).width),\n });\n return;\n }\n\n makeElementPlainTextContentEditable(textBlock);\n textBlock.tabIndex = tabIndex || 0;\n textBlock.innerText = mode === 'designer' ? value : processedText;\n textBlock.addEventListener('blur', (e: Event) => {\n if (onChange) onChange({ key: 'content', value: getText(e.target as HTMLDivElement) });\n if (stopEditing) stopEditing();\n });\n\n if (enableDynamicFontSize) {\n let dynamicFontSize: undefined | number = undefined;\n\n textBlock.addEventListener('keyup', () => {\n setTimeout(() => {\n // Use a regular function instead of an async one since we don't need await\n (() => {\n if (!textBlock.textContent) return;\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value: isInlineMarkdownTextSchema(schema)\n ? stripInlineMarkdown(getText(textBlock))\n : getText(textBlock),\n startingFontSize: dynamicFontSize,\n });\n textBlock.style.fontSize = `${dynamicFontSize}pt`;\n\n const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n textBlock.style.paddingTop = `${newTopAdj}px`;\n textBlock.style.marginBottom = `${newBottomAdj}px`;\n })();\n }, 0);\n });\n }\n\n if (usePlaceholder) {\n textBlock.style.color = PLACEHOLDER_FONT_COLOR;\n textBlock.addEventListener('focus', () => {\n if (textBlock.innerText === placeholder) {\n textBlock.innerText = '';\n textBlock.style.color = schema.fontColor ?? DEFAULT_FONT_COLOR;\n }\n });\n }\n\n if (mode === 'designer') {\n setTimeout(() => {\n textBlock.focus();\n // Set the focus to the end of the editable element when you focus, as we would for a textarea\n const selection = window.getSelection();\n const range = document.createRange();\n if (selection && range) {\n range.selectNodeContents(textBlock);\n range.collapse(false); // Collapse range to the end\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n};\n\nconst renderInlineMarkdownReadOnly = async (arg: {\n textBlock: HTMLDivElement;\n value: string;\n schema: TextSchema;\n font: NonNullable<UIRenderProps<TextSchema>['options']['font']>;\n _cache: Map<string | number, unknown>;\n fontSize: number;\n}) => {\n const { textBlock, value, schema, font, _cache, fontSize } = arg;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const alignment = schema.alignment ?? DEFAULT_ALIGNMENT;\n const boxWidthInPt = mm2pt(getBoxContentArea(schema).width);\n const runs = await resolveRichTextRuns({\n runs: parseInlineMarkdown(value),\n schema,\n font,\n _cache,\n });\n const lines = applyTextLineRange(\n layoutRichTextLines({\n runs,\n fontSize,\n characterSpacing,\n boxWidthInPt,\n }),\n getTextLineRange(schema),\n );\n\n textBlock.innerHTML = '';\n lines.forEach((line, lineIndex) => {\n const lineEl = document.createElement('span');\n lineEl.dataset.pdfmeWrapLine = '';\n lineEl.style.whiteSpace = 'pre';\n const stripTrailingLetterSpacing = applySharedWrapLineSpacing(\n lineEl,\n {\n text: line.runs.map((run) => run.text).join(''),\n width: line.width,\n hardBreak: line.hardBreak,\n },\n alignment,\n boxWidthInPt,\n characterSpacing,\n );\n\n line.runs.forEach((run) => {\n appendInlineMarkdownRun({ parent: lineEl, run, schema, font });\n });\n if (stripTrailingLetterSpacing) {\n stripLineEndLetterSpacing(lineEl);\n }\n\n textBlock.appendChild(lineEl);\n if (lineIndex < lines.length - 1) {\n textBlock.appendChild(document.createTextNode('\\n'));\n }\n });\n};\n\nconst appendInlineMarkdownRun = (arg: {\n parent: HTMLElement;\n run: Awaited<ReturnType<typeof resolveRichTextRuns>>[number];\n schema: TextSchema;\n font: NonNullable<UIRenderProps<TextSchema>['options']['font']>;\n}) => {\n const { parent, run, schema, font } = arg;\n const href = run.href ? normalizeLinkHref(run.href) : undefined;\n const span = href ? document.createElement('a') : document.createElement('span');\n const processedText = replaceUnsupportedChars(run.text, run.fontKitFont);\n const textDecorations: string[] = [];\n\n span.textContent = processedText;\n if (href) {\n const anchor = span as HTMLAnchorElement;\n anchor.href = href;\n if (!getInternalLinkTarget(href)) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n }\n textDecorations.push('underline');\n }\n if (run.fontName) {\n span.style.fontFamily = `'${run.fontName}'`;\n }\n if (run.syntheticBold) {\n span.style.fontWeight = '800';\n span.style.textShadow = SYNTHETIC_BOLD_CSS_TEXT_SHADOW;\n }\n if (run.syntheticItalic) {\n span.style.fontStyle = 'italic';\n }\n if (run.strikethrough) {\n textDecorations.push('line-through');\n }\n if (textDecorations.length > 0) {\n span.style.textDecoration = textDecorations.join(' ');\n }\n if (run.code) {\n span.style.backgroundColor = CODE_BACKGROUND_COLOR;\n span.style.borderRadius = '2px';\n span.style.padding = `0 ${CODE_HORIZONTAL_PADDING}pt`;\n if (!schema.fontVariants?.code || !font[schema.fontVariants.code]) {\n span.style.fontFamily = run.fontName ? `'${run.fontName}', monospace` : 'monospace';\n }\n }\n parent.appendChild(span);\n};\n\nconst applySharedWrapLineSpacing = (\n lineEl: HTMLElement,\n line: { text: string; width: number; hardBreak: boolean },\n alignment: string,\n boxWidthInPt: number,\n characterSpacing: number,\n) => {\n const { extraLetterSpacing } = getLineAlignment(line, boxWidthInPt, alignment);\n const stripTrailingLetterSpacing = !(alignment === ALIGN_JUSTIFY && !line.hardBreak);\n if (!stripTrailingLetterSpacing && extraLetterSpacing !== 0) {\n lineEl.style.letterSpacing = `${characterSpacing + extraLetterSpacing}pt`;\n }\n return stripTrailingLetterSpacing;\n};\n\nconst stripLineEndLetterSpacing = (lineEl: HTMLElement) => {\n let node: ChildNode | null = lineEl.lastChild;\n while (node && (node.nodeType !== Node.ELEMENT_NODE || !node.textContent)) {\n node = node.previousSibling;\n }\n if (!node || node.nodeType !== Node.ELEMENT_NODE) return;\n\n const el = node as HTMLElement;\n const graphemes = splitGraphemes(el.textContent ?? '');\n if (graphemes.length === 0) return;\n if (graphemes.length === 1) {\n el.style.letterSpacing = '0';\n return;\n }\n\n el.textContent = graphemes.slice(0, -1).join('');\n const tail = document.createElement('span');\n tail.textContent = graphemes[graphemes.length - 1];\n tail.style.letterSpacing = '0';\n el.appendChild(tail);\n};\n\nconst renderReadOnlyPlainLines = (arg: {\n textBlock: HTMLDivElement;\n lines: WrapLine[];\n fontKitFont: FontKitFont;\n fontSize: number;\n characterSpacing: number;\n alignment: string;\n boxWidthInPt: number;\n}) => {\n const { textBlock, lines, fontKitFont, fontSize, characterSpacing, alignment, boxWidthInPt } =\n arg;\n textBlock.innerHTML = '';\n\n lines.forEach((line, lineIndex) => {\n const lineEl = document.createElement('span');\n lineEl.dataset.pdfmeWrapLine = '';\n lineEl.style.whiteSpace = 'pre';\n const displayText = replaceUnsupportedChars(line.text, fontKitFont);\n\n const textWidth = widthOfTextAtSize(line.text, fontKitFont, fontSize, characterSpacing);\n const stripTrailingLetterSpacing = applySharedWrapLineSpacing(\n lineEl,\n { text: line.text, width: textWidth, hardBreak: line.hardBreak },\n alignment,\n boxWidthInPt,\n characterSpacing,\n );\n\n const graphemes = splitGraphemes(displayText);\n graphemes.forEach((grapheme, index) => {\n const span = document.createElement('span');\n span.textContent = grapheme;\n // PDF `setCharacterSpacing` applies Tc after every grapheme, including\n // the last. Zeroing the last glyph is only for ordinary characterSpacing\n // so browsers do not count a trailing gap when wrapping.\n if (index === graphemes.length - 1 && stripTrailingLetterSpacing) {\n span.style.letterSpacing = '0';\n }\n lineEl.appendChild(span);\n });\n\n textBlock.appendChild(lineEl);\n // Join with a real newline so `pre` paints one visual line per wrap line\n // and `textContent` keeps paragraph breaks. Do not suffix facade `\\n`\n // characters — that would add an extra blank line after each paragraph.\n if (lineIndex < lines.length - 1) {\n textBlock.appendChild(document.createTextNode('\\n'));\n }\n });\n};\n\nconst getRangedPlainTextValue = (arg: {\n value: string;\n schema: TextSchema;\n fontKitFont: FontKitFont;\n fontSize: number;\n}) => {\n const { value, schema, fontKitFont, fontSize } = arg;\n const lineRange = getTextLineRange(schema);\n if (!lineRange) return value;\n\n const lines = applyTextLineRange(\n splitTextToSize({\n value,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n fontKitFont,\n boxWidthInPt: mm2pt(getBoxContentArea(schema).width),\n }),\n lineRange,\n );\n return plainTextLinesToValue(lines);\n};\n\nexport const buildStyledTextContainer = (\n arg: UIRenderProps<TextSchema>,\n fontKitFont: FontKitFont,\n value: string,\n resolvedDynamicFontSize?: number,\n display?: { useComputedWrapLines?: boolean },\n) => {\n const { schema, rootElement, mode } = arg;\n\n let dynamicFontSize: undefined | number = resolvedDynamicFontSize;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const editable = isEditable(mode, schema);\n // `pre` + left-for-justify is for read-only displays whose wrap-engine\n // lines are already computed (plain text and inline Markdown). Live Form /\n // Designer editing keeps `pre-wrap` so caret / IME stay native.\n const useComputedWrapLines = display?.useComputedWrapLines ?? !editable;\n\n if (dynamicFontSize === undefined && shouldUseDynamicFontSize(schema, arg.basePdf) && value) {\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value,\n startingFontSize: dynamicFontSize,\n });\n }\n\n // Depending on vertical alignment, we need to move the top or bottom of the font to keep\n // it within it's defined box and align it with the generated pdf.\n const { topAdj, bottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n\n const topAdjustment = topAdj.toString();\n const bottomAdjustment = bottomAdj.toString();\n const verticalAlignment = schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT;\n const isTopAligned = verticalAlignment === VERTICAL_ALIGN_TOP;\n\n const container = document.createElement('div');\n const { borderWidth, padding } = getBoxInsets(schema);\n const hasPadding = hasBoxDimension(schema.padding);\n const hasBorder = Boolean(schema.borderColor && hasBoxDimension(schema.borderWidth));\n\n const containerStyle: CSS.Properties = {\n padding: hasPadding\n ? `${padding.top}mm ${padding.right}mm ${padding.bottom}mm ${padding.left}mm`\n : 0,\n resize: 'none',\n backgroundColor: getBackgroundColor(schema),\n border: hasBorder ? undefined : 'none',\n ...(hasBorder\n ? {\n borderTopWidth: `${borderWidth.top}mm`,\n borderRightWidth: `${borderWidth.right}mm`,\n borderBottomWidth: `${borderWidth.bottom}mm`,\n borderLeftWidth: `${borderWidth.left}mm`,\n borderStyle: 'solid',\n borderColor: schema.borderColor,\n }\n : {}),\n ...(hasPadding || hasBorder ? { boxSizing: 'border-box' } : {}),\n display: 'flex',\n flexDirection: 'column',\n justifyContent: mapVerticalAlignToFlex(verticalAlignment),\n width: '100%',\n height: '100%',\n cursor: editable ? 'text' : 'default',\n };\n Object.assign(container.style, containerStyle);\n rootElement.innerHTML = '';\n rootElement.appendChild(container);\n\n // text decoration\n const textDecorations = [];\n if (schema.strikethrough) textDecorations.push('line-through');\n if (schema.underline) textDecorations.push('underline');\n\n const alignment = schema.alignment ?? DEFAULT_ALIGNMENT;\n const textBlockStyle: CSS.Properties = {\n // Font formatting styles\n fontFamily: schema.fontName ? `'${schema.fontName}'` : 'inherit',\n color: schema.fontColor ? schema.fontColor : DEFAULT_FONT_COLOR,\n fontSize: `${dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE}pt`,\n letterSpacing: `${characterSpacing}pt`,\n lineHeight: `${schema.lineHeight ?? DEFAULT_LINE_HEIGHT}em`,\n // Read-only Viewer paints wrap-engine lines with `pre`. CSS justify would\n // fight the PDF grapheme-count letter-spacing applied per soft line.\n textAlign: useComputedWrapLines && alignment === ALIGN_JUSTIFY ? 'left' : alignment,\n whiteSpace: useComputedWrapLines ? 'pre' : 'pre-wrap',\n wordBreak: useComputedWrapLines ? 'normal' : 'break-word',\n // Block layout styles\n resize: 'none',\n border: 'none',\n outline: 'none',\n marginBottom: `${bottomAdjustment}px`,\n paddingTop: `${topAdjustment}px`,\n backgroundColor: 'transparent',\n textDecoration: textDecorations.join(' '),\n // Browsers include the final letter-spacing in editable text wrapping, unlike PDF rendering.\n ...(editable && characterSpacing > 0 ? { width: `calc(100% + ${characterSpacing}pt)` } : {}),\n ...(isTopAligned ? { height: '100%' } : {}),\n };\n\n const textBlock = document.createElement('div');\n textBlock.id = 'text-' + String(schema.id);\n Object.assign(textBlock.style, textBlockStyle);\n\n container.appendChild(textBlock);\n\n return textBlock;\n};\n\n/**\n * Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.\n * This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.\n */\nexport const makeElementPlainTextContentEditable = (element: HTMLElement) => {\n if (!isFirefox()) {\n element.contentEditable = 'plaintext-only';\n return;\n }\n\n element.contentEditable = 'true';\n element.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n document.execCommand('insertLineBreak', false, undefined);\n }\n });\n\n element.addEventListener('paste', (e: ClipboardEvent) => {\n e.preventDefault();\n const paste = e.clipboardData?.getData('text');\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n selection.deleteFromDocument();\n selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));\n selection.collapseToEnd();\n });\n};\n\nexport const mapVerticalAlignToFlex = (verticalAlignmentValue: string | undefined) => {\n switch (verticalAlignmentValue) {\n case VERTICAL_ALIGN_TOP:\n return 'flex-start';\n case VERTICAL_ALIGN_MIDDLE:\n return 'center';\n case VERTICAL_ALIGN_BOTTOM:\n return 'flex-end';\n }\n return 'flex-start';\n};\n\nconst getBackgroundColor = (schema: { backgroundColor?: string }) => {\n if (!schema.backgroundColor) return 'transparent';\n return schema.backgroundColor;\n};\n","import type { Plugin } from '@pdfme/common';\nimport { pdfRender } from './pdfRender.js';\nimport { propPanel } from './propPanel.js';\nimport { uiRender } from './uiRender.js';\nimport type { TextSchema } from './types.js';\nimport { TextCursorInput } from 'lucide';\nimport { createSvgStr } from '../utils.js';\n\nconst textSchema: Plugin<TextSchema> = {\n pdf: pdfRender,\n ui: uiRender,\n propPanel,\n icon: createSvgStr(TextCursorInput),\n};\n\nexport default textSchema;\n","import text from './text/index.js';\n\n// The default built-in plugin surface is intentionally limited to text.\n// Generator/UI consumers that need image, barcode, table, or other schema types\n// must import and pass those plugins explicitly from `@pdfme/schemas`.\nconst builtInPlugins = { Text: text };\n\nexport { builtInPlugins };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"builtins-C-2wyB_3.js","names":[],"sources":["../src/text/linkAnnotation.ts","../src/text/richTextPdfRender.ts","../src/text/overflow.ts","../src/pdfFont.ts","../src/text/pdfRender.ts","../src/text/icons/index.ts","../src/text/extraFormatter.ts","../src/text/propPanel.ts","../src/text/uiRender.ts","../src/text/index.ts","../src/builtins.ts"],"sourcesContent":["import { normalizeSafeLinkUri } from '@pdfme/common';\nimport type { PDFDocument, PDFPage } from '@pdfme/pdf-lib';\nimport { PDFName, PDFString } from '@pdfme/pdf-lib';\n\nexport type LinkAnnotationRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport const addUriLinkAnnotation = (arg: {\n pdfDoc: PDFDocument;\n page: PDFPage;\n uri: string;\n rect: LinkAnnotationRect;\n borderWidth?: number;\n}) => {\n const { pdfDoc, page, uri, rect, borderWidth = 0 } = arg;\n const safeUri = normalizeSafeLinkUri(uri);\n if (!safeUri || rect.width <= 0 || rect.height <= 0) return;\n\n const annotationRef = pdfDoc.context.register(\n pdfDoc.context.obj({\n Type: PDFName.of('Annot'),\n Subtype: PDFName.of('Link'),\n Rect: [rect.x, rect.y, rect.x + rect.width, rect.y + rect.height],\n Border: [0, 0, borderWidth],\n A: {\n Type: PDFName.of('Action'),\n S: PDFName.of('URI'),\n URI: PDFString.of(safeUri),\n },\n }),\n );\n\n page.node.addAnnot(annotationRef);\n};\n","import type { PDFFont, Rotation } from '@pdfme/pdf-lib';\nimport type { ColorType, Font, PDFRenderProps } from '@pdfme/common';\nimport { getInternalLinkTarget, registerInternalLinkAnnotation } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n CODE_BACKGROUND_COLOR,\n CODE_HORIZONTAL_PADDING,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_TOP,\n} from './constants.js';\nimport { getFontDescentInPt, heightOfFontAtSize, widthOfTextAtSize } from './helper.js';\nimport { addUriLinkAnnotation, type LinkAnnotationRect } from './linkAnnotation.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange } from './measure.js';\nimport { layoutRichTextLines, resolveRichTextRuns, type RichTextLineRun } from './richText.js';\nimport { getLineAlignment } from './wrap.js';\nimport type { TextSchema } from './types.js';\nimport { hex2PrintingColor, rotatePoint } from '../utils.js';\nimport { getTextLineRange } from '../splitRange.js';\n\ntype TextColor = ReturnType<typeof hex2PrintingColor>;\n\nconst getSyntheticBoldWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticBold ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS : 0;\n\nconst getSyntheticItalicWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n\nconst getRunWidth = (run: RichTextLineRun, fontSize: number, characterSpacing: number) =>\n widthOfTextAtSize(run.text, run.fontKitFont, fontSize, characterSpacing) +\n getSyntheticBoldWidth(run, fontSize) +\n getSyntheticItalicWidth(run, fontSize) +\n (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0);\n\nconst getPdfFontFromObj = (run: RichTextLineRun, pdfFontObj: Record<string, PDFFont>) => {\n const pdfFont = pdfFontObj[run.fontName];\n if (!pdfFont) {\n throw new Error(`[@pdfme/schemas] Missing embedded font \"${run.fontName}\".`);\n }\n return pdfFont;\n};\n\nconst embedFontsForRuns = async (\n runs: RichTextLineRun[],\n embedPdfFont: (fontName: string) => Promise<PDFFont>,\n) => {\n const fontNames = Array.from(new Set(runs.map((run) => run.fontName)));\n const pdfFonts = await Promise.all(\n fontNames.map(async (fontName) => [fontName, await embedPdfFont(fontName)] as const),\n );\n return Object.fromEntries(pdfFonts);\n};\n\nconst drawDecorationLine = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n color: TextColor;\n opacity: number | undefined;\n}) => {\n const { page, x, y, width, rotate, pivotPoint, fontSize, color, opacity } = arg;\n if (width <= 0) return;\n\n page.drawLine({\n start: rotatePoint({ x, y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: x + width, y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color,\n opacity,\n });\n};\n\nconst getAxisAlignedRect = (arg: {\n x: number;\n y: number;\n width: number;\n height: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n}): LinkAnnotationRect => {\n const { x, y, width, height, rotate, pivotPoint } = arg;\n if (rotate.angle === 0) return { x, y, width, height };\n\n const points = [\n { x, y },\n { x: x + width, y },\n { x: x + width, y: y + height },\n { x, y: y + height },\n ].map((point) => rotatePoint(point, pivotPoint, rotate.angle));\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n\n return {\n x: minX,\n y: minY,\n width: Math.max(...xs) - minX,\n height: Math.max(...ys) - minY,\n };\n};\n\nconst getLinkAnnotationRect = (arg: {\n run: RichTextLineRun;\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n}): LinkAnnotationRect => {\n const { run, x, y, width, rotate, pivotPoint, fontSize } = arg;\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n const descent = getFontDescentInPt(run.fontKitFont, fontSize);\n const rectY = y + descent;\n const rectHeight = textHeight - descent;\n\n return getAxisAlignedRect({\n x,\n y: rectY,\n width,\n height: rectHeight,\n rotate,\n pivotPoint,\n });\n};\n\nconst drawRun = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n run: RichTextLineRun;\n pdfFont: PDFFont;\n x: number;\n y: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n lineHeight: number;\n color: TextColor;\n opacity: number | undefined;\n colorType: ColorType;\n characterSpacing: number;\n strikethrough: boolean;\n underline: boolean;\n}) => {\n const {\n page,\n pdfLib,\n run,\n pdfFont,\n x,\n y,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing,\n strikethrough,\n underline,\n } = arg;\n const runWidth = getRunWidth(run, fontSize, characterSpacing);\n const codePadding = run.code ? CODE_HORIZONTAL_PADDING : 0;\n const textX = x + codePadding;\n const textWidth = runWidth - codePadding * 2;\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n\n if (run.code) {\n const bgX = x;\n const bgY = y - textHeight * 0.2;\n const bgPoint =\n rotate.angle === 0\n ? { x: bgX, y: bgY }\n : rotatePoint({ x: bgX, y: bgY }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: bgPoint.x,\n y: bgPoint.y,\n width: runWidth,\n height: textHeight * 1.2,\n rotate,\n color: hex2PrintingColor(CODE_BACKGROUND_COLOR, colorType),\n opacity,\n });\n }\n\n if (strikethrough && runWidth > 0) {\n drawDecorationLine({\n page,\n x: textX,\n y: y + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n if (underline && runWidth > 0) {\n drawDecorationLine({\n page,\n x: textX,\n y: y - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n const drawAt = (drawX: number) => {\n const point =\n rotate.angle === 0 ? { x: drawX, y } : rotatePoint({ x: drawX, y }, pivotPoint, rotate.angle);\n page.drawText(run.text, {\n x: point.x,\n y: point.y,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFont,\n opacity,\n ...(run.syntheticItalic ? { ySkew: pdfLib.degrees(SYNTHETIC_ITALIC_SKEW_DEGREES) } : {}),\n });\n };\n\n drawAt(textX);\n if (run.syntheticBold) {\n const offset = fontSize * SYNTHETIC_BOLD_OFFSET_RATIO;\n for (let i = 1; i <= SYNTHETIC_BOLD_PDF_EXTRA_DRAWS; i++) {\n drawAt(textX + offset * i);\n }\n }\n};\n\nexport const renderInlineMarkdownText = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n embedPdfFont: (fontName: string) => Promise<PDFFont>;\n fontKitFont: FontKitFont;\n pdfDoc: PDFRenderProps<TextSchema>['pdfDoc'];\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n _cache: Map<string | number, unknown>;\n colorType: ColorType;\n fontSize: number;\n color: TextColor;\n alignment: string;\n verticalAlignment: string;\n lineHeight: number;\n characterSpacing: number;\n x: number;\n y: number;\n width: number;\n height: number;\n pivotPoint: { x: number; y: number };\n rotate: Rotation;\n opacity: number | undefined;\n}) => {\n const {\n value,\n schema,\n font,\n embedPdfFont,\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n y,\n width,\n height,\n pivotPoint,\n rotate,\n opacity,\n } = arg;\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const allLines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize,\n characterSpacing,\n boxWidthInPt: width,\n });\n const lineRange = getTextLineRange(schema);\n const lines = applyTextLineRange(allLines, lineRange);\n const 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 const alignmentMetrics = getLineAlignment(\n {\n text: line.runs.map((run) => run.text).join(''),\n width: line.width,\n hardBreak: line.hardBreak,\n },\n width,\n alignment,\n );\n const textWidth = alignmentMetrics.usedWidth;\n const spacing = characterSpacing + alignmentMetrics.extraLetterSpacing;\n const xLine = x + alignmentMetrics.x;\n\n const yLine = y + height - yOffset - lineHeight * fontSize * rowIndex;\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n if (schema.strikethrough || schema.underline) {\n const textHeight = Math.max(\n ...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)),\n );\n if (schema.strikethrough) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n if (schema.underline) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n }\n\n line.runs.reduce((currentX, run, runIndex) => {\n const runWidth = getRunWidth(run, fontSize, spacing);\n const pdfFont = getPdfFontFromObj(run, pdfFontObj);\n drawRun({\n page,\n pdfLib,\n run,\n pdfFont,\n x: currentX,\n y: yLine,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing: spacing,\n strikethrough: Boolean(run.strikethrough),\n underline: Boolean(run.href) && !schema.underline,\n });\n if (run.href) {\n const rect = getLinkAnnotationRect({\n run,\n x: currentX,\n y: yLine,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n });\n const targetName = getInternalLinkTarget(run.href);\n if (targetName) {\n registerInternalLinkAnnotation({ _cache, page, targetName, rect });\n } else {\n addUriLinkAnnotation({ pdfDoc, page, uri: run.href, rect });\n }\n }\n\n return currentX + runWidth + (runIndex === line.runs.length - 1 ? 0 : spacing);\n }, xLine);\n });\n};\n","import { isBlankPdf, type BasePdf } from '@pdfme/common';\nimport { TEXT_OVERFLOW_EXPAND } from './constants.js';\nimport type { TextSchema } from './types.js';\n\nconst TEXT_OVERFLOW_EXPAND_SCHEMA_TYPES = new Set(['text', 'multiVariableText']);\n\ntype TextOverflowSchema = Pick<TextSchema, 'overflow'> & Partial<Pick<TextSchema, 'type'>>;\n\nconst isTextOverflowExpandSchema = (schema: Partial<Pick<TextSchema, 'type'>>) =>\n schema.type === undefined || TEXT_OVERFLOW_EXPAND_SCHEMA_TYPES.has(schema.type);\n\nexport const canUseTextOverflowExpand = (\n schema: Partial<Pick<TextSchema, 'type'>>,\n basePdf?: BasePdf,\n) => !isTextOverflowExpandSchema(schema) || basePdf === undefined || isBlankPdf(basePdf);\n\nexport const isTextOverflowExpand = (schema: TextOverflowSchema, basePdf?: BasePdf) =>\n canUseTextOverflowExpand(schema, basePdf) && schema.overflow === TEXT_OVERFLOW_EXPAND;\n\nexport const shouldUseDynamicFontSize = (\n schema: Pick<TextSchema, 'dynamicFontSize' | 'overflow'> & Partial<Pick<TextSchema, 'type'>>,\n basePdf?: BasePdf,\n) => Boolean(schema.dynamicFontSize) && !isTextOverflowExpand(schema, basePdf);\n","import { PDFFont, PDFDocument } from '@pdfme/pdf-lib';\nimport { Font } from '@pdfme/common';\nimport { fetchRemoteFontData } from './text/helper.js';\n\ntype PdfFontCache = Record<string, Promise<PDFFont>>;\n\nconst PDF_FONT_CACHE_KEY = 'schemas-pdf-font-cache';\n\nconst getPdfFontCache = (_cache: Map<string | number, unknown>): PdfFontCache => {\n let pdfFontCache = _cache.get(PDF_FONT_CACHE_KEY) as PdfFontCache | undefined;\n if (!pdfFontCache) {\n pdfFontCache = {};\n _cache.set(PDF_FONT_CACHE_KEY, pdfFontCache);\n }\n\n return pdfFontCache;\n};\n\nexport const 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","import type { Font as FontKitFont } from 'fontkit';\nimport type { TextSchema } from './types.js';\nimport {\n PDFRenderProps,\n ColorType,\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 widthOfTextAtSize,\n wrapTextToSize,\n} from './helper.js';\nimport { getLineAlignment } from './wrap.js';\nimport { stripInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange } from './measure.js';\nimport { calculateDynamicRichTextFontSize, isInlineMarkdownTextSchema } from './richText.js';\nimport { renderInlineMarkdownText } from './richTextPdfRender.js';\nimport { shouldUseDynamicFontSize } from './overflow.js';\nimport { convertForPdfLayoutProps, rotatePoint, hex2PrintingColor } from '../utils.js';\nimport { getTextLineRange } from '../splitRange.js';\nimport { getBoxContentArea, getBoxInsets, hasBoxDimension } from '../box.js';\nimport { embedAndGetFont } from '../pdfFont.js';\n\nconst getFontProp = ({\n value,\n fontKitFont,\n schema,\n basePdf,\n colorType,\n fontSize: resolvedFontSize,\n}: {\n value: string;\n fontKitFont: FontKitFont;\n colorType?: ColorType;\n schema: TextSchema;\n basePdf: PDFRenderProps<TextSchema>['basePdf'];\n fontSize?: number;\n}) => {\n const fontSize =\n resolvedFontSize ??\n (shouldUseDynamicFontSize(schema, basePdf)\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE));\n const color = hex2PrintingColor(schema.fontColor || DEFAULT_FONT_COLOR, colorType);\n\n return {\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n verticalAlignment: schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n lineHeight: schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n color,\n };\n};\n\nexport const pdfRender = async (arg: PDFRenderProps<TextSchema>) => {\n const { value, pdfDoc, pdfLib, page, options, schema, basePdf, _cache } = arg;\n const { font = getDefaultFont(), colorType } = options;\n\n const pageHeight = page.getHeight();\n const {\n width,\n height,\n rotate,\n position: { x, y },\n opacity,\n } = convertForPdfLayoutProps({ schema, pageHeight, applyRotateTranslate: false });\n\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(schema.position.y) - height / 2 };\n\n if (!value) return;\n drawTextBoxDecoration({ page, schema, colorType, x, y, width, height, rotate, pivotPoint });\n\n const fontName = schema.fontName ? schema.fontName : getFallbackFontName(font);\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const contentArea = getBoxContentArea(schema);\n const contentX = x + mm2pt(contentArea.leftInset);\n const contentY = y + mm2pt(contentArea.bottomInset);\n const contentWidth = mm2pt(contentArea.width);\n const contentHeight = mm2pt(contentArea.height);\n\n const pdfFontValuePromise = enableInlineMarkdown\n ? undefined\n : embedAndGetFont({\n pdfDoc,\n font,\n fontName,\n _cache,\n });\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && shouldUseDynamicFontSize(schema, basePdf)\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : undefined;\n const fontProp = getFontProp({\n value: displayValue,\n fontKitFont,\n schema,\n basePdf,\n colorType,\n fontSize: dynamicRichTextFontSize,\n });\n\n const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = fontProp;\n\n if (enableInlineMarkdown) {\n await renderInlineMarkdownText({\n value,\n schema,\n font,\n embedPdfFont: (fontName) => embedAndGetFont({ pdfDoc, font, fontName, _cache }),\n fontKitFont,\n pdfDoc,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x: contentX,\n y: contentY,\n width: contentWidth,\n height: contentHeight,\n pivotPoint,\n rotate,\n opacity,\n });\n return;\n }\n if (!pdfFontValuePromise) {\n throw new Error('[@pdfme/schemas] Failed to prepare PDF font for text rendering.');\n }\n const pdfFontValue = await pdfFontValuePromise;\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n const lines = applyTextLineRange(\n wrapTextToSize({\n value,\n characterSpacing,\n fontSize,\n fontKitFont,\n boxWidthInPt: contentWidth,\n }),\n getTextLineRange(schema),\n );\n const needsTextWidth = alignment !== 'left' || Boolean(schema.strikethrough || schema.underline);\n const needsTextHeight = Boolean(schema.strikethrough || schema.underline);\n\n // Text lines are rendered from the bottom upwards, we need to adjust the position down\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = contentHeight - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (contentHeight - otherLinesHeight - firstLineTextHeight + descent) / 2 +\n firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n const trimmed = line.text;\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 const alignmentMetrics = getLineAlignment(\n { text: trimmed, width: textWidth, hardBreak: line.hardBreak },\n contentWidth,\n alignment,\n );\n\n // Adobe Acrobat Reader shows an error if `drawText` is called with an empty text\n const drawText = trimmed === '' ? '\\r\\n' : trimmed;\n\n let xLine = contentX + alignmentMetrics.x;\n let yLine = contentY + contentHeight - yOffset - rowYOffset;\n\n // draw strikethrough\n if (schema.strikethrough && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine + textHeight / 3;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n // draw underline\n if (schema.underline && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine - textHeight / 12;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n if (rotate.angle !== 0) {\n // As we draw each line individually from different points, we must translate each lines position\n // relative to the UI rotation pivot point. see comments in convertForPdfLayoutProps() for more info.\n const rotatedPoint = rotatePoint({ x: xLine, y: yLine }, pivotPoint, rotate.angle);\n xLine = rotatedPoint.x;\n yLine = rotatedPoint.y;\n }\n\n page.pushOperators(\n pdfLib.setCharacterSpacing(characterSpacing + alignmentMetrics.extraLetterSpacing),\n );\n\n page.drawText(drawText, {\n x: xLine,\n y: yLine,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFontValue,\n opacity,\n });\n });\n};\n\nconst drawTextBoxDecoration = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n schema: TextSchema;\n colorType?: ColorType;\n x: number;\n y: number;\n width: number;\n height: number;\n rotate: ReturnType<typeof convertForPdfLayoutProps>['rotate'];\n pivotPoint: { x: number; y: number };\n}) => {\n const { page, schema, colorType, x, y, width, height, rotate, pivotPoint } = arg;\n const { borderWidth } = getBoxInsets(schema);\n const opacity = schema.opacity ?? 1;\n\n const drawRectangle = (rect: {\n x: number;\n y: number;\n width: number;\n height: number;\n color: NonNullable<ReturnType<typeof hex2PrintingColor>>;\n }) => {\n if (rect.width <= 0 || rect.height <= 0) return;\n const point =\n rotate.angle === 0\n ? { x: rect.x, y: rect.y }\n : rotatePoint({ x: rect.x, y: rect.y }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: point.x,\n y: point.y,\n width: rect.width,\n height: rect.height,\n rotate,\n color: rect.color,\n opacity,\n });\n };\n\n if (schema.backgroundColor) {\n const color = hex2PrintingColor(schema.backgroundColor, colorType);\n if (color) drawRectangle({ x, y, width, height, color });\n }\n\n if (!schema.borderColor || !hasBoxDimension(schema.borderWidth)) return;\n\n const color = hex2PrintingColor(schema.borderColor, colorType);\n if (!color) return;\n\n const top = mm2pt(borderWidth.top);\n const right = mm2pt(borderWidth.right);\n const bottom = mm2pt(borderWidth.bottom);\n const left = mm2pt(borderWidth.left);\n\n drawRectangle({ x, y: y + height - top, width, height: top, color });\n drawRectangle({ x: x + width - right, y, width: right, height, color });\n drawRectangle({ x, y, width, height: bottom, color });\n drawRectangle({ x, y, width: left, height, color });\n};\n","import {\n Strikethrough,\n Underline,\n AlignLeft,\n AlignCenter,\n AlignRight,\n ArrowUpToLine,\n ArrowDownToLine,\n AlignJustify,\n} from 'lucide';\nimport { createSvgStr } from '../../utils.js';\n\nexport const TextStrikethroughIcon = createSvgStr(Strikethrough);\n\nexport const TextUnderlineIcon = createSvgStr(Underline);\n\nexport const TextAlignLeftIcon = createSvgStr(AlignLeft);\n\nexport const TextAlignCenterIcon = createSvgStr(AlignCenter);\n\nexport const TextAlignRightIcon = createSvgStr(AlignRight);\n\nexport const TextAlignJustifyIcon = createSvgStr(AlignJustify);\n\nexport const TextVerticalAlignTopIcon = createSvgStr(ArrowUpToLine);\n\n// svg icons are material icons from https://www.xicons.org\nexport const TextVerticalAlignMiddleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 24 24\"><path d=\"M8 19h3v4h2v-4h3l-4-4l-4 4zm8-14h-3V1h-2v4H8l4 4l4-4zM4 11v2h16v-2H4z\" fill=\"currentColor\"></path></svg>`;\n\nexport const TextVerticalAlignBottomIcon = createSvgStr(ArrowDownToLine);\n","// No imports needed from @pdfme/common\nimport {\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextAlignJustifyIcon,\n TextStrikethroughIcon,\n TextUnderlineIcon,\n TextVerticalAlignBottomIcon,\n TextVerticalAlignMiddleIcon,\n TextVerticalAlignTopIcon,\n} from './icons/index.js';\nimport {\n ALIGN_CENTER,\n ALIGN_RIGHT,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n ALIGN_JUSTIFY,\n} from './constants.js';\n\nexport enum Formatter {\n STRIKETHROUGH = 'strikethrough',\n UNDERLINE = 'underline',\n ALIGNMENT = 'alignment',\n VERTICAL_ALIGNMENT = 'verticalAlignment',\n}\n\ninterface GroupButtonBoolean {\n key: Formatter;\n icon: string;\n type: 'boolean';\n}\n\ninterface GroupButtonString {\n key: Formatter;\n icon: string;\n type: 'select';\n value: string;\n}\n\ntype GroupButton = GroupButtonBoolean | GroupButtonString;\n\nexport function getExtraFormatterSchema(i18n: (key: string) => string): {\n title: string;\n widget: string;\n buttons: GroupButton[];\n span: number;\n} {\n const buttons: GroupButton[] = [\n { key: Formatter.STRIKETHROUGH, icon: TextStrikethroughIcon, type: 'boolean' },\n { key: Formatter.UNDERLINE, icon: TextUnderlineIcon, type: 'boolean' },\n { key: Formatter.ALIGNMENT, icon: TextAlignLeftIcon, type: 'select', value: DEFAULT_ALIGNMENT },\n { key: Formatter.ALIGNMENT, icon: TextAlignCenterIcon, type: 'select', value: ALIGN_CENTER },\n { key: Formatter.ALIGNMENT, icon: TextAlignRightIcon, type: 'select', value: ALIGN_RIGHT },\n { key: Formatter.ALIGNMENT, icon: TextAlignJustifyIcon, type: 'select', value: ALIGN_JUSTIFY },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignTopIcon,\n type: 'select',\n value: DEFAULT_VERTICAL_ALIGNMENT,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignMiddleIcon,\n type: 'select',\n value: VERTICAL_ALIGN_MIDDLE,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignBottomIcon,\n type: 'select',\n value: VERTICAL_ALIGN_BOTTOM,\n },\n ];\n return {\n title: i18n('schemas.text.format'),\n widget: 'ButtonGroup',\n buttons,\n span: 24,\n };\n}\n","import {\n DEFAULT_FONT_NAME,\n PropPanel,\n PropPanelWidgetProps,\n PropPanelSchema,\n getFallbackFontName,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_COLOR,\n DYNAMIC_FIT_VERTICAL,\n DYNAMIC_FIT_HORIZONTAL,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n DEFAULT_TEXT_FORMAT,\n TEXT_FORMAT_INLINE_MARKDOWN,\n TEXT_FORMAT_PLAIN,\n TEXT_OVERFLOW_EXPAND,\n TEXT_OVERFLOW_VISIBLE,\n DEFAULT_TEXT_OVERFLOW,\n DEFAULT_FONT_VARIANT_FALLBACK,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n FONT_VARIANT_FALLBACK_SYNTHETIC,\n} from './constants.js';\nimport { DEFAULT_OPACITY, HEX_COLOR_PATTERN } from '../constants.js';\nimport { getExtraFormatterSchema } from './extraFormatter.js';\nimport { canUseTextOverflowExpand, isTextOverflowExpand } from './overflow.js';\nimport { createBoxDimension, getBoxDimensionPropPanelSchema } from '../box.js';\n\nconst UseDynamicFontSize = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n, basePdf } = props;\n const isExpand = isTextOverflowExpand(activeSchema as unknown as TextSchema, basePdf);\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n !isExpand && Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n checkbox.disabled = isExpand;\n checkbox.onchange = (e: Event) => {\n const val = (e.target as HTMLInputElement).checked\n ? {\n min: DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n max: DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n fit: DEFAULT_DYNAMIC_FIT,\n }\n : undefined;\n changeSchemas([{ key: 'dynamicFontSize', value: val, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.dynamicFontSize') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.style.opacity = isExpand ? '0.5' : '1';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nconst UseInlineMarkdown = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n (activeSchema as { textFormat?: unknown })?.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n checkbox.onchange = (e: Event) => {\n const value = (e.target as HTMLInputElement).checked\n ? TEXT_FORMAT_INLINE_MARKDOWN\n : TEXT_FORMAT_PLAIN;\n changeSchemas([{ key: 'textFormat', value, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.inlineMarkdown') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nexport const propPanel: PropPanel<TextSchema> = {\n schema: ({ options, activeSchema, i18n, basePdf }) => {\n const font = options.font || { [DEFAULT_FONT_NAME]: { data: '', fallback: true } };\n const fontNames = Object.keys(font);\n const fallbackFontName = getFallbackFontName(font);\n\n const activeTextSchema = activeSchema as unknown as TextSchema;\n const canExpandOverflow = canUseTextOverflowExpand(activeTextSchema, basePdf);\n const isExpand = isTextOverflowExpand(activeTextSchema, basePdf);\n const enableDynamicFont =\n !isExpand && Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n const hideTextFormat = activeTextSchema.type === 'text' && activeTextSchema.readOnly !== true;\n const enableInlineMarkdown =\n activeTextSchema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN && !hideTextFormat;\n const baseFontName =\n activeTextSchema.fontName && font[activeTextSchema.fontName]\n ? activeTextSchema.fontName\n : fallbackFontName;\n const optionalFontNames = [\n { label: baseFontName, value: '' },\n ...fontNames\n .filter((name) => name !== baseFontName)\n .map((name) => ({ label: name, value: name })),\n ];\n const overflowOptions = [\n { label: i18n('schemas.text.overflowVisible'), value: TEXT_OVERFLOW_VISIBLE },\n ...(canExpandOverflow\n ? [{ label: i18n('schemas.text.overflowExpand'), value: TEXT_OVERFLOW_EXPAND }]\n : []),\n ];\n\n const textSchema: Record<string, PropPanelSchema> = {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n disabled: enableDynamicFont,\n props: { min: 0 },\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n props: { min: 0 },\n },\n formatter: getExtraFormatterSchema(i18n),\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n overflow: {\n title: i18n('schemas.text.overflow'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_TEXT_OVERFLOW,\n props: {\n options: overflowOptions,\n },\n span: 8,\n },\n useDynamicFontSize: { type: 'boolean', widget: 'UseDynamicFontSize', bind: false, span: 16 },\n dynamicFontSize: {\n type: 'object',\n widget: 'card',\n column: 3,\n properties: {\n min: {\n title: i18n('schemas.text.min'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n max: {\n title: i18n('schemas.text.max'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n fit: {\n title: i18n('schemas.text.fit'),\n type: 'string',\n widget: 'select',\n hidden: !enableDynamicFont,\n props: {\n options: [\n { label: i18n('schemas.horizontal'), value: DYNAMIC_FIT_HORIZONTAL },\n { label: i18n('schemas.vertical'), value: DYNAMIC_FIT_VERTICAL },\n ],\n },\n },\n },\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n backgroundColor: {\n title: i18n('schemas.bgColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(0.1),\n },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(),\n },\n useInlineMarkdown: {\n type: 'boolean',\n widget: 'UseInlineMarkdown',\n bind: false,\n hidden: hideTextFormat,\n span: enableInlineMarkdown ? 12 : 24,\n },\n fontVariantFallback: {\n title: i18n('schemas.text.variantFallback'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_FONT_VARIANT_FALLBACK,\n hidden: !enableInlineMarkdown,\n props: {\n options: [\n { label: i18n('schemas.text.synthetic'), value: FONT_VARIANT_FALLBACK_SYNTHETIC },\n { label: i18n('schemas.text.plain'), value: FONT_VARIANT_FALLBACK_PLAIN },\n { label: i18n('schemas.text.error'), value: FONT_VARIANT_FALLBACK_ERROR },\n ],\n },\n span: 12,\n },\n fontVariants: {\n title: i18n('schemas.text.markdownFonts'),\n type: 'object',\n widget: 'card',\n column: 2,\n hidden: !enableInlineMarkdown,\n properties: {\n bold: {\n title: i18n('schemas.text.boldFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n italic: {\n title: i18n('schemas.text.italicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n boldItalic: {\n title: i18n('schemas.text.boldItalicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n code: {\n title: i18n('schemas.text.codeFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n },\n },\n };\n\n return textSchema;\n },\n widgets: { UseDynamicFontSize, UseInlineMarkdown },\n defaultSchema: {\n name: '',\n type: 'text',\n content: 'Type Something...',\n position: { x: 0, y: 0 },\n width: 45,\n height: 10,\n // If the value of \"rotate\" is set to undefined or not set at all, rotation will be disabled in the UI.\n // Check this document: https://pdfme.com//docs/custom-schemas#learning-how-to-create-from-pdfmeschemas-code\n rotate: 0,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: DEFAULT_VERTICAL_ALIGNMENT,\n fontSize: DEFAULT_FONT_SIZE,\n textFormat: DEFAULT_TEXT_FORMAT,\n overflow: DEFAULT_TEXT_OVERFLOW,\n fontVariantFallback: DEFAULT_FONT_VARIANT_FALLBACK,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n dynamicFontSize: undefined,\n fontColor: DEFAULT_FONT_COLOR,\n fontName: undefined,\n backgroundColor: '',\n borderColor: '#000000',\n borderWidth: createBoxDimension(0),\n padding: createBoxDimension(0),\n opacity: DEFAULT_OPACITY,\n strikethrough: false,\n underline: false,\n },\n};\n","import type * as CSS from 'csstype';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n UIRenderProps,\n getDefaultFont,\n getInternalLinkTarget,\n mm2pt,\n normalizeLinkHref,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n PLACEHOLDER_FONT_COLOR,\n CODE_BACKGROUND_COLOR,\n CODE_HORIZONTAL_PADDING,\n SYNTHETIC_BOLD_CSS_TEXT_SHADOW,\n TEXT_FORMAT_INLINE_MARKDOWN,\n ALIGN_JUSTIFY,\n} from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n getBrowserVerticalFontAdjustments,\n isFirefox,\n splitTextToSize,\n wrapTextToSize,\n widthOfTextAtSize,\n} from './helper.js';\nimport { getLineAlignment, splitGraphemes, type WrapLine } from './wrap.js';\nimport { parseInlineMarkdown, stripInlineMarkdown } from './inlineMarkdown.js';\nimport { applyTextLineRange, plainTextLinesToValue } from './measure.js';\nimport { shouldUseDynamicFontSize } from './overflow.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n layoutRichTextLines,\n resolveRichTextRuns,\n} from './richText.js';\nimport { isEditable } from '../utils.js';\nimport { getTextLineRange } from '../splitRange.js';\nimport { getBoxContentArea, getBoxInsets, hasBoxDimension } from '../box.js';\n\nconst replaceUnsupportedChars = (text: string, fontKitFont: FontKitFont): string => {\n const charSupportCache: { [char: string]: boolean } = {};\n\n const isCharSupported = (char: string): boolean => {\n if (char in charSupportCache) {\n return charSupportCache[char];\n }\n const isSupported = fontKitFont.hasGlyphForCodePoint(char.codePointAt(0) || 0);\n charSupportCache[char] = isSupported;\n return isSupported;\n };\n\n const segments = text.split(/(\\r\\n|\\n|\\r)/);\n\n return segments\n .map((segment) => {\n if (/\\r\\n|\\n|\\r/.test(segment)) {\n return segment;\n }\n\n return Array.from(segment)\n .map((char) => {\n if (/\\s/.test(char) || char.charCodeAt(0) < 32) {\n return char;\n }\n\n return isCharSupported(char) ? char : '〿';\n })\n .join('');\n })\n .join('');\n};\n\nexport const uiRender = async (arg: UIRenderProps<TextSchema>) => {\n const {\n value,\n schema,\n basePdf,\n mode,\n onChange,\n stopEditing,\n tabIndex,\n placeholder,\n options,\n _cache,\n } = arg;\n const hasInlineMarkdownFormat = schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const isReadOnlySplitInlineMarkdownFormChunk =\n mode === 'form' && Boolean(getTextLineRange(schema)) && hasInlineMarkdownFormat;\n const renderInlineMarkdownReadOnlyChunk =\n enableInlineMarkdown || isReadOnlySplitInlineMarkdownFormChunk;\n const editable = isEditable(mode, schema) && !isReadOnlySplitInlineMarkdownFormChunk;\n const usePlaceholder = editable && placeholder && !value;\n const getText = (element: HTMLDivElement) => {\n let text = element.innerText;\n if (text.endsWith('\\n')) {\n // contenteditable adds additional newline char retrieved with innerText\n text = text.slice(0, -1);\n }\n return text;\n };\n const font = options?.font || getDefaultFont();\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, import('fontkit').Font>,\n );\n const enableDynamicFontSize = shouldUseDynamicFontSize(schema, basePdf);\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && enableDynamicFontSize\n ? await calculateDynamicRichTextFontSize({\n value: usePlaceholder ? (placeholder as string) : value,\n schema,\n font,\n _cache,\n })\n : undefined;\n const resolvedPlainFontSize =\n !enableInlineMarkdown && enableDynamicFontSize && (usePlaceholder ? placeholder : displayValue)\n ? calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value: usePlaceholder ? (placeholder as string) : displayValue,\n })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE);\n const useComputedWrapLines = !editable;\n const textBlock = buildStyledTextContainer(\n isReadOnlySplitInlineMarkdownFormChunk ? { ...arg, mode: 'viewer' } : arg,\n fontKitFont,\n usePlaceholder ? placeholder : displayValue,\n dynamicRichTextFontSize ?? resolvedPlainFontSize,\n { useComputedWrapLines },\n );\n\n const processedText = replaceUnsupportedChars(\n getRangedPlainTextValue({\n value,\n schema,\n fontKitFont,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n }),\n fontKitFont,\n );\n\n if (!editable) {\n if (renderInlineMarkdownReadOnlyChunk) {\n await renderInlineMarkdownReadOnly({\n textBlock,\n value,\n schema,\n font,\n _cache,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n });\n return;\n }\n\n renderReadOnlyPlainLines({\n textBlock,\n lines: applyTextLineRange(\n wrapTextToSize({\n value,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n fontKitFont,\n boxWidthInPt: mm2pt(getBoxContentArea(schema).width),\n }),\n getTextLineRange(schema),\n ),\n fontKitFont,\n fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n boxWidthInPt: mm2pt(getBoxContentArea(schema).width),\n });\n return;\n }\n\n makeElementPlainTextContentEditable(textBlock);\n textBlock.tabIndex = tabIndex || 0;\n textBlock.innerText = mode === 'designer' ? value : processedText;\n textBlock.addEventListener('blur', (e: Event) => {\n if (onChange) onChange({ key: 'content', value: getText(e.target as HTMLDivElement) });\n if (stopEditing) stopEditing();\n });\n\n if (enableDynamicFontSize) {\n let dynamicFontSize: undefined | number = undefined;\n\n textBlock.addEventListener('keyup', () => {\n setTimeout(() => {\n // Use a regular function instead of an async one since we don't need await\n (() => {\n if (!textBlock.textContent) return;\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value: isInlineMarkdownTextSchema(schema)\n ? stripInlineMarkdown(getText(textBlock))\n : getText(textBlock),\n startingFontSize: dynamicFontSize,\n });\n textBlock.style.fontSize = `${dynamicFontSize}pt`;\n\n const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n textBlock.style.paddingTop = `${newTopAdj}px`;\n textBlock.style.marginBottom = `${newBottomAdj}px`;\n })();\n }, 0);\n });\n }\n\n if (usePlaceholder) {\n textBlock.style.color = PLACEHOLDER_FONT_COLOR;\n textBlock.addEventListener('focus', () => {\n if (textBlock.innerText === placeholder) {\n textBlock.innerText = '';\n textBlock.style.color = schema.fontColor ?? DEFAULT_FONT_COLOR;\n }\n });\n }\n\n if (mode === 'designer') {\n setTimeout(() => {\n textBlock.focus();\n // Set the focus to the end of the editable element when you focus, as we would for a textarea\n const selection = window.getSelection();\n const range = document.createRange();\n if (selection && range) {\n range.selectNodeContents(textBlock);\n range.collapse(false); // Collapse range to the end\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n};\n\nconst renderInlineMarkdownReadOnly = async (arg: {\n textBlock: HTMLDivElement;\n value: string;\n schema: TextSchema;\n font: NonNullable<UIRenderProps<TextSchema>['options']['font']>;\n _cache: Map<string | number, unknown>;\n fontSize: number;\n}) => {\n const { textBlock, value, schema, font, _cache, fontSize } = arg;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const alignment = schema.alignment ?? DEFAULT_ALIGNMENT;\n const boxWidthInPt = mm2pt(getBoxContentArea(schema).width);\n const runs = await resolveRichTextRuns({\n runs: parseInlineMarkdown(value),\n schema,\n font,\n _cache,\n });\n const lines = applyTextLineRange(\n layoutRichTextLines({\n runs,\n fontSize,\n characterSpacing,\n boxWidthInPt,\n }),\n getTextLineRange(schema),\n );\n\n textBlock.innerHTML = '';\n lines.forEach((line, lineIndex) => {\n const lineEl = document.createElement('span');\n lineEl.dataset.pdfmeWrapLine = '';\n lineEl.style.whiteSpace = 'pre';\n const stripTrailingLetterSpacing = applySharedWrapLineSpacing(\n lineEl,\n {\n text: line.runs.map((run) => run.text).join(''),\n width: line.width,\n hardBreak: line.hardBreak,\n },\n alignment,\n boxWidthInPt,\n characterSpacing,\n );\n\n line.runs.forEach((run) => {\n appendInlineMarkdownRun({ parent: lineEl, run, schema, font });\n });\n if (stripTrailingLetterSpacing) {\n stripLineEndLetterSpacing(lineEl);\n }\n\n textBlock.appendChild(lineEl);\n if (lineIndex < lines.length - 1) {\n textBlock.appendChild(document.createTextNode('\\n'));\n }\n });\n};\n\nconst appendInlineMarkdownRun = (arg: {\n parent: HTMLElement;\n run: Awaited<ReturnType<typeof resolveRichTextRuns>>[number];\n schema: TextSchema;\n font: NonNullable<UIRenderProps<TextSchema>['options']['font']>;\n}) => {\n const { parent, run, schema, font } = arg;\n const href = run.href ? normalizeLinkHref(run.href) : undefined;\n const span = href ? document.createElement('a') : document.createElement('span');\n const processedText = replaceUnsupportedChars(run.text, run.fontKitFont);\n const textDecorations: string[] = [];\n\n span.textContent = processedText;\n if (href) {\n const anchor = span as HTMLAnchorElement;\n anchor.href = href;\n if (!getInternalLinkTarget(href)) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n }\n textDecorations.push('underline');\n }\n if (run.fontName) {\n span.style.fontFamily = `'${run.fontName}'`;\n }\n if (run.syntheticBold) {\n span.style.fontWeight = '800';\n span.style.textShadow = SYNTHETIC_BOLD_CSS_TEXT_SHADOW;\n }\n if (run.syntheticItalic) {\n span.style.fontStyle = 'italic';\n }\n if (run.strikethrough) {\n textDecorations.push('line-through');\n }\n if (textDecorations.length > 0) {\n span.style.textDecoration = textDecorations.join(' ');\n }\n if (run.code) {\n span.style.backgroundColor = CODE_BACKGROUND_COLOR;\n span.style.borderRadius = '2px';\n span.style.padding = `0 ${CODE_HORIZONTAL_PADDING}pt`;\n if (!schema.fontVariants?.code || !font[schema.fontVariants.code]) {\n span.style.fontFamily = run.fontName ? `'${run.fontName}', monospace` : 'monospace';\n }\n }\n parent.appendChild(span);\n};\n\nconst applySharedWrapLineSpacing = (\n lineEl: HTMLElement,\n line: { text: string; width: number; hardBreak: boolean },\n alignment: string,\n boxWidthInPt: number,\n characterSpacing: number,\n) => {\n const { extraLetterSpacing } = getLineAlignment(line, boxWidthInPt, alignment);\n const stripTrailingLetterSpacing = !(alignment === ALIGN_JUSTIFY && !line.hardBreak);\n if (!stripTrailingLetterSpacing && extraLetterSpacing !== 0) {\n lineEl.style.letterSpacing = `${characterSpacing + extraLetterSpacing}pt`;\n }\n return stripTrailingLetterSpacing;\n};\n\nconst stripLineEndLetterSpacing = (lineEl: HTMLElement) => {\n let node: ChildNode | null = lineEl.lastChild;\n while (node && (node.nodeType !== Node.ELEMENT_NODE || !node.textContent)) {\n node = node.previousSibling;\n }\n if (!node || node.nodeType !== Node.ELEMENT_NODE) return;\n\n const el = node as HTMLElement;\n const graphemes = splitGraphemes(el.textContent ?? '');\n if (graphemes.length === 0) return;\n if (graphemes.length === 1) {\n el.style.letterSpacing = '0';\n return;\n }\n\n el.textContent = graphemes.slice(0, -1).join('');\n const tail = document.createElement('span');\n tail.textContent = graphemes[graphemes.length - 1];\n tail.style.letterSpacing = '0';\n el.appendChild(tail);\n};\n\nconst renderReadOnlyPlainLines = (arg: {\n textBlock: HTMLDivElement;\n lines: WrapLine[];\n fontKitFont: FontKitFont;\n fontSize: number;\n characterSpacing: number;\n alignment: string;\n boxWidthInPt: number;\n}) => {\n const { textBlock, lines, fontKitFont, fontSize, characterSpacing, alignment, boxWidthInPt } =\n arg;\n textBlock.innerHTML = '';\n\n lines.forEach((line, lineIndex) => {\n const lineEl = document.createElement('span');\n lineEl.dataset.pdfmeWrapLine = '';\n lineEl.style.whiteSpace = 'pre';\n const displayText = replaceUnsupportedChars(line.text, fontKitFont);\n\n const textWidth = widthOfTextAtSize(line.text, fontKitFont, fontSize, characterSpacing);\n const stripTrailingLetterSpacing = applySharedWrapLineSpacing(\n lineEl,\n { text: line.text, width: textWidth, hardBreak: line.hardBreak },\n alignment,\n boxWidthInPt,\n characterSpacing,\n );\n\n const graphemes = splitGraphemes(displayText);\n graphemes.forEach((grapheme, index) => {\n const span = document.createElement('span');\n span.textContent = grapheme;\n // PDF `setCharacterSpacing` applies Tc after every grapheme, including\n // the last. Zeroing the last glyph is only for ordinary characterSpacing\n // so browsers do not count a trailing gap when wrapping.\n if (index === graphemes.length - 1 && stripTrailingLetterSpacing) {\n span.style.letterSpacing = '0';\n }\n lineEl.appendChild(span);\n });\n\n textBlock.appendChild(lineEl);\n // Join with a real newline so `pre` paints one visual line per wrap line\n // and `textContent` keeps paragraph breaks. Do not suffix facade `\\n`\n // characters — that would add an extra blank line after each paragraph.\n if (lineIndex < lines.length - 1) {\n textBlock.appendChild(document.createTextNode('\\n'));\n }\n });\n};\n\nconst getRangedPlainTextValue = (arg: {\n value: string;\n schema: TextSchema;\n fontKitFont: FontKitFont;\n fontSize: number;\n}) => {\n const { value, schema, fontKitFont, fontSize } = arg;\n const lineRange = getTextLineRange(schema);\n if (!lineRange) return value;\n\n const lines = applyTextLineRange(\n splitTextToSize({\n value,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n fontKitFont,\n boxWidthInPt: mm2pt(getBoxContentArea(schema).width),\n }),\n lineRange,\n );\n return plainTextLinesToValue(lines);\n};\n\nexport const buildStyledTextContainer = (\n arg: UIRenderProps<TextSchema>,\n fontKitFont: FontKitFont,\n value: string,\n resolvedDynamicFontSize?: number,\n display?: { useComputedWrapLines?: boolean },\n) => {\n const { schema, rootElement, mode } = arg;\n\n let dynamicFontSize: undefined | number = resolvedDynamicFontSize;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const editable = isEditable(mode, schema);\n // `pre` + left-for-justify is for read-only displays whose wrap-engine\n // lines are already computed (plain text and inline Markdown). Live Form /\n // Designer editing keeps `pre-wrap` so caret / IME stay native.\n const useComputedWrapLines = display?.useComputedWrapLines ?? !editable;\n\n if (dynamicFontSize === undefined && shouldUseDynamicFontSize(schema, arg.basePdf) && value) {\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value,\n startingFontSize: dynamicFontSize,\n });\n }\n\n // Depending on vertical alignment, we need to move the top or bottom of the font to keep\n // it within it's defined box and align it with the generated pdf.\n const { topAdj, bottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n\n const topAdjustment = topAdj.toString();\n const bottomAdjustment = bottomAdj.toString();\n const verticalAlignment = schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT;\n const isTopAligned = verticalAlignment === VERTICAL_ALIGN_TOP;\n\n const container = document.createElement('div');\n const { borderWidth, padding } = getBoxInsets(schema);\n const hasPadding = hasBoxDimension(schema.padding);\n const hasBorder = Boolean(schema.borderColor && hasBoxDimension(schema.borderWidth));\n\n const containerStyle: CSS.Properties = {\n padding: hasPadding\n ? `${padding.top}mm ${padding.right}mm ${padding.bottom}mm ${padding.left}mm`\n : 0,\n resize: 'none',\n backgroundColor: getBackgroundColor(schema),\n border: hasBorder ? undefined : 'none',\n ...(hasBorder\n ? {\n borderTopWidth: `${borderWidth.top}mm`,\n borderRightWidth: `${borderWidth.right}mm`,\n borderBottomWidth: `${borderWidth.bottom}mm`,\n borderLeftWidth: `${borderWidth.left}mm`,\n borderStyle: 'solid',\n borderColor: schema.borderColor,\n }\n : {}),\n ...(hasPadding || hasBorder ? { boxSizing: 'border-box' } : {}),\n display: 'flex',\n flexDirection: 'column',\n justifyContent: mapVerticalAlignToFlex(verticalAlignment),\n width: '100%',\n height: '100%',\n cursor: editable ? 'text' : 'default',\n };\n Object.assign(container.style, containerStyle);\n rootElement.innerHTML = '';\n rootElement.appendChild(container);\n\n // text decoration\n const textDecorations = [];\n if (schema.strikethrough) textDecorations.push('line-through');\n if (schema.underline) textDecorations.push('underline');\n\n const alignment = schema.alignment ?? DEFAULT_ALIGNMENT;\n const textBlockStyle: CSS.Properties = {\n // Font formatting styles\n fontFamily: schema.fontName ? `'${schema.fontName}'` : 'inherit',\n color: schema.fontColor ? schema.fontColor : DEFAULT_FONT_COLOR,\n fontSize: `${dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE}pt`,\n letterSpacing: `${characterSpacing}pt`,\n lineHeight: `${schema.lineHeight ?? DEFAULT_LINE_HEIGHT}em`,\n // Read-only Viewer paints wrap-engine lines with `pre`. CSS justify would\n // fight the PDF grapheme-count letter-spacing applied per soft line.\n textAlign: useComputedWrapLines && alignment === ALIGN_JUSTIFY ? 'left' : alignment,\n whiteSpace: useComputedWrapLines ? 'pre' : 'pre-wrap',\n wordBreak: useComputedWrapLines ? 'normal' : 'break-word',\n // Block layout styles\n resize: 'none',\n border: 'none',\n outline: 'none',\n marginBottom: `${bottomAdjustment}px`,\n paddingTop: `${topAdjustment}px`,\n backgroundColor: 'transparent',\n textDecoration: textDecorations.join(' '),\n // Browsers include the final letter-spacing in editable text wrapping, unlike PDF rendering.\n ...(editable && characterSpacing > 0 ? { width: `calc(100% + ${characterSpacing}pt)` } : {}),\n ...(isTopAligned ? { height: '100%' } : {}),\n };\n\n const textBlock = document.createElement('div');\n textBlock.id = 'text-' + String(schema.id);\n Object.assign(textBlock.style, textBlockStyle);\n\n container.appendChild(textBlock);\n\n return textBlock;\n};\n\n/**\n * Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.\n * This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.\n */\nexport const makeElementPlainTextContentEditable = (element: HTMLElement) => {\n if (!isFirefox()) {\n element.contentEditable = 'plaintext-only';\n return;\n }\n\n element.contentEditable = 'true';\n element.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n document.execCommand('insertLineBreak', false, undefined);\n }\n });\n\n element.addEventListener('paste', (e: ClipboardEvent) => {\n e.preventDefault();\n const paste = e.clipboardData?.getData('text');\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n selection.deleteFromDocument();\n selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));\n selection.collapseToEnd();\n });\n};\n\nexport const mapVerticalAlignToFlex = (verticalAlignmentValue: string | undefined) => {\n switch (verticalAlignmentValue) {\n case VERTICAL_ALIGN_TOP:\n return 'flex-start';\n case VERTICAL_ALIGN_MIDDLE:\n return 'center';\n case VERTICAL_ALIGN_BOTTOM:\n return 'flex-end';\n }\n return 'flex-start';\n};\n\nconst getBackgroundColor = (schema: { backgroundColor?: string }) => {\n if (!schema.backgroundColor) return 'transparent';\n return schema.backgroundColor;\n};\n","import type { Plugin } from '@pdfme/common';\nimport { pdfRender } from './pdfRender.js';\nimport { propPanel } from './propPanel.js';\nimport { uiRender } from './uiRender.js';\nimport type { TextSchema } from './types.js';\nimport { TextCursorInput } from 'lucide';\nimport { createSvgStr } from '../utils.js';\n\nconst textSchema: Plugin<TextSchema> = {\n pdf: pdfRender,\n ui: uiRender,\n propPanel,\n icon: createSvgStr(TextCursorInput),\n};\n\nexport default textSchema;\n","import text from './text/index.js';\n\n// The default built-in plugin surface is intentionally limited to text.\n// Generator/UI consumers that need image, barcode, table, or other schema types\n// must import and pass those plugins explicitly from `@pdfme/schemas`.\nconst builtInPlugins = { Text: text };\n\nexport { builtInPlugins };\n"],"mappings":"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"}
|
package/dist/builtins.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as builtInPlugins } from "./builtins-
|
|
1
|
+
import { t as builtInPlugins } from "./builtins-C-2wyB_3.js";
|
|
2
2
|
export { builtInPlugins };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { D as getBoxContentArea, E as createBoxDimension, L as CODE_BACKGROUND_COLOR, V as DEFAULT_FONT_COLOR, X as PLACEHOLDER_FONT_COLOR, Z as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, a as createListItemSplitRange, c as getListItemRange, g as getFontKitFont, i as TEXT_LINE_SPLIT_UNIT, it as VERTICAL_ALIGN_MIDDLE, l as getTableBodyRange, n as LIST_ITEM_SPLIT_UNIT, o as createTableBodySplitRange, r as TABLE_BODY_SPLIT_UNIT, s as createTextLineSplitRange, t as BUILT_IN_DYNAMIC_LAYOUT_SPLIT_UNITS, u as getTextLineRange, z as DEFAULT_ALIGNMENT } from "./splitRange-B6311Noc.js";
|
|
2
2
|
import { a as measureTextLines, f as resolveFontVariant, h as parseInlineMarkdown, u as isInlineMarkdownTextSchema } from "./measure-BarlRI1L.js";
|
|
3
|
-
import { a as mapVerticalAlignToFlex, c as Formatter, d as embedAndGetFont, i as makeElementPlainTextContentEditable, l as getExtraFormatterSchema, n as textSchema, o as uiRender$4, r as buildStyledTextContainer, s as propPanel$3, t as builtInPlugins, u as pdfRender$4 } from "./builtins-
|
|
3
|
+
import { a as mapVerticalAlignToFlex, c as Formatter, d as embedAndGetFont, i as makeElementPlainTextContentEditable, l as getExtraFormatterSchema, n as textSchema, o as uiRender$4, r as buildStyledTextContainer, s as propPanel$3, t as builtInPlugins, u as pdfRender$4 } from "./builtins-C-2wyB_3.js";
|
|
4
4
|
import { a as getCellPropPanelSchema, c as HEX_COLOR_PATTERN, i as getBodyWithSchemaRange, l as createSingleTable, n as getDynamicLayoutForTable, o as getColumnStylesPropPanelSchema, r as getBody, s as getDefaultCellStyles, t as getDynamicHeightsForTable } from "./dynamicTemplate-DkTVIMNr.js";
|
|
5
|
-
import { c as isEditable, d as
|
|
5
|
+
import { c as isEditable, d as rotatePoint, f as countUniqueVariableNames, i as createSvgStr, l as readFile, m as visitVariables, n as convertForPdfLayoutProps, o as hex2PrintingColor, p as getVariableNames, r as createErrorElm, t as addAlphaToHex, u as rgbColorToCmykColor } from "./utils-CPYF2FY_.js";
|
|
6
6
|
import { a as normalizeListItems, c as LIST_STYLE_BULLET, i as normalizeListItemEntries, l as LIST_STYLE_ORDERED, n as calculateListLayout, o as serializeListItems, s as DEFAULT_LIST_STYLE, t as getDynamicLayoutForList } from "./dynamicTemplate-CcnCXHfM.js";
|
|
7
7
|
import { i as validateVariables, n as substituteVariables, r as substituteVariablesAsInlineMarkdownLiterals, t as resolveReadOnlyMultiVariableText } from "./helper-BR4_UZA5.js";
|
|
8
8
|
import "./tables.js";
|
|
@@ -2214,12 +2214,17 @@ var svgSchema = {
|
|
|
2214
2214
|
_cache
|
|
2215
2215
|
})])) : [];
|
|
2216
2216
|
const fonts = fontEntries.length > 0 ? Object.fromEntries(fontEntries) : void 0;
|
|
2217
|
+
const mapColor = options.colorType?.toLowerCase() === "cmyk" ? ({ parsed }) => ({
|
|
2218
|
+
color: rgbColorToCmykColor(parsed.rgb),
|
|
2219
|
+
alpha: parsed.alpha
|
|
2220
|
+
}) : void 0;
|
|
2217
2221
|
await page.drawSvg(value, {
|
|
2218
2222
|
x,
|
|
2219
2223
|
y: y + height,
|
|
2220
2224
|
width,
|
|
2221
2225
|
height,
|
|
2222
|
-
fonts
|
|
2226
|
+
fonts,
|
|
2227
|
+
mapColor
|
|
2223
2228
|
});
|
|
2224
2229
|
},
|
|
2225
2230
|
propPanel: {
|