@pdfme/schemas 6.1.13 → 6.2.0-dev.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/barcodes/helper.d.ts +17 -2
  2. package/dist/{builtins-8En4EIAG.js → builtins-C-2wyB_3.js} +140 -83
  3. package/dist/builtins-C-2wyB_3.js.map +1 -0
  4. package/dist/builtins.js +1 -1
  5. package/dist/dynamicLayout.js +4 -4
  6. package/dist/{dynamicTemplate-DQF7c6NR.js → dynamicTemplate-CcnCXHfM.js} +2 -2
  7. package/dist/{dynamicTemplate-DQF7c6NR.js.map → dynamicTemplate-CcnCXHfM.js.map} +1 -1
  8. package/dist/{dynamicTemplate-DFk_de1Y.js → dynamicTemplate-DEwOv_DE.js} +7 -6
  9. package/dist/dynamicTemplate-DEwOv_DE.js.map +1 -0
  10. package/dist/{dynamicTemplate-CnK0nlnj.js → dynamicTemplate-DkTVIMNr.js} +2 -2
  11. package/dist/{dynamicTemplate-CnK0nlnj.js.map → dynamicTemplate-DkTVIMNr.js.map} +1 -1
  12. package/dist/graphics/image.d.ts +26 -1
  13. package/dist/graphics/orientation.d.ts +31 -0
  14. package/dist/{helper-VroN19Ci.js → helper-BR4_UZA5.js} +26 -3
  15. package/dist/helper-BR4_UZA5.js.map +1 -0
  16. package/dist/index.js +676 -142
  17. package/dist/index.js.map +1 -1
  18. package/dist/lists.js +2 -2
  19. package/dist/{measure-BC7tjAtT.js → measure-BarlRI1L.js} +71 -227
  20. package/dist/measure-BarlRI1L.js.map +1 -0
  21. package/dist/multiVariableText/helper.d.ts +8 -0
  22. package/dist/multiVariableText/types.d.ts +2 -0
  23. package/dist/pdfFont.d.ts +8 -0
  24. package/dist/splitRange-B6311Noc.js +10854 -0
  25. package/dist/splitRange-B6311Noc.js.map +1 -0
  26. package/dist/tables.js +2 -2
  27. package/dist/text/helper.d.ts +33 -1
  28. package/dist/text/lineBreak.d.ts +69 -0
  29. package/dist/text/lineBreakClasses.generated.d.ts +11 -0
  30. package/dist/text/richText.d.ts +2 -0
  31. package/dist/text/uiRender.d.ts +3 -1
  32. package/dist/text/wrap.d.ts +67 -0
  33. package/dist/texts.js +3 -3
  34. package/dist/{utils-D_sFXK0U.js → utils-CPYF2FY_.js} +18 -15
  35. package/dist/utils-CPYF2FY_.js.map +1 -0
  36. package/dist/utils.d.ts +3 -2
  37. package/dist/utils.js +3 -3
  38. package/package.json +3 -1
  39. package/dist/builtins-8En4EIAG.js.map +0 -1
  40. package/dist/dynamicTemplate-DFk_de1Y.js.map +0 -1
  41. package/dist/helper-VroN19Ci.js.map +0 -1
  42. package/dist/measure-BC7tjAtT.js.map +0 -1
  43. package/dist/splitRange-BHV0vb0Q.js +0 -504
  44. package/dist/splitRange-BHV0vb0Q.js.map +0 -1
  45. package/dist/utils-D_sFXK0U.js.map +0 -1
@@ -9,7 +9,19 @@ export declare const barCodeType2Bcid: (type: BarcodeTypes) => "code128" | "code
9
9
  * Strip hash from the beginning of HTML hex color codes for the bwip.js lib
10
10
  */
11
11
  export declare const mapHexColorForBwipJsLib: (color: string | undefined, fallback?: string) => string;
