@pdfme/schemas 6.1.1-dev.4 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{builtins-CFqn6U5J.js → builtins-CWHhKSVA.js} +26 -58
- package/dist/builtins-CWHhKSVA.js.map +1 -0
- package/dist/builtins.js +1 -1
- package/dist/{dynamicTemplate-DslOH4FZ.js → dynamicTemplate-DmuRoTw4.js} +2 -2
- package/dist/{dynamicTemplate-DslOH4FZ.js.map → dynamicTemplate-DmuRoTw4.js.map} +1 -1
- package/dist/{helper-6FilIoVM.js → helper-M_MmV_d5.js} +3 -25
- package/dist/helper-M_MmV_d5.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/{lists-BmAAx0lx.js → lists-B6dmgpkS.js} +2 -2
- package/dist/{lists-BmAAx0lx.js.map → lists-B6dmgpkS.js.map} +1 -1
- package/dist/lists.js +1 -1
- package/dist/tables.js +1 -1
- package/dist/text/richTextPdfRender.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/dist/builtins-CFqn6U5J.js.map +0 -1
- package/dist/helper-6FilIoVM.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as TEXT_FORMAT_INLINE_MARKDOWN, C as FONT_SIZE_ADJUSTMENT, D as PLACEHOLDER_FONT_COLOR, E as FONT_VARIANT_FALLBACK_SYNTHETIC, M as VERTICAL_ALIGN_BOTTOM, N as VERTICAL_ALIGN_MIDDLE, O as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, S as DYNAMIC_FIT_VERTICAL, T as FONT_VARIANT_FALLBACK_PLAIN, _ as DEFAULT_DYNAMIC_FIT, a as getFontKitFont, b as DEFAULT_TEXT_FORMAT, c as splitTextToSize, d as ALIGN_JUSTIFY, g as DEFAULT_ALIGNMENT, h as CODE_HORIZONTAL_PADDING, i as getFontDescentInPt, j as TEXT_FORMAT_PLAIN, k as SYNTHETIC_BOLD_OFFSET_RATIO, l as widthOfTextAtSize, m as CODE_BACKGROUND_COLOR, n as fetchRemoteFontData, o as heightOfFontAtSize, p as ALIGN_RIGHT, r as getBrowserVerticalFontAdjustments, s as isFirefox, t as calculateDynamicFontSize, u as ALIGN_CENTER, v as DEFAULT_FONT_COLOR, w as FONT_VARIANT_FALLBACK_ERROR, x as DYNAMIC_FIT_HORIZONTAL, y as DEFAULT_FONT_VARIANT_FALLBACK } from "./helper-
|
|
2
|
-
import { c as HEX_COLOR_PATTERN } from "./dynamicTemplate-
|
|
1
|
+
import { A as TEXT_FORMAT_INLINE_MARKDOWN, C as FONT_SIZE_ADJUSTMENT, D as PLACEHOLDER_FONT_COLOR, E as FONT_VARIANT_FALLBACK_SYNTHETIC, M as VERTICAL_ALIGN_BOTTOM, N as VERTICAL_ALIGN_MIDDLE, O as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, S as DYNAMIC_FIT_VERTICAL, T as FONT_VARIANT_FALLBACK_PLAIN, _ as DEFAULT_DYNAMIC_FIT, a as getFontKitFont, b as DEFAULT_TEXT_FORMAT, c as splitTextToSize, d as ALIGN_JUSTIFY, g as DEFAULT_ALIGNMENT, h as CODE_HORIZONTAL_PADDING, i as getFontDescentInPt, j as TEXT_FORMAT_PLAIN, k as SYNTHETIC_BOLD_OFFSET_RATIO, l as widthOfTextAtSize, m as CODE_BACKGROUND_COLOR, n as fetchRemoteFontData, o as heightOfFontAtSize, p as ALIGN_RIGHT, r as getBrowserVerticalFontAdjustments, s as isFirefox, t as calculateDynamicFontSize, u as ALIGN_CENTER, v as DEFAULT_FONT_COLOR, w as FONT_VARIANT_FALLBACK_ERROR, x as DYNAMIC_FIT_HORIZONTAL, y as DEFAULT_FONT_VARIANT_FALLBACK } from "./helper-M_MmV_d5.js";
|
|
2
|
+
import { c as HEX_COLOR_PATTERN } from "./dynamicTemplate-DmuRoTw4.js";
|
|
3
3
|
import { convertForPdfLayoutProps, createSvgStr, hex2PrintingColor, isEditable, rotatePoint } from "./utils.js";
|
|
4
4
|
import { DEFAULT_FONT_NAME, getDefaultFont, getFallbackFontName, mm2pt, pt2mm } from "@pdfme/common";
|
|
5
5
|
import { AlignCenter, AlignJustify, AlignLeft, AlignRight, ArrowDownToLine, ArrowUpToLine, Strikethrough, TextCursorInput, Underline } from "lucide";
|
|
@@ -427,16 +427,11 @@ var calculateDynamicRichTextFontSize = async (arg) => {
|
|
|
427
427
|
var getSyntheticBoldWidth = (run, fontSize) => run.syntheticBold ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * 2 : 0;
|
|
428
428
|
var getSyntheticItalicWidth = (run, fontSize) => run.syntheticItalic ? heightOfFontAtSize(run.fontKitFont, fontSize) * Math.tan(12 * Math.PI / 180) : 0;
|
|
429
429
|
var getRunWidth = (run, fontSize, characterSpacing) => widthOfTextAtSize(run.text, run.fontKitFont, fontSize, characterSpacing) + getSyntheticBoldWidth(run, fontSize) + getSyntheticItalicWidth(run, fontSize);
|
|
430
|
-
var
|
|
430
|
+
var getPdfFont = (run, pdfFontObj) => {
|
|
431
431
|
const pdfFont = pdfFontObj[run.fontName];
|
|
432
432
|
if (!pdfFont) throw new Error(`[@pdfme/schemas] Missing embedded font "${run.fontName}".`);
|
|
433
433
|
return pdfFont;
|
|
434
434
|
};
|
|
435
|
-
var embedFontsForRuns = async (runs, embedPdfFont) => {
|
|
436
|
-
const fontNames = Array.from(new Set(runs.map((run) => run.fontName)));
|
|
437
|
-
const pdfFonts = await Promise.all(fontNames.map(async (fontName) => [fontName, await embedPdfFont(fontName)]));
|
|
438
|
-
return Object.fromEntries(pdfFonts);
|
|
439
|
-
};
|
|
440
435
|
var drawDecorationLine = (arg) => {
|
|
441
436
|
const { page, x, y, width, rotate, pivotPoint, fontSize, color, opacity } = arg;
|
|
442
437
|
if (width <= 0) return;
|
|
@@ -517,7 +512,7 @@ var drawRun = (arg) => {
|
|
|
517
512
|
}
|
|
518
513
|
};
|
|
519
514
|
var renderInlineMarkdownText = async (arg) => {
|
|
520
|
-
const { value, schema, font,
|
|
515
|
+
const { value, schema, font, pdfFontObj, fontKitFont, page, pdfLib, _cache, colorType, fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing, x, width, height, pageHeight, pivotPoint, rotate, opacity } = arg;
|
|
521
516
|
const lines = layoutRichTextLines({
|
|
522
517
|
runs: await resolveRichTextRuns({
|
|
523
518
|
runs: parseInlineMarkdown(value),
|
|
@@ -529,7 +524,6 @@ var renderInlineMarkdownText = async (arg) => {
|
|
|
529
524
|
characterSpacing,
|
|
530
525
|
boxWidthInPt: width
|
|
531
526
|
});
|
|
532
|
-
const pdfFontObj = await embedFontsForRuns(lines.flatMap((line) => line.runs), embedPdfFont);
|
|
533
527
|
const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);
|
|
534
528
|
const descent = getFontDescentInPt(fontKitFont, fontSize);
|
|
535
529
|
const halfLineHeightAdjustment = lineHeight === 0 ? 0 : (lineHeight - 1) * fontSize / 2;
|
|
@@ -587,7 +581,7 @@ var renderInlineMarkdownText = async (arg) => {
|
|
|
587
581
|
page,
|
|
588
582
|
pdfLib,
|
|
589
583
|
run,
|
|
590
|
-
pdfFont:
|
|
584
|
+
pdfFont: getPdfFont(run, pdfFontObj),
|
|
591
585
|
x: currentX,
|
|
592
586
|
y: yLine,
|
|
593
587
|
rotate,
|
|
@@ -606,29 +600,17 @@ var renderInlineMarkdownText = async (arg) => {
|
|
|
606
600
|
};
|
|
607
601
|
//#endregion
|
|
608
602
|
//#region src/text/pdfRender.ts
|
|
609
|
-
var
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
_cache.set(PDF_FONT_CACHE_KEY, pdfFontCache);
|
|
615
|
-
}
|
|
616
|
-
return pdfFontCache;
|
|
617
|
-
};
|
|
618
|
-
var embedAndGetFont = (arg) => {
|
|
619
|
-
const { pdfDoc, font, fontName, _cache } = arg;
|
|
620
|
-
const pdfFontCache = getPdfFontCache(_cache);
|
|
621
|
-
const cachedFont = pdfFontCache[fontName];
|
|
622
|
-
if (cachedFont) return cachedFont;
|
|
623
|
-
const fontValue = font[fontName];
|
|
624
|
-
if (!fontValue) return Promise.reject(/* @__PURE__ */ new Error(`[@pdfme/schemas] Font "${fontName}" is not found.`));
|
|
625
|
-
const pdfFontPromise = (async () => {
|
|
626
|
-
let fontData = fontValue.data;
|
|
603
|
+
var embedAndGetFontObj = async (arg) => {
|
|
604
|
+
const { pdfDoc, font, _cache } = arg;
|
|
605
|
+
if (_cache.has(pdfDoc)) return _cache.get(pdfDoc);
|
|
606
|
+
const fontValues = await Promise.all(Object.values(font).map(async (v) => {
|
|
607
|
+
let fontData = v.data;
|
|
627
608
|
if (typeof fontData === "string" && fontData.startsWith("http")) fontData = await fetchRemoteFontData(fontData);
|
|
628
|
-
return pdfDoc.embedFont(fontData, { subset: typeof
|
|
629
|
-
})
|
|
630
|
-
|
|
631
|
-
|
|
609
|
+
return pdfDoc.embedFont(fontData, { subset: typeof v.subset === "undefined" ? true : v.subset });
|
|
610
|
+
}));
|
|
611
|
+
const fontObj = Object.keys(font).reduce((acc, cur, i) => Object.assign(acc, { [cur]: fontValues[i] }), {});
|
|
612
|
+
_cache.set(pdfDoc, fontObj);
|
|
613
|
+
return fontObj;
|
|
632
614
|
};
|
|
633
615
|
var getFontProp = ({ value, fontKitFont, schema, colorType, fontSize: resolvedFontSize }) => {
|
|
634
616
|
const fontSize = resolvedFontSize ?? (schema.dynamicFontSize ? calculateDynamicFontSize({
|
|
@@ -646,24 +628,16 @@ var getFontProp = ({ value, fontKitFont, schema, colorType, fontSize: resolvedFo
|
|
|
646
628
|
color
|
|
647
629
|
};
|
|
648
630
|
};
|
|
649
|
-
var graphemeSegmenter;
|
|
650
|
-
var getGraphemeSegmenter = () => {
|
|
651
|
-
graphemeSegmenter ?? (graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" }));
|
|
652
|
-
return graphemeSegmenter;
|
|
653
|
-
};
|
|
654
631
|
var pdfRender = async (arg) => {
|
|
655
632
|
const { value, pdfDoc, pdfLib, page, options, schema, _cache } = arg;
|
|
656
633
|
if (!value) return;
|
|
657
634
|
const { font = getDefaultFont(), colorType } = options;
|
|
658
|
-
const
|
|
659
|
-
const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);
|
|
660
|
-
const pdfFontValuePromise = enableInlineMarkdown ? void 0 : embedAndGetFont({
|
|
635
|
+
const [pdfFontObj, fontKitFont] = await Promise.all([embedAndGetFontObj({
|
|
661
636
|
pdfDoc,
|
|
662
637
|
font,
|
|
663
|
-
fontName,
|
|
664
638
|
_cache
|
|
665
|
-
});
|
|
666
|
-
const
|
|
639
|
+
}), getFontKitFont(schema.fontName, font, _cache)]);
|
|
640
|
+
const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);
|
|
667
641
|
const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = getFontProp({
|
|
668
642
|
value: enableInlineMarkdown ? stripInlineMarkdown(value) : value,
|
|
669
643
|
fontKitFont,
|
|
@@ -676,6 +650,8 @@ var pdfRender = async (arg) => {
|
|
|
676
650
|
_cache
|
|
677
651
|
}) : void 0
|
|
678
652
|
});
|
|
653
|
+
const fontName = schema.fontName ? schema.fontName : getFallbackFontName(font);
|
|
654
|
+
const pdfFontValue = pdfFontObj && pdfFontObj[fontName];
|
|
679
655
|
const pageHeight = page.getHeight();
|
|
680
656
|
const { width, height, rotate, position: { x, y }, opacity } = convertForPdfLayoutProps({
|
|
681
657
|
schema,
|
|
@@ -715,12 +691,7 @@ var pdfRender = async (arg) => {
|
|
|
715
691
|
value,
|
|
716
692
|
schema,
|
|
717
693
|
font,
|
|
718
|
-
|
|
719
|
-
pdfDoc,
|
|
720
|
-
font,
|
|
721
|
-
fontName,
|
|
722
|
-
_cache
|
|
723
|
-
}),
|
|
694
|
+
pdfFontObj,
|
|
724
695
|
fontKitFont,
|
|
725
696
|
page,
|
|
726
697
|
pdfLib,
|
|
@@ -742,8 +713,6 @@ var pdfRender = async (arg) => {
|
|
|
742
713
|
});
|
|
743
714
|
return;
|
|
744
715
|
}
|
|
745
|
-
if (!pdfFontValuePromise) throw new Error("[@pdfme/schemas] Failed to prepare PDF font for text rendering.");
|
|
746
|
-
const pdfFontValue = await pdfFontValuePromise;
|
|
747
716
|
const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);
|
|
748
717
|
const descent = getFontDescentInPt(fontKitFont, fontSize);
|
|
749
718
|
const halfLineHeightAdjustment = lineHeight === 0 ? 0 : (lineHeight - 1) * fontSize / 2;
|
|
@@ -754,8 +723,6 @@ var pdfRender = async (arg) => {
|
|
|
754
723
|
fontKitFont,
|
|
755
724
|
boxWidthInPt: width
|
|
756
725
|
});
|
|
757
|
-
const needsTextWidth = alignment !== "left" || Boolean(schema.strikethrough || schema.underline);
|
|
758
|
-
const needsTextHeight = Boolean(schema.strikethrough || schema.underline);
|
|
759
726
|
let yOffset = 0;
|
|
760
727
|
if (verticalAlignment === "top") yOffset = firstLineTextHeight + halfLineHeightAdjustment;
|
|
761
728
|
else {
|
|
@@ -763,10 +730,11 @@ var pdfRender = async (arg) => {
|
|
|
763
730
|
if (verticalAlignment === "bottom") yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;
|
|
764
731
|
else if (verticalAlignment === "middle") yOffset = (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;
|
|
765
732
|
}
|
|
733
|
+
const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
766
734
|
lines.forEach((line, rowIndex) => {
|
|
767
735
|
const trimmed = line.replace("\n", "");
|
|
768
|
-
const textWidth =
|
|
769
|
-
const textHeight =
|
|
736
|
+
const textWidth = widthOfTextAtSize(trimmed, fontKitFont, fontSize, characterSpacing);
|
|
737
|
+
const textHeight = heightOfFontAtSize(fontKitFont, fontSize);
|
|
770
738
|
const rowYOffset = lineHeight * fontSize * rowIndex;
|
|
771
739
|
if (line === "") line = "\r\n";
|
|
772
740
|
let xLine = x;
|
|
@@ -817,7 +785,7 @@ var pdfRender = async (arg) => {
|
|
|
817
785
|
}
|
|
818
786
|
let spacing = characterSpacing;
|
|
819
787
|
if (alignment === "justify" && line.slice(-1) !== "\n") {
|
|
820
|
-
const iterator =
|
|
788
|
+
const iterator = segmenter.segment(trimmed)[Symbol.iterator]();
|
|
821
789
|
const len = Array.from(iterator).length;
|
|
822
790
|
spacing += (width - textWidth) / len;
|
|
823
791
|
}
|
|
@@ -1418,4 +1386,4 @@ var builtInPlugins = { Text: textSchema };
|
|
|
1418
1386
|
//#endregion
|
|
1419
1387
|
export { mapVerticalAlignToFlex as a, Formatter as c, isInlineMarkdownTextSchema as d, resolveFontVariant as f, makeElementPlainTextContentEditable as i, getExtraFormatterSchema as l, parseInlineMarkdown as m, textSchema as n, uiRender as o, escapeInlineMarkdown as p, buildStyledTextContainer as r, propPanel as s, builtInPlugins as t, pdfRender as u };
|
|
1420
1388
|
|
|
1421
|
-
//# sourceMappingURL=builtins-
|
|
1389
|
+
//# sourceMappingURL=builtins-CWHhKSVA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins-CWHhKSVA.js","names":[],"sources":["../src/text/inlineMarkdown.ts","../src/text/richText.ts","../src/text/richTextPdfRender.ts","../src/text/pdfRender.ts","../src/text/icons/index.ts","../src/text/extraFormatter.ts","../src/text/propPanel.ts","../src/text/uiRender.ts","../src/text/index.ts","../src/builtins.ts"],"sourcesContent":["import 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\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 });\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 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 delimiter = getDelimiter(value, index);\n if (!delimiter) {\n buffer += char;\n continue;\n }\n\n const closingIndex = findClosingDelimiter(value, delimiter, index + delimiter.length);\n if (closingIndex === -1 || closingIndex + delimiter.length > to) {\n buffer += char;\n continue;\n }\n\n flush();\n\n if (delimiter === '`') {\n appendRun(\n runs,\n value.slice(index + 1, closingIndex).replace(MARKDOWN_UNESCAPE_PATTERN, '$1'),\n { ...style, code: true },\n );\n } else {\n const nestedRuns = parseRange(\n value,\n index + delimiter.length,\n closingIndex,\n mergeStyle(style, delimiter),\n );\n nestedRuns.forEach((run) => appendRun(runs, run.text, run));\n }\n\n index = closingIndex + delimiter.length - 1;\n }\n\n flush();\n return runs;\n};\n\nexport const parseInlineMarkdown = (value: string): RichTextRun[] => {\n if (!value) return [];\n return parseRange(value, 0, value.length, {});\n};\n\nexport const escapeInlineMarkdown = (value: string): string =>\n value.replace(MARKDOWN_ESCAPE_PATTERN, (char) => `\\\\${char}`);\n\nexport const stripInlineMarkdown = (value: string): string =>\n parseInlineMarkdown(value)\n .map((run) => run.text)\n .join('');\n","import { getFallbackFontName, mm2pt, pt2mm, type Font } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_VARIANT_FALLBACK,\n DYNAMIC_FIT_HORIZONTAL,\n DYNAMIC_FIT_VERTICAL,\n FONT_SIZE_ADJUSTMENT,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n TEXT_FORMAT_INLINE_MARKDOWN,\n} from './constants.js';\nimport { getFontKitFont, heightOfFontAtSize, widthOfTextAtSize } from './helper.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport type { RichTextRun, TextSchema } from './types.js';\n\nexport type ResolvedRichTextRun = RichTextRun & {\n fontName: string;\n fontKitFont: FontKitFont;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\nexport type RichTextLineRun = ResolvedRichTextRun & {\n width: number;\n};\n\nexport type RichTextLine = {\n runs: RichTextLineRun[];\n width: number;\n hardBreak: boolean;\n};\n\ntype FontVariantResolution = {\n fontName: string;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\ntype RichTextRunPiece = {\n run: ResolvedRichTextRun;\n text: string;\n};\n\nconst richTextWordSegmenter = new Intl.Segmenter(undefined, { granularity: 'word' });\nconst richTextGraphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\nconst getBaseFontName = (schema: TextSchema, font: Font) =>\n schema.fontName && font[schema.fontName] ? schema.fontName : getFallbackFontName(font);\n\nconst getLoadedFontName = (font: Font, fontName?: string) =>\n fontName && font[fontName] ? fontName : undefined;\n\nexport const isInlineMarkdownTextSchema = (schema: TextSchema) =>\n schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN &&\n !(schema.type === 'text' && schema.readOnly !== true);\n\nexport const resolveFontVariant = (\n run: RichTextRun,\n schema: TextSchema,\n font: Font,\n): FontVariantResolution => {\n const baseFontName = getBaseFontName(schema, font);\n const variants = schema.fontVariants ?? {};\n const fallback = schema.fontVariantFallback ?? DEFAULT_FONT_VARIANT_FALLBACK;\n\n let fontName = baseFontName;\n let needsBold = Boolean(run.bold);\n let needsItalic = Boolean(run.italic);\n\n if (run.code) {\n fontName = getLoadedFontName(font, variants.code) ?? baseFontName;\n } else if (run.bold && run.italic) {\n const boldItalic = getLoadedFontName(font, variants.boldItalic);\n const italic = getLoadedFontName(font, variants.italic);\n const bold = getLoadedFontName(font, variants.bold);\n\n if (boldItalic) {\n fontName = boldItalic;\n needsBold = false;\n needsItalic = false;\n } else if (italic) {\n fontName = italic;\n needsItalic = false;\n } else if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.bold) {\n const bold = getLoadedFontName(font, variants.bold);\n if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.italic) {\n const italic = getLoadedFontName(font, variants.italic);\n if (italic) {\n fontName = italic;\n needsItalic = false;\n }\n }\n\n if (\n (needsBold || needsItalic || (run.code && !getLoadedFontName(font, variants.code))) &&\n fallback === FONT_VARIANT_FALLBACK_ERROR\n ) {\n throw new Error(\n `[@pdfme/schemas] Missing font variant for markdown text in field \"${schema.name}\".`,\n );\n }\n\n return {\n fontName,\n syntheticBold: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsBold,\n syntheticItalic: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsItalic,\n };\n};\n\nexport const resolveRichTextRuns = async (arg: {\n runs: RichTextRun[];\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n}): Promise<ResolvedRichTextRun[]> => {\n const { runs, schema, font, _cache } = arg;\n const fontKitCache = new Map<string, FontKitFont>();\n\n const getResolvedFontKitFont = async (fontName: string) => {\n const cached = fontKitCache.get(fontName);\n if (cached) return cached;\n\n const fontKitFont = await getFontKitFont(fontName, font, _cache as Map<string, FontKitFont>);\n fontKitCache.set(fontName, fontKitFont);\n return fontKitFont;\n };\n\n return Promise.all(\n runs.map(async (run) => {\n const resolution = resolveFontVariant(run, schema, font);\n return {\n ...run,\n ...resolution,\n fontKitFont: await getResolvedFontKitFont(resolution.fontName),\n };\n }),\n );\n};\n\nconst measureRunText = (\n run: ResolvedRichTextRun,\n text: string,\n fontSize: number,\n characterSpacing: number,\n) => {\n const syntheticBoldWidth = run.syntheticBold\n ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS\n : 0;\n const syntheticItalicWidth = run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n return (\n widthOfTextAtSize(text, run.fontKitFont, fontSize, characterSpacing) +\n syntheticBoldWidth +\n syntheticItalicWidth\n );\n};\n\nconst createLine = (): RichTextLine => ({ runs: [], width: 0, hardBreak: false });\n\nconst pushRunToLine = (\n line: RichTextLine,\n run: ResolvedRichTextRun,\n text: string,\n fontSize: number,\n characterSpacing: number,\n) => {\n if (!text) return;\n const width = measureRunText(run, text, fontSize, characterSpacing);\n if (line.runs.length > 0) line.width += characterSpacing;\n line.runs.push({ ...run, text, width });\n line.width += width;\n};\n\nconst measurePiecesWidth = (\n pieces: RichTextRunPiece[],\n fontSize: number,\n characterSpacing: number,\n) => {\n let width = 0;\n let hasText = false;\n pieces.forEach((piece) => {\n if (!piece.text) return;\n if (hasText) width += characterSpacing;\n width += measureRunText(piece.run, piece.text, fontSize, characterSpacing);\n hasText = true;\n });\n return width;\n};\n\nconst sliceRunPieces = (\n pieces: RichTextRunPiece[],\n startIndex: number,\n endIndex: number,\n): RichTextRunPiece[] => {\n const result: RichTextRunPiece[] = [];\n let offset = 0;\n\n pieces.forEach((piece) => {\n const pieceStart = offset;\n const pieceEnd = pieceStart + piece.text.length;\n const sliceStart = Math.max(startIndex, pieceStart);\n const sliceEnd = Math.min(endIndex, pieceEnd);\n\n if (sliceStart < sliceEnd) {\n result.push({\n run: piece.run,\n text: piece.text.slice(sliceStart - pieceStart, sliceEnd - pieceStart),\n });\n }\n\n offset = pieceEnd;\n });\n\n return result;\n};\n\nconst segmentRunPiecesByWord = (\n runs: ResolvedRichTextRun[],\n onSegment: (pieces: RichTextRunPiece[]) => void,\n onHardBreak: () => void,\n) => {\n let paragraphPieces: RichTextRunPiece[] = [];\n\n const flushParagraph = () => {\n if (paragraphPieces.length === 0) return;\n\n const paragraphText = paragraphPieces.map((piece) => piece.text).join('');\n Array.from(richTextWordSegmenter.segment(paragraphText), ({ segment, index }) => {\n const pieces = sliceRunPieces(paragraphPieces, index, index + segment.length);\n if (pieces.length > 0) onSegment(pieces);\n });\n paragraphPieces = [];\n };\n\n runs.forEach((run) => {\n run.text.split(/(\\r\\n|\\r|\\n)/).forEach((part) => {\n if (part === '\\r\\n' || part === '\\r' || part === '\\n') {\n flushParagraph();\n onHardBreak();\n return;\n }\n\n if (part) paragraphPieces.push({ run, text: part });\n });\n });\n\n flushParagraph();\n};\n\nconst splitIntoGraphemes = (value: string) =>\n Array.from(richTextGraphemeSegmenter.segment(value), ({ segment }) => segment);\n\nexport const countRichTextLineGraphemes = (line: RichTextLine) =>\n splitIntoGraphemes(line.runs.map((run) => run.text).join('')).length;\n\nexport const getRichTextLineText = (line: RichTextLine) =>\n line.runs.map((run) => run.text).join('');\n\nexport const layoutRichTextLines = (arg: {\n runs: ResolvedRichTextRun[];\n fontSize: number;\n characterSpacing: number;\n boxWidthInPt: number;\n}): RichTextLine[] => {\n const { runs, fontSize, characterSpacing, boxWidthInPt } = arg;\n const lines: RichTextLine[] = [];\n let currentLine = createLine();\n\n const pushCurrentLine = (hardBreak: boolean) => {\n currentLine.hardBreak = hardBreak;\n lines.push(currentLine);\n currentLine = createLine();\n };\n\n const pushPiecesToLine = (pieces: RichTextRunPiece[]) => {\n pieces.forEach((piece) => {\n pushRunToLine(currentLine, piece.run, piece.text, fontSize, characterSpacing);\n });\n };\n\n const pushOversizedText = (run: ResolvedRichTextRun, text: string) => {\n let remainingText = text;\n\n while (remainingText.length > 0) {\n const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;\n const remainingWidth = Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0);\n const remainingTextWidth = measureRunText(run, remainingText, fontSize, characterSpacing);\n\n if (\n remainingTextWidth <= remainingWidth ||\n (currentLine.runs.length === 0 && remainingTextWidth <= boxWidthInPt)\n ) {\n pushRunToLine(currentLine, run, remainingText, fontSize, characterSpacing);\n return;\n }\n\n if (currentLine.runs.length > 0 && remainingTextWidth <= boxWidthInPt) {\n pushCurrentLine(false);\n continue;\n }\n\n const graphemes = splitIntoGraphemes(remainingText);\n let fittingText = '';\n let fittingLength = 0;\n\n for (const grapheme of graphemes) {\n const candidate = fittingText + grapheme;\n const candidateWidth = measureRunText(run, candidate, fontSize, characterSpacing);\n const maxWidth = currentLine.runs.length === 0 ? boxWidthInPt : remainingWidth;\n if (candidateWidth > maxWidth) {\n if (fittingText) break;\n if (currentLine.runs.length > 0) break;\n }\n fittingText = candidate;\n fittingLength += grapheme.length;\n if (candidateWidth > maxWidth) break;\n }\n\n if (!fittingText) {\n pushCurrentLine(false);\n continue;\n }\n\n pushRunToLine(currentLine, run, fittingText, fontSize, characterSpacing);\n remainingText = remainingText.slice(fittingLength);\n if (remainingText.length > 0) pushCurrentLine(false);\n }\n };\n\n const pushSegment = (pieces: RichTextRunPiece[]) => {\n const segmentWidth = measurePiecesWidth(pieces, fontSize, characterSpacing);\n const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;\n const remainingWidth = Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0);\n\n if (\n segmentWidth <= remainingWidth ||\n (currentLine.runs.length === 0 && segmentWidth <= boxWidthInPt)\n ) {\n pushPiecesToLine(pieces);\n return;\n }\n\n if (currentLine.runs.length > 0) {\n pushCurrentLine(false);\n if (segmentWidth <= boxWidthInPt) {\n pushPiecesToLine(pieces);\n return;\n }\n }\n\n pieces.forEach((piece) => pushOversizedText(piece.run, piece.text));\n };\n\n segmentRunPiecesByWord(runs, pushSegment, () => pushCurrentLine(true));\n\n if (currentLine.runs.length > 0 || lines.length === 0) {\n pushCurrentLine(false);\n }\n\n return lines;\n};\n\nconst measureParagraphWidths = (\n runs: ResolvedRichTextRun[],\n fontSize: number,\n characterSpacing: number,\n) => {\n const widths: number[] = [];\n let paragraphPieces: RichTextRunPiece[] = [];\n\n const pushWidth = () => {\n widths.push(measurePiecesWidth(paragraphPieces, fontSize, characterSpacing));\n paragraphPieces = [];\n };\n\n runs.forEach((run) => {\n run.text.split(/(\\r\\n|\\r|\\n)/).forEach((part) => {\n if (part === '\\r\\n' || part === '\\r' || part === '\\n') {\n pushWidth();\n return;\n }\n\n if (part) paragraphPieces.push({ run, text: part });\n });\n });\n\n pushWidth();\n return widths;\n};\n\nconst getLineHeightAtSize = (line: RichTextLine, fontSize: number) => {\n if (line.runs.length === 0) return fontSize;\n return Math.max(...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)));\n};\n\nexport const calculateDynamicRichTextFontSize = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n startingFontSize?: number | undefined;\n}) => {\n const { value, schema, font, _cache, startingFontSize } = arg;\n const {\n fontSize: schemaFontSize,\n dynamicFontSize: dynamicFontSizeSetting,\n characterSpacing: schemaCharacterSpacing,\n width: boxWidth,\n height: boxHeight,\n lineHeight = DEFAULT_LINE_HEIGHT,\n } = schema;\n const fontSize = startingFontSize || schemaFontSize || DEFAULT_FONT_SIZE;\n if (!dynamicFontSizeSetting) return fontSize;\n if (dynamicFontSizeSetting.max < dynamicFontSizeSetting.min) return fontSize;\n\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const characterSpacing = schemaCharacterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const dynamicFontFit = dynamicFontSizeSetting.fit ?? DEFAULT_DYNAMIC_FIT;\n const boxWidthInPt = mm2pt(boxWidth);\n\n let dynamicFontSize = fontSize;\n if (dynamicFontSize < dynamicFontSizeSetting.min) {\n dynamicFontSize = dynamicFontSizeSetting.min;\n } else if (dynamicFontSize > dynamicFontSizeSetting.max) {\n dynamicFontSize = dynamicFontSizeSetting.max;\n }\n\n const calculateConstraints = (size: number) => {\n let totalWidthInMm = 0;\n let totalHeightInMm = 0;\n\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize: size,\n characterSpacing,\n boxWidthInPt,\n });\n\n lines.forEach((line, lineIndex) => {\n if (dynamicFontFit === DYNAMIC_FIT_VERTICAL) {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(line.width));\n }\n\n if (lineIndex === 0) {\n totalHeightInMm += pt2mm(getLineHeightAtSize(line, size) * lineHeight);\n } else {\n totalHeightInMm += pt2mm(size * lineHeight);\n }\n });\n\n if (dynamicFontFit === DYNAMIC_FIT_HORIZONTAL) {\n measureParagraphWidths(resolvedRuns, size, characterSpacing).forEach((paragraphWidth) => {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(paragraphWidth));\n });\n }\n\n return { totalWidthInMm, totalHeightInMm };\n };\n\n const shouldFontGrowToFit = (totalWidthInMm: number, totalHeightInMm: number) => {\n if (dynamicFontSize >= dynamicFontSizeSetting.max) {\n return false;\n }\n if (dynamicFontFit === DYNAMIC_FIT_HORIZONTAL) {\n return totalWidthInMm < boxWidth;\n }\n return totalHeightInMm < boxHeight;\n };\n\n const shouldFontShrinkToFit = (totalWidthInMm: number, totalHeightInMm: number) => {\n if (dynamicFontSize <= dynamicFontSizeSetting.min || dynamicFontSize <= 0) {\n return false;\n }\n return totalWidthInMm > boxWidth || totalHeightInMm > boxHeight;\n };\n\n let { totalWidthInMm, totalHeightInMm } = calculateConstraints(dynamicFontSize);\n\n while (shouldFontGrowToFit(totalWidthInMm, totalHeightInMm)) {\n dynamicFontSize += FONT_SIZE_ADJUSTMENT;\n const { totalWidthInMm: newWidth, totalHeightInMm: newHeight } =\n calculateConstraints(dynamicFontSize);\n\n if (newHeight < boxHeight) {\n totalWidthInMm = newWidth;\n totalHeightInMm = newHeight;\n } else {\n dynamicFontSize -= FONT_SIZE_ADJUSTMENT;\n break;\n }\n }\n\n while (shouldFontShrinkToFit(totalWidthInMm, totalHeightInMm)) {\n dynamicFontSize -= FONT_SIZE_ADJUSTMENT;\n ({ totalWidthInMm, totalHeightInMm } = calculateConstraints(dynamicFontSize));\n }\n\n return dynamicFontSize;\n};\n","import type { PDFFont, Rotation } from '@pdfme/pdf-lib';\nimport type { ColorType, Font, PDFRenderProps } from '@pdfme/common';\nimport { mm2pt } 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 { parseInlineMarkdown } from './inlineMarkdown.js';\nimport {\n countRichTextLineGraphemes,\n layoutRichTextLines,\n resolveRichTextRuns,\n type RichTextLineRun,\n} from './richText.js';\nimport type { TextSchema } from './types.js';\nimport { hex2PrintingColor, rotatePoint } from '../utils.js';\n\ntype TextColor = ReturnType<typeof hex2PrintingColor>;\n\nconst getSyntheticBoldWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticBold ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS : 0;\n\nconst getSyntheticItalicWidth = (run: RichTextLineRun, fontSize: number) =>\n run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n\nconst getRunWidth = (run: RichTextLineRun, fontSize: number, characterSpacing: number) =>\n widthOfTextAtSize(run.text, run.fontKitFont, fontSize, characterSpacing) +\n getSyntheticBoldWidth(run, fontSize) +\n getSyntheticItalicWidth(run, fontSize);\n\nconst getPdfFont = (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 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 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}) => {\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 } = arg;\n const runWidth = getRunWidth(run, fontSize, characterSpacing);\n const textHeight = heightOfFontAtSize(run.fontKitFont, fontSize);\n\n if (run.code) {\n const padding = CODE_HORIZONTAL_PADDING;\n const bgX = x - padding;\n const bgY = y - textHeight * 0.2;\n const bgPoint =\n rotate.angle === 0\n ? { x: bgX, y: bgY }\n : rotatePoint({ x: bgX, y: bgY }, pivotPoint, rotate.angle);\n page.drawRectangle({\n x: bgPoint.x,\n y: bgPoint.y,\n width: runWidth + padding * 2,\n height: textHeight * 1.2,\n rotate,\n color: hex2PrintingColor(CODE_BACKGROUND_COLOR, colorType),\n opacity,\n });\n }\n\n if (strikethrough && runWidth > 0) {\n drawDecorationLine({\n page,\n x,\n y: y + textHeight / 3,\n width: runWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n\n const drawAt = (drawX: number) => {\n const point =\n rotate.angle === 0 ? { x: drawX, y } : rotatePoint({ x: drawX, y }, pivotPoint, rotate.angle);\n page.drawText(run.text, {\n x: point.x,\n y: point.y,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFont,\n opacity,\n ...(run.syntheticItalic ? { ySkew: pdfLib.degrees(SYNTHETIC_ITALIC_SKEW_DEGREES) } : {}),\n });\n };\n\n drawAt(x);\n if (run.syntheticBold) {\n const offset = fontSize * SYNTHETIC_BOLD_OFFSET_RATIO;\n for (let i = 1; i <= SYNTHETIC_BOLD_PDF_EXTRA_DRAWS; i++) {\n drawAt(x + offset * i);\n }\n }\n};\n\nexport const renderInlineMarkdownText = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n pdfFontObj: Record<string, PDFFont>;\n fontKitFont: FontKitFont;\n page: PDFRenderProps<TextSchema>['page'];\n pdfLib: PDFRenderProps<TextSchema>['pdfLib'];\n _cache: Map<string | number, unknown>;\n colorType: ColorType;\n fontSize: number;\n color: TextColor;\n alignment: string;\n verticalAlignment: string;\n lineHeight: number;\n characterSpacing: number;\n x: number;\n width: number;\n height: number;\n pageHeight: number;\n pivotPoint: { x: number; y: number };\n rotate: Rotation;\n opacity: number | undefined;\n}) => {\n const {\n value,\n schema,\n font,\n pdfFontObj,\n fontKitFont,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n width,\n height,\n pageHeight,\n pivotPoint,\n rotate,\n opacity,\n } = arg;\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize,\n characterSpacing,\n boxWidthInPt: width,\n });\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n if (line.runs.length === 0) return;\n\n let textWidth = line.width;\n let spacing = characterSpacing;\n const shouldJustify = alignment === 'justify' && !line.hardBreak && rowIndex < lines.length - 1;\n\n if (shouldJustify) {\n const graphemeCount = countRichTextLineGraphemes(line);\n if (graphemeCount > 0) {\n spacing += (width - textWidth) / graphemeCount;\n textWidth = width;\n }\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n const yLine =\n pageHeight - mm2pt(schema.position.y) - yOffset - lineHeight * fontSize * rowIndex;\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n if (schema.strikethrough || schema.underline) {\n const textHeight = Math.max(\n ...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)),\n );\n if (schema.strikethrough) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n if (schema.underline) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n }\n\n line.runs.reduce((currentX, run, runIndex) => {\n const runWidth = getRunWidth(run, fontSize, spacing);\n const pdfFont = getPdfFont(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 });\n\n return currentX + runWidth + (runIndex === line.runs.length - 1 ? 0 : spacing);\n }, xLine);\n });\n};\n","import { PDFFont, PDFDocument } from '@pdfme/pdf-lib';\nimport type { Font as FontKitFont } from 'fontkit';\nimport type { TextSchema } from './types.js';\nimport {\n PDFRenderProps,\n ColorType,\n Font,\n getDefaultFont,\n getFallbackFontName,\n mm2pt,\n} from '@pdfme/common';\nimport {\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n} from './constants.js';\nimport {\n calculateDynamicFontSize,\n heightOfFontAtSize,\n getFontDescentInPt,\n getFontKitFont,\n fetchRemoteFontData,\n widthOfTextAtSize,\n splitTextToSize,\n} from './helper.js';\nimport { stripInlineMarkdown } from './inlineMarkdown.js';\nimport { calculateDynamicRichTextFontSize, isInlineMarkdownTextSchema } from './richText.js';\nimport { renderInlineMarkdownText } from './richTextPdfRender.js';\nimport { convertForPdfLayoutProps, rotatePoint, hex2PrintingColor } from '../utils.js';\n\nconst embedAndGetFontObj = async (arg: {\n pdfDoc: PDFDocument;\n font: Font;\n _cache: Map<PDFDocument, { [key: string]: PDFFont }>;\n}) => {\n const { pdfDoc, font, _cache } = arg;\n if (_cache.has(pdfDoc)) {\n return _cache.get(pdfDoc) as { [key: string]: PDFFont };\n }\n\n const fontValues = await Promise.all(\n Object.values(font).map(async (v) => {\n let fontData = v.data;\n if (typeof fontData === 'string' && fontData.startsWith('http')) {\n fontData = await fetchRemoteFontData(fontData);\n }\n return pdfDoc.embedFont(fontData, {\n subset: typeof v.subset === 'undefined' ? true : v.subset,\n });\n }),\n );\n\n const fontObj = Object.keys(font).reduce(\n (acc, cur, i) => Object.assign(acc, { [cur]: fontValues[i] }),\n {} as { [key: string]: PDFFont },\n );\n\n _cache.set(pdfDoc, fontObj);\n return fontObj;\n};\n\nconst getFontProp = ({\n value,\n fontKitFont,\n schema,\n colorType,\n fontSize: resolvedFontSize,\n}: {\n value: string;\n fontKitFont: FontKitFont;\n colorType?: ColorType;\n schema: TextSchema;\n fontSize?: number;\n}) => {\n const fontSize =\n resolvedFontSize ??\n (schema.dynamicFontSize\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE));\n const color = hex2PrintingColor(schema.fontColor || DEFAULT_FONT_COLOR, colorType);\n\n return {\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n verticalAlignment: schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n lineHeight: schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n color,\n };\n};\n\nexport const pdfRender = async (arg: PDFRenderProps<TextSchema>) => {\n const { value, pdfDoc, pdfLib, page, options, schema, _cache } = arg;\n if (!value) return;\n\n const { font = getDefaultFont(), colorType } = options;\n\n const [pdfFontObj, fontKitFont] = await Promise.all([\n embedAndGetFontObj({\n pdfDoc,\n font,\n _cache: _cache as unknown as Map<PDFDocument, { [key: string]: PDFFont }>,\n }),\n getFontKitFont(schema.fontName, font, _cache as Map<string, FontKitFont>),\n ]);\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && schema.dynamicFontSize\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : undefined;\n const fontProp = getFontProp({\n value: displayValue,\n fontKitFont,\n schema,\n colorType,\n fontSize: dynamicRichTextFontSize,\n });\n\n const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = fontProp;\n\n const fontName = (\n schema.fontName ? schema.fontName : getFallbackFontName(font)\n ) as keyof typeof pdfFontObj;\n const pdfFontValue = pdfFontObj && pdfFontObj[fontName];\n\n const pageHeight = page.getHeight();\n const {\n width,\n height,\n rotate,\n position: { x, y },\n opacity,\n } = convertForPdfLayoutProps({ schema, pageHeight, applyRotateTranslate: false });\n\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(schema.position.y) - height / 2 };\n\n if (schema.backgroundColor) {\n const color = hex2PrintingColor(schema.backgroundColor, colorType);\n if (rotate.angle !== 0) {\n // Apply the same rotation logic as text rendering to match UI behavior\n const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotate.angle);\n page.drawRectangle({ x: rotatedPoint.x, y: rotatedPoint.y, width, height, rotate, color });\n } else {\n page.drawRectangle({ x, y, width, height, rotate, color });\n }\n }\n\n if (enableInlineMarkdown) {\n await renderInlineMarkdownText({\n value,\n schema,\n font,\n pdfFontObj,\n fontKitFont,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n width,\n height,\n pageHeight,\n pivotPoint,\n rotate,\n opacity,\n });\n return;\n }\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n const lines = splitTextToSize({\n value,\n characterSpacing,\n fontSize,\n fontKitFont,\n boxWidthInPt: width,\n });\n\n // Text lines are rendered from the bottom upwards, we need to adjust the position down\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;\n }\n }\n\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\n lines.forEach((line, rowIndex) => {\n const trimmed = line.replace('\\n', '');\n const textWidth = widthOfTextAtSize(trimmed, fontKitFont, fontSize, characterSpacing);\n const textHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const rowYOffset = lineHeight * fontSize * rowIndex;\n\n // Adobe Acrobat Reader shows an error if `drawText` is called with an empty text\n if (line === '') {\n // return; // this also works\n line = '\\r\\n';\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n let yLine = pageHeight - mm2pt(schema.position.y) - yOffset - rowYOffset;\n\n // draw strikethrough\n if (schema.strikethrough && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine + textHeight / 3;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n // draw underline\n if (schema.underline && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine - textHeight / 12;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n if (rotate.angle !== 0) {\n // As we draw each line individually from different points, we must translate each lines position\n // relative to the UI rotation pivot point. see comments in convertForPdfLayoutProps() for more info.\n const rotatedPoint = rotatePoint({ x: xLine, y: yLine }, pivotPoint, rotate.angle);\n xLine = rotatedPoint.x;\n yLine = rotatedPoint.y;\n }\n\n let spacing = characterSpacing;\n if (alignment === 'justify' && line.slice(-1) !== '\\n') {\n // if alignment is `justify` but the end of line is not newline, then adjust the spacing\n const iterator = segmenter.segment(trimmed)[Symbol.iterator]();\n const len = Array.from(iterator).length;\n spacing += (width - textWidth) / len;\n }\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n page.drawText(trimmed, {\n x: xLine,\n y: yLine,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFontValue,\n opacity,\n });\n });\n};\n","import {\n Strikethrough,\n Underline,\n AlignLeft,\n AlignCenter,\n AlignRight,\n ArrowUpToLine,\n ArrowDownToLine,\n AlignJustify,\n} from 'lucide';\nimport { createSvgStr } from '../../utils.js';\n\nexport const TextStrikethroughIcon = createSvgStr(Strikethrough);\n\nexport const TextUnderlineIcon = createSvgStr(Underline);\n\nexport const TextAlignLeftIcon = createSvgStr(AlignLeft);\n\nexport const TextAlignCenterIcon = createSvgStr(AlignCenter);\n\nexport const TextAlignRightIcon = createSvgStr(AlignRight);\n\nexport const TextAlignJustifyIcon = createSvgStr(AlignJustify);\n\nexport const TextVerticalAlignTopIcon = createSvgStr(ArrowUpToLine);\n\n// svg icons are material icons from https://www.xicons.org\nexport const TextVerticalAlignMiddleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 24 24\"><path d=\"M8 19h3v4h2v-4h3l-4-4l-4 4zm8-14h-3V1h-2v4H8l4 4l4-4zM4 11v2h16v-2H4z\" fill=\"currentColor\"></path></svg>`;\n\nexport const TextVerticalAlignBottomIcon = createSvgStr(ArrowDownToLine);\n","// No imports needed from @pdfme/common\nimport {\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextAlignJustifyIcon,\n TextStrikethroughIcon,\n TextUnderlineIcon,\n TextVerticalAlignBottomIcon,\n TextVerticalAlignMiddleIcon,\n TextVerticalAlignTopIcon,\n} from './icons/index.js';\nimport {\n ALIGN_CENTER,\n ALIGN_RIGHT,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n ALIGN_JUSTIFY,\n} from './constants.js';\n\nexport enum Formatter {\n STRIKETHROUGH = 'strikethrough',\n UNDERLINE = 'underline',\n ALIGNMENT = 'alignment',\n VERTICAL_ALIGNMENT = 'verticalAlignment',\n}\n\ninterface GroupButtonBoolean {\n key: Formatter;\n icon: string;\n type: 'boolean';\n}\n\ninterface GroupButtonString {\n key: Formatter;\n icon: string;\n type: 'select';\n value: string;\n}\n\ntype GroupButton = GroupButtonBoolean | GroupButtonString;\n\nexport function getExtraFormatterSchema(i18n: (key: string) => string): {\n title: string;\n widget: string;\n buttons: GroupButton[];\n span: number;\n} {\n const buttons: GroupButton[] = [\n { key: Formatter.STRIKETHROUGH, icon: TextStrikethroughIcon, type: 'boolean' },\n { key: Formatter.UNDERLINE, icon: TextUnderlineIcon, type: 'boolean' },\n { key: Formatter.ALIGNMENT, icon: TextAlignLeftIcon, type: 'select', value: DEFAULT_ALIGNMENT },\n { key: Formatter.ALIGNMENT, icon: TextAlignCenterIcon, type: 'select', value: ALIGN_CENTER },\n { key: Formatter.ALIGNMENT, icon: TextAlignRightIcon, type: 'select', value: ALIGN_RIGHT },\n { key: Formatter.ALIGNMENT, icon: TextAlignJustifyIcon, type: 'select', value: ALIGN_JUSTIFY },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignTopIcon,\n type: 'select',\n value: DEFAULT_VERTICAL_ALIGNMENT,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignMiddleIcon,\n type: 'select',\n value: VERTICAL_ALIGN_MIDDLE,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignBottomIcon,\n type: 'select',\n value: VERTICAL_ALIGN_BOTTOM,\n },\n ];\n return {\n title: i18n('schemas.text.format'),\n widget: 'ButtonGroup',\n buttons,\n span: 24,\n };\n}\n","import {\n DEFAULT_FONT_NAME,\n PropPanel,\n PropPanelWidgetProps,\n PropPanelSchema,\n getFallbackFontName,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_COLOR,\n DYNAMIC_FIT_VERTICAL,\n DYNAMIC_FIT_HORIZONTAL,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n DEFAULT_TEXT_FORMAT,\n TEXT_FORMAT_INLINE_MARKDOWN,\n TEXT_FORMAT_PLAIN,\n DEFAULT_FONT_VARIANT_FALLBACK,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n FONT_VARIANT_FALLBACK_SYNTHETIC,\n} from './constants.js';\nimport { DEFAULT_OPACITY, HEX_COLOR_PATTERN } from '../constants.js';\nimport { getExtraFormatterSchema } from './extraFormatter.js';\n\nconst UseDynamicFontSize = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n checkbox.onchange = (e: Event) => {\n const val = (e.target as HTMLInputElement).checked\n ? {\n min: DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n max: DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n fit: DEFAULT_DYNAMIC_FIT,\n }\n : undefined;\n changeSchemas([{ key: 'dynamicFontSize', value: val, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.dynamicFontSize') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nconst UseInlineMarkdown = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n (activeSchema as { textFormat?: unknown })?.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n checkbox.onchange = (e: Event) => {\n const value = (e.target as HTMLInputElement).checked\n ? TEXT_FORMAT_INLINE_MARKDOWN\n : TEXT_FORMAT_PLAIN;\n changeSchemas([{ key: 'textFormat', value, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.inlineMarkdown') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nexport const propPanel: PropPanel<TextSchema> = {\n schema: ({ options, activeSchema, i18n }) => {\n const font = options.font || { [DEFAULT_FONT_NAME]: { data: '', fallback: true } };\n const fontNames = Object.keys(font);\n const fallbackFontName = getFallbackFontName(font);\n\n const enableDynamicFont = Boolean(\n (activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize,\n );\n const activeTextSchema = activeSchema as unknown as TextSchema;\n const hideTextFormat = activeTextSchema.type === 'text' && activeTextSchema.readOnly !== true;\n const enableInlineMarkdown =\n activeTextSchema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN && !hideTextFormat;\n const baseFontName =\n activeTextSchema.fontName && font[activeTextSchema.fontName]\n ? activeTextSchema.fontName\n : fallbackFontName;\n const optionalFontNames = [\n { label: baseFontName, value: '' },\n ...fontNames\n .filter((name) => name !== baseFontName)\n .map((name) => ({ label: name, value: name })),\n ];\n\n const textSchema: Record<string, PropPanelSchema> = {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n disabled: enableDynamicFont,\n props: { min: 0 },\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n props: { min: 0 },\n },\n formatter: getExtraFormatterSchema(i18n),\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n useDynamicFontSize: { type: 'boolean', widget: 'UseDynamicFontSize', bind: false, span: 16 },\n dynamicFontSize: {\n type: 'object',\n widget: 'card',\n column: 3,\n properties: {\n min: {\n title: i18n('schemas.text.min'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n max: {\n title: i18n('schemas.text.max'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n fit: {\n title: i18n('schemas.text.fit'),\n type: 'string',\n widget: 'select',\n hidden: !enableDynamicFont,\n props: {\n options: [\n { label: i18n('schemas.horizontal'), value: DYNAMIC_FIT_HORIZONTAL },\n { label: i18n('schemas.vertical'), value: DYNAMIC_FIT_VERTICAL },\n ],\n },\n },\n },\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n backgroundColor: {\n title: i18n('schemas.bgColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n useInlineMarkdown: {\n type: 'boolean',\n widget: 'UseInlineMarkdown',\n bind: false,\n hidden: hideTextFormat,\n span: enableInlineMarkdown ? 12 : 24,\n },\n fontVariantFallback: {\n title: i18n('schemas.text.variantFallback'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_FONT_VARIANT_FALLBACK,\n hidden: !enableInlineMarkdown,\n props: {\n options: [\n { label: i18n('schemas.text.synthetic'), value: FONT_VARIANT_FALLBACK_SYNTHETIC },\n { label: i18n('schemas.text.plain'), value: FONT_VARIANT_FALLBACK_PLAIN },\n { label: i18n('schemas.text.error'), value: FONT_VARIANT_FALLBACK_ERROR },\n ],\n },\n span: 12,\n },\n fontVariants: {\n title: i18n('schemas.text.markdownFonts'),\n type: 'object',\n widget: 'card',\n column: 2,\n hidden: !enableInlineMarkdown,\n properties: {\n bold: {\n title: i18n('schemas.text.boldFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n italic: {\n title: i18n('schemas.text.italicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n boldItalic: {\n title: i18n('schemas.text.boldItalicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n code: {\n title: i18n('schemas.text.codeFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n },\n },\n };\n\n return textSchema;\n },\n widgets: { UseDynamicFontSize, UseInlineMarkdown },\n defaultSchema: {\n name: '',\n type: 'text',\n content: 'Type Something...',\n position: { x: 0, y: 0 },\n width: 45,\n height: 10,\n // If the value of \"rotate\" is set to undefined or not set at all, rotation will be disabled in the UI.\n // Check this document: https://pdfme.com//docs/custom-schemas#learning-how-to-create-from-pdfmeschemas-code\n rotate: 0,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: DEFAULT_VERTICAL_ALIGNMENT,\n fontSize: DEFAULT_FONT_SIZE,\n textFormat: DEFAULT_TEXT_FORMAT,\n fontVariantFallback: DEFAULT_FONT_VARIANT_FALLBACK,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n dynamicFontSize: undefined,\n fontColor: DEFAULT_FONT_COLOR,\n fontName: undefined,\n backgroundColor: '',\n opacity: DEFAULT_OPACITY,\n strikethrough: false,\n underline: false,\n },\n};\n","import type * as CSS from 'csstype';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { UIRenderProps, getDefaultFont } from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n PLACEHOLDER_FONT_COLOR,\n CODE_BACKGROUND_COLOR,\n SYNTHETIC_BOLD_CSS_TEXT_SHADOW,\n} from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n getBrowserVerticalFontAdjustments,\n isFirefox,\n} from './helper.js';\nimport { parseInlineMarkdown, stripInlineMarkdown } from './inlineMarkdown.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n resolveRichTextRuns,\n} from './richText.js';\nimport { isEditable } from '../utils.js';\n\nconst replaceUnsupportedChars = (text: string, fontKitFont: FontKitFont): string => {\n const charSupportCache: { [char: string]: boolean } = {};\n\n const isCharSupported = (char: string): boolean => {\n if (char in charSupportCache) {\n return charSupportCache[char];\n }\n const isSupported = fontKitFont.hasGlyphForCodePoint(char.codePointAt(0) || 0);\n charSupportCache[char] = isSupported;\n return isSupported;\n };\n\n const segments = text.split(/(\\r\\n|\\n|\\r)/);\n\n return segments\n .map((segment) => {\n if (/\\r\\n|\\n|\\r/.test(segment)) {\n return segment;\n }\n\n return Array.from(segment)\n .map((char) => {\n if (/\\s/.test(char) || char.charCodeAt(0) < 32) {\n return char;\n }\n\n return isCharSupported(char) ? char : '〿';\n })\n .join('');\n })\n .join('');\n};\n\nexport const uiRender = async (arg: UIRenderProps<TextSchema>) => {\n const { value, schema, mode, onChange, stopEditing, tabIndex, placeholder, options, _cache } =\n arg;\n const usePlaceholder = isEditable(mode, schema) && placeholder && !value;\n const getText = (element: HTMLDivElement) => {\n let text = element.innerText;\n if (text.endsWith('\\n')) {\n // contenteditable adds additional newline char retrieved with innerText\n text = text.slice(0, -1);\n }\n return text;\n };\n const font = options?.font || getDefaultFont();\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, import('fontkit').Font>,\n );\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && schema.dynamicFontSize\n ? await calculateDynamicRichTextFontSize({\n value: usePlaceholder ? (placeholder as string) : value,\n schema,\n font,\n _cache,\n })\n : undefined;\n const textBlock = buildStyledTextContainer(\n arg,\n fontKitFont,\n usePlaceholder ? placeholder : displayValue,\n dynamicRichTextFontSize,\n );\n\n const processedText = replaceUnsupportedChars(value, fontKitFont);\n\n if (!isEditable(mode, schema)) {\n if (enableInlineMarkdown) {\n await renderInlineMarkdownReadOnly({\n textBlock,\n value,\n schema,\n font,\n _cache,\n });\n return;\n }\n\n // Read-only mode\n textBlock.innerHTML = processedText\n .split('')\n .map((l, i) => {\n const escaped = l\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n return `<span style=\"letter-spacing:${\n String(value).length === i + 1 ? 0 : 'inherit'\n };\">${escaped}</span>`;\n })\n .join('');\n return;\n }\n\n makeElementPlainTextContentEditable(textBlock);\n textBlock.tabIndex = tabIndex || 0;\n textBlock.innerText = mode === 'designer' ? value : processedText;\n textBlock.addEventListener('blur', (e: Event) => {\n if (onChange) onChange({ key: 'content', value: getText(e.target as HTMLDivElement) });\n if (stopEditing) stopEditing();\n });\n\n if (schema.dynamicFontSize) {\n let dynamicFontSize: undefined | number = undefined;\n\n textBlock.addEventListener('keyup', () => {\n setTimeout(() => {\n // Use a regular function instead of an async one since we don't need await\n (() => {\n if (!textBlock.textContent) return;\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value: isInlineMarkdownTextSchema(schema)\n ? stripInlineMarkdown(getText(textBlock))\n : getText(textBlock),\n startingFontSize: dynamicFontSize,\n });\n textBlock.style.fontSize = `${dynamicFontSize}pt`;\n\n const { topAdj: newTopAdj, bottomAdj: newBottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n textBlock.style.paddingTop = `${newTopAdj}px`;\n textBlock.style.marginBottom = `${newBottomAdj}px`;\n })();\n }, 0);\n });\n }\n\n if (usePlaceholder) {\n textBlock.style.color = PLACEHOLDER_FONT_COLOR;\n textBlock.addEventListener('focus', () => {\n if (textBlock.innerText === placeholder) {\n textBlock.innerText = '';\n textBlock.style.color = schema.fontColor ?? DEFAULT_FONT_COLOR;\n }\n });\n }\n\n if (mode === 'designer') {\n setTimeout(() => {\n textBlock.focus();\n // Set the focus to the end of the editable element when you focus, as we would for a textarea\n const selection = window.getSelection();\n const range = document.createRange();\n if (selection && range) {\n range.selectNodeContents(textBlock);\n range.collapse(false); // Collapse range to the end\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n};\n\nconst renderInlineMarkdownReadOnly = async (arg: {\n textBlock: HTMLDivElement;\n value: string;\n schema: TextSchema;\n font: NonNullable<UIRenderProps<TextSchema>['options']['font']>;\n _cache: Map<string | number, unknown>;\n}) => {\n const { textBlock, value, schema, font, _cache } = arg;\n const runs = await resolveRichTextRuns({\n runs: parseInlineMarkdown(value),\n schema,\n font,\n _cache,\n });\n\n textBlock.innerHTML = '';\n runs.forEach((run) => {\n const span = document.createElement('span');\n const processedText = replaceUnsupportedChars(run.text, run.fontKitFont);\n\n span.textContent = processedText;\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 span.style.textDecoration = 'line-through';\n }\n if (run.code) {\n span.style.backgroundColor = CODE_BACKGROUND_COLOR;\n span.style.borderRadius = '2px';\n span.style.padding = '0 0.15em';\n if (!schema.fontVariants?.code || !font[schema.fontVariants.code]) {\n span.style.fontFamily = run.fontName\n ? `'${run.fontName}', monospace`\n : 'monospace';\n }\n }\n textBlock.appendChild(span);\n });\n};\n\nexport const buildStyledTextContainer = (\n arg: UIRenderProps<TextSchema>,\n fontKitFont: FontKitFont,\n value: string,\n resolvedDynamicFontSize?: number,\n) => {\n const { schema, rootElement, mode } = arg;\n\n let dynamicFontSize: undefined | number = resolvedDynamicFontSize;\n\n if (dynamicFontSize === undefined && schema.dynamicFontSize && value) {\n dynamicFontSize = calculateDynamicFontSize({\n textSchema: schema,\n fontKitFont,\n value,\n startingFontSize: dynamicFontSize,\n });\n }\n\n // Depending on vertical alignment, we need to move the top or bottom of the font to keep\n // it within it's defined box and align it with the generated pdf.\n const { topAdj, bottomAdj } = getBrowserVerticalFontAdjustments(\n fontKitFont,\n dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE,\n schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n );\n\n const topAdjustment = topAdj.toString();\n const bottomAdjustment = bottomAdj.toString();\n\n const container = document.createElement('div');\n\n const containerStyle: CSS.Properties = {\n padding: 0,\n resize: 'none',\n backgroundColor: getBackgroundColor(value, schema),\n border: 'none',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: mapVerticalAlignToFlex(schema.verticalAlignment),\n width: '100%',\n height: '100%',\n cursor: isEditable(mode, schema) ? 'text' : 'default',\n };\n Object.assign(container.style, containerStyle);\n rootElement.innerHTML = '';\n rootElement.appendChild(container);\n\n // text decoration\n const textDecorations = [];\n if (schema.strikethrough) textDecorations.push('line-through');\n if (schema.underline) textDecorations.push('underline');\n\n const textBlockStyle: CSS.Properties = {\n // Font formatting styles\n fontFamily: schema.fontName ? `'${schema.fontName}'` : 'inherit',\n color: schema.fontColor ? schema.fontColor : DEFAULT_FONT_COLOR,\n fontSize: `${dynamicFontSize ?? schema.fontSize ?? DEFAULT_FONT_SIZE}pt`,\n letterSpacing: `${schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING}pt`,\n lineHeight: `${schema.lineHeight ?? DEFAULT_LINE_HEIGHT}em`,\n textAlign: schema.alignment ?? DEFAULT_ALIGNMENT,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n // Block layout styles\n resize: 'none',\n border: 'none',\n outline: 'none',\n marginBottom: `${bottomAdjustment}px`,\n paddingTop: `${topAdjustment}px`,\n backgroundColor: 'transparent',\n textDecoration: textDecorations.join(' '),\n };\n\n const textBlock = document.createElement('div');\n textBlock.id = 'text-' + String(schema.id);\n Object.assign(textBlock.style, textBlockStyle);\n\n container.appendChild(textBlock);\n\n return textBlock;\n};\n\n/**\n * Firefox doesn't support 'plaintext-only' contentEditable mode, which we want to avoid mark-up.\n * This function adds a workaround for Firefox to make the contentEditable element behave like 'plaintext-only'.\n */\nexport const makeElementPlainTextContentEditable = (element: HTMLElement) => {\n if (!isFirefox()) {\n element.contentEditable = 'plaintext-only';\n return;\n }\n\n element.contentEditable = 'true';\n element.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n document.execCommand('insertLineBreak', false, undefined);\n }\n });\n\n element.addEventListener('paste', (e: ClipboardEvent) => {\n e.preventDefault();\n const paste = e.clipboardData?.getData('text');\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n selection.deleteFromDocument();\n selection.getRangeAt(0).insertNode(document.createTextNode(paste || ''));\n selection.collapseToEnd();\n });\n};\n\nexport const mapVerticalAlignToFlex = (verticalAlignmentValue: string | undefined) => {\n switch (verticalAlignmentValue) {\n case VERTICAL_ALIGN_TOP:\n return 'flex-start';\n case VERTICAL_ALIGN_MIDDLE:\n return 'center';\n case VERTICAL_ALIGN_BOTTOM:\n return 'flex-end';\n }\n return 'flex-start';\n};\n\nconst getBackgroundColor = (value: string, schema: { backgroundColor?: string }) => {\n if (!value || !schema.backgroundColor) return 'transparent';\n return schema.backgroundColor;\n};\n","import type { Plugin } from '@pdfme/common';\nimport { pdfRender } from './pdfRender.js';\nimport { propPanel } from './propPanel.js';\nimport { uiRender } from './uiRender.js';\nimport type { TextSchema } from './types.js';\nimport { TextCursorInput } from 'lucide';\nimport { createSvgStr } from '../utils.js';\n\nconst textSchema: Plugin<TextSchema> = {\n pdf: pdfRender,\n ui: uiRender,\n propPanel,\n icon: createSvgStr(TextCursorInput),\n};\n\nexport default textSchema;\n","import text from './text/index.js';\n\n// The default built-in plugin surface is intentionally limited to text.\n// Generator/UI consumers that need image, barcode, table, or other schema types\n// must import and pass those plugins explicitly from `@pdfme/schemas`.\nconst builtInPlugins = { Text: text };\n\nexport { builtInPlugins };\n"],"mappings":"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"}
|
package/dist/builtins.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as builtInPlugins } from "./builtins-
|
|
1
|
+
import { t as builtInPlugins } from "./builtins-CWHhKSVA.js";
|
|
2
2
|
export { builtInPlugins };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as VERTICAL_ALIGN_BOTTOM, N as VERTICAL_ALIGN_MIDDLE, a as getFontKitFont, c as splitTextToSize, f as ALIGN_LEFT, g as DEFAULT_ALIGNMENT, l as widthOfTextAtSize, p as ALIGN_RIGHT, u as ALIGN_CENTER, v as DEFAULT_FONT_COLOR } from "./helper-
|
|
1
|
+
import { M as VERTICAL_ALIGN_BOTTOM, N as VERTICAL_ALIGN_MIDDLE, a as getFontKitFont, c as splitTextToSize, f as ALIGN_LEFT, g as DEFAULT_ALIGNMENT, l as widthOfTextAtSize, p as ALIGN_RIGHT, u as ALIGN_CENTER, v as DEFAULT_FONT_COLOR } from "./helper-M_MmV_d5.js";
|
|
2
2
|
import { cloneDeep, getDefaultFont, getFallbackFontName, isBlankPdf, mm2pt, pt2mm } from "@pdfme/common";
|
|
3
3
|
//#region \0@oxc-project+runtime@0.127.0/helpers/typeof.js
|
|
4
4
|
function _typeof(o) {
|
|
@@ -798,4 +798,4 @@ var getDynamicLayoutForTable = async (value, args) => {
|
|
|
798
798
|
//#endregion
|
|
799
799
|
export { getCellPropPanelSchema as a, HEX_COLOR_PATTERN as c, getBodyWithRange as i, createSingleTable as l, getDynamicLayoutForTable as n, getColumnStylesPropPanelSchema as o, getBody as r, getDefaultCellStyles as s, getDynamicHeightsForTable as t };
|
|
800
800
|
|
|
801
|
-
//# sourceMappingURL=dynamicTemplate-
|
|
801
|
+
//# sourceMappingURL=dynamicTemplate-DmuRoTw4.js.map
|