@pdfme/schemas 6.1.13-dev.4 → 6.1.13-dev.55

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 +12 -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 +639 -140
  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
package/dist/lists.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as createListItemSplitRange, c as getListItemRange, n as LIST_ITEM_SPLIT_UNIT } from "./splitRange-BHV0vb0Q.js";
2
- import { a as normalizeListItems, i as normalizeListItemEntries, n as calculateListLayout, o as serializeListItems, r as getListMarkers, t as getDynamicLayoutForList } from "./dynamicTemplate-DQF7c6NR.js";
1
+ import { a as createListItemSplitRange, c as getListItemRange, n as LIST_ITEM_SPLIT_UNIT } from "./splitRange-B6311Noc.js";
2
+ import { a as normalizeListItems, i as normalizeListItemEntries, n as calculateListLayout, o as serializeListItems, r as getListMarkers, t as getDynamicLayoutForList } from "./dynamicTemplate-CcnCXHfM.js";
3
3
  export { LIST_ITEM_SPLIT_UNIT, calculateListLayout, createListItemSplitRange, getDynamicLayoutForList, getListItemRange, getListMarkers, normalizeListItemEntries, normalizeListItems, serializeListItems };
@@ -1,4 +1,4 @@
1
- import { C as getBoxInsets, E as hasBoxDimension, M as CODE_HORIZONTAL_PADDING, T as getSplitBoxDimension, V as FONT_SIZE_ADJUSTMENT, d as calculateDynamicFontSize, g as heightOfFontAtSize, h as getFontKitFont, q as SYNTHETIC_BOLD_OFFSET_RATIO, u as getTextLineRange, v as splitTextToSize, w as getBoxVerticalInset, x as getBoxContentArea, y as widthOfTextAtSize } from "./splitRange-BHV0vb0Q.js";
1
+ import { A as getBoxVerticalInset, D as getBoxContentArea, M as hasBoxDimension, Q as SYNTHETIC_BOLD_OFFSET_RATIO, R as CODE_HORIZONTAL_PADDING, _ as getLineBoxHeightPt, b as splitTextToSize, d as calculateDynamicFontSize, g as getFontKitFont, j as getSplitBoxDimension, k as getBoxInsets, p as fitDynamicFontSize, u as getTextLineRange, v as heightOfFontAtSize, w as layoutStyledRuns, x as widthOfTextAtSize } from "./splitRange-B6311Noc.js";
2
2
  import { getDefaultFont, getFallbackFontName, mm2pt, normalizeLinkHref, pt2mm } from "@pdfme/common";
3
3
  //#region src/text/inlineMarkdown.ts