12
- export declare const createBarCode: (arg: {
12
+ /**
13
+ * Barcode colors historically accept bwip-js style hex without a leading '#';
14
+ * CSS and pdfme's color utils require the '#', so add it when missing.
15
+ */
16
+ export declare const ensureHexColorHash: (color: string | undefined) => string | undefined;
17
+ export type BarcodeRenderRuntime = 'document-canvas' | 'offscreencanvas' | 'node-buffer';
18
+ /**
19
+ * Pick a barcode renderer from capabilities, not `typeof window`.
20
+ * Browser Workers have neither `window` nor Node's `bwip-js.toBuffer()`.
21
+ * OffscreenCanvas without `toCanvas()` (Node bwip-js export) falls back to `toBuffer()`.
22
+ */
23
+ export declare const resolveBarcodeRenderRuntime: () => BarcodeRenderRuntime;
24
+ type CreateBarCodeArg = {
13
25
  type: BarcodeTypes;
14
26
  input: string;
15
27
  width: number;
@@ -18,4 +30,7 @@ export declare const createBarCode: (arg: {
18
30
  barColor?: string;
19
31
  textColor?: string;
20
32
  includetext?: boolean;
21
- }) => Promise<Buffer>;
33
+ };
34
+ export declare const createBarCodeSvg: (arg: CreateBarCodeArg) => string;
35
+ export declare const createBarCode: (arg: CreateBarCodeArg) => Promise<Buffer>;
36
+ export {};
@@ -1,7 +1,7 @@
1
- import { $ as VERTICAL_ALIGN_MIDDLE, A as ALIGN_RIGHT, B as DYNAMIC_FIT_VERTICAL, C as getBoxInsets, D as ALIGN_CENTER, E as hasBoxDimension, F as DEFAULT_FONT_COLOR, G as PLACEHOLDER_FONT_COLOR, H as FONT_VARIANT_FALLBACK_ERROR, I as DEFAULT_FONT_VARIANT_FALLBACK, J as TEXT_FORMAT_INLINE_MARKDOWN, K as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, L as DEFAULT_TEXT_FORMAT, M as CODE_HORIZONTAL_PADDING, N as DEFAULT_ALIGNMENT, O as ALIGN_JUSTIFY, P as DEFAULT_DYNAMIC_FIT, Q as VERTICAL_ALIGN_BOTTOM, R as DEFAULT_TEXT_OVERFLOW, S as getBoxDimensionPropPanelSchema, U as FONT_VARIANT_FALLBACK_PLAIN, W as FONT_VARIANT_FALLBACK_SYNTHETIC, X as TEXT_OVERFLOW_EXPAND, Y as TEXT_FORMAT_PLAIN, Z as TEXT_OVERFLOW_VISIBLE, _ as isFirefox, b as createBoxDimension, d as calculateDynamicFontSize, f as fetchRemoteFontData, g as heightOfFontAtSize, h as getFontKitFont, j as CODE_BACKGROUND_COLOR, m as getFontDescentInPt, p as getBrowserVerticalFontAdjustments, q as SYNTHETIC_BOLD_OFFSET_RATIO, u as getTextLineRange, v as splitTextToSize, x as getBoxContentArea, y as widthOfTextAtSize, z as DYNAMIC_FIT_HORIZONTAL } from "./splitRange-BHV0vb0Q.js";
2
- import { _ as stripInlineMarkdown, d as isInlineMarkdownTextSchema, f as layoutRichTextLines, g as parseInlineMarkdown, l as calculateDynamicRichTextFontSize, m as resolveRichTextRuns, s as plainTextLinesToValue, t as applyTextLineRange, u as countRichTextLineGraphemes } from "./measure-BC7tjAtT.js";
3
- import { c as HEX_COLOR_PATTERN } from "./dynamicTemplate-CnK0nlnj.js";
4
- import { c as isEditable, i as createSvgStr, n as convertForPdfLayoutProps, o as hex2PrintingColor, u as rotatePoint } from "./utils-D_sFXK0U.js";
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
+ 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
+ import { c as HEX_COLOR_PATTERN } from "./dynamicTemplate-DkTVIMNr.js";
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";
@@ -206,7 +206,6 @@ var renderInlineMarkdownText = async (arg) => {
206
206
  });
207
207
  const lineRange = getTextLineRange(schema);
208
208
  const lines = applyTextLineRange(allLines, lineRange);
209
- const lineRangeStart = lineRange?.start ?? 0;
210
209
  const pdfFontObj = await embedFontsForRuns(lines.flatMap((line) => line.runs), embedPdfFont);
211
210
  const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);