4
4
  var MARKDOWN_ESCAPABLE_CHARS = /* @__PURE__ */ new Set([
@@ -172,8 +172,6 @@ var escapeInlineMarkdown = (value) => value.replace(MARKDOWN_ESCAPE_PATTERN, (ch
172
172
  var stripInlineMarkdown = (value) => parseInlineMarkdown(value).map((run) => run.text).join("");
173
173
  //#endregion
174
174
  //#region src/text/richText.ts
175
- var richTextWordSegmenter = new Intl.Segmenter(void 0, { granularity: "word" });
176
- var richTextGraphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
177
175
  var getBaseFontName = (schema, font) => schema.fontName && font[schema.fontName] ? schema.fontName : getFallbackFontName(font);
178
176
  var getLoadedFontName = (font, fontName) => fontName && font[fontName] ? fontName : void 0;
179
177
  var isInlineMarkdownTextSchema = (schema) => schema.textFormat === "inline-markdown" && !(schema.type === "text" && schema.readOnly !== true);
@@ -244,250 +242,101 @@ var measureRunText = (run, text, fontSize, characterSpacing) => {
244
242
  const syntheticItalicWidth = run.syntheticItalic ? heightOfFontAtSize(run.fontKitFont, fontSize) * Math.tan(12 * Math.PI / 180) : 0;
245
243
  return widthOfTextAtSize(text, run.fontKitFont, fontSize, characterSpacing) + syntheticBoldWidth + syntheticItalicWidth + (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0);
246
244
  };
247
- var createLine = () => ({
248
- runs: [],
249
- width: 0,
250
- hardBreak: false
251
- });
252
- var pushRunToLine = (line, run, text, fontSize, characterSpacing) => {
253
- if (!text) return;
254
- const width = measureRunText(run, text, fontSize, characterSpacing);
255
- const lastRun = line.runs[line.runs.length - 1];
256
- if (lastRun && canMergeRichTextRuns(lastRun, run)) {
257
- const previousWidth = lastRun.width;
258
- lastRun.text += text;
259
- lastRun.width = measureRunText(lastRun, lastRun.text, fontSize, characterSpacing);
260
- line.width += lastRun.width - previousWidth;
261
- return;
262
- }
263
- if (line.runs.length > 0) line.width += characterSpacing;
264
- line.runs.push({
265
- ...run,
266
- text,
267
- width
268
- });
269
- line.width += width;
270
- };
271
- var canMergeRichTextRuns = (a, b) => a.fontName === b.fontName && a.fontKitFont === b.fontKitFont && a.syntheticBold === b.syntheticBold && a.syntheticItalic === b.syntheticItalic && a.bold === b.bold && a.italic === b.italic && a.strikethrough === b.strikethrough && a.code === b.code && a.href === b.href;
272
- var measurePiecesWidth = (pieces, fontSize, characterSpacing) => {
273
- let width = 0;
274
- let hasText = false;
275
- pieces.forEach((piece) => {
276
- if (!piece.text) return;
277
- if (hasText) width += characterSpacing;
278
- width += measureRunText(piece.run, piece.text, fontSize, characterSpacing);
279
- hasText = true;
280
- });
281
- return width;
282
- };
283
- var sliceRunPieces = (pieces, startIndex, endIndex) => {
284
- const result = [];
285
- let offset = 0;
286
- pieces.forEach((piece) => {
287
- const pieceStart = offset;
288
- const pieceEnd = pieceStart + piece.text.length;
289
- const sliceStart = Math.max(startIndex, pieceStart);
290
- const sliceEnd = Math.min(endIndex, pieceEnd);
291
- if (sliceStart < sliceEnd) result.push({
292
- run: piece.run,
293
- text: piece.text.slice(sliceStart - pieceStart, sliceEnd - pieceStart)
294
- });
295
- offset = pieceEnd;
296
- });
297
- return result;
298
- };
299
- var segmentRunPiecesByWord = (runs, onSegment, onHardBreak) => {
300
- let paragraphPieces = [];
301
- const flushParagraph = () => {
302
- if (paragraphPieces.length === 0) return;
303
- const paragraphText = paragraphPieces.map((piece) => piece.text).join("");
304
- Array.from(richTextWordSegmenter.segment(paragraphText), ({ segment, index }) => {
305
- const pieces = sliceRunPieces(paragraphPieces, index, index + segment.length);
306
- if (pieces.length > 0) onSegment(pieces);
307
- });
308
- paragraphPieces = [];
309
- };
310
- runs.forEach((run) => {
311
- run.text.split(/(\r\n|\r|\n)/).forEach((part) => {
312
- if (part === "\r\n" || part === "\r" || part === "\n") {
313
- flushParagraph();
314
- onHardBreak();
315
- return;
316
- }
317
- if (part) paragraphPieces.push({
318
- run,
319
- text: part
320
- });
321
- });
322
- });
323
- flushParagraph();
324
- };
325
- var splitIntoGraphemes = (value) => Array.from(richTextGraphemeSegmenter.segment(value), ({ segment }) => segment);
326
- var countRichTextLineGraphemes = (line) => splitIntoGraphemes(line.runs.map((run) => run.text).join("")).length;
327
245
  var layoutRichTextLines = (arg) => {
328
246
  const { runs, fontSize, characterSpacing, boxWidthInPt } = arg;
329
- const lines = [];
330
- let currentLine = createLine();
331
- const pushCurrentLine = (hardBreak) => {
332
- currentLine.hardBreak = hardBreak;
333
- lines.push(currentLine);
334
- currentLine = createLine();
335
- };
336
- const pushPiecesToLine = (pieces) => {
337
- pieces.forEach((piece) => {
338
- pushRunToLine(currentLine, piece.run, piece.text, fontSize, characterSpacing);
339
- });
340
- };
341
- const pushOversizedText = (run, text) => {
342
- let remainingText = text;
343
- while (remainingText.length > 0) {
344
- const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;
345
- const remainingWidth = Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0);
346
- const remainingTextWidth = measureRunText(run, remainingText, fontSize, characterSpacing);
347
- if (remainingTextWidth <= remainingWidth || currentLine.runs.length === 0 && remainingTextWidth <= boxWidthInPt) {
348
- pushRunToLine(currentLine, run, remainingText, fontSize, characterSpacing);
349
- return;
350
- }
351
- if (currentLine.runs.length > 0 && remainingTextWidth <= boxWidthInPt) {
352
- pushCurrentLine(false);
353
- continue;
354
- }
355
- const graphemes = splitIntoGraphemes(remainingText);
356
- let fittingText = "";
357
- let fittingLength = 0;
358
- for (const grapheme of graphemes) {
359
- const candidate = fittingText + grapheme;
360
- const candidateWidth = measureRunText(run, candidate, fontSize, characterSpacing);
361
- const maxWidth = currentLine.runs.length === 0 ? boxWidthInPt : remainingWidth;
362
- if (candidateWidth > maxWidth) {
363
- if (fittingText) break;
364
- if (currentLine.runs.length > 0) break;
365
- }
366
- fittingText = candidate;
367
- fittingLength += grapheme.length;
368
- if (candidateWidth > maxWidth) break;
369
- }
370
- if (!fittingText) {
371
- pushCurrentLine(false);
372
- continue;
373
- }
374
- pushRunToLine(currentLine, run, fittingText, fontSize, characterSpacing);
375
- remainingText = remainingText.slice(fittingLength);
376
- if (remainingText.length > 0) pushCurrentLine(false);
377
- }
378
- };
379
- const pushSegment = (pieces) => {
380
- const segmentWidth = measurePiecesWidth(pieces, fontSize, characterSpacing);
381
- const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;
382
- if (segmentWidth <= Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0) || currentLine.runs.length === 0 && segmentWidth <= boxWidthInPt) {
383
- pushPiecesToLine(pieces);
384
- return;
385
- }
386
- if (currentLine.runs.length > 0) {
387
- pushCurrentLine(false);
388
- if (segmentWidth <= boxWidthInPt) {
389
- pushPiecesToLine(pieces);
390
- return;
391
- }
392
- }
393
- pieces.forEach((piece) => pushOversizedText(piece.run, piece.text));
394
- };
395
- segmentRunPiecesByWord(runs, pushSegment, () => pushCurrentLine(true));
396
- if (currentLine.runs.length > 0 || lines.length === 0) pushCurrentLine(false);
397
- return lines;
247
+ return layoutStyledRuns(runs.map((run) => ({
248
+ text: run.text,
249
+ measure: (text) => measureRunText(run, text, fontSize, characterSpacing),
250
+ style: run
251
+ })), boxWidthInPt, { characterSpacing }).map((line) => ({
252
+ runs: line.spans.map((span) => ({
253
+ ...span.style,
254
+ text: span.text,
255
+ width: span.width
256
+ })),
257
+ width: line.width,
258
+ hardBreak: line.hardBreak
259
+ }));
398
260
  };
399
261
  var measureParagraphWidths = (runs, fontSize, characterSpacing) => {
400
262
  const widths = [];
401
- let paragraphPieces = [];
263
+ let paragraphText = "";
264
+ let paragraphRuns = [];
402
265
  const pushWidth = () => {
403
- widths.push(measurePiecesWidth(paragraphPieces, fontSize, characterSpacing));
404
- paragraphPieces = [];
266
+ if (paragraphRuns.length === 0 && paragraphText === "") {
267
+ widths.push(0);
268
+ return;
269
+ }
270
+ let width = 0;
271
+ paragraphRuns.forEach((run, index) => {
272
+ if (index > 0) width += characterSpacing;
273
+ width += measureRunText(run, run.text, fontSize, characterSpacing);
274
+ });
275
+ widths.push(width);
276
+ paragraphText = "";
277
+ paragraphRuns = [];
405
278
  };
406
279
  runs.forEach((run) => {
407
- run.text.split(/(\r\n|\r|\n)/).forEach((part) => {
408
- if (part === "\r\n" || part === "\r" || part === "\n") {
280
+ run.text.split(/(\r\n|\r|\n|\f|\v)/).forEach((part) => {
281
+ if (part === "\r\n" || part === "\r" || part === "\n" || part === "\f" || part === "\v") {
409
282
  pushWidth();
410
283
  return;
411
284
  }
412
- if (part) paragraphPieces.push({
413
- run,
414
- text: part
415
- });
285
+ if (part) {
286
+ paragraphText += part;
287
+ paragraphRuns.push({
288
+ ...run,
289
+ text: part
290
+ });
291
+ }
416
292
  });
417
293
  });
418
294
  pushWidth();
419
295
  return widths;
420
296
  };
421
- var getLineHeightAtSize = (line, fontSize) => {
422
- if (line.runs.length === 0) return fontSize;
423
- return Math.max(...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)));
424
- };
297
+ var getRichTextLineBoxHeightPt = (line, fontSize, isFirstLine, fallbackFont) => getLineBoxHeightPt(fontSize, isFirstLine, line.runs.map((run) => run.fontKitFont), fallbackFont);
425
298
  var calculateDynamicRichTextFontSize = async (arg) => {
426
299
  const { value, schema, font, _cache, startingFontSize } = arg;
427
300
  const { fontSize: schemaFontSize, dynamicFontSize: dynamicFontSizeSetting, characterSpacing: schemaCharacterSpacing, lineHeight = 1 } = schema;
428
301
  const { width: boxWidth, height: boxHeight } = getBoxContentArea(schema);
429
302
  const fontSize = startingFontSize || schemaFontSize || 13;
430
303
  if (!dynamicFontSizeSetting) return fontSize;
431
- if (dynamicFontSizeSetting.max < dynamicFontSizeSetting.min) return fontSize;
432
304
  const resolvedRuns = await resolveRichTextRuns({
433
305
  runs: parseInlineMarkdown(value),
434
306
  schema,
435
307
  font,
436
308
  _cache
437
309
  });
310
+ const fallbackFont = resolvedRuns[0]?.fontKitFont ?? await getFontKitFont(schema.fontName, font, _cache);
438
311
  const characterSpacing = schemaCharacterSpacing ?? 0;
439
312
  const dynamicFontFit = dynamicFontSizeSetting.fit ?? "vertical";
440
313
  const boxWidthInPt = mm2pt(boxWidth);
441
- let dynamicFontSize = fontSize;
442
- if (dynamicFontSize < dynamicFontSizeSetting.min) dynamicFontSize = dynamicFontSizeSetting.min;
443
- else if (dynamicFontSize > dynamicFontSizeSetting.max) dynamicFontSize = dynamicFontSizeSetting.max;
444
- const calculateConstraints = (size) => {
445
- let totalWidthInMm = 0;
446
- let totalHeightInMm = 0;
447
- layoutRichTextLines({
448
- runs: resolvedRuns,
449
- fontSize: size,
450
- characterSpacing,
451
- boxWidthInPt
452
- }).forEach((line, lineIndex) => {
453
- if (dynamicFontFit === "vertical") totalWidthInMm = Math.max(totalWidthInMm, pt2mm(line.width));
454
- if (lineIndex === 0) totalHeightInMm += pt2mm(getLineHeightAtSize(line, size) * lineHeight);
455
- else totalHeightInMm += pt2mm(size * lineHeight);
456
- });
457
- if (dynamicFontFit === "horizontal") measureParagraphWidths(resolvedRuns, size, characterSpacing).forEach((paragraphWidth) => {
458
- totalWidthInMm = Math.max(totalWidthInMm, pt2mm(paragraphWidth));
459
- });
460
- return {
461
- totalWidthInMm,
462
- totalHeightInMm
463
- };
464
- };
465
- const shouldFontGrowToFit = (totalWidthInMm, totalHeightInMm) => {
466
- if (dynamicFontSize >= dynamicFontSizeSetting.max) return false;
467
- if (dynamicFontFit === "horizontal") return totalWidthInMm < boxWidth;
468
- return totalHeightInMm < boxHeight;
469
- };
470
- const shouldFontShrinkToFit = (totalWidthInMm, totalHeightInMm) => {
471
- if (dynamicFontSize <= dynamicFontSizeSetting.min || dynamicFontSize <= 0) return false;
472
- return totalWidthInMm > boxWidth || totalHeightInMm > boxHeight;
473
- };
474
- let { totalWidthInMm, totalHeightInMm } = calculateConstraints(dynamicFontSize);
475
- while (shouldFontGrowToFit(totalWidthInMm, totalHeightInMm)) {
476
- dynamicFontSize += FONT_SIZE_ADJUSTMENT;
477
- const { totalWidthInMm: newWidth, totalHeightInMm: newHeight } = calculateConstraints(dynamicFontSize);
478
- if (newHeight < boxHeight) {
479
- totalWidthInMm = newWidth;
480
- totalHeightInMm = newHeight;
481
- } else {
482
- dynamicFontSize -= FONT_SIZE_ADJUSTMENT;
483
- break;
314
+ return fitDynamicFontSize({
315
+ startSize: fontSize,
316
+ setting: dynamicFontSizeSetting,
317
+ boxWidth,
318
+ boxHeight,
319
+ calculateConstraints: (size) => {
320
+ let totalWidthInMm = 0;
321
+ let totalHeightInMm = 0;
322
+ layoutRichTextLines({
323
+ runs: resolvedRuns,
324
+ fontSize: size,
325
+ characterSpacing,
326
+ boxWidthInPt
327
+ }).forEach((line, lineIndex) => {
328
+ if (dynamicFontFit === "vertical") totalWidthInMm = Math.max(totalWidthInMm, pt2mm(line.width));
329
+ totalHeightInMm += pt2mm(getRichTextLineBoxHeightPt(line, size, lineIndex === 0, fallbackFont) * lineHeight);
330
+ });
331
+ if (dynamicFontFit === "horizontal") measureParagraphWidths(resolvedRuns, size, characterSpacing).forEach((paragraphWidth) => {
332
+ totalWidthInMm = Math.max(totalWidthInMm, pt2mm(paragraphWidth));
333
+ });
334
+ return {
335
+ totalWidthInMm,
336
+ totalHeightInMm
337
+ };
484
338
  }
485
- }
486
- while (shouldFontShrinkToFit(totalWidthInMm, totalHeightInMm)) {
487
- dynamicFontSize -= FONT_SIZE_ADJUSTMENT;
488
- ({totalWidthInMm, totalHeightInMm} = calculateConstraints(dynamicFontSize));
489
- }
490
- return dynamicFontSize;
339
+ });
491
340
  };
492
341
  //#endregion
493
342
  //#region src/text/measure.ts
@@ -533,9 +382,10 @@ var measureTextLines = async ({ value, schema, font = getDefaultFont(), _cache =
533
382
  characterSpacing,
534
383
  boxWidthInPt
535
384
  });
385
+ const fallbackFont = resolvedRuns[0]?.fontKitFont ?? await getFontKitFont(schema.fontName, font, _cache);
536
386
  return {
537
387
  lines: lines.map((line) => line.runs.map((run) => run.text).join("")),
538
- lineHeights: measureRichTextLineHeights(lines, resolvedFontSize, lineHeight)
388
+ lineHeights: measureRichTextLineHeights(lines, resolvedFontSize, lineHeight, fallbackFont)
539
389
  };
540
390
  }
541
391
  const fontKitFont = await getFontKitFont(schema.fontName, font, _cache);
@@ -595,19 +445,13 @@ var getTextBoxVerticalInsetForRange = (schema, range, totalLines) => {
595
445
  };
596
446
  var measurePlainTextLineHeights = (lines, fontKitFont, fontSize, lineHeight) => {
597
447
  if (lines.length === 0) return [];
598
- const firstLineHeight = heightOfFontAtSize(fontKitFont, fontSize) * lineHeight;
599
- const otherLineHeight = fontSize * lineHeight;
600
- return lines.map((_, index) => pt2mm(index === 0 ? firstLineHeight : otherLineHeight));
448
+ return lines.map((_, index) => pt2mm(getLineBoxHeightPt(fontSize, index === 0, [fontKitFont], fontKitFont) * lineHeight));
601
449
  };
602
- var measureRichTextLineHeights = (lines, fontSize, lineHeight) => {
450
+ var measureRichTextLineHeights = (lines, fontSize, lineHeight, fallbackFont) => {
603
451
  if (lines.length === 0) return [];
604
- return lines.map((line, index) => pt2mm((index === 0 ? getRichTextLineHeight(line, fontSize) : fontSize) * lineHeight));
605
- };
606
- var getRichTextLineHeight = (line, fontSize) => {
607
- if (line.runs.length === 0) return fontSize;
608
- return Math.max(...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)));
452
+ return lines.map((line, index) => pt2mm(getLineBoxHeightPt(fontSize, index === 0, line.runs.map((run) => run.fontKitFont), fallbackFont) * lineHeight));
609
453
  };
610
454
  //#endregion
611
- export { stripInlineMarkdown as _, measureTextLines as a, sumLineHeights as c, isInlineMarkdownTextSchema as d, layoutRichTextLines as f, parseInlineMarkdown as g, escapeInlineMarkdown as h, measureTextHeight as i, calculateDynamicRichTextFontSize as l, resolveRichTextRuns as m, getTextLineHeightsWithBox as n, mergeTextLineRangeValue as o, resolveFontVariant as p, getTextSplitBoxStyle as r, plainTextLinesToValue as s, applyTextLineRange as t, countRichTextLineGraphemes as u };
455
+ export { measureTextLines as a, sumLineHeights as c, layoutRichTextLines as d, resolveFontVariant as f, stripInlineMarkdown as g, parseInlineMarkdown as h, measureTextHeight as i, calculateDynamicRichTextFontSize as l, escapeInlineMarkdown as m, getTextLineHeightsWithBox as n, mergeTextLineRangeValue as o, resolveRichTextRuns as p, getTextSplitBoxStyle as r, plainTextLinesToValue as s, applyTextLineRange as t, isInlineMarkdownTextSchema as u };
612
456
 
613
- //# sourceMappingURL=measure-BC7tjAtT.js.map
457
+ //# sourceMappingURL=measure-BarlRI1L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure-BarlRI1L.js","names":[],"sources":["../src/text/inlineMarkdown.ts","../src/text/richText.ts","../src/text/measure.ts"],"sourcesContent":["import { normalizeLinkHref } from '@pdfme/common';\nimport type { RichTextRun } from './types.js';\n\ntype InlineStyle = Omit<RichTextRun, 'text'>;\n\nconst MARKDOWN_ESCAPABLE_CHARS = new Set(['\\\\', '*', '~', '`', '[', ']', '(', ')']);\nconst MARKDOWN_ESCAPE_PATTERN = /[\\\\*~`[\\]()]/g;\nconst MARKDOWN_UNESCAPE_PATTERN = /\\\\([\\\\*~`[\\]()])/g;\n\nconst sameStyle = (a: InlineStyle, b: InlineStyle) =>\n Boolean(a.bold) === Boolean(b.bold) &&\n Boolean(a.italic) === Boolean(b.italic) &&\n Boolean(a.strikethrough) === Boolean(b.strikethrough) &&\n Boolean(a.code) === Boolean(b.code) &&\n a.href === b.href;\n\nconst appendRun = (runs: RichTextRun[], text: string, style: InlineStyle) => {\n if (!text) return;\n\n const lastRun = runs.at(-1);\n if (lastRun && sameStyle(lastRun, style)) {\n lastRun.text += text;\n return;\n }\n\n runs.push({\n text,\n ...(style.bold ? { bold: true } : {}),\n ...(style.italic ? { italic: true } : {}),\n ...(style.strikethrough ? { strikethrough: true } : {}),\n ...(style.code ? { code: true } : {}),\n ...(style.href ? { href: style.href } : {}),\n });\n};\n\nconst findClosingDelimiter = (value: string, delimiter: string, from: number): number => {\n for (let i = from; i < value.length; i++) {\n if (value[i] === '\\\\') {\n i += 1;\n continue;\n }\n\n if (delimiter !== '`' && value[i] === '`') {\n const codeEnd = findClosingDelimiter(value, '`', i + 1);\n if (codeEnd === -1) continue;\n i = codeEnd;\n continue;\n }\n\n if (value.startsWith(delimiter, i)) {\n return i;\n }\n }\n\n return -1;\n};\n\nconst getDelimiter = (value: string, index: number) => {\n if (value[index] === '`') return '`';\n if (value.startsWith('***', index)) return '***';\n if (value.startsWith('**', index)) return '**';\n if (value.startsWith('~~', index)) return '~~';\n if (value[index] === '*') return '*';\n return '';\n};\n\nconst findLinkLabelEnd = (value: string, from: number, to: number): number => {\n for (let index = from; index < to; index += 1) {\n if (value[index] === '\\\\') {\n index += 1;\n continue;\n }\n\n if (value[index] === ']') return index;\n }\n\n return -1;\n};\n\nconst findLinkDestinationEnd = (value: string, from: number, to: number): number => {\n let depth = 0;\n\n for (let index = from; index < to; index += 1) {\n if (value[index] === '\\\\') {\n index += 1;\n continue;\n }\n\n if (value[index] === '(') {\n depth += 1;\n continue;\n }\n\n if (value[index] === ')') {\n if (depth === 0) return index;\n depth -= 1;\n }\n }\n\n return -1;\n};\n\nconst parseLinkAt = (value: string, index: number, to: number) => {\n if (value[index] !== '[') return undefined;\n\n const labelEnd = findLinkLabelEnd(value, index + 1, to);\n if (labelEnd === -1 || value[labelEnd + 1] !== '(') return undefined;\n\n const destinationStart = labelEnd + 2;\n const destinationEnd = findLinkDestinationEnd(value, destinationStart, to);\n if (destinationEnd === -1) return undefined;\n\n const href = value\n .slice(destinationStart, destinationEnd)\n .replace(MARKDOWN_UNESCAPE_PATTERN, '$1');\n const safeHref = normalizeLinkHref(href);\n if (!safeHref) return undefined;\n\n return {\n labelStart: index + 1,\n labelEnd,\n href: safeHref,\n end: destinationEnd + 1,\n };\n};\n\nconst mergeStyle = (style: InlineStyle, delimiter: string): InlineStyle => {\n if (delimiter === '***') {\n return { ...style, bold: true, italic: true };\n }\n if (delimiter === '**') {\n return { ...style, bold: true };\n }\n if (delimiter === '*') {\n return { ...style, italic: true };\n }\n if (delimiter === '~~') {\n return { ...style, strikethrough: true };\n }\n return style;\n};\n\nconst parseRange = (value: string, from: number, to: number, style: InlineStyle): RichTextRun[] => {\n const runs: RichTextRun[] = [];\n let buffer = '';\n\n const flush = () => {\n appendRun(runs, buffer, style);\n buffer = '';\n };\n\n for (let index = from; index < to; index++) {\n const char = value[index];\n\n if (char === '\\\\' && index + 1 < to && MARKDOWN_ESCAPABLE_CHARS.has(value[index + 1])) {\n buffer += value[index + 1];\n index += 1;\n continue;\n }\n\n const link = style.href ? undefined : parseLinkAt(value, index, to);\n if (link) {\n flush();\n const nestedRuns = parseRange(value, link.labelStart, link.labelEnd, {\n ...style,\n href: link.href,\n });\n nestedRuns.forEach((run) => appendRun(runs, run.text, run));\n index = link.end - 1;\n continue;\n }\n\n const delimiter = getDelimiter(value, index);\n if (!delimiter) {\n buffer += char;\n continue;\n }\n\n const closingIndex = findClosingDelimiter(value, delimiter, index + delimiter.length);\n if (closingIndex === -1 || closingIndex + delimiter.length > to) {\n buffer += char;\n continue;\n }\n\n flush();\n\n if (delimiter === '`') {\n appendRun(\n runs,\n value.slice(index + 1, closingIndex).replace(MARKDOWN_UNESCAPE_PATTERN, '$1'),\n { ...style, code: true },\n );\n } else {\n const nestedRuns = parseRange(\n value,\n index + delimiter.length,\n closingIndex,\n mergeStyle(style, delimiter),\n );\n nestedRuns.forEach((run) => appendRun(runs, run.text, run));\n }\n\n index = closingIndex + delimiter.length - 1;\n }\n\n flush();\n return runs;\n};\n\nexport const parseInlineMarkdown = (value: string): RichTextRun[] => {\n if (!value) return [];\n return parseRange(value, 0, value.length, {});\n};\n\nexport const escapeInlineMarkdown = (value: string): string =>\n value.replace(MARKDOWN_ESCAPE_PATTERN, (char) => `\\\\${char}`);\n\nexport const stripInlineMarkdown = (value: string): string =>\n parseInlineMarkdown(value)\n .map((run) => run.text)\n .join('');\n","import { getFallbackFontName, mm2pt, pt2mm, type Font } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_VARIANT_FALLBACK,\n CODE_HORIZONTAL_PADDING,\n DYNAMIC_FIT_HORIZONTAL,\n DYNAMIC_FIT_VERTICAL,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n TEXT_FORMAT_INLINE_MARKDOWN,\n} from './constants.js';\nimport {\n fitDynamicFontSize,\n getFontKitFont,\n getLineBoxHeightPt,\n heightOfFontAtSize,\n widthOfTextAtSize,\n} from './helper.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport type { RichTextRun, TextSchema } from './types.js';\nimport { getBoxContentArea } from '../box.js';\nimport { countGraphemes, layoutStyledRuns } from './wrap.js';\n\nexport type ResolvedRichTextRun = RichTextRun & {\n fontName: string;\n fontKitFont: FontKitFont;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\nexport type RichTextLineRun = ResolvedRichTextRun & {\n width: number;\n};\n\nexport type RichTextLine = {\n runs: RichTextLineRun[];\n width: number;\n hardBreak: boolean;\n};\n\ntype FontVariantResolution = {\n fontName: string;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\nconst getBaseFontName = (schema: TextSchema, font: Font) =>\n schema.fontName && font[schema.fontName] ? schema.fontName : getFallbackFontName(font);\n\nconst getLoadedFontName = (font: Font, fontName?: string) =>\n fontName && font[fontName] ? fontName : undefined;\n\nexport const isInlineMarkdownTextSchema = (schema: TextSchema) =>\n schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN &&\n !(schema.type === 'text' && schema.readOnly !== true);\n\nexport const resolveFontVariant = (\n run: RichTextRun,\n schema: TextSchema,\n font: Font,\n): FontVariantResolution => {\n const baseFontName = getBaseFontName(schema, font);\n const variants = schema.fontVariants ?? {};\n const fallback = schema.fontVariantFallback ?? DEFAULT_FONT_VARIANT_FALLBACK;\n\n let fontName = baseFontName;\n let needsBold = Boolean(run.bold);\n let needsItalic = Boolean(run.italic);\n\n if (run.code) {\n fontName = getLoadedFontName(font, variants.code) ?? baseFontName;\n } else if (run.bold && run.italic) {\n const boldItalic = getLoadedFontName(font, variants.boldItalic);\n const italic = getLoadedFontName(font, variants.italic);\n const bold = getLoadedFontName(font, variants.bold);\n\n if (boldItalic) {\n fontName = boldItalic;\n needsBold = false;\n needsItalic = false;\n } else if (italic) {\n fontName = italic;\n needsItalic = false;\n } else if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.bold) {\n const bold = getLoadedFontName(font, variants.bold);\n if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.italic) {\n const italic = getLoadedFontName(font, variants.italic);\n if (italic) {\n fontName = italic;\n needsItalic = false;\n }\n }\n\n if (\n (needsBold || needsItalic || (run.code && !getLoadedFontName(font, variants.code))) &&\n fallback === FONT_VARIANT_FALLBACK_ERROR\n ) {\n throw new Error(\n `[@pdfme/schemas] Missing font variant for markdown text in field \"${schema.name}\".`,\n );\n }\n\n return {\n fontName,\n syntheticBold: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsBold,\n syntheticItalic: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsItalic,\n };\n};\n\nexport const resolveRichTextRuns = async (arg: {\n runs: RichTextRun[];\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n}): Promise<ResolvedRichTextRun[]> => {\n const { runs, schema, font, _cache } = arg;\n const fontKitCache = new Map<string, FontKitFont>();\n\n const getResolvedFontKitFont = async (fontName: string) => {\n const cached = fontKitCache.get(fontName);\n if (cached) return cached;\n\n const fontKitFont = await getFontKitFont(fontName, font, _cache as Map<string, FontKitFont>);\n fontKitCache.set(fontName, fontKitFont);\n return fontKitFont;\n };\n\n return Promise.all(\n runs.map(async (run) => {\n const resolution = resolveFontVariant(run, schema, font);\n return {\n ...run,\n ...resolution,\n fontKitFont: await getResolvedFontKitFont(resolution.fontName),\n };\n }),\n );\n};\n\nexport const measureRunText = (\n run: ResolvedRichTextRun,\n text: string,\n fontSize: number,\n characterSpacing: number,\n) => {\n const syntheticBoldWidth = run.syntheticBold\n ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS\n : 0;\n const syntheticItalicWidth = run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n return (\n widthOfTextAtSize(text, run.fontKitFont, fontSize, characterSpacing) +\n syntheticBoldWidth +\n syntheticItalicWidth +\n (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0)\n );\n};\n\nexport const countRichTextLineGraphemes = (line: RichTextLine) =>\n countGraphemes(line.runs.map((run) => run.text).join(''));\n\nexport const getRichTextLineText = (line: RichTextLine) =>\n line.runs.map((run) => run.text).join('');\n\nexport const layoutRichTextLines = (arg: {\n runs: ResolvedRichTextRun[];\n fontSize: number;\n characterSpacing: number;\n boxWidthInPt: number;\n}): RichTextLine[] => {\n const { runs, fontSize, characterSpacing, boxWidthInPt } = arg;\n return layoutStyledRuns(\n runs.map((run) => ({\n text: run.text,\n measure: (text) => measureRunText(run, text, fontSize, characterSpacing),\n style: run,\n })),\n boxWidthInPt,\n { characterSpacing },\n ).map((line) => ({\n runs: line.spans.map((span) => ({\n ...span.style,\n text: span.text,\n width: span.width,\n })),\n width: line.width,\n hardBreak: line.hardBreak,\n }));\n};\n\nconst measureParagraphWidths = (\n runs: ResolvedRichTextRun[],\n fontSize: number,\n characterSpacing: number,\n) => {\n const widths: number[] = [];\n let paragraphText = '';\n let paragraphRuns: ResolvedRichTextRun[] = [];\n\n const pushWidth = () => {\n if (paragraphRuns.length === 0 && paragraphText === '') {\n widths.push(0);\n return;\n }\n let width = 0;\n paragraphRuns.forEach((run, index) => {\n if (index > 0) width += characterSpacing;\n width += measureRunText(run, run.text, fontSize, characterSpacing);\n });\n widths.push(width);\n paragraphText = '';\n paragraphRuns = [];\n };\n\n runs.forEach((run) => {\n run.text.split(/(\\r\\n|\\r|\\n|\\f|\\v)/).forEach((part) => {\n if (part === '\\r\\n' || part === '\\r' || part === '\\n' || part === '\\f' || part === '\\v') {\n pushWidth();\n return;\n }\n\n if (part) {\n paragraphText += part;\n paragraphRuns.push({ ...run, text: part });\n }\n });\n });\n\n pushWidth();\n return widths;\n};\n\nexport const getRichTextLineBoxHeightPt = (\n line: RichTextLine,\n fontSize: number,\n isFirstLine: boolean,\n fallbackFont: FontKitFont,\n) =>\n getLineBoxHeightPt(\n fontSize,\n isFirstLine,\n line.runs.map((run) => run.fontKitFont),\n fallbackFont,\n );\n\nexport const calculateDynamicRichTextFontSize = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n startingFontSize?: number | undefined;\n}) => {\n const { value, schema, font, _cache, startingFontSize } = arg;\n const {\n fontSize: schemaFontSize,\n dynamicFontSize: dynamicFontSizeSetting,\n characterSpacing: schemaCharacterSpacing,\n lineHeight = DEFAULT_LINE_HEIGHT,\n } = schema;\n const { width: boxWidth, height: boxHeight } = getBoxContentArea(schema);\n const fontSize = startingFontSize || schemaFontSize || DEFAULT_FONT_SIZE;\n if (!dynamicFontSizeSetting) return fontSize;\n\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const fallbackFont =\n resolvedRuns[0]?.fontKitFont ??\n (await getFontKitFont(schema.fontName, font, _cache as Map<string, FontKitFont>));\n const characterSpacing = schemaCharacterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const dynamicFontFit = dynamicFontSizeSetting.fit ?? DEFAULT_DYNAMIC_FIT;\n const boxWidthInPt = mm2pt(boxWidth);\n\n return fitDynamicFontSize({\n startSize: fontSize,\n setting: dynamicFontSizeSetting,\n boxWidth,\n boxHeight,\n calculateConstraints: (size) => {\n let totalWidthInMm = 0;\n let totalHeightInMm = 0;\n\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize: size,\n characterSpacing,\n boxWidthInPt,\n });\n\n lines.forEach((line, lineIndex) => {\n if (dynamicFontFit === DYNAMIC_FIT_VERTICAL) {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(line.width));\n }\n\n totalHeightInMm += pt2mm(\n getRichTextLineBoxHeightPt(line, size, lineIndex === 0, fallbackFont) * lineHeight,\n );\n });\n\n if (dynamicFontFit === DYNAMIC_FIT_HORIZONTAL) {\n measureParagraphWidths(resolvedRuns, size, characterSpacing).forEach((paragraphWidth) => {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(paragraphWidth));\n });\n }\n\n return { totalWidthInMm, totalHeightInMm };\n },\n });\n};\n","import { getDefaultFont, mm2pt, pt2mm, type DynamicLayoutRange, type Font } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { DEFAULT_CHARACTER_SPACING, DEFAULT_FONT_SIZE, DEFAULT_LINE_HEIGHT } from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n getLineBoxHeightPt,\n splitTextToSize,\n} from './helper.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n layoutRichTextLines,\n resolveRichTextRuns,\n type RichTextLine,\n} from './richText.js';\nimport type { TextSchema } from './types.js';\nimport { getTextLineRange } from '../splitRange.js';\nimport {\n getBoxContentArea,\n getBoxInsets,\n getBoxVerticalInset,\n getSplitBoxDimension,\n hasBoxDimension,\n} from '../box.js';\n\ntype MeasureTextHeightArgs = {\n value: string;\n schema: TextSchema;\n font?: Font;\n _cache?: Map<string | number, unknown>;\n ignoreDynamicFontSize?: boolean;\n};\n\ntype MeasureTextLinesResult = {\n lines: string[];\n lineHeights: number[];\n};\n\nexport const applyTextLineRange = <T>(lines: T[], range?: DynamicLayoutRange) => {\n if (!range) return lines;\n return lines.slice(range.start, range.end ?? lines.length);\n};\n\nexport const plainTextLinesToValue = (lines: string[]) =>\n lines.map((line) => line.replace(/[\\r\\n]+$/g, '')).join('\\n');\n\nconst splitReplacementTextToLines = (value: string) => {\n const lines: string[] = [];\n let start = 0;\n\n for (let i = 0; i < value.length; i += 1) {\n const charCode = value.charCodeAt(i);\n if (charCode !== 10 && charCode !== 13) continue;\n\n lines.push(value.slice(start, i));\n if (charCode === 13 && value.charCodeAt(i + 1) === 10) i += 1;\n start = i + 1;\n }\n\n lines.push(value.slice(start));\n return lines;\n};\n\nexport const measureTextLines = async ({\n value,\n schema,\n font = getDefaultFont(),\n _cache = new Map<string | number, unknown>(),\n ignoreDynamicFontSize = false,\n}: MeasureTextHeightArgs): Promise<MeasureTextLinesResult> => {\n const fontSize = schema.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = schema.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const boxWidthInPt = mm2pt(getBoxContentArea(schema).width);\n\n if (isInlineMarkdownTextSchema(schema)) {\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const resolvedFontSize =\n schema.dynamicFontSize && schema.height > 0 && !ignoreDynamicFontSize\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : fontSize;\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize: resolvedFontSize,\n characterSpacing,\n boxWidthInPt,\n });\n\n const fallbackFont =\n resolvedRuns[0]?.fontKitFont ??\n (await getFontKitFont(schema.fontName, font, _cache as Map<string, FontKitFont>));\n return {\n lines: lines.map((line) => line.runs.map((run) => run.text).join('')),\n lineHeights: measureRichTextLineHeights(lines, resolvedFontSize, lineHeight, fallbackFont),\n };\n }\n\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const resolvedFontSize =\n schema.dynamicFontSize && schema.height > 0 && !ignoreDynamicFontSize\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : fontSize;\n const lines = splitTextToSize({\n value,\n characterSpacing,\n fontSize: resolvedFontSize,\n fontKitFont,\n boxWidthInPt,\n });\n\n return {\n lines,\n lineHeights: measurePlainTextLineHeights(lines, fontKitFont, resolvedFontSize, lineHeight),\n };\n};\n\nexport const mergeTextLineRangeValue = async ({\n value,\n replacement,\n schema,\n font = getDefaultFont(),\n _cache = new Map<string | number, unknown>(),\n}: {\n value: string;\n replacement: string;\n schema: TextSchema;\n font?: Font;\n _cache?: Map<string | number, unknown>;\n}) => {\n const range = getTextLineRange(schema);\n if (!range) return replacement;\n\n const { lines } = await measureTextLines({\n value,\n schema,\n font,\n _cache,\n ignoreDynamicFontSize: true,\n });\n const { start, end = lines.length } = range;\n const nextLines = [...lines];\n nextLines.splice(start, end - start, ...splitReplacementTextToLines(replacement));\n return plainTextLinesToValue(nextLines);\n};\n\nexport const measureTextHeight = async (args: MeasureTextHeightArgs): Promise<number> => {\n const { lineHeights } = await measureTextLines(args);\n return sumLineHeights(lineHeights) + getBoxVerticalInset(args.schema);\n};\n\nexport const sumLineHeights = (lineHeights: number[]) =>\n lineHeights.reduce((sum, height) => sum + height, 0);\n\nexport const getTextLineHeightsWithBox = (lineHeights: number[], schema: TextSchema) =>\n lineHeights.map(\n (height, index) =>\n height +\n getTextBoxVerticalInsetForRange(schema, { start: index, end: index + 1 }, lineHeights.length),\n );\n\nexport const getTextSplitBoxStyle = (\n schema: TextSchema,\n range: DynamicLayoutRange,\n totalLines: number,\n) => {\n const { borderWidth, padding } = getBoxInsets(schema);\n return {\n ...(hasBoxDimension(schema.borderWidth)\n ? { borderWidth: getSplitBoxDimension(borderWidth, range, totalLines) }\n : {}),\n ...(hasBoxDimension(schema.padding)\n ? { padding: getSplitBoxDimension(padding, range, totalLines) }\n : {}),\n };\n};\n\nexport const getTextBoxVerticalInsetForRange = (\n schema: TextSchema,\n range: DynamicLayoutRange,\n totalLines: number,\n) => {\n const { borderWidth, padding } = getBoxInsets(schema);\n const splitBorderWidth = getSplitBoxDimension(borderWidth, range, totalLines);\n const splitPadding = getSplitBoxDimension(padding, range, totalLines);\n return splitBorderWidth.top + splitBorderWidth.bottom + splitPadding.top + splitPadding.bottom;\n};\n\nconst measurePlainTextLineHeights = (\n lines: string[],\n fontKitFont: FontKitFont,\n fontSize: number,\n lineHeight: number,\n) => {\n if (lines.length === 0) return [];\n return lines.map((_, index) =>\n pt2mm(getLineBoxHeightPt(fontSize, index === 0, [fontKitFont], fontKitFont) * lineHeight),\n );\n};\n\nconst measureRichTextLineHeights = (\n lines: RichTextLine[],\n fontSize: number,\n lineHeight: number,\n fallbackFont: FontKitFont,\n) => {\n if (lines.length === 0) return [];\n return lines.map((line, index) =>\n pt2mm(\n getLineBoxHeightPt(\n fontSize,\n index === 0,\n line.runs.map((run) => run.fontKitFont),\n fallbackFont,\n ) * lineHeight,\n ),\n );\n};\n"],"mappings":";;;AAKA,IAAM,2CAA2B,IAAI,IAAI;CAAC;CAAM;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG,CAAC;AAClF,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAElC,IAAM,aAAa,GAAgB,MACjC,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,IAAI,KAClC,QAAQ,EAAE,MAAM,MAAM,QAAQ,EAAE,MAAM,KACtC,QAAQ,EAAE,aAAa,MAAM,QAAQ,EAAE,aAAa,KACpD,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,IAAI,KAClC,EAAE,SAAS,EAAE;AAEf,IAAM,aAAa,MAAqB,MAAc,UAAuB;CAC3E,IAAI,CAAC,MAAM;CAEX,MAAM,UAAU,KAAK,GAAG,EAAE;CAC1B,IAAI,WAAW,UAAU,SAAS,KAAK,GAAG;EACxC,QAAQ,QAAQ;EAChB;CACF;CAEA,KAAK,KAAK;EACR;EACA,GAAI,MAAM,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;EACnC,GAAI,MAAM,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;EACvC,GAAI,MAAM,gBAAgB,EAAE,eAAe,KAAK,IAAI,CAAC;EACrD,GAAI,MAAM,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;EACnC,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;CAC3C,CAAC;AACH;AAEA,IAAM,wBAAwB,OAAe,WAAmB,SAAyB;CACvF,KAAK,IAAI,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK;EACxC,IAAI,MAAM,OAAO,MAAM;GACrB,KAAK;GACL;EACF;EAEA,IAAI,cAAc,OAAO,MAAM,OAAO,KAAK;GACzC,MAAM,UAAU,qBAAqB,OAAO,KAAK,IAAI,CAAC;GACtD,IAAI,YAAY,IAAI;GACpB,IAAI;GACJ;EACF;EAEA,IAAI,MAAM,WAAW,WAAW,CAAC,GAC/B,OAAO;CAEX;CAEA,OAAO;AACT;AAEA,IAAM,gBAAgB,OAAe,UAAkB;CACrD,IAAI,MAAM,WAAW,KAAK,OAAO;CACjC,IAAI,MAAM,WAAW,OAAO,KAAK,GAAG,OAAO;CAC3C,IAAI,MAAM,WAAW,MAAM,KAAK,GAAG,OAAO;CAC1C,IAAI,MAAM,WAAW,MAAM,KAAK,GAAG,OAAO;CAC1C,IAAI,MAAM,WAAW,KAAK,OAAO;CACjC,OAAO;AACT;AAEA,IAAM,oBAAoB,OAAe,MAAc,OAAuB;CAC5E,KAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI,SAAS,GAAG;EAC7C,IAAI,MAAM,WAAW,MAAM;GACzB,SAAS;GACT;EACF;EAEA,IAAI,MAAM,WAAW,KAAK,OAAO;CACnC;CAEA,OAAO;AACT;AAEA,IAAM,0BAA0B,OAAe,MAAc,OAAuB;CAClF,IAAI,QAAQ;CAEZ,KAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI,SAAS,GAAG;EAC7C,IAAI,MAAM,WAAW,MAAM;GACzB,SAAS;GACT;EACF;EAEA,IAAI,MAAM,WAAW,KAAK;GACxB,SAAS;GACT;EACF;EAEA,IAAI,MAAM,WAAW,KAAK;GACxB,IAAI,UAAU,GAAG,OAAO;GACxB,SAAS;EACX;CACF;CAEA,OAAO;AACT;AAEA,IAAM,eAAe,OAAe,OAAe,OAAe;CAChE,IAAI,MAAM,WAAW,KAAK,OAAO,KAAA;CAEjC,MAAM,WAAW,iBAAiB,OAAO,QAAQ,GAAG,EAAE;CACtD,IAAI,aAAa,MAAM,MAAM,WAAW,OAAO,KAAK,OAAO,KAAA;CAE3D,MAAM,mBAAmB,WAAW;CACpC,MAAM,iBAAiB,uBAAuB,OAAO,kBAAkB,EAAE;CACzE,IAAI,mBAAmB,IAAI,OAAO,KAAA;CAElC,MAAM,OAAO,MACV,MAAM,kBAAkB,cAAc,CAAC,CACvC,QAAQ,2BAA2B,IAAI;CAC1C,MAAM,WAAW,kBAAkB,IAAI;CACvC,IAAI,CAAC,UAAU,OAAO,KAAA;CAEtB,OAAO;EACL,YAAY,QAAQ;EACpB;EACA,MAAM;EACN,KAAK,iBAAiB;CACxB;AACF;AAEA,IAAM,cAAc,OAAoB,cAAmC;CACzE,IAAI,cAAc,OAChB,OAAO;EAAE,GAAG;EAAO,MAAM;EAAM,QAAQ;CAAK;CAE9C,IAAI,cAAc,MAChB,OAAO;EAAE,GAAG;EAAO,MAAM;CAAK;CAEhC,IAAI,cAAc,KAChB,OAAO;EAAE,GAAG;EAAO,QAAQ;CAAK;CAElC,IAAI,cAAc,MAChB,OAAO;EAAE,GAAG;EAAO,eAAe;CAAK;CAEzC,OAAO;AACT;AAEA,IAAM,cAAc,OAAe,MAAc,IAAY,UAAsC;CACjG,MAAM,OAAsB,CAAC;CAC7B,IAAI,SAAS;CAEb,MAAM,cAAc;EAClB,UAAU,MAAM,QAAQ,KAAK;EAC7B,SAAS;CACX;CAEA,KAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI,SAAS;EAC1C,MAAM,OAAO,MAAM;EAEnB,IAAI,SAAS,QAAQ,QAAQ,IAAI,MAAM,yBAAyB,IAAI,MAAM,QAAQ,EAAE,GAAG;GACrF,UAAU,MAAM,QAAQ;GACxB,SAAS;GACT;EACF;EAEA,MAAM,OAAO,MAAM,OAAO,KAAA,IAAY,YAAY,OAAO,OAAO,EAAE;EAClE,IAAI,MAAM;GACR,MAAM;GAKN,WAJ8B,OAAO,KAAK,YAAY,KAAK,UAAU;IACnE,GAAG;IACH,MAAM,KAAK;GACb,CACA,CAAA,CAAW,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,GAAG,CAAC;GAC1D,QAAQ,KAAK,MAAM;GACnB;EACF;EAEA,MAAM,YAAY,aAAa,OAAO,KAAK;EAC3C,IAAI,CAAC,WAAW;GACd,UAAU;GACV;EACF;EAEA,MAAM,eAAe,qBAAqB,OAAO,WAAW,QAAQ,UAAU,MAAM;EACpF,IAAI,iBAAiB,MAAM,eAAe,UAAU,SAAS,IAAI;GAC/D,UAAU;GACV;EACF;EAEA,MAAM;EAEN,IAAI,cAAc,KAChB,UACE,MACA,MAAM,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,QAAQ,2BAA2B,IAAI,GAC5E;GAAE,GAAG;GAAO,MAAM;EAAK,CACzB;OAQA,WALE,OACA,QAAQ,UAAU,QAClB,cACA,WAAW,OAAO,SAAS,CAE7B,CAAA,CAAW,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,GAAG,CAAC;EAG5D,QAAQ,eAAe,UAAU,SAAS;CAC5C;CAEA,MAAM;CACN,OAAO;AACT;AAEA,IAAa,uBAAuB,UAAiC;CACnE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,OAAO,WAAW,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC;AAC9C;AAEA,IAAa,wBAAwB,UACnC,MAAM,QAAQ,0BAA0B,SAAS,KAAK,MAAM;AAE9D,IAAa,uBAAuB,UAClC,oBAAoB,KAAK,CAAC,CACvB,KAAK,QAAQ,IAAI,IAAI,CAAC,CACtB,KAAK,EAAE;;;ACvKZ,IAAM,mBAAmB,QAAoB,SAC3C,OAAO,YAAY,KAAK,OAAO,YAAY,OAAO,WAAW,oBAAoB,IAAI;AAEvF,IAAM,qBAAqB,MAAY,aACrC,YAAY,KAAK,YAAY,WAAW,KAAA;AAE1C,IAAa,8BAA8B,WACzC,OAAO,eAAA,qBACP,EAAE,OAAO,SAAS,UAAU,OAAO,aAAa;AAElD,IAAa,sBACX,KACA,QACA,SAC0B;CAC1B,MAAM,eAAe,gBAAgB,QAAQ,IAAI;CACjD,MAAM,WAAW,OAAO,gBAAgB,CAAC;CACzC,MAAM,WAAW,OAAO,uBAAA;CAExB,IAAI,WAAW;CACf,IAAI,YAAY,QAAQ,IAAI,IAAI;CAChC,IAAI,cAAc,QAAQ,IAAI,MAAM;CAEpC,IAAI,IAAI,MACN,WAAW,kBAAkB,MAAM,SAAS,IAAI,KAAK;MAChD,IAAI,IAAI,QAAQ,IAAI,QAAQ;EACjC,MAAM,aAAa,kBAAkB,MAAM,SAAS,UAAU;EAC9D,MAAM,SAAS,kBAAkB,MAAM,SAAS,MAAM;EACtD,MAAM,OAAO,kBAAkB,MAAM,SAAS,IAAI;EAElD,IAAI,YAAY;GACd,WAAW;GACX,YAAY;GACZ,cAAc;EAChB,OAAO,IAAI,QAAQ;GACjB,WAAW;GACX,cAAc;EAChB,OAAO,IAAI,MAAM;GACf,WAAW;GACX,YAAY;EACd;CACF,OAAO,IAAI,IAAI,MAAM;EACnB,MAAM,OAAO,kBAAkB,MAAM,SAAS,IAAI;EAClD,IAAI,MAAM;GACR,WAAW;GACX,YAAY;EACd;CACF,OAAO,IAAI,IAAI,QAAQ;EACrB,MAAM,SAAS,kBAAkB,MAAM,SAAS,MAAM;EACtD,IAAI,QAAQ;GACV,WAAW;GACX,cAAc;EAChB;CACF;CAEA,KACG,aAAa,eAAgB,IAAI,QAAQ,CAAC,kBAAkB,MAAM,SAAS,IAAI,MAChF,aAAA,SAEA,MAAM,IAAI,MACR,qEAAqE,OAAO,KAAK,GACnF;CAGF,OAAO;EACL;EACA,eAAe,aAAA,WAA4C;EAC3D,iBAAiB,aAAA,WAA4C;CAC/D;AACF;AAEA,IAAa,sBAAsB,OAAO,QAKJ;CACpC,MAAM,EAAE,MAAM,QAAQ,MAAM,WAAW;CACvC,MAAM,+BAAe,IAAI,IAAyB;CAElD,MAAM,yBAAyB,OAAO,aAAqB;EACzD,MAAM,SAAS,aAAa,IAAI,QAAQ;EACxC,IAAI,QAAQ,OAAO;EAEnB,MAAM,cAAc,MAAM,eAAe,UAAU,MAAM,MAAkC;EAC3F,aAAa,IAAI,UAAU,WAAW;EACtC,OAAO;CACT;CAEA,OAAO,QAAQ,IACb,KAAK,IAAI,OAAO,QAAQ;EACtB,MAAM,aAAa,mBAAmB,KAAK,QAAQ,IAAI;EACvD,OAAO;GACL,GAAG;GACH,GAAG;GACH,aAAa,MAAM,uBAAuB,WAAW,QAAQ;EAC/D;CACF,CAAC,CACH;AACF;AAEA,IAAa,kBACX,KACA,MACA,UACA,qBACG;CACH,MAAM,qBAAqB,IAAI,gBAC3B,WAAW,8BAAA,IACX;CACJ,MAAM,uBAAuB,IAAI,kBAC7B,mBAAmB,IAAI,aAAa,QAAQ,IAC5C,KAAK,IAAA,KAAqC,KAAK,KAAM,GAAG,IACxD;CACJ,OACE,kBAAkB,MAAM,IAAI,aAAa,UAAU,gBAAgB,IACnE,qBACA,wBACC,IAAI,OAAO,0BAA0B,IAAI;AAE9C;AAQA,IAAa,uBAAuB,QAKd;CACpB,MAAM,EAAE,MAAM,UAAU,kBAAkB,iBAAiB;CAC3D,OAAO,iBACL,KAAK,KAAK,SAAS;EACjB,MAAM,IAAI;EACV,UAAU,SAAS,eAAe,KAAK,MAAM,UAAU,gBAAgB;EACvE,OAAO;CACT,EAAE,GACF,cACA,EAAE,iBAAiB,CACrB,CAAC,CAAC,KAAK,UAAU;EACf,MAAM,KAAK,MAAM,KAAK,UAAU;GAC9B,GAAG,KAAK;GACR,MAAM,KAAK;GACX,OAAO,KAAK;EACd,EAAE;EACF,OAAO,KAAK;EACZ,WAAW,KAAK;CAClB,EAAE;AACJ;AAEA,IAAM,0BACJ,MACA,UACA,qBACG;CACH,MAAM,SAAmB,CAAC;CAC1B,IAAI,gBAAgB;CACpB,IAAI,gBAAuC,CAAC;CAE5C,MAAM,kBAAkB;EACtB,IAAI,cAAc,WAAW,KAAK,kBAAkB,IAAI;GACtD,OAAO,KAAK,CAAC;GACb;EACF;EACA,IAAI,QAAQ;EACZ,cAAc,SAAS,KAAK,UAAU;GACpC,IAAI,QAAQ,GAAG,SAAS;GACxB,SAAS,eAAe,KAAK,IAAI,MAAM,UAAU,gBAAgB;EACnE,CAAC;EACD,OAAO,KAAK,KAAK;EACjB,gBAAgB;EAChB,gBAAgB,CAAC;CACnB;CAEA,KAAK,SAAS,QAAQ;EACpB,IAAI,KAAK,MAAM,oBAAoB,CAAC,CAAC,SAAS,SAAS;GACrD,IAAI,SAAS,UAAU,SAAS,QAAQ,SAAS,QAAQ,SAAS,QAAQ,SAAS,MAAM;IACvF,UAAU;IACV;GACF;GAEA,IAAI,MAAM;IACR,iBAAiB;IACjB,cAAc,KAAK;KAAE,GAAG;KAAK,MAAM;IAAK,CAAC;GAC3C;EACF,CAAC;CACH,CAAC;CAED,UAAU;CACV,OAAO;AACT;AAEA,IAAa,8BACX,MACA,UACA,aACA,iBAEA,mBACE,UACA,aACA,KAAK,KAAK,KAAK,QAAQ,IAAI,WAAW,GACtC,YACF;AAEF,IAAa,mCAAmC,OAAO,QAMjD;CACJ,MAAM,EAAE,OAAO,QAAQ,MAAM,QAAQ,qBAAqB;CAC1D,MAAM,EACJ,UAAU,gBACV,iBAAiB,wBACjB,kBAAkB,wBAClB,aAAA,MACE;CACJ,MAAM,EAAE,OAAO,UAAU,QAAQ,cAAc,kBAAkB,MAAM;CACvE,MAAM,WAAW,oBAAoB,kBAAA;CACrC,IAAI,CAAC,wBAAwB,OAAO;CAGpC,MAAM,eAAe,MAAM,oBAAoB;EAAE,MAD5B,oBAAoB,KACc;EAAc;EAAQ;EAAM;CAAO,CAAC;CAC3F,MAAM,eACJ,aAAa,EAAE,EAAE,eAChB,MAAM,eAAe,OAAO,UAAU,MAAM,MAAkC;CACjF,MAAM,mBAAmB,0BAAA;CACzB,MAAM,iBAAiB,uBAAuB,OAAA;CAC9C,MAAM,eAAe,MAAM,QAAQ;CAEnC,OAAO,mBAAmB;EACxB,WAAW;EACX,SAAS;EACT;EACA;EACA,uBAAuB,SAAS;GAC9B,IAAI,iBAAiB;GACrB,IAAI,kBAAkB;GAStB,oBAPkC;IAChC,MAAM;IACN,UAAU;IACV;IACA;GACF,CAEA,CAAA,CAAM,SAAS,MAAM,cAAc;IACjC,IAAI,mBAAA,YACF,iBAAiB,KAAK,IAAI,gBAAgB,MAAM,KAAK,KAAK,CAAC;IAG7D,mBAAmB,MACjB,2BAA2B,MAAM,MAAM,cAAc,GAAG,YAAY,IAAI,UAC1E;GACF,CAAC;GAED,IAAI,mBAAA,cACF,uBAAuB,cAAc,MAAM,gBAAgB,CAAC,CAAC,SAAS,mBAAmB;IACvF,iBAAiB,KAAK,IAAI,gBAAgB,MAAM,cAAc,CAAC;GACjE,CAAC;GAGH,OAAO;IAAE;IAAgB;GAAgB;EAC3C;CACF,CAAC;AACH;;;AC5RA,IAAa,sBAAyB,OAAY,UAA+B;CAC/E,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM;AAC3D;AAEA,IAAa,yBAAyB,UACpC,MAAM,KAAK,SAAS,KAAK,QAAQ,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI;AAE9D,IAAM,+BAA+B,UAAkB;CACrD,MAAM,QAAkB,CAAC;CACzB,IAAI,QAAQ;CAEZ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,WAAW,MAAM,WAAW,CAAC;EACnC,IAAI,aAAa,MAAM,aAAa,IAAI;EAExC,MAAM,KAAK,MAAM,MAAM,OAAO,CAAC,CAAC;EAChC,IAAI,aAAa,MAAM,MAAM,WAAW,IAAI,CAAC,MAAM,IAAI,KAAK;EAC5D,QAAQ,IAAI;CACd;CAEA,MAAM,KAAK,MAAM,MAAM,KAAK,CAAC;CAC7B,OAAO;AACT;AAEA,IAAa,mBAAmB,OAAO,EACrC,OACA,QACA,OAAO,eAAe,GACtB,yBAAS,IAAI,IAA8B,GAC3C,wBAAwB,YACoC;CAC5D,MAAM,WAAW,OAAO,YAAA;CACxB,MAAM,aAAa,OAAO,cAAA;CAC1B,MAAM,mBAAmB,OAAO,oBAAA;CAChC,MAAM,eAAe,MAAM,kBAAkB,MAAM,CAAC,CAAC,KAAK;CAE1D,IAAI,2BAA2B,MAAM,GAAG;EAEtC,MAAM,eAAe,MAAM,oBAAoB;GAAE,MAD5B,oBAAoB,KACc;GAAc;GAAQ;GAAM;EAAO,CAAC;EAC3F,MAAM,mBACJ,OAAO,mBAAmB,OAAO,SAAS,KAAK,CAAC,wBAC5C,MAAM,iCAAiC;GAAE;GAAO;GAAQ;GAAM;EAAO,CAAC,IACtE;EACN,MAAM,QAAQ,oBAAoB;GAChC,MAAM;GACN,UAAU;GACV;GACA;EACF,CAAC;EAED,MAAM,eACJ,aAAa,EAAE,EAAE,eAChB,MAAM,eAAe,OAAO,UAAU,MAAM,MAAkC;EACjF,OAAO;GACL,OAAO,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;GACpE,aAAa,2BAA2B,OAAO,kBAAkB,YAAY,YAAY;EAC3F;CACF;CAEA,MAAM,cAAc,MAAM,eACxB,OAAO,UACP,MACA,MACF;CACA,MAAM,mBACJ,OAAO,mBAAmB,OAAO,SAAS,KAAK,CAAC,wBAC5C,yBAAyB;EAAE,YAAY;EAAQ;EAAa;CAAM,CAAC,IACnE;CACN,MAAM,QAAQ,gBAAgB;EAC5B;EACA;EACA,UAAU;EACV;EACA;CACF,CAAC;CAED,OAAO;EACL;EACA,aAAa,4BAA4B,OAAO,aAAa,kBAAkB,UAAU;CAC3F;AACF;AAEA,IAAa,0BAA0B,OAAO,EAC5C,OACA,aACA,QACA,OAAO,eAAe,GACtB,yBAAS,IAAI,IAA8B,QAOvC;CACJ,MAAM,QAAQ,iBAAiB,MAAM;CACrC,IAAI,CAAC,OAAO,OAAO;CAEnB,MAAM,EAAE,UAAU,MAAM,iBAAiB;EACvC;EACA;EACA;EACA;EACA,uBAAuB;CACzB,CAAC;CACD,MAAM,EAAE,OAAO,MAAM,MAAM,WAAW;CACtC,MAAM,YAAY,CAAC,GAAG,KAAK;CAC3B,UAAU,OAAO,OAAO,MAAM,OAAO,GAAG,4BAA4B,WAAW,CAAC;CAChF,OAAO,sBAAsB,SAAS;AACxC;AAEA,IAAa,oBAAoB,OAAO,SAAiD;CACvF,MAAM,EAAE,gBAAgB,MAAM,iBAAiB,IAAI;CACnD,OAAO,eAAe,WAAW,IAAI,oBAAoB,KAAK,MAAM;AACtE;AAEA,IAAa,kBAAkB,gBAC7B,YAAY,QAAQ,KAAK,WAAW,MAAM,QAAQ,CAAC;AAErD,IAAa,6BAA6B,aAAuB,WAC/D,YAAY,KACT,QAAQ,UACP,SACA,gCAAgC,QAAQ;CAAE,OAAO;CAAO,KAAK,QAAQ;AAAE,GAAG,YAAY,MAAM,CAChG;AAEF,IAAa,wBACX,QACA,OACA,eACG;CACH,MAAM,EAAE,aAAa,YAAY,aAAa,MAAM;CACpD,OAAO;EACL,GAAI,gBAAgB,OAAO,WAAW,IAClC,EAAE,aAAa,qBAAqB,aAAa,OAAO,UAAU,EAAE,IACpE,CAAC;EACL,GAAI,gBAAgB,OAAO,OAAO,IAC9B,EAAE,SAAS,qBAAqB,SAAS,OAAO,UAAU,EAAE,IAC5D,CAAC;CACP;AACF;AAEA,IAAa,mCACX,QACA,OACA,eACG;CACH,MAAM,EAAE,aAAa,YAAY,aAAa,MAAM;CACpD,MAAM,mBAAmB,qBAAqB,aAAa,OAAO,UAAU;CAC5E,MAAM,eAAe,qBAAqB,SAAS,OAAO,UAAU;CACpE,OAAO,iBAAiB,MAAM,iBAAiB,SAAS,aAAa,MAAM,aAAa;AAC1F;AAEA,IAAM,+BACJ,OACA,aACA,UACA,eACG;CACH,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC;CAChC,OAAO,MAAM,KAAK,GAAG,UACnB,MAAM,mBAAmB,UAAU,UAAU,GAAG,CAAC,WAAW,GAAG,WAAW,IAAI,UAAU,CAC1F;AACF;AAEA,IAAM,8BACJ,OACA,UACA,YACA,iBACG;CACH,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC;CAChC,OAAO,MAAM,KAAK,MAAM,UACtB,MACE,mBACE,UACA,UAAU,GACV,KAAK,KAAK,KAAK,QAAQ,IAAI,WAAW,GACtC,YACF,IAAI,UACN,CACF;AACF"}
@@ -1,4 +1,12 @@
1
1
  import { MultiVariableTextSchema } from './types.js';
2
+ export declare const tryParseVariableMap: (variablesIn: string | Record<string, string> | undefined) => Record<string, string> | undefined;
2
3
  export declare const substituteVariables: (text: string, variablesIn: string | Record<string, string>, valueMapper?: (value: string, variableName: string) => string) => string;
3
4
  export declare const substituteVariablesAsInlineMarkdownLiterals: (text: string, variablesIn: string | Record<string, string>) => string;
5
+ /**
6
+ * Resolve a read-only MVT field to display text.
7
+ * jsx locked fields set `contentSnapshot` and store already-substituted text
8
+ * in `content`. Designer templates omit that flag and store variable JSON.
9
+ * Never treat `content` as an expression, and never infer a snapshot from keys.
10
+ */
11
+ export declare const resolveReadOnlyMultiVariableText: (schema: MultiVariableTextSchema, value?: string) => string;
4
12
  export declare const validateVariables: (value: string, schema: MultiVariableTextSchema) => boolean;
@@ -2,4 +2,6 @@ import type { TextSchema } from '../text/types.js';
2
2
  export type MultiVariableTextSchema = TextSchema & {
3
3
  text: string;
4
4
  variables: string[];
5
+ /** When true, `content` is already-substituted display text (jsx locked MVT). */
6
+ contentSnapshot?: boolean;
5
7
  };
@@ -0,0 +1,8 @@
1
+ import { PDFFont, PDFDocument } from '@pdfme/pdf-lib';
2
+ import { Font } from '@pdfme/common';
3
+ export declare const embedAndGetFont: (arg: {
4
+ pdfDoc: PDFDocument;
5
+ font: Font;
6
+ fontName: string;
7
+ _cache: Map<string | number, unknown>;
8
+ }) => Promise<PDFFont>;