212
211
  const descent = getFontDescentInPt(fontKitFont, fontSize);
@@ -220,18 +219,14 @@ var renderInlineMarkdownText = async (arg) => {
220
219
  }
221
220
  lines.forEach((line, rowIndex) => {
222
221
  if (line.runs.length === 0) return;
223
- let textWidth = line.width;
224
- let spacing = characterSpacing;
225
- if (alignment === "justify" && !line.hardBreak && lineRangeStart + rowIndex < allLines.length - 1) {
226
- const graphemeCount = countRichTextLineGraphemes(line);
227
- if (graphemeCount > 0) {
228
- spacing += (width - textWidth) / graphemeCount;
229
- textWidth = width;
230
- }
231
- }
232
- let xLine = x;
233
- if (alignment === "center") xLine += (width - textWidth) / 2;
234
- else if (alignment === "right") xLine += width - textWidth;
222
+ const alignmentMetrics = getLineAlignment({
223
+ text: line.runs.map((run) => run.text).join(""),
224
+ width: line.width,
225
+ hardBreak: line.hardBreak
226
+ }, width, alignment);
227
+ const textWidth = alignmentMetrics.usedWidth;
228
+ const spacing = characterSpacing + alignmentMetrics.extraLetterSpacing;
229
+ const xLine = x + alignmentMetrics.x;
235
230
  const yLine = y + height - yOffset - lineHeight * fontSize * rowIndex;
236
231
  page.pushOperators(pdfLib.setCharacterSpacing(spacing));
237
232
  if (schema.strikethrough || schema.underline) {
@@ -316,8 +311,8 @@ var canUseTextOverflowExpand = (schema, basePdf) => !isTextOverflowExpandSchema(
316
311
  var isTextOverflowExpand = (schema, basePdf) => canUseTextOverflowExpand(schema, basePdf) && schema.overflow === "expand";
317
312
  var shouldUseDynamicFontSize = (schema, basePdf) => Boolean(schema.dynamicFontSize) && !isTextOverflowExpand(schema, basePdf);
318
313
  //#endregion
319
- //#region src/text/pdfRender.ts
320
- var PDF_FONT_CACHE_KEY = "text-pdf-font-cache";
314
+ //#region src/pdfFont.ts
315
+ var PDF_FONT_CACHE_KEY = "schemas-pdf-font-cache";
321
316
  var getPdfFontCache = (_cache) => {
322
317
  let pdfFontCache = _cache.get(PDF_FONT_CACHE_KEY);
323
318
  if (!pdfFontCache) {
@@ -341,6 +336,8 @@ var embedAndGetFont = (arg) => {
341
336
  pdfFontCache[fontName] = pdfFontPromise;
342
337
  return pdfFontPromise;
343
338
  };
339
+ //#endregion
340
+ //#region src/text/pdfRender.ts
344
341
  var getFontProp = ({ value, fontKitFont, schema, basePdf, colorType, fontSize: resolvedFontSize }) => {
345
342
  const fontSize = resolvedFontSize ?? (shouldUseDynamicFontSize(schema, basePdf) ? calculateDynamicFontSize({
346
343
  textSchema: schema,
@@ -357,11 +354,6 @@ var getFontProp = ({ value, fontKitFont, schema, basePdf, colorType, fontSize: r
357
354
  color
358
355
  };
359
356
  };
360
- var graphemeSegmenter;
361
- var getGraphemeSegmenter = () => {
362
- graphemeSegmenter ?? (graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" }));
363
- return graphemeSegmenter;
364
- };
365
357
  var pdfRender = async (arg) => {
366
358
  const { value, pdfDoc, pdfLib, page, options, schema, basePdf, _cache } = arg;
367
359
  const { font = getDefaultFont(), colorType } = options;
@@ -452,7 +444,7 @@ var pdfRender = async (arg) => {
452
444
  const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);
453
445
  const descent = getFontDescentInPt(fontKitFont, fontSize);
454
446
  const halfLineHeightAdjustment = lineHeight === 0 ? 0 : (lineHeight - 1) * fontSize / 2;
455
- const lines = applyTextLineRange(splitTextToSize({
447
+ const lines = applyTextLineRange(wrapTextToSize({
456
448
  value,
457
449
  characterSpacing,
458
450
  fontSize,
@@ -469,14 +461,17 @@ var pdfRender = async (arg) => {
469
461
  else if (verticalAlignment === "middle") yOffset = (contentHeight - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;
470
462
  }
471
463
  lines.forEach((line, rowIndex) => {
472
- const trimmed = line.replace("\n", "");
464
+ const trimmed = line.text;
473
465
  const textWidth = needsTextWidth ? widthOfTextAtSize(trimmed, fontKitFont, fontSize, characterSpacing) : 0;
474
466
  const textHeight = needsTextHeight ? heightOfFontAtSize(fontKitFont, fontSize) : 0;
475
467
  const rowYOffset = lineHeight * fontSize * rowIndex;
476
- if (line === "") line = "\r\n";
477
- let xLine = contentX;
478
- if (alignment === "center") xLine += (contentWidth - textWidth) / 2;
479
- else if (alignment === "right") xLine += contentWidth - textWidth;
468
+ const alignmentMetrics = getLineAlignment({
469
+ text: trimmed,
470
+ width: textWidth,
471
+ hardBreak: line.hardBreak
472
+ }, contentWidth, alignment);
473
+ const drawText = trimmed === "" ? "\r\n" : trimmed;
474
+ let xLine = contentX + alignmentMetrics.x;
480
475
  let yLine = contentY + contentHeight - yOffset - rowYOffset;
481
476
  if (schema.strikethrough && textWidth > 0) {
482
477
  const _x = xLine + textWidth + 1;
@@ -520,14 +515,8 @@ var pdfRender = async (arg) => {
520
515
  xLine = rotatedPoint.x;
521
516
  yLine = rotatedPoint.y;
522
517
  }
523
- let spacing = characterSpacing;
524
- if (alignment === "justify" && line.slice(-1) !== "\n") {
525
- const iterator = getGraphemeSegmenter().segment(trimmed)[Symbol.iterator]();
526
- const len = Array.from(iterator).length;
527
- spacing += (contentWidth - textWidth) / len;
528
- }
529
- page.pushOperators(pdfLib.setCharacterSpacing(spacing));
530
- page.drawText(trimmed, {
518
+ page.pushOperators(pdfLib.setCharacterSpacing(characterSpacing + alignmentMetrics.extraLetterSpacing));
519
+ page.drawText(drawText, {
531
520
  x: xLine,
532
521
  y: yLine,
533
522
  rotate,
@@ -1042,15 +1031,21 @@ var uiRender = async (arg) => {
1042
1031
  font,
1043
1032
  _cache
1044
1033
  }) : void 0;
1034
+ const resolvedPlainFontSize = !enableInlineMarkdown && enableDynamicFontSize && (usePlaceholder ? placeholder : displayValue) ? calculateDynamicFontSize({
1035
+ textSchema: schema,
1036
+ fontKitFont,
1037
+ value: usePlaceholder ? placeholder : displayValue
1038
+ }) : schema.fontSize ?? 13;
1039
+ const useComputedWrapLines = !editable;
1045
1040
  const textBlock = buildStyledTextContainer(isReadOnlySplitInlineMarkdownFormChunk ? {
1046
1041
  ...arg,
1047
1042
  mode: "viewer"
1048
- } : arg, fontKitFont, usePlaceholder ? placeholder : displayValue, dynamicRichTextFontSize);
1043
+ } : arg, fontKitFont, usePlaceholder ? placeholder : displayValue, dynamicRichTextFontSize ?? resolvedPlainFontSize, { useComputedWrapLines });
1049
1044
  const processedText = replaceUnsupportedChars(getRangedPlainTextValue({
1050
1045
  value,
1051
1046
  schema,
1052
1047
  fontKitFont,
1053
- fontSize: schema.fontSize ?? 13
1048
+ fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize
1054
1049
  }), fontKitFont);
1055
1050
  if (!editable) {
1056
1051
  if (renderInlineMarkdownReadOnlyChunk) {
@@ -1059,14 +1054,26 @@ var uiRender = async (arg) => {
1059
1054
  value,
1060
1055
  schema,
1061
1056
  font,
1062
- _cache
1057
+ _cache,
1058
+ fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize
1063
1059
  });
1064
1060
  return;
1065
1061
  }
1066
- textBlock.innerHTML = processedText.split("").map((l, i) => {
1067
- const escaped = l.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
1068
- return `<span style="letter-spacing:${String(value).length === i + 1 ? 0 : "inherit"};">${escaped}</span>`;
1069
- }).join("");
1062
+ renderReadOnlyPlainLines({
1063
+ textBlock,
1064
+ lines: applyTextLineRange(wrapTextToSize({
1065
+ value,
1066
+ characterSpacing: schema.characterSpacing ?? 0,
1067
+ fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,
1068
+ fontKitFont,
1069
+ boxWidthInPt: mm2pt(getBoxContentArea(schema).width)
1070
+ }), getTextLineRange(schema)),
1071
+ fontKitFont,
1072
+ fontSize: dynamicRichTextFontSize ?? resolvedPlainFontSize,
1073
+ characterSpacing: schema.characterSpacing ?? 0,
1074
+ alignment: schema.alignment ?? "left",
1075
+ boxWidthInPt: mm2pt(getBoxContentArea(schema).width)
1076
+ });
1070
1077
  return;
1071
1078
  }
1072
1079
  makeElementPlainTextContentEditable(textBlock);
@@ -1121,47 +1128,47 @@ var uiRender = async (arg) => {
1121
1128
  });
1122
1129
  };
1123
1130
  var renderInlineMarkdownReadOnly = async (arg) => {
1124
- const { textBlock, value, schema, font, _cache } = arg;
1131
+ const { textBlock, value, schema, font, _cache, fontSize } = arg;
1132
+ const characterSpacing = schema.characterSpacing ?? 0;
1133
+ const alignment = schema.alignment ?? "left";
1134
+ const boxWidthInPt = mm2pt(getBoxContentArea(schema).width);
1125
1135
  const runs = await resolveRichTextRuns({
1126
1136
  runs: parseInlineMarkdown(value),
1127
1137
  schema,
1128
1138
  font,
1129
1139
  _cache
1130
1140
  });
1131
- const lineRange = getTextLineRange(schema);
1132
- if (lineRange) {
1133
- const lines = applyTextLineRange(layoutRichTextLines({
1134
- runs,
1135
- fontSize: schema.fontSize ?? 13,
1136
- characterSpacing: schema.characterSpacing ?? 0,
1137
- boxWidthInPt: mm2pt(getBoxContentArea(schema).width)
1138
- }), lineRange);
1139
- textBlock.innerHTML = "";
1140
- lines.forEach((line, lineIndex) => {
1141
- line.runs.forEach((run) => {
1142
- appendInlineMarkdownRun({
1143
- textBlock,
1144
- run,
1145
- schema,
1146
- font
1147
- });
1148
- });
1149
- if (lineIndex < lines.length - 1) textBlock.appendChild(document.createElement("br"));
1150
- });
1151
- return;
1152
- }
1141
+ const lines = applyTextLineRange(layoutRichTextLines({
1142
+ runs,
1143
+ fontSize,
1144
+ characterSpacing,
1145
+ boxWidthInPt
1146
+ }), getTextLineRange(schema));
1153
1147
  textBlock.innerHTML = "";
1154
- runs.forEach((run) => {
1155
- appendInlineMarkdownRun({
1156
- textBlock,
1157
- run,
1158
- schema,
1159
- font
1148
+ lines.forEach((line, lineIndex) => {
1149
+ const lineEl = document.createElement("span");
1150
+ lineEl.dataset.pdfmeWrapLine = "";
1151
+ lineEl.style.whiteSpace = "pre";
1152
+ const stripTrailingLetterSpacing = applySharedWrapLineSpacing(lineEl, {
1153
+ text: line.runs.map((run) => run.text).join(""),
1154
+ width: line.width,
1155
+ hardBreak: line.hardBreak
1156
+ }, alignment, boxWidthInPt, characterSpacing);
1157
+ line.runs.forEach((run) => {
1158
+ appendInlineMarkdownRun({
1159
+ parent: lineEl,
1160
+ run,
1161
+ schema,
1162
+ font
1163
+ });
1160
1164
  });
1165
+ if (stripTrailingLetterSpacing) stripLineEndLetterSpacing(lineEl);
1166
+ textBlock.appendChild(lineEl);
1167
+ if (lineIndex < lines.length - 1) textBlock.appendChild(document.createTextNode("\n"));
1161
1168
  });
1162
1169
  };
1163
1170
  var appendInlineMarkdownRun = (arg) => {
1164
- const { textBlock, run, schema, font } = arg;
1171
+ const { parent, run, schema, font } = arg;
1165
1172
  const href = run.href ? normalizeLinkHref(run.href) : void 0;
1166
1173
  const span = href ? document.createElement("a") : document.createElement("span");
1167
1174
  const processedText = replaceUnsupportedChars(run.text, run.fontKitFont);
@@ -1187,10 +1194,58 @@ var appendInlineMarkdownRun = (arg) => {
1187
1194
  if (run.code) {
1188
1195
  span.style.backgroundColor = CODE_BACKGROUND_COLOR;
1189
1196
  span.style.borderRadius = "2px";
1190
- span.style.padding = "0 0.15em";
1197
+ span.style.padding = `0 ${CODE_HORIZONTAL_PADDING}pt`;
1191
1198
  if (!schema.fontVariants?.code || !font[schema.fontVariants.code]) span.style.fontFamily = run.fontName ? `'${run.fontName}', monospace` : "monospace";
1192
1199
  }
1193
- textBlock.appendChild(span);
1200
+ parent.appendChild(span);
1201
+ };
1202
+ var applySharedWrapLineSpacing = (lineEl, line, alignment, boxWidthInPt, characterSpacing) => {
1203
+ const { extraLetterSpacing } = getLineAlignment(line, boxWidthInPt, alignment);
1204
+ const stripTrailingLetterSpacing = !(alignment === "justify" && !line.hardBreak);
1205
+ if (!stripTrailingLetterSpacing && extraLetterSpacing !== 0) lineEl.style.letterSpacing = `${characterSpacing + extraLetterSpacing}pt`;
1206
+ return stripTrailingLetterSpacing;
1207
+ };
1208
+ var stripLineEndLetterSpacing = (lineEl) => {
1209
+ let node = lineEl.lastChild;
1210
+ while (node && (node.nodeType !== Node.ELEMENT_NODE || !node.textContent)) node = node.previousSibling;
1211
+ if (!node || node.nodeType !== Node.ELEMENT_NODE) return;
1212
+ const el = node;
1213
+ const graphemes = splitGraphemes(el.textContent ?? "");
1214
+ if (graphemes.length === 0) return;
1215
+ if (graphemes.length === 1) {
1216
+ el.style.letterSpacing = "0";
1217
+ return;
1218
+ }
1219
+ el.textContent = graphemes.slice(0, -1).join("");
1220
+ const tail = document.createElement("span");
1221
+ tail.textContent = graphemes[graphemes.length - 1];
1222
+ tail.style.letterSpacing = "0";
1223
+ el.appendChild(tail);
1224
+ };
1225
+ var renderReadOnlyPlainLines = (arg) => {
1226
+ const { textBlock, lines, fontKitFont, fontSize, characterSpacing, alignment, boxWidthInPt } = arg;
1227
+ textBlock.innerHTML = "";
1228
+ lines.forEach((line, lineIndex) => {
1229
+ const lineEl = document.createElement("span");
1230
+ lineEl.dataset.pdfmeWrapLine = "";
1231
+ lineEl.style.whiteSpace = "pre";
1232
+ const displayText = replaceUnsupportedChars(line.text, fontKitFont);
1233
+ const textWidth = widthOfTextAtSize(line.text, fontKitFont, fontSize, characterSpacing);
1234
+ const stripTrailingLetterSpacing = applySharedWrapLineSpacing(lineEl, {
1235
+ text: line.text,
1236
+ width: textWidth,
1237
+ hardBreak: line.hardBreak
1238
+ }, alignment, boxWidthInPt, characterSpacing);
1239
+ const graphemes = splitGraphemes(displayText);
1240
+ graphemes.forEach((grapheme, index) => {
1241
+ const span = document.createElement("span");
1242
+ span.textContent = grapheme;
1243
+ if (index === graphemes.length - 1 && stripTrailingLetterSpacing) span.style.letterSpacing = "0";
1244
+ lineEl.appendChild(span);
1245
+ });
1246
+ textBlock.appendChild(lineEl);
1247
+ if (lineIndex < lines.length - 1) textBlock.appendChild(document.createTextNode("\n"));
1248
+ });
1194
1249
  };
1195
1250
  var getRangedPlainTextValue = (arg) => {
1196
1251
  const { value, schema, fontKitFont, fontSize } = arg;
@@ -1205,11 +1260,12 @@ var getRangedPlainTextValue = (arg) => {
1205
1260
  }), lineRange);
1206
1261
  return plainTextLinesToValue(lines);
1207
1262
  };
1208
- var buildStyledTextContainer = (arg, fontKitFont, value, resolvedDynamicFontSize) => {
1263
+ var buildStyledTextContainer = (arg, fontKitFont, value, resolvedDynamicFontSize, display) => {
1209
1264
  const { schema, rootElement, mode } = arg;
1210
1265
  let dynamicFontSize = resolvedDynamicFontSize;
1211
1266
  const characterSpacing = schema.characterSpacing ?? 0;
1212
1267
  const editable = isEditable(mode, schema);
1268
+ const useComputedWrapLines = display?.useComputedWrapLines ?? !editable;
1213
1269
  if (dynamicFontSize === void 0 && shouldUseDynamicFontSize(schema, arg.basePdf) && value) dynamicFontSize = calculateDynamicFontSize({
1214
1270
  textSchema: schema,
1215
1271
  fontKitFont,
@@ -1252,15 +1308,16 @@ var buildStyledTextContainer = (arg, fontKitFont, value, resolvedDynamicFontSize
1252
1308
  const textDecorations = [];
1253
1309
  if (schema.strikethrough) textDecorations.push("line-through");
1254
1310
  if (schema.underline) textDecorations.push("underline");
1311
+ const alignment = schema.alignment ?? "left";
1255
1312
  const textBlockStyle = {
1256
1313
  fontFamily: schema.fontName ? `'${schema.fontName}'` : "inherit",
1257
1314
  color: schema.fontColor ? schema.fontColor : DEFAULT_FONT_COLOR,
1258
1315
  fontSize: `${dynamicFontSize ?? schema.fontSize ?? 13}pt`,
1259
1316
  letterSpacing: `${characterSpacing}pt`,
1260
1317
  lineHeight: `${schema.lineHeight ?? 1}em`,
1261
- textAlign: schema.alignment ?? "left",
1262
- whiteSpace: "pre-wrap",
1263
- wordBreak: "break-word",
1318
+ textAlign: useComputedWrapLines && alignment === "justify" ? "left" : alignment,
1319
+ whiteSpace: useComputedWrapLines ? "pre" : "pre-wrap",
1320
+ wordBreak: useComputedWrapLines ? "normal" : "break-word",
1264
1321
  resize: "none",
1265
1322
  border: "none",
1266
1323
  outline: "none",
@@ -1327,6 +1384,6 @@ var textSchema = {
1327
1384
  //#region src/builtins.ts
1328
1385
  var builtInPlugins = { Text: textSchema };
1329
1386
  //#endregion
1330
- export { mapVerticalAlignToFlex as a, Formatter as c, makeElementPlainTextContentEditable as i, getExtraFormatterSchema as l, textSchema as n, uiRender as o, buildStyledTextContainer as r, propPanel as s, builtInPlugins as t, pdfRender as u };
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 };
1331
1388
 
1332
- //# sourceMappingURL=builtins-8En4EIAG.js.map
1389
+ //# sourceMappingURL=builtins-C-2wyB_3.js.map
@@ -0,0 +1 @@
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-8En4EIAG.js";
1
+ import { t as builtInPlugins } from "./builtins-C-2wyB_3.js";
2
2
  export { builtInPlugins };