@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builtins-CFqn6U5J.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 getPdfFontFromObj = (run: RichTextLineRun, pdfFontObj: Record<string, PDFFont>) => {\n const pdfFont = pdfFontObj[run.fontName];\n if (!pdfFont) {\n throw new Error(`[@pdfme/schemas] Missing embedded font \"${run.fontName}\".`);\n }\n return pdfFont;\n};\n\nconst embedFontsForRuns = async (\n runs: RichTextLineRun[],\n embedPdfFont: (fontName: string) => Promise<PDFFont>,\n) => {\n const fontNames = Array.from(new Set(runs.map((run) => run.fontName)));\n const pdfFonts = await Promise.all(\n fontNames.map(async (fontName) => [fontName, await embedPdfFont(fontName)] as const),\n );\n return Object.fromEntries(pdfFonts);\n};\n\nconst drawDecorationLine = (arg: {\n page: PDFRenderProps<TextSchema>['page'];\n x: number;\n y: number;\n width: number;\n rotate: Rotation;\n pivotPoint: { x: number; y: number };\n fontSize: number;\n color: TextColor;\n opacity: number | undefined;\n}) => {\n const { page, x, y, width, rotate, pivotPoint, fontSize, color, opacity } = arg;\n if (width <= 0) return;\n\n page.drawLine({\n start: rotatePoint({ x, y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: x + width, y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color,\n opacity,\n });\n};\n\nconst 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 embedPdfFont: (fontName: string) => Promise<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 embedPdfFont,\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 const pdfFontObj = await embedFontsForRuns(\n lines.flatMap((line) => line.runs),\n embedPdfFont,\n );\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n if (line.runs.length === 0) return;\n\n let textWidth = line.width;\n let spacing = characterSpacing;\n const shouldJustify = alignment === 'justify' && !line.hardBreak && rowIndex < lines.length - 1;\n\n if (shouldJustify) {\n const graphemeCount = countRichTextLineGraphemes(line);\n if (graphemeCount > 0) {\n spacing += (width - textWidth) / graphemeCount;\n textWidth = width;\n }\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n const yLine =\n pageHeight - mm2pt(schema.position.y) - yOffset - lineHeight * fontSize * rowIndex;\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n if (schema.strikethrough || schema.underline) {\n const textHeight = Math.max(\n ...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)),\n );\n if (schema.strikethrough) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine + textHeight / 3,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n if (schema.underline) {\n drawDecorationLine({\n page,\n x: xLine,\n y: yLine - textHeight / 12,\n width: textWidth,\n rotate,\n pivotPoint,\n fontSize,\n color,\n opacity,\n });\n }\n }\n\n line.runs.reduce((currentX, run, runIndex) => {\n const runWidth = getRunWidth(run, fontSize, spacing);\n const pdfFont = getPdfFontFromObj(run, pdfFontObj);\n drawRun({\n page,\n pdfLib,\n run,\n pdfFont,\n x: currentX,\n y: yLine,\n rotate,\n pivotPoint,\n fontSize,\n lineHeight,\n color,\n opacity,\n colorType,\n characterSpacing: spacing,\n strikethrough: Boolean(run.strikethrough),\n });\n\n return currentX + runWidth + (runIndex === line.runs.length - 1 ? 0 : spacing);\n }, xLine);\n });\n};\n","import { PDFFont, PDFDocument } from '@pdfme/pdf-lib';\nimport type { Font as FontKitFont } from 'fontkit';\nimport type { TextSchema } from './types.js';\nimport {\n PDFRenderProps,\n ColorType,\n Font,\n getDefaultFont,\n getFallbackFontName,\n mm2pt,\n} from '@pdfme/common';\nimport {\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n} from './constants.js';\nimport {\n calculateDynamicFontSize,\n heightOfFontAtSize,\n getFontDescentInPt,\n getFontKitFont,\n fetchRemoteFontData,\n widthOfTextAtSize,\n splitTextToSize,\n} from './helper.js';\nimport { stripInlineMarkdown } from './inlineMarkdown.js';\nimport { calculateDynamicRichTextFontSize, isInlineMarkdownTextSchema } from './richText.js';\nimport { renderInlineMarkdownText } from './richTextPdfRender.js';\nimport { convertForPdfLayoutProps, rotatePoint, hex2PrintingColor } from '../utils.js';\n\ntype PdfFontCache = Record<string, Promise<PDFFont>>;\n\nconst PDF_FONT_CACHE_KEY = 'text-pdf-font-cache';\n\nconst getPdfFontCache = (\n _cache: Map<string | number, unknown>,\n): PdfFontCache => {\n let pdfFontCache = _cache.get(PDF_FONT_CACHE_KEY) as PdfFontCache | undefined;\n if (!pdfFontCache) {\n pdfFontCache = {};\n _cache.set(PDF_FONT_CACHE_KEY, pdfFontCache);\n }\n\n return pdfFontCache;\n};\n\nconst embedAndGetFont = (arg: {\n pdfDoc: PDFDocument;\n font: Font;\n fontName: string;\n _cache: Map<string | number, unknown>;\n}) => {\n const { pdfDoc, font, fontName, _cache } = arg;\n const pdfFontCache = getPdfFontCache(_cache);\n const cachedFont = pdfFontCache[fontName];\n if (cachedFont) {\n return cachedFont;\n }\n\n const fontValue = font[fontName];\n if (!fontValue) {\n return Promise.reject(new Error(`[@pdfme/schemas] Font \"${fontName}\" is not found.`));\n }\n\n const pdfFontPromise = (async () => {\n let fontData = fontValue.data;\n if (typeof fontData === 'string' && fontData.startsWith('http')) {\n fontData = await fetchRemoteFontData(fontData);\n }\n return pdfDoc.embedFont(fontData, {\n subset: typeof fontValue.subset === 'undefined' ? true : fontValue.subset,\n });\n })();\n\n pdfFontCache[fontName] = pdfFontPromise;\n return pdfFontPromise;\n};\n\nconst getFontProp = ({\n value,\n fontKitFont,\n schema,\n colorType,\n fontSize: resolvedFontSize,\n}: {\n value: string;\n fontKitFont: FontKitFont;\n colorType?: ColorType;\n schema: TextSchema;\n fontSize?: number;\n}) => {\n const fontSize =\n resolvedFontSize ??\n (schema.dynamicFontSize\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : (schema.fontSize ?? DEFAULT_FONT_SIZE));\n const color = hex2PrintingColor(schema.fontColor || DEFAULT_FONT_COLOR, colorType);\n\n return {\n alignment: schema.alignment ?? DEFAULT_ALIGNMENT,\n verticalAlignment: schema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT,\n lineHeight: schema.lineHeight ?? DEFAULT_LINE_HEIGHT,\n characterSpacing: schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING,\n fontSize,\n color,\n };\n};\n\nlet graphemeSegmenter: Intl.Segmenter | undefined;\n\nconst getGraphemeSegmenter = () => {\n graphemeSegmenter ??= new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n return graphemeSegmenter;\n};\n\nexport const pdfRender = async (arg: PDFRenderProps<TextSchema>) => {\n const { value, pdfDoc, pdfLib, page, options, schema, _cache } = arg;\n if (!value) return;\n\n const { font = getDefaultFont(), colorType } = options;\n const fontName = schema.fontName ? schema.fontName : getFallbackFontName(font);\n const enableInlineMarkdown = isInlineMarkdownTextSchema(schema);\n\n const pdfFontValuePromise = enableInlineMarkdown\n ? undefined\n : embedAndGetFont({\n pdfDoc,\n font,\n fontName,\n _cache,\n });\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const displayValue = enableInlineMarkdown ? stripInlineMarkdown(value) : value;\n const dynamicRichTextFontSize =\n enableInlineMarkdown && schema.dynamicFontSize\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : undefined;\n const fontProp = getFontProp({\n value: displayValue,\n fontKitFont,\n schema,\n colorType,\n fontSize: dynamicRichTextFontSize,\n });\n\n const { fontSize, color, alignment, verticalAlignment, lineHeight, characterSpacing } = fontProp;\n\n const pageHeight = page.getHeight();\n const {\n width,\n height,\n rotate,\n position: { x, y },\n opacity,\n } = convertForPdfLayoutProps({ schema, pageHeight, applyRotateTranslate: false });\n\n const pivotPoint = { x: x + width / 2, y: pageHeight - mm2pt(schema.position.y) - height / 2 };\n\n if (schema.backgroundColor) {\n const color = hex2PrintingColor(schema.backgroundColor, colorType);\n if (rotate.angle !== 0) {\n // Apply the same rotation logic as text rendering to match UI behavior\n const rotatedPoint = rotatePoint({ x, y }, pivotPoint, rotate.angle);\n page.drawRectangle({ x: rotatedPoint.x, y: rotatedPoint.y, width, height, rotate, color });\n } else {\n page.drawRectangle({ x, y, width, height, rotate, color });\n }\n }\n\n if (enableInlineMarkdown) {\n await renderInlineMarkdownText({\n value,\n schema,\n font,\n embedPdfFont: (fontName) => embedAndGetFont({ pdfDoc, font, fontName, _cache }),\n fontKitFont,\n page,\n pdfLib,\n _cache,\n colorType,\n fontSize,\n color,\n alignment,\n verticalAlignment,\n lineHeight,\n characterSpacing,\n x,\n width,\n height,\n pageHeight,\n pivotPoint,\n rotate,\n opacity,\n });\n return;\n }\n if (!pdfFontValuePromise) {\n throw new Error('[@pdfme/schemas] Failed to prepare PDF font for text rendering.');\n }\n const pdfFontValue = await pdfFontValuePromise;\n\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, fontSize);\n const descent = getFontDescentInPt(fontKitFont, fontSize);\n const halfLineHeightAdjustment = lineHeight === 0 ? 0 : ((lineHeight - 1) * fontSize) / 2;\n\n const lines = splitTextToSize({\n value,\n characterSpacing,\n fontSize,\n fontKitFont,\n boxWidthInPt: width,\n });\n const needsTextWidth = alignment !== 'left' || Boolean(schema.strikethrough || schema.underline);\n const needsTextHeight = Boolean(schema.strikethrough || schema.underline);\n\n // Text lines are rendered from the bottom upwards, we need to adjust the position down\n let yOffset = 0;\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n yOffset = firstLineTextHeight + halfLineHeightAdjustment;\n } else {\n const otherLinesHeight = lineHeight * fontSize * (lines.length - 1);\n\n if (verticalAlignment === VERTICAL_ALIGN_BOTTOM) {\n yOffset = height - otherLinesHeight + descent - halfLineHeightAdjustment;\n } else if (verticalAlignment === VERTICAL_ALIGN_MIDDLE) {\n yOffset =\n (height - otherLinesHeight - firstLineTextHeight + descent) / 2 + firstLineTextHeight;\n }\n }\n\n lines.forEach((line, rowIndex) => {\n const trimmed = line.replace('\\n', '');\n const textWidth = needsTextWidth\n ? widthOfTextAtSize(trimmed, fontKitFont, fontSize, characterSpacing)\n : 0;\n const textHeight = needsTextHeight ? heightOfFontAtSize(fontKitFont, fontSize) : 0;\n const rowYOffset = lineHeight * fontSize * rowIndex;\n\n // Adobe Acrobat Reader shows an error if `drawText` is called with an empty text\n if (line === '') {\n // return; // this also works\n line = '\\r\\n';\n }\n\n let xLine = x;\n if (alignment === 'center') {\n xLine += (width - textWidth) / 2;\n } else if (alignment === 'right') {\n xLine += width - textWidth;\n }\n\n let yLine = pageHeight - mm2pt(schema.position.y) - yOffset - rowYOffset;\n\n // draw strikethrough\n if (schema.strikethrough && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine + textHeight / 3;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n // draw underline\n if (schema.underline && textWidth > 0) {\n const _x = xLine + textWidth + 1;\n const _y = yLine - textHeight / 12;\n page.drawLine({\n start: rotatePoint({ x: xLine, y: _y }, pivotPoint, rotate.angle),\n end: rotatePoint({ x: _x, y: _y }, pivotPoint, rotate.angle),\n thickness: (1 / 12) * fontSize,\n color: color,\n opacity,\n });\n }\n\n if (rotate.angle !== 0) {\n // As we draw each line individually from different points, we must translate each lines position\n // relative to the UI rotation pivot point. see comments in convertForPdfLayoutProps() for more info.\n const rotatedPoint = rotatePoint({ x: xLine, y: yLine }, pivotPoint, rotate.angle);\n xLine = rotatedPoint.x;\n yLine = rotatedPoint.y;\n }\n\n let spacing = characterSpacing;\n if (alignment === 'justify' && line.slice(-1) !== '\\n') {\n // if alignment is `justify` but the end of line is not newline, then adjust the spacing\n const segmenter = getGraphemeSegmenter();\n const iterator = segmenter.segment(trimmed)[Symbol.iterator]();\n const len = Array.from(iterator).length;\n spacing += (width - textWidth) / len;\n }\n page.pushOperators(pdfLib.setCharacterSpacing(spacing));\n\n page.drawText(trimmed, {\n x: xLine,\n y: yLine,\n rotate,\n size: fontSize,\n color,\n lineHeight: lineHeight * fontSize,\n font: pdfFontValue,\n opacity,\n });\n });\n};\n","import {\n Strikethrough,\n Underline,\n AlignLeft,\n AlignCenter,\n AlignRight,\n ArrowUpToLine,\n ArrowDownToLine,\n AlignJustify,\n} from 'lucide';\nimport { createSvgStr } from '../../utils.js';\n\nexport const TextStrikethroughIcon = createSvgStr(Strikethrough);\n\nexport const TextUnderlineIcon = createSvgStr(Underline);\n\nexport const TextAlignLeftIcon = createSvgStr(AlignLeft);\n\nexport const TextAlignCenterIcon = createSvgStr(AlignCenter);\n\nexport const TextAlignRightIcon = createSvgStr(AlignRight);\n\nexport const TextAlignJustifyIcon = createSvgStr(AlignJustify);\n\nexport const TextVerticalAlignTopIcon = createSvgStr(ArrowUpToLine);\n\n// svg icons are material icons from https://www.xicons.org\nexport const TextVerticalAlignMiddleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 24 24\"><path d=\"M8 19h3v4h2v-4h3l-4-4l-4 4zm8-14h-3V1h-2v4H8l4 4l4-4zM4 11v2h16v-2H4z\" fill=\"currentColor\"></path></svg>`;\n\nexport const TextVerticalAlignBottomIcon = createSvgStr(ArrowDownToLine);\n","// No imports needed from @pdfme/common\nimport {\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextAlignJustifyIcon,\n TextStrikethroughIcon,\n TextUnderlineIcon,\n TextVerticalAlignBottomIcon,\n TextVerticalAlignMiddleIcon,\n TextVerticalAlignTopIcon,\n} from './icons/index.js';\nimport {\n ALIGN_CENTER,\n ALIGN_RIGHT,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n VERTICAL_ALIGN_BOTTOM,\n VERTICAL_ALIGN_MIDDLE,\n ALIGN_JUSTIFY,\n} from './constants.js';\n\nexport enum Formatter {\n STRIKETHROUGH = 'strikethrough',\n UNDERLINE = 'underline',\n ALIGNMENT = 'alignment',\n VERTICAL_ALIGNMENT = 'verticalAlignment',\n}\n\ninterface GroupButtonBoolean {\n key: Formatter;\n icon: string;\n type: 'boolean';\n}\n\ninterface GroupButtonString {\n key: Formatter;\n icon: string;\n type: 'select';\n value: string;\n}\n\ntype GroupButton = GroupButtonBoolean | GroupButtonString;\n\nexport function getExtraFormatterSchema(i18n: (key: string) => string): {\n title: string;\n widget: string;\n buttons: GroupButton[];\n span: number;\n} {\n const buttons: GroupButton[] = [\n { key: Formatter.STRIKETHROUGH, icon: TextStrikethroughIcon, type: 'boolean' },\n { key: Formatter.UNDERLINE, icon: TextUnderlineIcon, type: 'boolean' },\n { key: Formatter.ALIGNMENT, icon: TextAlignLeftIcon, type: 'select', value: DEFAULT_ALIGNMENT },\n { key: Formatter.ALIGNMENT, icon: TextAlignCenterIcon, type: 'select', value: ALIGN_CENTER },\n { key: Formatter.ALIGNMENT, icon: TextAlignRightIcon, type: 'select', value: ALIGN_RIGHT },\n { key: Formatter.ALIGNMENT, icon: TextAlignJustifyIcon, type: 'select', value: ALIGN_JUSTIFY },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignTopIcon,\n type: 'select',\n value: DEFAULT_VERTICAL_ALIGNMENT,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignMiddleIcon,\n type: 'select',\n value: VERTICAL_ALIGN_MIDDLE,\n },\n {\n key: Formatter.VERTICAL_ALIGNMENT,\n icon: TextVerticalAlignBottomIcon,\n type: 'select',\n value: VERTICAL_ALIGN_BOTTOM,\n },\n ];\n return {\n title: i18n('schemas.text.format'),\n widget: 'ButtonGroup',\n buttons,\n span: 24,\n };\n}\n","import {\n DEFAULT_FONT_NAME,\n PropPanel,\n PropPanelWidgetProps,\n PropPanelSchema,\n getFallbackFontName,\n} from '@pdfme/common';\nimport type { TextSchema } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_ALIGNMENT,\n DEFAULT_VERTICAL_ALIGNMENT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_COLOR,\n DYNAMIC_FIT_VERTICAL,\n DYNAMIC_FIT_HORIZONTAL,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n DEFAULT_TEXT_FORMAT,\n TEXT_FORMAT_INLINE_MARKDOWN,\n TEXT_FORMAT_PLAIN,\n DEFAULT_FONT_VARIANT_FALLBACK,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n FONT_VARIANT_FALLBACK_SYNTHETIC,\n} from './constants.js';\nimport { DEFAULT_OPACITY, HEX_COLOR_PATTERN } from '../constants.js';\nimport { getExtraFormatterSchema } from './extraFormatter.js';\n\nconst UseDynamicFontSize = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = Boolean((activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize);\n checkbox.onchange = (e: Event) => {\n const val = (e.target as HTMLInputElement).checked\n ? {\n min: DEFAULT_DYNAMIC_MIN_FONT_SIZE,\n max: DEFAULT_DYNAMIC_MAX_FONT_SIZE,\n fit: DEFAULT_DYNAMIC_FIT,\n }\n : undefined;\n changeSchemas([{ key: 'dynamicFontSize', value: val, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.dynamicFontSize') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nconst UseInlineMarkdown = (props: PropPanelWidgetProps) => {\n const { rootElement, changeSchemas, activeSchema, i18n } = props;\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked =\n (activeSchema as { textFormat?: unknown })?.textFormat === TEXT_FORMAT_INLINE_MARKDOWN;\n checkbox.onchange = (e: Event) => {\n const value = (e.target as HTMLInputElement).checked\n ? TEXT_FORMAT_INLINE_MARKDOWN\n : TEXT_FORMAT_PLAIN;\n changeSchemas([{ key: 'textFormat', value, schemaId: activeSchema.id }]);\n };\n const label = document.createElement('label');\n const span = document.createElement('span');\n span.innerText = i18n('schemas.text.inlineMarkdown') || '';\n span.style.cssText = 'margin-left: 0.5rem';\n label.style.cssText = 'display: flex; width: 100%;';\n label.appendChild(checkbox);\n label.appendChild(span);\n rootElement.appendChild(label);\n};\n\nexport const propPanel: PropPanel<TextSchema> = {\n schema: ({ options, activeSchema, i18n }) => {\n const font = options.font || { [DEFAULT_FONT_NAME]: { data: '', fallback: true } };\n const fontNames = Object.keys(font);\n const fallbackFontName = getFallbackFontName(font);\n\n const enableDynamicFont = Boolean(\n (activeSchema as { dynamicFontSize?: unknown })?.dynamicFontSize,\n );\n const activeTextSchema = activeSchema as unknown as TextSchema;\n const hideTextFormat = activeTextSchema.type === 'text' && activeTextSchema.readOnly !== true;\n const enableInlineMarkdown =\n activeTextSchema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN && !hideTextFormat;\n const baseFontName =\n activeTextSchema.fontName && font[activeTextSchema.fontName]\n ? activeTextSchema.fontName\n : fallbackFontName;\n const optionalFontNames = [\n { label: baseFontName, value: '' },\n ...fontNames\n .filter((name) => name !== baseFontName)\n .map((name) => ({ label: name, value: name })),\n ];\n\n const textSchema: Record<string, PropPanelSchema> = {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n disabled: enableDynamicFont,\n props: { min: 0 },\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n span: 6,\n props: { min: 0 },\n },\n formatter: getExtraFormatterSchema(i18n),\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n useDynamicFontSize: { type: 'boolean', widget: 'UseDynamicFontSize', bind: false, span: 16 },\n dynamicFontSize: {\n type: 'object',\n widget: 'card',\n column: 3,\n properties: {\n min: {\n title: i18n('schemas.text.min'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n max: {\n title: i18n('schemas.text.max'),\n type: 'number',\n widget: 'inputNumber',\n hidden: !enableDynamicFont,\n props: { min: 0 },\n },\n fit: {\n title: i18n('schemas.text.fit'),\n type: 'string',\n widget: 'select',\n hidden: !enableDynamicFont,\n props: {\n options: [\n { label: i18n('schemas.horizontal'), value: DYNAMIC_FIT_HORIZONTAL },\n { label: i18n('schemas.vertical'), value: DYNAMIC_FIT_VERTICAL },\n ],\n },\n },\n },\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n backgroundColor: {\n title: i18n('schemas.bgColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [\n {\n pattern: HEX_COLOR_PATTERN,\n message: i18n('validation.hexColor'),\n },\n ],\n },\n useInlineMarkdown: {\n type: 'boolean',\n widget: 'UseInlineMarkdown',\n bind: false,\n hidden: hideTextFormat,\n span: enableInlineMarkdown ? 12 : 24,\n },\n fontVariantFallback: {\n title: i18n('schemas.text.variantFallback'),\n type: 'string',\n widget: 'select',\n default: DEFAULT_FONT_VARIANT_FALLBACK,\n hidden: !enableInlineMarkdown,\n props: {\n options: [\n { label: i18n('schemas.text.synthetic'), value: FONT_VARIANT_FALLBACK_SYNTHETIC },\n { label: i18n('schemas.text.plain'), value: FONT_VARIANT_FALLBACK_PLAIN },\n { label: i18n('schemas.text.error'), value: FONT_VARIANT_FALLBACK_ERROR },\n ],\n },\n span: 12,\n },\n fontVariants: {\n title: i18n('schemas.text.markdownFonts'),\n type: 'object',\n widget: 'card',\n column: 2,\n hidden: !enableInlineMarkdown,\n properties: {\n bold: {\n title: i18n('schemas.text.boldFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n italic: {\n title: i18n('schemas.text.italicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n boldItalic: {\n title: i18n('schemas.text.boldItalicFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n code: {\n title: i18n('schemas.text.codeFont'),\n type: 'string',\n widget: 'select',\n props: { options: optionalFontNames },\n },\n },\n },\n };\n\n return textSchema;\n },\n widgets: { UseDynamicFontSize, UseInlineMarkdown },\n defaultSchema: {\n name: '',\n type: 'text',\n content: 'Type Something...',\n position: { x: 0, y: 0 },\n width: 45,\n height: 10,\n // If the value of \"rotate\" is set to undefined or not set at all, rotation will be disabled in the UI.\n // Check this document: https://pdfme.com//docs/custom-schemas#learning-how-to-create-from-pdfmeschemas-code\n rotate: 0,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: DEFAULT_VERTICAL_ALIGNMENT,\n fontSize: DEFAULT_FONT_SIZE,\n textFormat: DEFAULT_TEXT_FORMAT,\n fontVariantFallback: DEFAULT_FONT_VARIANT_FALLBACK,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n dynamicFontSize: undefined,\n fontColor: DEFAULT_FONT_COLOR,\n fontName: undefined,\n backgroundColor: '',\n opacity: DEFAULT_OPACITY,\n strikethrough: false,\n underline: false,\n },\n};\n","import type * as CSS from 'csstype';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { 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":";;;;;;AAIA,IAAM,2BAA2B,IAAI,IAAI;CAAC;CAAM;CAAK;CAAK;CAAI,CAAC;AAC/D,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAElC,IAAM,aAAa,GAAgB,MACjC,QAAQ,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK,IACnC,QAAQ,EAAE,OAAO,KAAK,QAAQ,EAAE,OAAO,IACvC,QAAQ,EAAE,cAAc,KAAK,QAAQ,EAAE,cAAc,IACrD,QAAQ,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK;AAErC,IAAM,aAAa,MAAqB,MAAc,UAAuB;AAC3E,KAAI,CAAC,KAAM;CAEX,MAAM,UAAU,KAAK,GAAG,GAAG;AAC3B,KAAI,WAAW,UAAU,SAAS,MAAM,EAAE;AACxC,UAAQ,QAAQ;AAChB;;AAGF,MAAK,KAAK;EACR;EACA,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,GAAG,EAAE;EACpC,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,GAAG,EAAE;EACxC,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,GAAG,EAAE;EACtD,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,GAAG,EAAE;EACrC,CAAC;;AAGJ,IAAM,wBAAwB,OAAe,WAAmB,SAAyB;AACvF,MAAK,IAAI,IAAI,MAAM,IAAI,MAAM,QAAQ,KAAK;AACxC,MAAI,MAAM,OAAO,MAAM;AACrB,QAAK;AACL;;AAGF,MAAI,cAAc,OAAO,MAAM,OAAO,KAAK;GACzC,MAAM,UAAU,qBAAqB,OAAO,KAAK,IAAI,EAAE;AACvD,OAAI,YAAY,GAAI;AACpB,OAAI;AACJ;;AAGF,MAAI,MAAM,WAAW,WAAW,EAAE,CAChC,QAAO;;AAIX,QAAO;;AAGT,IAAM,gBAAgB,OAAe,UAAkB;AACrD,KAAI,MAAM,WAAW,IAAK,QAAO;AACjC,KAAI,MAAM,WAAW,OAAO,MAAM,CAAE,QAAO;AAC3C,KAAI,MAAM,WAAW,MAAM,MAAM,CAAE,QAAO;AAC1C,KAAI,MAAM,WAAW,MAAM,MAAM,CAAE,QAAO;AAC1C,KAAI,MAAM,WAAW,IAAK,QAAO;AACjC,QAAO;;AAGT,IAAM,cAAc,OAAoB,cAAmC;AACzE,KAAI,cAAc,MAChB,QAAO;EAAE,GAAG;EAAO,MAAM;EAAM,QAAQ;EAAM;AAE/C,KAAI,cAAc,KAChB,QAAO;EAAE,GAAG;EAAO,MAAM;EAAM;AAEjC,KAAI,cAAc,IAChB,QAAO;EAAE,GAAG;EAAO,QAAQ;EAAM;AAEnC,KAAI,cAAc,KAChB,QAAO;EAAE,GAAG;EAAO,eAAe;EAAM;AAE1C,QAAO;;AAGT,IAAM,cAAc,OAAe,MAAc,IAAY,UAAsC;CACjG,MAAM,OAAsB,EAAE;CAC9B,IAAI,SAAS;CAEb,MAAM,cAAc;AAClB,YAAU,MAAM,QAAQ,MAAM;AAC9B,WAAS;;AAGX,MAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI,SAAS;EAC1C,MAAM,OAAO,MAAM;AAEnB,MAAI,SAAS,QAAQ,QAAQ,IAAI,MAAM,yBAAyB,IAAI,MAAM,QAAQ,GAAG,EAAE;AACrF,aAAU,MAAM,QAAQ;AACxB,YAAS;AACT;;EAGF,MAAM,YAAY,aAAa,OAAO,MAAM;AAC5C,MAAI,CAAC,WAAW;AACd,aAAU;AACV;;EAGF,MAAM,eAAe,qBAAqB,OAAO,WAAW,QAAQ,UAAU,OAAO;AACrF,MAAI,iBAAiB,MAAM,eAAe,UAAU,SAAS,IAAI;AAC/D,aAAU;AACV;;AAGF,SAAO;AAEP,MAAI,cAAc,IAChB,WACE,MACA,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,2BAA2B,KAAK,EAC7E;GAAE,GAAG;GAAO,MAAM;GAAM,CACzB;MAEkB,YACjB,OACA,QAAQ,UAAU,QAClB,cACA,WAAW,OAAO,UAAU,CAE9B,CAAW,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,IAAI,CAAC;AAG7D,UAAQ,eAAe,UAAU,SAAS;;AAG5C,QAAO;AACP,QAAO;;AAGT,IAAa,uBAAuB,UAAiC;AACnE,KAAI,CAAC,MAAO,QAAO,EAAE;AACrB,QAAO,WAAW,OAAO,GAAG,MAAM,QAAQ,EAAE,CAAC;;AAG/C,IAAa,wBAAwB,UACnC,MAAM,QAAQ,0BAA0B,SAAS,KAAK,OAAO;AAE/D,IAAa,uBAAuB,UAClC,oBAAoB,MAAM,CACvB,KAAK,QAAQ,IAAI,KAAK,CACtB,KAAK,GAAG;;;AC/Fb,IAAM,wBAAwB,IAAI,KAAK,UAAU,KAAA,GAAW,EAAE,aAAa,QAAQ,CAAC;AACpF,IAAM,4BAA4B,IAAI,KAAK,UAAU,KAAA,GAAW,EAAE,aAAa,YAAY,CAAC;AAE5F,IAAM,mBAAmB,QAAoB,SAC3C,OAAO,YAAY,KAAK,OAAO,YAAY,OAAO,WAAW,oBAAoB,KAAK;AAExF,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,KAAK;CAClD,MAAM,WAAW,OAAO,gBAAgB,EAAE;CAC1C,MAAM,WAAW,OAAO,uBAAA;CAExB,IAAI,WAAW;CACf,IAAI,YAAY,QAAQ,IAAI,KAAK;CACjC,IAAI,cAAc,QAAQ,IAAI,OAAO;AAErC,KAAI,IAAI,KACN,YAAW,kBAAkB,MAAM,SAAS,KAAK,IAAI;UAC5C,IAAI,QAAQ,IAAI,QAAQ;EACjC,MAAM,aAAa,kBAAkB,MAAM,SAAS,WAAW;EAC/D,MAAM,SAAS,kBAAkB,MAAM,SAAS,OAAO;EACvD,MAAM,OAAO,kBAAkB,MAAM,SAAS,KAAK;AAEnD,MAAI,YAAY;AACd,cAAW;AACX,eAAY;AACZ,iBAAc;aACL,QAAQ;AACjB,cAAW;AACX,iBAAc;aACL,MAAM;AACf,cAAW;AACX,eAAY;;YAEL,IAAI,MAAM;EACnB,MAAM,OAAO,kBAAkB,MAAM,SAAS,KAAK;AACnD,MAAI,MAAM;AACR,cAAW;AACX,eAAY;;YAEL,IAAI,QAAQ;EACrB,MAAM,SAAS,kBAAkB,MAAM,SAAS,OAAO;AACvD,MAAI,QAAQ;AACV,cAAW;AACX,iBAAc;;;AAIlB,MACG,aAAa,eAAgB,IAAI,QAAQ,CAAC,kBAAkB,MAAM,SAAS,KAAK,KACjF,aAAA,QAEA,OAAM,IAAI,MACR,qEAAqE,OAAO,KAAK,IAClF;AAGH,QAAO;EACL;EACA,eAAe,aAAA,WAA4C;EAC3D,iBAAiB,aAAA,WAA4C;EAC9D;;AAGH,IAAa,sBAAsB,OAAO,QAKJ;CACpC,MAAM,EAAE,MAAM,QAAQ,MAAM,WAAW;CACvC,MAAM,+BAAe,IAAI,KAA0B;CAEnD,MAAM,yBAAyB,OAAO,aAAqB;EACzD,MAAM,SAAS,aAAa,IAAI,SAAS;AACzC,MAAI,OAAQ,QAAO;EAEnB,MAAM,cAAc,MAAM,eAAe,UAAU,MAAM,OAAmC;AAC5F,eAAa,IAAI,UAAU,YAAY;AACvC,SAAO;;AAGT,QAAO,QAAQ,IACb,KAAK,IAAI,OAAO,QAAQ;EACtB,MAAM,aAAa,mBAAmB,KAAK,QAAQ,KAAK;AACxD,SAAO;GACL,GAAG;GACH,GAAG;GACH,aAAa,MAAM,uBAAuB,WAAW,SAAS;GAC/D;GACD,CACH;;AAGH,IAAM,kBACJ,KACA,MACA,UACA,qBACG;CACH,MAAM,qBAAqB,IAAI,gBAC3B,WAAW,8BAAA,IACX;CACJ,MAAM,uBAAuB,IAAI,kBAC7B,mBAAmB,IAAI,aAAa,SAAS,GAC7C,KAAK,IAAA,KAAqC,KAAK,KAAM,IAAI,GACzD;AACJ,QACE,kBAAkB,MAAM,IAAI,aAAa,UAAU,iBAAiB,GACpE,qBACA;;AAIJ,IAAM,oBAAkC;CAAE,MAAM,EAAE;CAAE,OAAO;CAAG,WAAW;CAAO;AAEhF,IAAM,iBACJ,MACA,KACA,MACA,UACA,qBACG;AACH,KAAI,CAAC,KAAM;CACX,MAAM,QAAQ,eAAe,KAAK,MAAM,UAAU,iBAAiB;AACnE,KAAI,KAAK,KAAK,SAAS,EAAG,MAAK,SAAS;AACxC,MAAK,KAAK,KAAK;EAAE,GAAG;EAAK;EAAM;EAAO,CAAC;AACvC,MAAK,SAAS;;AAGhB,IAAM,sBACJ,QACA,UACA,qBACG;CACH,IAAI,QAAQ;CACZ,IAAI,UAAU;AACd,QAAO,SAAS,UAAU;AACxB,MAAI,CAAC,MAAM,KAAM;AACjB,MAAI,QAAS,UAAS;AACtB,WAAS,eAAe,MAAM,KAAK,MAAM,MAAM,UAAU,iBAAiB;AAC1E,YAAU;GACV;AACF,QAAO;;AAGT,IAAM,kBACJ,QACA,YACA,aACuB;CACvB,MAAM,SAA6B,EAAE;CACrC,IAAI,SAAS;AAEb,QAAO,SAAS,UAAU;EACxB,MAAM,aAAa;EACnB,MAAM,WAAW,aAAa,MAAM,KAAK;EACzC,MAAM,aAAa,KAAK,IAAI,YAAY,WAAW;EACnD,MAAM,WAAW,KAAK,IAAI,UAAU,SAAS;AAE7C,MAAI,aAAa,SACf,QAAO,KAAK;GACV,KAAK,MAAM;GACX,MAAM,MAAM,KAAK,MAAM,aAAa,YAAY,WAAW,WAAW;GACvE,CAAC;AAGJ,WAAS;GACT;AAEF,QAAO;;AAGT,IAAM,0BACJ,MACA,WACA,gBACG;CACH,IAAI,kBAAsC,EAAE;CAE5C,MAAM,uBAAuB;AAC3B,MAAI,gBAAgB,WAAW,EAAG;EAElC,MAAM,gBAAgB,gBAAgB,KAAK,UAAU,MAAM,KAAK,CAAC,KAAK,GAAG;AACzE,QAAM,KAAK,sBAAsB,QAAQ,cAAc,GAAG,EAAE,SAAS,YAAY;GAC/E,MAAM,SAAS,eAAe,iBAAiB,OAAO,QAAQ,QAAQ,OAAO;AAC7E,OAAI,OAAO,SAAS,EAAG,WAAU,OAAO;IACxC;AACF,oBAAkB,EAAE;;AAGtB,MAAK,SAAS,QAAQ;AACpB,MAAI,KAAK,MAAM,eAAe,CAAC,SAAS,SAAS;AAC/C,OAAI,SAAS,UAAU,SAAS,QAAQ,SAAS,MAAM;AACrD,oBAAgB;AAChB,iBAAa;AACb;;AAGF,OAAI,KAAM,iBAAgB,KAAK;IAAE;IAAK,MAAM;IAAM,CAAC;IACnD;GACF;AAEF,iBAAgB;;AAGlB,IAAM,sBAAsB,UAC1B,MAAM,KAAK,0BAA0B,QAAQ,MAAM,GAAG,EAAE,cAAc,QAAQ;AAEhF,IAAa,8BAA8B,SACzC,mBAAmB,KAAK,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAKhE,IAAa,uBAAuB,QAKd;CACpB,MAAM,EAAE,MAAM,UAAU,kBAAkB,iBAAiB;CAC3D,MAAM,QAAwB,EAAE;CAChC,IAAI,cAAc,YAAY;CAE9B,MAAM,mBAAmB,cAAuB;AAC9C,cAAY,YAAY;AACxB,QAAM,KAAK,YAAY;AACvB,gBAAc,YAAY;;CAG5B,MAAM,oBAAoB,WAA+B;AACvD,SAAO,SAAS,UAAU;AACxB,iBAAc,aAAa,MAAM,KAAK,MAAM,MAAM,UAAU,iBAAiB;IAC7E;;CAGJ,MAAM,qBAAqB,KAA0B,SAAiB;EACpE,IAAI,gBAAgB;AAEpB,SAAO,cAAc,SAAS,GAAG;GAC/B,MAAM,iBAAiB,YAAY,KAAK,SAAS,IAAI,mBAAmB;GACxE,MAAM,iBAAiB,KAAK,IAAI,eAAe,YAAY,QAAQ,gBAAgB,EAAE;GACrF,MAAM,qBAAqB,eAAe,KAAK,eAAe,UAAU,iBAAiB;AAEzF,OACE,sBAAsB,kBACrB,YAAY,KAAK,WAAW,KAAK,sBAAsB,cACxD;AACA,kBAAc,aAAa,KAAK,eAAe,UAAU,iBAAiB;AAC1E;;AAGF,OAAI,YAAY,KAAK,SAAS,KAAK,sBAAsB,cAAc;AACrE,oBAAgB,MAAM;AACtB;;GAGF,MAAM,YAAY,mBAAmB,cAAc;GACnD,IAAI,cAAc;GAClB,IAAI,gBAAgB;AAEpB,QAAK,MAAM,YAAY,WAAW;IAChC,MAAM,YAAY,cAAc;IAChC,MAAM,iBAAiB,eAAe,KAAK,WAAW,UAAU,iBAAiB;IACjF,MAAM,WAAW,YAAY,KAAK,WAAW,IAAI,eAAe;AAChE,QAAI,iBAAiB,UAAU;AAC7B,SAAI,YAAa;AACjB,SAAI,YAAY,KAAK,SAAS,EAAG;;AAEnC,kBAAc;AACd,qBAAiB,SAAS;AAC1B,QAAI,iBAAiB,SAAU;;AAGjC,OAAI,CAAC,aAAa;AAChB,oBAAgB,MAAM;AACtB;;AAGF,iBAAc,aAAa,KAAK,aAAa,UAAU,iBAAiB;AACxE,mBAAgB,cAAc,MAAM,cAAc;AAClD,OAAI,cAAc,SAAS,EAAG,iBAAgB,MAAM;;;CAIxD,MAAM,eAAe,WAA+B;EAClD,MAAM,eAAe,mBAAmB,QAAQ,UAAU,iBAAiB;EAC3E,MAAM,iBAAiB,YAAY,KAAK,SAAS,IAAI,mBAAmB;AAGxE,MACE,gBAHqB,KAAK,IAAI,eAAe,YAAY,QAAQ,gBAAgB,EAGjE,IACf,YAAY,KAAK,WAAW,KAAK,gBAAgB,cAClD;AACA,oBAAiB,OAAO;AACxB;;AAGF,MAAI,YAAY,KAAK,SAAS,GAAG;AAC/B,mBAAgB,MAAM;AACtB,OAAI,gBAAgB,cAAc;AAChC,qBAAiB,OAAO;AACxB;;;AAIJ,SAAO,SAAS,UAAU,kBAAkB,MAAM,KAAK,MAAM,KAAK,CAAC;;AAGrE,wBAAuB,MAAM,mBAAmB,gBAAgB,KAAK,CAAC;AAEtE,KAAI,YAAY,KAAK,SAAS,KAAK,MAAM,WAAW,EAClD,iBAAgB,MAAM;AAGxB,QAAO;;AAGT,IAAM,0BACJ,MACA,UACA,qBACG;CACH,MAAM,SAAmB,EAAE;CAC3B,IAAI,kBAAsC,EAAE;CAE5C,MAAM,kBAAkB;AACtB,SAAO,KAAK,mBAAmB,iBAAiB,UAAU,iBAAiB,CAAC;AAC5E,oBAAkB,EAAE;;AAGtB,MAAK,SAAS,QAAQ;AACpB,MAAI,KAAK,MAAM,eAAe,CAAC,SAAS,SAAS;AAC/C,OAAI,SAAS,UAAU,SAAS,QAAQ,SAAS,MAAM;AACrD,eAAW;AACX;;AAGF,OAAI,KAAM,iBAAgB,KAAK;IAAE;IAAK,MAAM;IAAM,CAAC;IACnD;GACF;AAEF,YAAW;AACX,QAAO;;AAGT,IAAM,uBAAuB,MAAoB,aAAqB;AACpE,KAAI,KAAK,KAAK,WAAW,EAAG,QAAO;AACnC,QAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,QAAQ,mBAAmB,IAAI,aAAa,SAAS,CAAC,CAAC;;AAG3F,IAAa,mCAAmC,OAAO,QAMjD;CACJ,MAAM,EAAE,OAAO,QAAQ,MAAM,QAAQ,qBAAqB;CAC1D,MAAM,EACJ,UAAU,gBACV,iBAAiB,wBACjB,kBAAkB,wBAClB,OAAO,UACP,QAAQ,WACR,aAAA,MACE;CACJ,MAAM,WAAW,oBAAoB,kBAAA;AACrC,KAAI,CAAC,uBAAwB,QAAO;AACpC,KAAI,uBAAuB,MAAM,uBAAuB,IAAK,QAAO;CAGpE,MAAM,eAAe,MAAM,oBAAoB;EAAE,MAD5B,oBAAoB,MACc;EAAc;EAAQ;EAAM;EAAQ,CAAC;CAC5F,MAAM,mBAAmB,0BAAA;CACzB,MAAM,iBAAiB,uBAAuB,OAAA;CAC9C,MAAM,eAAe,MAAM,SAAS;CAEpC,IAAI,kBAAkB;AACtB,KAAI,kBAAkB,uBAAuB,IAC3C,mBAAkB,uBAAuB;UAChC,kBAAkB,uBAAuB,IAClD,mBAAkB,uBAAuB;CAG3C,MAAM,wBAAwB,SAAiB;EAC7C,IAAI,iBAAiB;EACrB,IAAI,kBAAkB;AAER,sBAAoB;GAChC,MAAM;GACN,UAAU;GACV;GACA;GACD,CAED,CAAM,SAAS,MAAM,cAAc;AACjC,OAAI,mBAAA,WACF,kBAAiB,KAAK,IAAI,gBAAgB,MAAM,KAAK,MAAM,CAAC;AAG9D,OAAI,cAAc,EAChB,oBAAmB,MAAM,oBAAoB,MAAM,KAAK,GAAG,WAAW;OAEtE,oBAAmB,MAAM,OAAO,WAAW;IAE7C;AAEF,MAAI,mBAAA,aACF,wBAAuB,cAAc,MAAM,iBAAiB,CAAC,SAAS,mBAAmB;AACvF,oBAAiB,KAAK,IAAI,gBAAgB,MAAM,eAAe,CAAC;IAChE;AAGJ,SAAO;GAAE;GAAgB;GAAiB;;CAG5C,MAAM,uBAAuB,gBAAwB,oBAA4B;AAC/E,MAAI,mBAAmB,uBAAuB,IAC5C,QAAO;AAET,MAAI,mBAAA,aACF,QAAO,iBAAiB;AAE1B,SAAO,kBAAkB;;CAG3B,MAAM,yBAAyB,gBAAwB,oBAA4B;AACjF,MAAI,mBAAmB,uBAAuB,OAAO,mBAAmB,EACtE,QAAO;AAET,SAAO,iBAAiB,YAAY,kBAAkB;;CAGxD,IAAI,EAAE,gBAAgB,oBAAoB,qBAAqB,gBAAgB;AAE/E,QAAO,oBAAoB,gBAAgB,gBAAgB,EAAE;AAC3D,qBAAmB;EACnB,MAAM,EAAE,gBAAgB,UAAU,iBAAiB,cACjD,qBAAqB,gBAAgB;AAEvC,MAAI,YAAY,WAAW;AACzB,oBAAiB;AACjB,qBAAkB;SACb;AACL,sBAAmB;AACnB;;;AAIJ,QAAO,sBAAsB,gBAAgB,gBAAgB,EAAE;AAC7D,qBAAmB;AACnB,GAAC,CAAE,gBAAgB,mBAAoB,qBAAqB,gBAAgB;;AAG9E,QAAO;;;;ACxeT,IAAM,yBAAyB,KAAsB,aACnD,IAAI,gBAAgB,WAAW,8BAAA,IAA+D;AAEhG,IAAM,2BAA2B,KAAsB,aACrD,IAAI,kBACA,mBAAmB,IAAI,aAAa,SAAS,GAC7C,KAAK,IAAA,KAAqC,KAAK,KAAM,IAAI,GACzD;AAEN,IAAM,eAAe,KAAsB,UAAkB,qBAC3D,kBAAkB,IAAI,MAAM,IAAI,aAAa,UAAU,iBAAiB,GACxE,sBAAsB,KAAK,SAAS,GACpC,wBAAwB,KAAK,SAAS;AAExC,IAAM,qBAAqB,KAAsB,eAAwC;CACvF,MAAM,UAAU,WAAW,IAAI;AAC/B,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,2CAA2C,IAAI,SAAS,IAAI;AAE9E,QAAO;;AAGT,IAAM,oBAAoB,OACxB,MACA,iBACG;CACH,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,CAAC;CACtE,MAAM,WAAW,MAAM,QAAQ,IAC7B,UAAU,IAAI,OAAO,aAAa,CAAC,UAAU,MAAM,aAAa,SAAS,CAAC,CAAU,CACrF;AACD,QAAO,OAAO,YAAY,SAAS;;AAGrC,IAAM,sBAAsB,QAUtB;CACJ,MAAM,EAAE,MAAM,GAAG,GAAG,OAAO,QAAQ,YAAY,UAAU,OAAO,YAAY;AAC5E,KAAI,SAAS,EAAG;AAEhB,MAAK,SAAS;EACZ,OAAO,YAAY;GAAE;GAAG;GAAG,EAAE,YAAY,OAAO,MAAM;EACtD,KAAK,YAAY;GAAE,GAAG,IAAI;GAAO;GAAG,EAAE,YAAY,OAAO,MAAM;EAC/D,WAAY,IAAI,KAAM;EACtB;EACA;EACD,CAAC;;AAGJ,IAAM,WAAW,QAgBX;CACJ,MAAM,EACJ,MACA,QACA,KACA,SACA,GACA,GACA,QACA,YACA,UACA,YACA,OACA,SACA,WACA,kBACA,kBACE;CACJ,MAAM,WAAW,YAAY,KAAK,UAAU,iBAAiB;CAC7D,MAAM,aAAa,mBAAmB,IAAI,aAAa,SAAS;AAEhE,KAAI,IAAI,MAAM;EACZ,MAAM,UAAU;EAChB,MAAM,MAAM,IAAI;EAChB,MAAM,MAAM,IAAI,aAAa;EAC7B,MAAM,UACJ,OAAO,UAAU,IACb;GAAE,GAAG;GAAK,GAAG;GAAK,GAClB,YAAY;GAAE,GAAG;GAAK,GAAG;GAAK,EAAE,YAAY,OAAO,MAAM;AAC/D,OAAK,cAAc;GACjB,GAAG,QAAQ;GACX,GAAG,QAAQ;GACX,OAAO,WAAW,UAAU;GAC5B,QAAQ,aAAa;GACrB;GACA,OAAO,kBAAkB,uBAAuB,UAAU;GAC1D;GACD,CAAC;;AAGJ,KAAI,iBAAiB,WAAW,EAC9B,oBAAmB;EACjB;EACA;EACA,GAAG,IAAI,aAAa;EACpB,OAAO;EACP;EACA;EACA;EACA;EACA;EACD,CAAC;CAGJ,MAAM,UAAU,UAAkB;EAChC,MAAM,QACJ,OAAO,UAAU,IAAI;GAAE,GAAG;GAAO;GAAG,GAAG,YAAY;GAAE,GAAG;GAAO;GAAG,EAAE,YAAY,OAAO,MAAM;AAC/F,OAAK,SAAS,IAAI,MAAM;GACtB,GAAG,MAAM;GACT,GAAG,MAAM;GACT;GACA,MAAM;GACN;GACA,YAAY,aAAa;GACzB,MAAM;GACN;GACA,GAAI,IAAI,kBAAkB,EAAE,OAAO,OAAO,QAAA,GAAsC,EAAE,GAAG,EAAE;GACxF,CAAC;;AAGJ,QAAO,EAAE;AACT,KAAI,IAAI,eAAe;EACrB,MAAM,SAAS,WAAW;AAC1B,OAAK,IAAI,IAAI,GAAG,KAAA,GAAqC,IACnD,QAAO,IAAI,SAAS,EAAE;;;AAK5B,IAAa,2BAA2B,OAAO,QAuBzC;CACJ,MAAM,EACJ,OACA,QACA,MACA,cACA,aACA,MACA,QACA,QACA,WACA,UACA,OACA,WACA,mBACA,YACA,kBACA,GACA,OACA,QACA,YACA,YACA,QACA,YACE;CAGJ,MAAM,QAAQ,oBAAoB;EAChC,MAAM,MAFmB,oBAAoB;GAAE,MAD5B,oBAAoB,MACc;GAAc;GAAQ;GAAM;GAAQ,CAAC;EAG1F;EACA;EACA,cAAc;EACf,CAAC;CACF,MAAM,aAAa,MAAM,kBACvB,MAAM,SAAS,SAAS,KAAK,KAAK,EAClC,aACD;CAED,MAAM,sBAAsB,mBAAmB,aAAa,SAAS;CACrE,MAAM,UAAU,mBAAmB,aAAa,SAAS;CACzD,MAAM,2BAA2B,eAAe,IAAI,KAAM,aAAa,KAAK,WAAY;CAExF,IAAI,UAAU;AACd,KAAI,sBAAA,MACF,WAAU,sBAAsB;MAC3B;EACL,MAAM,mBAAmB,aAAa,YAAY,MAAM,SAAS;AAEjE,MAAI,sBAAA,SACF,WAAU,SAAS,mBAAmB,UAAU;WACvC,sBAAA,SACT,YACG,SAAS,mBAAmB,sBAAsB,WAAW,IAAI;;AAIxE,OAAM,SAAS,MAAM,aAAa;AAChC,MAAI,KAAK,KAAK,WAAW,EAAG;EAE5B,IAAI,YAAY,KAAK;EACrB,IAAI,UAAU;AAGd,MAFsB,cAAc,aAAa,CAAC,KAAK,aAAa,WAAW,MAAM,SAAS,GAE3E;GACjB,MAAM,gBAAgB,2BAA2B,KAAK;AACtD,OAAI,gBAAgB,GAAG;AACrB,gBAAY,QAAQ,aAAa;AACjC,gBAAY;;;EAIhB,IAAI,QAAQ;AACZ,MAAI,cAAc,SAChB,WAAU,QAAQ,aAAa;WACtB,cAAc,QACvB,UAAS,QAAQ;EAGnB,MAAM,QACJ,aAAa,MAAM,OAAO,SAAS,EAAE,GAAG,UAAU,aAAa,WAAW;AAC5E,OAAK,cAAc,OAAO,oBAAoB,QAAQ,CAAC;AAEvD,MAAI,OAAO,iBAAiB,OAAO,WAAW;GAC5C,MAAM,aAAa,KAAK,IACtB,GAAG,KAAK,KAAK,KAAK,QAAQ,mBAAmB,IAAI,aAAa,SAAS,CAAC,CACzE;AACD,OAAI,OAAO,cACT,oBAAmB;IACjB;IACA,GAAG;IACH,GAAG,QAAQ,aAAa;IACxB,OAAO;IACP;IACA;IACA;IACA;IACA;IACD,CAAC;AAEJ,OAAI,OAAO,UACT,oBAAmB;IACjB;IACA,GAAG;IACH,GAAG,QAAQ,aAAa;IACxB,OAAO;IACP;IACA;IACA;IACA;IACA;IACD,CAAC;;AAIN,OAAK,KAAK,QAAQ,UAAU,KAAK,aAAa;GAC5C,MAAM,WAAW,YAAY,KAAK,UAAU,QAAQ;AAEpD,WAAQ;IACN;IACA;IACA;IACA,SALc,kBAAkB,KAAK,WAKrC;IACA,GAAG;IACH,GAAG;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA,kBAAkB;IAClB,eAAe,QAAQ,IAAI,cAAc;IAC1C,CAAC;AAEF,UAAO,WAAW,YAAY,aAAa,KAAK,KAAK,SAAS,IAAI,IAAI;KACrE,MAAM;GACT;;;;AC5SJ,IAAM,qBAAqB;AAE3B,IAAM,mBACJ,WACiB;CACjB,IAAI,eAAe,OAAO,IAAI,mBAAmB;AACjD,KAAI,CAAC,cAAc;AACjB,iBAAe,EAAE;AACjB,SAAO,IAAI,oBAAoB,aAAa;;AAG9C,QAAO;;AAGT,IAAM,mBAAmB,QAKnB;CACJ,MAAM,EAAE,QAAQ,MAAM,UAAU,WAAW;CAC3C,MAAM,eAAe,gBAAgB,OAAO;CAC5C,MAAM,aAAa,aAAa;AAChC,KAAI,WACF,QAAO;CAGT,MAAM,YAAY,KAAK;AACvB,KAAI,CAAC,UACH,QAAO,QAAQ,uBAAO,IAAI,MAAM,0BAA0B,SAAS,iBAAiB,CAAC;CAGvF,MAAM,kBAAkB,YAAY;EAClC,IAAI,WAAW,UAAU;AACzB,MAAI,OAAO,aAAa,YAAY,SAAS,WAAW,OAAO,CAC7D,YAAW,MAAM,oBAAoB,SAAS;AAEhD,SAAO,OAAO,UAAU,UAAU,EAChC,QAAQ,OAAO,UAAU,WAAW,cAAc,OAAO,UAAU,QACpE,CAAC;KACA;AAEJ,cAAa,YAAY;AACzB,QAAO;;AAGT,IAAM,eAAe,EACnB,OACA,aACA,QACA,WACA,UAAU,uBAON;CACJ,MAAM,WACJ,qBACC,OAAO,kBACJ,yBAAyB;EAAE,YAAY;EAAQ;EAAa;EAAO,CAAC,GACnE,OAAO,YAAA;CACd,MAAM,QAAQ,kBAAkB,OAAO,aAAA,WAAiC,UAAU;AAElF,QAAO;EACL,WAAW,OAAO,aAAA;EAClB,mBAAmB,OAAO,qBAAA;EAC1B,YAAY,OAAO,cAAA;EACnB,kBAAkB,OAAO,oBAAA;EACzB;EACA;EACD;;AAGH,IAAI;AAEJ,IAAM,6BAA6B;AACjC,uBAAA,oBAAsB,IAAI,KAAK,UAAU,KAAA,GAAW,EAAE,aAAa,YAAY,CAAC;AAChF,QAAO;;AAGT,IAAa,YAAY,OAAO,QAAoC;CAClE,MAAM,EAAE,OAAO,QAAQ,QAAQ,MAAM,SAAS,QAAQ,WAAW;AACjE,KAAI,CAAC,MAAO;CAEZ,MAAM,EAAE,OAAO,gBAAgB,EAAE,cAAc;CAC/C,MAAM,WAAW,OAAO,WAAW,OAAO,WAAW,oBAAoB,KAAK;CAC9E,MAAM,uBAAuB,2BAA2B,OAAO;CAE/D,MAAM,sBAAsB,uBACxB,KAAA,IACA,gBAAgB;EACd;EACA;EACA;EACA;EACD,CAAC;CACN,MAAM,cAAc,MAAM,eACxB,OAAO,UACP,MACA,OACD;CAcD,MAAM,EAAE,UAAU,OAAO,WAAW,mBAAmB,YAAY,qBARlD,YAAY;EAC3B,OANmB,uBAAuB,oBAAoB,MAAM,GAAG;EAOvE;EACA;EACA;EACA,UARA,wBAAwB,OAAO,kBAC3B,MAAM,iCAAiC;GAAE;GAAO;GAAQ;GAAM;GAAQ,CAAC,GACvE,KAAA;EAOL,CAEuF;CAExF,MAAM,aAAa,KAAK,WAAW;CACnC,MAAM,EACJ,OACA,QACA,QACA,UAAU,EAAE,GAAG,KACf,YACE,yBAAyB;EAAE;EAAQ;EAAY,sBAAsB;EAAO,CAAC;CAEjF,MAAM,aAAa;EAAE,GAAG,IAAI,QAAQ;EAAG,GAAG,aAAa,MAAM,OAAO,SAAS,EAAE,GAAG,SAAS;EAAG;AAE9F,KAAI,OAAO,iBAAiB;EAC1B,MAAM,QAAQ,kBAAkB,OAAO,iBAAiB,UAAU;AAClE,MAAI,OAAO,UAAU,GAAG;GAEtB,MAAM,eAAe,YAAY;IAAE;IAAG;IAAG,EAAE,YAAY,OAAO,MAAM;AACpE,QAAK,cAAc;IAAE,GAAG,aAAa;IAAG,GAAG,aAAa;IAAG;IAAO;IAAQ;IAAQ;IAAO,CAAC;QAE1F,MAAK,cAAc;GAAE;GAAG;GAAG;GAAO;GAAQ;GAAQ;GAAO,CAAC;;AAI9D,KAAI,sBAAsB;AACxB,QAAM,yBAAyB;GAC7B;GACA;GACA;GACA,eAAe,aAAa,gBAAgB;IAAE;IAAQ;IAAM;IAAU;IAAQ,CAAC;GAC/E;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;AACF;;AAEF,KAAI,CAAC,oBACH,OAAM,IAAI,MAAM,kEAAkE;CAEpF,MAAM,eAAe,MAAM;CAE3B,MAAM,sBAAsB,mBAAmB,aAAa,SAAS;CACrE,MAAM,UAAU,mBAAmB,aAAa,SAAS;CACzD,MAAM,2BAA2B,eAAe,IAAI,KAAM,aAAa,KAAK,WAAY;CAExF,MAAM,QAAQ,gBAAgB;EAC5B;EACA;EACA;EACA;EACA,cAAc;EACf,CAAC;CACF,MAAM,iBAAiB,cAAc,UAAU,QAAQ,OAAO,iBAAiB,OAAO,UAAU;CAChG,MAAM,kBAAkB,QAAQ,OAAO,iBAAiB,OAAO,UAAU;CAGzE,IAAI,UAAU;AACd,KAAI,sBAAA,MACF,WAAU,sBAAsB;MAC3B;EACL,MAAM,mBAAmB,aAAa,YAAY,MAAM,SAAS;AAEjE,MAAI,sBAAA,SACF,WAAU,SAAS,mBAAmB,UAAU;WACvC,sBAAA,SACT,YACG,SAAS,mBAAmB,sBAAsB,WAAW,IAAI;;AAIxE,OAAM,SAAS,MAAM,aAAa;EAChC,MAAM,UAAU,KAAK,QAAQ,MAAM,GAAG;EACtC,MAAM,YAAY,iBACd,kBAAkB,SAAS,aAAa,UAAU,iBAAiB,GACnE;EACJ,MAAM,aAAa,kBAAkB,mBAAmB,aAAa,SAAS,GAAG;EACjF,MAAM,aAAa,aAAa,WAAW;AAG3C,MAAI,SAAS,GAEX,QAAO;EAGT,IAAI,QAAQ;AACZ,MAAI,cAAc,SAChB,WAAU,QAAQ,aAAa;WACtB,cAAc,QACvB,UAAS,QAAQ;EAGnB,IAAI,QAAQ,aAAa,MAAM,OAAO,SAAS,EAAE,GAAG,UAAU;AAG9D,MAAI,OAAO,iBAAiB,YAAY,GAAG;GACzC,MAAM,KAAK,QAAQ,YAAY;GAC/B,MAAM,KAAK,QAAQ,aAAa;AAChC,QAAK,SAAS;IACZ,OAAO,YAAY;KAAE,GAAG;KAAO,GAAG;KAAI,EAAE,YAAY,OAAO,MAAM;IACjE,KAAK,YAAY;KAAE,GAAG;KAAI,GAAG;KAAI,EAAE,YAAY,OAAO,MAAM;IAC5D,WAAY,IAAI,KAAM;IACf;IACP;IACD,CAAC;;AAIJ,MAAI,OAAO,aAAa,YAAY,GAAG;GACrC,MAAM,KAAK,QAAQ,YAAY;GAC/B,MAAM,KAAK,QAAQ,aAAa;AAChC,QAAK,SAAS;IACZ,OAAO,YAAY;KAAE,GAAG;KAAO,GAAG;KAAI,EAAE,YAAY,OAAO,MAAM;IACjE,KAAK,YAAY;KAAE,GAAG;KAAI,GAAG;KAAI,EAAE,YAAY,OAAO,MAAM;IAC5D,WAAY,IAAI,KAAM;IACf;IACP;IACD,CAAC;;AAGJ,MAAI,OAAO,UAAU,GAAG;GAGtB,MAAM,eAAe,YAAY;IAAE,GAAG;IAAO,GAAG;IAAO,EAAE,YAAY,OAAO,MAAM;AAClF,WAAQ,aAAa;AACrB,WAAQ,aAAa;;EAGvB,IAAI,UAAU;AACd,MAAI,cAAc,aAAa,KAAK,MAAM,GAAG,KAAK,MAAM;GAGtD,MAAM,WADY,sBACD,CAAU,QAAQ,QAAQ,CAAC,OAAO,WAAW;GAC9D,MAAM,MAAM,MAAM,KAAK,SAAS,CAAC;AACjC,eAAY,QAAQ,aAAa;;AAEnC,OAAK,cAAc,OAAO,oBAAoB,QAAQ,CAAC;AAEvD,OAAK,SAAS,SAAS;GACrB,GAAG;GACH,GAAG;GACH;GACA,MAAM;GACN;GACA,YAAY,aAAa;GACzB,MAAM;GACN;GACD,CAAC;GACF;;;;ACjTJ,IAAa,wBAAwB,aAAa,cAAc;AAEhE,IAAa,oBAAoB,aAAa,UAAU;AAExD,IAAa,oBAAoB,aAAa,UAAU;AAExD,IAAa,sBAAsB,aAAa,YAAY;AAE5D,IAAa,qBAAqB,aAAa,WAAW;AAE1D,IAAa,uBAAuB,aAAa,aAAa;AAE9D,IAAa,2BAA2B,aAAa,cAAc;AAGnE,IAAa,8BAA8B;AAE3C,IAAa,8BAA8B,aAAa,gBAAgB;;;ACPxE,IAAY,YAAL,yBAAA,WAAA;AACL,WAAA,mBAAgB;AAChB,WAAA,eAAY;AACZ,WAAA,eAAY;AACZ,WAAA,wBAAqB;;KACtB;AAiBD,SAAgB,wBAAwB,MAKtC;CACA,MAAM,UAAyB;EAC7B;GAAE,KAAK,UAAU;GAAe,MAAM;GAAuB,MAAM;GAAW;EAC9E;GAAE,KAAK,UAAU;GAAW,MAAM;GAAmB,MAAM;GAAW;EACtE;GAAE,KAAK,UAAU;GAAW,MAAM;GAAmB,MAAM;GAAU,OAAO;GAAmB;EAC/F;GAAE,KAAK,UAAU;GAAW,MAAM;GAAqB,MAAM;GAAU,OAAO;GAAc;EAC5F;GAAE,KAAK,UAAU;GAAW,MAAM;GAAoB,MAAM;GAAU,OAAO;GAAa;EAC1F;GAAE,KAAK,UAAU;GAAW,MAAM;GAAsB,MAAM;GAAU,OAAO;GAAe;EAC9F;GACE,KAAK,UAAU;GACf,MAAM;GACN,MAAM;GACN,OAAA;GACD;EACD;GACE,KAAK,UAAU;GACf,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,KAAK,UAAU;GACf,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACF;AACD,QAAO;EACL,OAAO,KAAK,sBAAsB;EAClC,QAAQ;EACR;EACA,MAAM;EACP;;;;AClDH,IAAM,sBAAsB,UAAgC;CAC1D,MAAM,EAAE,aAAa,eAAe,cAAc,SAAS;CAE3D,MAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,UAAS,OAAO;AAChB,UAAS,UAAU,QAAS,cAAgD,gBAAgB;AAC5F,UAAS,YAAY,MAAa;AAQhC,gBAAc,CAAC;GAAE,KAAK;GAAmB,OAP5B,EAAE,OAA4B,UACvC;IACE,KAAA;IACA,KAAA;IACA,KAAK;IACN,GACD,KAAA;GACiD,UAAU,aAAa;GAAI,CAAC,CAAC;;CAEpF,MAAM,QAAQ,SAAS,cAAc,QAAQ;CAC7C,MAAM,OAAO,SAAS,cAAc,OAAO;AAC3C,MAAK,YAAY,KAAK,+BAA+B,IAAI;AACzD,MAAK,MAAM,UAAU;AACrB,OAAM,MAAM,UAAU;AACtB,OAAM,YAAY,SAAS;AAC3B,OAAM,YAAY,KAAK;AACvB,aAAY,YAAY,MAAM;;AAGhC,IAAM,qBAAqB,UAAgC;CACzD,MAAM,EAAE,aAAa,eAAe,cAAc,SAAS;CAE3D,MAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,UAAS,OAAO;AAChB,UAAS,UACN,cAA2C,eAAe;AAC7D,UAAS,YAAY,MAAa;AAIhC,gBAAc,CAAC;GAAE,KAAK;GAAc,OAHrB,EAAE,OAA4B,UACzC,8BACA;GACuC,UAAU,aAAa;GAAI,CAAC,CAAC;;CAE1E,MAAM,QAAQ,SAAS,cAAc,QAAQ;CAC7C,MAAM,OAAO,SAAS,cAAc,OAAO;AAC3C,MAAK,YAAY,KAAK,8BAA8B,IAAI;AACxD,MAAK,MAAM,UAAU;AACrB,OAAM,MAAM,UAAU;AACtB,OAAM,YAAY,SAAS;AAC3B,OAAM,YAAY,KAAK;AACvB,aAAY,YAAY,MAAM;;AAGhC,IAAa,YAAmC;CAC9C,SAAS,EAAE,SAAS,cAAc,WAAW;EAC3C,MAAM,OAAO,QAAQ,QAAQ,GAAG,oBAAoB;GAAE,MAAM;GAAI,UAAU;GAAM,EAAE;EAClF,MAAM,YAAY,OAAO,KAAK,KAAK;EACnC,MAAM,mBAAmB,oBAAoB,KAAK;EAElD,MAAM,oBAAoB,QACvB,cAAgD,gBAClD;EACD,MAAM,mBAAmB;EACzB,MAAM,iBAAiB,iBAAiB,SAAS,UAAU,iBAAiB,aAAa;EACzF,MAAM,uBACJ,iBAAiB,eAAA,qBAA8C,CAAC;EAClE,MAAM,eACJ,iBAAiB,YAAY,KAAK,iBAAiB,YAC/C,iBAAiB,WACjB;EACN,MAAM,oBAAoB,CACxB;GAAE,OAAO;GAAc,OAAO;GAAI,EAClC,GAAG,UACA,QAAQ,SAAS,SAAS,aAAa,CACvC,KAAK,UAAU;GAAE,OAAO;GAAM,OAAO;GAAM,EAAE,CACjD;AA0JD,SAAO;GAvJL,UAAU;IACR,OAAO,KAAK,wBAAwB;IACpC,MAAM;IACN,QAAQ;IACR,SAAS;IACT,aAAa;IACb,OAAO,EAAE,SAAS,UAAU,KAAK,UAAU;KAAE,OAAO;KAAM,OAAO;KAAM,EAAE,EAAE;IAC3E,MAAM;IACP;GACD,UAAU;IACR,OAAO,KAAK,oBAAoB;IAChC,MAAM;IACN,QAAQ;IACR,MAAM;IACN,UAAU;IACV,OAAO,EAAE,KAAK,GAAG;IAClB;GACD,kBAAkB;IAChB,OAAO,KAAK,uBAAuB;IACnC,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO,EAAE,KAAK,GAAG;IAClB;GACD,WAAW,wBAAwB,KAAK;GACxC,YAAY;IACV,OAAO,KAAK,0BAA0B;IACtC,MAAM;IACN,QAAQ;IACR,OAAO;KAAE,MAAM;KAAK,KAAK;KAAG;IAC5B,MAAM;IACP;GACD,oBAAoB;IAAE,MAAM;IAAW,QAAQ;IAAsB,MAAM;IAAO,MAAM;IAAI;GAC5F,iBAAiB;IACf,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,YAAY;KACV,KAAK;MACH,OAAO,KAAK,mBAAmB;MAC/B,MAAM;MACN,QAAQ;MACR,QAAQ,CAAC;MACT,OAAO,EAAE,KAAK,GAAG;MAClB;KACD,KAAK;MACH,OAAO,KAAK,mBAAmB;MAC/B,MAAM;MACN,QAAQ;MACR,QAAQ,CAAC;MACT,OAAO,EAAE,KAAK,GAAG;MAClB;KACD,KAAK;MACH,OAAO,KAAK,mBAAmB;MAC/B,MAAM;MACN,QAAQ;MACR,QAAQ,CAAC;MACT,OAAO,EACL,SAAS,CACP;OAAE,OAAO,KAAK,qBAAqB;OAAE,OAAO;OAAwB,EACpE;OAAE,OAAO,KAAK,mBAAmB;OAAE,OAAO;OAAsB,CACjE,EACF;MACF;KACF;IACF;GACD,WAAW;IACT,OAAO,KAAK,oBAAoB;IAChC,MAAM;IACN,QAAQ;IACR,OAAO,EACL,eAAe,MAChB;IACD,OAAO,CACL;KACE,SAAS;KACT,SAAS,KAAK,sBAAsB;KACrC,CACF;IACF;GACD,iBAAiB;IACf,OAAO,KAAK,kBAAkB;IAC9B,MAAM;IACN,QAAQ;IACR,OAAO,EACL,eAAe,MAChB;IACD,OAAO,CACL;KACE,SAAS;KACT,SAAS,KAAK,sBAAsB;KACrC,CACF;IACF;GACD,mBAAmB;IACjB,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM,uBAAuB,KAAK;IACnC;GACD,qBAAqB;IACnB,OAAO,KAAK,+BAA+B;IAC3C,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ,CAAC;IACT,OAAO,EACL,SAAS;KACP;MAAE,OAAO,KAAK,yBAAyB;MAAE,OAAO;MAAiC;KACjF;MAAE,OAAO,KAAK,qBAAqB;MAAE,OAAO;MAA6B;KACzE;MAAE,OAAO,KAAK,qBAAqB;MAAE,OAAO;MAA6B;KAC1E,EACF;IACD,MAAM;IACP;GACD,cAAc;IACZ,OAAO,KAAK,6BAA6B;IACzC,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY;KACV,MAAM;MACJ,OAAO,KAAK,wBAAwB;MACpC,MAAM;MACN,QAAQ;MACR,OAAO,EAAE,SAAS,mBAAmB;MACtC;KACD,QAAQ;MACN,OAAO,KAAK,0BAA0B;MACtC,MAAM;MACN,QAAQ;MACR,OAAO,EAAE,SAAS,mBAAmB;MACtC;KACD,YAAY;MACV,OAAO,KAAK,8BAA8B;MAC1C,MAAM;MACN,QAAQ;MACR,OAAO,EAAE,SAAS,mBAAmB;MACtC;KACD,MAAM;MACJ,OAAO,KAAK,wBAAwB;MACpC,MAAM;MACN,QAAQ;MACR,OAAO,EAAE,SAAS,mBAAmB;MACtC;KACF;IACF;GAGI;;CAET,SAAS;EAAE;EAAoB;EAAmB;CAClD,eAAe;EACb,MAAM;EACN,MAAM;EACN,SAAS;EACT,UAAU;GAAE,GAAG;GAAG,GAAG;GAAG;EACxB,OAAO;EACP,QAAQ;EAGR,QAAQ;EACR,WAAW;EACX,mBAAA;EACA,UAAA;EACA,YAAY;EACZ,qBAAqB;EACrB,YAAA;EACA,kBAAA;EACA,iBAAiB,KAAA;EACjB,WAAW;EACX,UAAU,KAAA;EACV,iBAAiB;EACjB,SAAA;EACA,eAAe;EACf,WAAW;EACZ;CACF;;;AC5PD,IAAM,2BAA2B,MAAc,gBAAqC;CAClF,MAAM,mBAAgD,EAAE;CAExD,MAAM,mBAAmB,SAA0B;AACjD,MAAI,QAAQ,iBACV,QAAO,iBAAiB;EAE1B,MAAM,cAAc,YAAY,qBAAqB,KAAK,YAAY,EAAE,IAAI,EAAE;AAC9E,mBAAiB,QAAQ;AACzB,SAAO;;AAKT,QAFiB,KAAK,MAAM,eAErB,CACJ,KAAK,YAAY;AAChB,MAAI,aAAa,KAAK,QAAQ,CAC5B,QAAO;AAGT,SAAO,MAAM,KAAK,QAAQ,CACvB,KAAK,SAAS;AACb,OAAI,KAAK,KAAK,KAAK,IAAI,KAAK,WAAW,EAAE,GAAG,GAC1C,QAAO;AAGT,UAAO,gBAAgB,KAAK,GAAG,OAAO;IACtC,CACD,KAAK,GAAG;GACX,CACD,KAAK,GAAG;;AAGb,IAAa,WAAW,OAAO,QAAmC;CAChE,MAAM,EAAE,OAAO,QAAQ,MAAM,UAAU,aAAa,UAAU,aAAa,SAAS,WAClF;CACF,MAAM,iBAAiB,WAAW,MAAM,OAAO,IAAI,eAAe,CAAC;CACnE,MAAM,WAAW,YAA4B;EAC3C,IAAI,OAAO,QAAQ;AACnB,MAAI,KAAK,SAAS,KAAK,CAErB,QAAO,KAAK,MAAM,GAAG,GAAG;AAE1B,SAAO;;CAET,MAAM,OAAO,SAAS,QAAQ,gBAAgB;CAC9C,MAAM,cAAc,MAAM,eACxB,OAAO,UACP,MACA,OACD;CACD,MAAM,uBAAuB,2BAA2B,OAAO;CAC/D,MAAM,eAAe,uBAAuB,oBAAoB,MAAM,GAAG;CACzE,MAAM,0BACJ,wBAAwB,OAAO,kBAC3B,MAAM,iCAAiC;EACrC,OAAO,iBAAkB,cAAyB;EAClD;EACA;EACA;EACD,CAAC,GACF,KAAA;CACN,MAAM,YAAY,yBAChB,KACA,aACA,iBAAiB,cAAc,cAC/B,wBACD;CAED,MAAM,gBAAgB,wBAAwB,OAAO,YAAY;AAEjE,KAAI,CAAC,WAAW,MAAM,OAAO,EAAE;AAC7B,MAAI,sBAAsB;AACxB,SAAM,6BAA6B;IACjC;IACA;IACA;IACA;IACA;IACD,CAAC;AACF;;AAIF,YAAU,YAAY,cACnB,MAAM,GAAG,CACT,KAAK,GAAG,MAAM;GACb,MAAM,UAAU,EACb,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS;AAC1B,UAAO,+BACL,OAAO,MAAM,CAAC,WAAW,IAAI,IAAI,IAAI,UACtC,KAAK,QAAQ;IACd,CACD,KAAK,GAAG;AACX;;AAGF,qCAAoC,UAAU;AAC9C,WAAU,WAAW,YAAY;AACjC,WAAU,YAAY,SAAS,aAAa,QAAQ;AACpD,WAAU,iBAAiB,SAAS,MAAa;AAC/C,MAAI,SAAU,UAAS;GAAE,KAAK;GAAW,OAAO,QAAQ,EAAE,OAAyB;GAAE,CAAC;AACtF,MAAI,YAAa,cAAa;GAC9B;AAEF,KAAI,OAAO,iBAAiB;EAC1B,IAAI,kBAAsC,KAAA;AAE1C,YAAU,iBAAiB,eAAe;AACxC,oBAAiB;AAEf,WAAO;AACL,SAAI,CAAC,UAAU,YAAa;AAC5B,uBAAkB,yBAAyB;MACzC,YAAY;MACZ;MACA,OAAO,2BAA2B,OAAO,GACrC,oBAAoB,QAAQ,UAAU,CAAC,GACvC,QAAQ,UAAU;MACtB,kBAAkB;MACnB,CAAC;AACF,eAAU,MAAM,WAAW,GAAG,gBAAgB;KAE9C,MAAM,EAAE,QAAQ,WAAW,WAAW,iBAAiB,kCACrD,aACA,mBAAmB,OAAO,YAAA,IAC1B,OAAO,cAAA,GACP,OAAO,qBAAA,MACR;AACD,eAAU,MAAM,aAAa,GAAG,UAAU;AAC1C,eAAU,MAAM,eAAe,GAAG,aAAa;QAC7C;MACH,EAAE;IACL;;AAGJ,KAAI,gBAAgB;AAClB,YAAU,MAAM,QAAQ;AACxB,YAAU,iBAAiB,eAAe;AACxC,OAAI,UAAU,cAAc,aAAa;AACvC,cAAU,YAAY;AACtB,cAAU,MAAM,QAAQ,OAAO,aAAA;;IAEjC;;AAGJ,KAAI,SAAS,WACX,kBAAiB;AACf,YAAU,OAAO;EAEjB,MAAM,YAAY,OAAO,cAAc;EACvC,MAAM,QAAQ,SAAS,aAAa;AACpC,MAAI,aAAa,OAAO;AACtB,SAAM,mBAAmB,UAAU;AACnC,SAAM,SAAS,MAAM;AACrB,cAAW,iBAAiB;AAC5B,cAAW,SAAS,MAAM;;GAE5B;;AAIN,IAAM,+BAA+B,OAAO,QAMtC;CACJ,MAAM,EAAE,WAAW,OAAO,QAAQ,MAAM,WAAW;CACnD,MAAM,OAAO,MAAM,oBAAoB;EACrC,MAAM,oBAAoB,MAAM;EAChC;EACA;EACA;EACD,CAAC;AAEF,WAAU,YAAY;AACtB,MAAK,SAAS,QAAQ;EACpB,MAAM,OAAO,SAAS,cAAc,OAAO;AAG3C,OAAK,cAFiB,wBAAwB,IAAI,MAAM,IAAI,YAEzC;AACnB,MAAI,IAAI,SACN,MAAK,MAAM,aAAa,IAAI,IAAI,SAAS;AAE3C,MAAI,IAAI,eAAe;AACrB,QAAK,MAAM,aAAa;AACxB,QAAK,MAAM,aAAa;;AAE1B,MAAI,IAAI,gBACN,MAAK,MAAM,YAAY;AAEzB,MAAI,IAAI,cACN,MAAK,MAAM,iBAAiB;AAE9B,MAAI,IAAI,MAAM;AACZ,QAAK,MAAM,kBAAkB;AAC7B,QAAK,MAAM,eAAe;AAC1B,QAAK,MAAM,UAAU;AACrB,OAAI,CAAC,OAAO,cAAc,QAAQ,CAAC,KAAK,OAAO,aAAa,MAC1D,MAAK,MAAM,aAAa,IAAI,WACxB,IAAI,IAAI,SAAS,gBACjB;;AAGR,YAAU,YAAY,KAAK;GAC3B;;AAGJ,IAAa,4BACX,KACA,aACA,OACA,4BACG;CACH,MAAM,EAAE,QAAQ,aAAa,SAAS;CAEtC,IAAI,kBAAsC;AAE1C,KAAI,oBAAoB,KAAA,KAAa,OAAO,mBAAmB,MAC7D,mBAAkB,yBAAyB;EACzC,YAAY;EACZ;EACA;EACA,kBAAkB;EACnB,CAAC;CAKJ,MAAM,EAAE,QAAQ,cAAc,kCAC5B,aACA,mBAAmB,OAAO,YAAA,IAC1B,OAAO,cAAA,GACP,OAAO,qBAAA,MACR;CAED,MAAM,gBAAgB,OAAO,UAAU;CACvC,MAAM,mBAAmB,UAAU,UAAU;CAE7C,MAAM,YAAY,SAAS,cAAc,MAAM;CAE/C,MAAM,iBAAiC;EACrC,SAAS;EACT,QAAQ;EACR,iBAAiB,mBAAmB,OAAO,OAAO;EAClD,QAAQ;EACR,SAAS;EACT,eAAe;EACf,gBAAgB,uBAAuB,OAAO,kBAAkB;EAChE,OAAO;EACP,QAAQ;EACR,QAAQ,WAAW,MAAM,OAAO,GAAG,SAAS;EAC7C;AACD,QAAO,OAAO,UAAU,OAAO,eAAe;AAC9C,aAAY,YAAY;AACxB,aAAY,YAAY,UAAU;CAGlC,MAAM,kBAAkB,EAAE;AAC1B,KAAI,OAAO,cAAe,iBAAgB,KAAK,eAAe;AAC9D,KAAI,OAAO,UAAW,iBAAgB,KAAK,YAAY;CAEvD,MAAM,iBAAiC;EAErC,YAAY,OAAO,WAAW,IAAI,OAAO,SAAS,KAAK;EACvD,OAAO,OAAO,YAAY,OAAO,YAAY;EAC7C,UAAU,GAAG,mBAAmB,OAAO,YAAA,GAA8B;EACrE,eAAe,GAAG,OAAO,oBAAA,EAA8C;EACvE,YAAY,GAAG,OAAO,cAAA,EAAkC;EACxD,WAAW,OAAO,aAAA;EAClB,YAAY;EACZ,WAAW;EAEX,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,cAAc,GAAG,iBAAiB;EAClC,YAAY,GAAG,cAAc;EAC7B,iBAAiB;EACjB,gBAAgB,gBAAgB,KAAK,IAAI;EAC1C;CAED,MAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,WAAU,KAAK,UAAU,OAAO,OAAO,GAAG;AAC1C,QAAO,OAAO,UAAU,OAAO,eAAe;AAE9C,WAAU,YAAY,UAAU;AAEhC,QAAO;;;;;;AAOT,IAAa,uCAAuC,YAAyB;AAC3E,KAAI,CAAC,WAAW,EAAE;AAChB,UAAQ,kBAAkB;AAC1B;;AAGF,SAAQ,kBAAkB;AAC1B,SAAQ,iBAAiB,YAAY,MAAqB;AACxD,MAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,KAAE,gBAAgB;AAClB,YAAS,YAAY,mBAAmB,OAAO,KAAA,EAAU;;GAE3D;AAEF,SAAQ,iBAAiB,UAAU,MAAsB;AACvD,IAAE,gBAAgB;EAClB,MAAM,QAAQ,EAAE,eAAe,QAAQ,OAAO;EAC9C,MAAM,YAAY,OAAO,cAAc;AACvC,MAAI,CAAC,WAAW,WAAY;AAC5B,YAAU,oBAAoB;AAC9B,YAAU,WAAW,EAAE,CAAC,WAAW,SAAS,eAAe,SAAS,GAAG,CAAC;AACxE,YAAU,eAAe;GACzB;;AAGJ,IAAa,0BAA0B,2BAA+C;AACpF,SAAQ,wBAAR;EACE,KAAA,MACE,QAAO;EACT,KAAK,sBACH,QAAO;EACT,KAAK,sBACH,QAAO;;AAEX,QAAO;;AAGT,IAAM,sBAAsB,OAAe,WAAyC;AAClF,KAAI,CAAC,SAAS,CAAC,OAAO,gBAAiB,QAAO;AAC9C,QAAO,OAAO;;;;AC3WhB,IAAM,aAAiC;CACrC,KAAK;CACL,IAAI;CACJ;CACA,MAAM,aAAa,gBAAgB;CACpC;;;ACRD,IAAM,iBAAiB,EAAE,MAAM,YAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helper-6FilIoVM.js","names":[],"sources":["../src/text/constants.ts","../src/text/helper.ts"],"sourcesContent":["import {\n ALIGNMENT,\n VERTICAL_ALIGNMENT,\n DYNAMIC_FONT_SIZE_FIT,\n TEXT_FORMAT,\n FONT_VARIANT_FALLBACK,\n} from './types.js';\n\nexport const DEFAULT_FONT_SIZE = 13;\n\nexport const ALIGN_LEFT = 'left' as ALIGNMENT;\nexport const ALIGN_CENTER = 'center' as ALIGNMENT;\nexport const ALIGN_RIGHT = 'right' as ALIGNMENT;\nexport const ALIGN_JUSTIFY = 'justify' as ALIGNMENT;\nexport const DEFAULT_ALIGNMENT = ALIGN_LEFT;\nexport const VERTICAL_ALIGN_TOP = 'top' as VERTICAL_ALIGNMENT;\nexport const VERTICAL_ALIGN_MIDDLE = 'middle' as VERTICAL_ALIGNMENT;\nexport const VERTICAL_ALIGN_BOTTOM = 'bottom' as VERTICAL_ALIGNMENT;\nexport const DEFAULT_VERTICAL_ALIGNMENT = VERTICAL_ALIGN_TOP;\nexport const DEFAULT_LINE_HEIGHT = 1;\nexport const DEFAULT_CHARACTER_SPACING = 0;\nexport const DEFAULT_FONT_COLOR = '#000000';\nexport const PLACEHOLDER_FONT_COLOR = '#A0A0A0';\nexport const TEXT_FORMAT_PLAIN = 'plain' as const satisfies TEXT_FORMAT;\nexport const TEXT_FORMAT_INLINE_MARKDOWN = 'inline-markdown' as const satisfies TEXT_FORMAT;\nexport const DEFAULT_TEXT_FORMAT = TEXT_FORMAT_PLAIN;\nexport const FONT_VARIANT_FALLBACK_SYNTHETIC =\n 'synthetic' as const satisfies FONT_VARIANT_FALLBACK;\nexport const FONT_VARIANT_FALLBACK_PLAIN = 'plain' as const satisfies FONT_VARIANT_FALLBACK;\nexport const FONT_VARIANT_FALLBACK_ERROR = 'error' as const satisfies FONT_VARIANT_FALLBACK;\nexport const DEFAULT_FONT_VARIANT_FALLBACK = FONT_VARIANT_FALLBACK_SYNTHETIC;\nexport const SYNTHETIC_BOLD_OFFSET_RATIO = 0.03;\nexport const SYNTHETIC_BOLD_PDF_EXTRA_DRAWS = 2;\nexport const SYNTHETIC_BOLD_CSS_TEXT_SHADOW = '0.025em 0 0 currentColor';\nexport const SYNTHETIC_ITALIC_SKEW_DEGREES = 12;\nexport const CODE_BACKGROUND_COLOR = '#f2f3f5';\nexport const CODE_HORIZONTAL_PADDING = 1.5;\nexport const DYNAMIC_FIT_VERTICAL = 'vertical' as DYNAMIC_FONT_SIZE_FIT;\nexport const DYNAMIC_FIT_HORIZONTAL = 'horizontal' as DYNAMIC_FONT_SIZE_FIT;\nexport const DEFAULT_DYNAMIC_FIT = DYNAMIC_FIT_VERTICAL;\nexport const DEFAULT_DYNAMIC_MIN_FONT_SIZE = 4;\n\nexport const DEFAULT_DYNAMIC_MAX_FONT_SIZE = 72;\nexport const FONT_SIZE_ADJUSTMENT = 0.25;\n\nexport const LINE_START_FORBIDDEN_CHARS = [\n // 句読点\n '、',\n '。',\n ',',\n '.',\n\n // 閉じカッコ類\n '」',\n '』',\n ')',\n '}',\n '】',\n '>',\n '≫',\n ']',\n\n // 記号\n '・',\n 'ー',\n '―',\n '-',\n\n // 約物\n '!',\n '!',\n '?',\n '?',\n ':',\n ':',\n ';',\n ';',\n '/',\n '/',\n\n // 繰り返し記号\n 'ゝ',\n '々',\n '〃',\n\n // 拗音・促音(小書きのかな)\n 'ぁ',\n 'ぃ',\n 'ぅ',\n 'ぇ',\n 'ぉ',\n 'っ',\n 'ゃ',\n 'ゅ',\n 'ょ',\n 'ァ',\n 'ィ',\n 'ゥ',\n 'ェ',\n 'ォ',\n 'ッ',\n 'ャ',\n 'ュ',\n 'ョ',\n];\n\nexport const LINE_END_FORBIDDEN_CHARS = [\n // 始め括弧類\n '「',\n '『',\n '(',\n '{',\n '【',\n '<',\n '≪',\n '[',\n '〘',\n '〖',\n '〝',\n '‘',\n '“',\n '⦅',\n '«',\n];\n","import * as fontkit from 'fontkit';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n b64toUint8Array,\n mm2pt,\n pt2mm,\n pt2px,\n Font,\n getFallbackFontName,\n getDefaultFont,\n DEFAULT_FONT_NAME,\n isUrlSafeToFetch,\n} from '@pdfme/common';\nimport { Buffer } from 'buffer';\nimport type { TextSchema, FontWidthCalcValues } from './types.js';\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_LINE_HEIGHT,\n FONT_SIZE_ADJUSTMENT,\n DEFAULT_DYNAMIC_FIT,\n DYNAMIC_FIT_HORIZONTAL,\n DYNAMIC_FIT_VERTICAL,\n VERTICAL_ALIGN_TOP,\n LINE_END_FORBIDDEN_CHARS,\n LINE_START_FORBIDDEN_CHARS,\n} from './constants.js';\n\nexport const getBrowserVerticalFontAdjustments = (\n fontKitFont: FontKitFont,\n fontSize: number,\n lineHeight: number,\n verticalAlignment: string,\n) => {\n const { ascent, descent, unitsPerEm } = fontKitFont;\n\n // Fonts have a designed line height that the browser renders when using `line-height: normal`\n const fontBaseLineHeight = (ascent - descent) / unitsPerEm;\n\n // For vertical alignment top\n // To achieve consistent positioning between browser and PDF, we apply the difference between\n // the font's actual height and the font size in pixels.\n // Browsers middle the font within this height, so we only need half of it to apply to the top.\n // This means the font renders a bit lower in the browser, but achieves PDF alignment\n const topAdjustment = (fontBaseLineHeight * fontSize - fontSize) / 2;\n\n if (verticalAlignment === VERTICAL_ALIGN_TOP) {\n return { topAdj: pt2px(topAdjustment), bottomAdj: 0 };\n }\n\n // For vertical alignment bottom and middle\n // When browsers render text in a non-form element (such as a <div>), some of the text may be\n // lowered below and outside the containing element if the line height used is less than\n // the base line-height of the font.\n // This behaviour does not happen in a <textarea> though, so we need to adjust the positioning\n // for consistency between editing and viewing to stop text jumping up and down.\n // This portion of text is half of the difference between the base line height and the used\n // line height. If using the same or higher line-height than the base font, then line-height\n // takes over in the browser and this adjustment is not needed.\n // Unlike the top adjustment - this is only driven by browser behaviour, not PDF alignment.\n let bottomAdjustment = 0;\n if (lineHeight < fontBaseLineHeight) {\n bottomAdjustment = ((fontBaseLineHeight - lineHeight) * fontSize) / 2;\n }\n\n return { topAdj: 0, bottomAdj: pt2px(bottomAdjustment) };\n};\n\nexport const getFontDescentInPt = (fontKitFont: FontKitFont, fontSize: number) => {\n const { descent, unitsPerEm } = fontKitFont;\n\n return (descent / unitsPerEm) * fontSize;\n};\n\nexport const heightOfFontAtSize = (fontKitFont: FontKitFont, fontSize: number) => {\n const { ascent, descent, bbox, unitsPerEm } = fontKitFont;\n\n const scale = 1000 / unitsPerEm;\n const yTop = (ascent || bbox.maxY) * scale;\n const yBottom = (descent || bbox.minY) * scale;\n\n let height = yTop - yBottom;\n height -= Math.abs(descent * scale) || 0;\n\n return (height / 1000) * fontSize;\n};\n\nconst calculateCharacterSpacing = (textContent: string, textCharacterSpacing: number) => {\n return (textContent.length - 1) * textCharacterSpacing;\n};\n\nconst TEXT_WIDTH_CACHE_LIMIT = 5000;\nconst textWidthCache = new WeakMap<FontKitFont, Map<string, number>>();\n\nconst getTextWidthCache = (fontKitFont: FontKitFont) => {\n let cache = textWidthCache.get(fontKitFont);\n if (!cache) {\n cache = new Map<string, number>();\n textWidthCache.set(fontKitFont, cache);\n }\n return cache;\n};\n\nexport const widthOfTextAtSize = (\n text: string,\n fontKitFont: FontKitFont,\n fontSize: number,\n characterSpacing: number,\n) => {\n const cache = getTextWidthCache(fontKitFont);\n const cacheKey = `${fontSize}\\0${characterSpacing}\\0${text}`;\n const cachedWidth = cache.get(cacheKey);\n if (cachedWidth !== undefined) {\n return cachedWidth;\n }\n\n const { glyphs } = fontKitFont.layout(text);\n const scale = 1000 / fontKitFont.unitsPerEm;\n const standardWidth =\n glyphs.reduce((totalWidth, glyph) => totalWidth + glyph.advanceWidth * scale, 0) *\n (fontSize / 1000);\n const width = standardWidth + calculateCharacterSpacing(text, characterSpacing);\n\n if (cache.size >= TEXT_WIDTH_CACHE_LIMIT) {\n cache.clear();\n }\n cache.set(cacheKey, width);\n\n return width;\n};\n\nconst getFallbackFont = (font: Font) => {\n const fallbackFontName = getFallbackFontName(font);\n return font[fallbackFontName];\n};\n\nconst getCacheKey = (fontName: string) => `getFontKitFont-${fontName}`;\n\nexport const fetchRemoteFontData = async (url: string): Promise<ArrayBuffer> => {\n if (!isUrlSafeToFetch(url)) {\n throw Error(\n '[@pdfme/schemas] Invalid or unsafe URL for font data. Only http: and https: URLs pointing to public hosts are allowed.',\n );\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n return await response.arrayBuffer();\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw Error(`[@pdfme/schemas] Failed to fetch remote font data from ${url}. ${reason}`);\n }\n};\n\nexport const getFontKitFont = async (\n fontName: string | undefined,\n font: Font,\n _cache: Map<string | number, fontkit.Font>,\n) => {\n const fntNm = fontName || getFallbackFontName(font);\n const cacheKey = getCacheKey(fntNm);\n if (_cache.has(cacheKey)) {\n return _cache.get(cacheKey) as fontkit.Font;\n }\n\n const currentFont = font[fntNm] || getFallbackFont(font) || getDefaultFont()[DEFAULT_FONT_NAME];\n let fontData = currentFont.data;\n if (typeof fontData === 'string') {\n if (fontData.startsWith('http')) {\n fontData = await fetchRemoteFontData(fontData);\n } else {\n fontData = b64toUint8Array(fontData);\n }\n }\n\n // Convert fontData to Buffer if it's not already a Buffer\n let fontDataBuffer: Buffer;\n if (fontData instanceof Buffer) {\n fontDataBuffer = fontData;\n } else {\n fontDataBuffer = Buffer.from(fontData as ArrayBufferLike);\n }\n const fontKitFont = fontkit.create(fontDataBuffer) as fontkit.Font;\n _cache.set(cacheKey, fontKitFont);\n\n return fontKitFont;\n};\n\nconst isTextExceedingBoxWidth = (text: string, calcValues: FontWidthCalcValues) => {\n const { font, fontSize, characterSpacing, boxWidthInPt } = calcValues;\n const textWidth = widthOfTextAtSize(text, font, fontSize, characterSpacing);\n return textWidth > boxWidthInPt;\n};\n\n/**\n * Incrementally checks the current line for its real length\n * and returns the position where it exceeds the box width.\n * Returns `null` to indicate if textLine is shorter than the available box.\n */\nconst getOverPosition = (textLine: string, calcValues: FontWidthCalcValues) => {\n for (let i = 0; i <= textLine.length; i++) {\n if (isTextExceedingBoxWidth(textLine.slice(0, i + 1), calcValues)) {\n return i;\n }\n }\n\n return null;\n};\n\n/**\n * Line breakable chars depend on the language and writing system.\n * Western writing systems typically use spaces and hyphens as line breakable chars.\n * Other writing systems often break on word boundaries so the following\n * does not negatively impact them.\n * However, this might need to be revisited for broader language support.\n */\nconst isLineBreakableChar = (char: string) => {\n const lineBreakableChars = [' ', '-', '\\u2014', '\\u2013'];\n return lineBreakableChars.includes(char);\n};\n\n/**\n * Gets the position of the split. Splits the exceeding line at\n * the last breakable char prior to it exceeding the bounding box width.\n */\nconst getSplitPosition = (textLine: string, calcValues: FontWidthCalcValues) => {\n const overPos = getOverPosition(textLine, calcValues);\n if (overPos === null) return textLine.length; // input line is shorter than the available space\n\n if (textLine[overPos] === ' ') {\n // if the character immediately beyond the boundary is a space, split\n return overPos;\n }\n\n let overPosTmp = overPos - 1;\n while (overPosTmp >= 0) {\n if (isLineBreakableChar(textLine[overPosTmp])) {\n return overPosTmp + 1;\n }\n overPosTmp--;\n }\n\n // For very long lines with no breakable chars use the original overPos\n return overPos;\n};\n\n/**\n * Recursively splits the line at getSplitPosition.\n * If there is some leftover, split the rest again in the same manner.\n */\nexport const getSplittedLines = (textLine: string, calcValues: FontWidthCalcValues): string[] => {\n const splitPos = getSplitPosition(textLine, calcValues);\n const splittedLine = textLine.substring(0, splitPos).trimEnd();\n const rest = textLine.substring(splitPos).trimStart();\n\n if (rest === textLine) {\n // if we went so small that we want to split on the first char\n // then end recursion to avoid infinite loop\n return [textLine];\n }\n\n if (rest.length === 0) {\n // end recursion if there is no leftover\n return [splittedLine];\n }\n\n return [splittedLine, ...getSplittedLines(rest, calcValues)];\n};\n\n/**\n * If using dynamic font size, iteratively increment or decrement the\n * font size to fit the containing box.\n * Calculating space usage involves splitting lines where they exceed\n * the box width based on the proposed size.\n */\nexport const calculateDynamicFontSize = ({\n textSchema,\n fontKitFont,\n value,\n startingFontSize,\n}: {\n textSchema: TextSchema;\n fontKitFont: FontKitFont;\n value: string;\n startingFontSize?: number | undefined;\n}) => {\n const {\n fontSize: schemaFontSize,\n dynamicFontSize: dynamicFontSizeSetting,\n characterSpacing: schemaCharacterSpacing,\n width: boxWidth,\n height: boxHeight,\n lineHeight = DEFAULT_LINE_HEIGHT,\n } = textSchema;\n const fontSize = startingFontSize || schemaFontSize || DEFAULT_FONT_SIZE;\n if (!dynamicFontSizeSetting) return fontSize;\n if (dynamicFontSizeSetting.max < dynamicFontSizeSetting.min) return fontSize;\n\n const characterSpacing = schemaCharacterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const paragraphs = value.split('\\n');\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 const dynamicFontFit = dynamicFontSizeSetting.fit ?? DEFAULT_DYNAMIC_FIT;\n\n const calculateConstraints = (size: number) => {\n let totalWidthInMm = 0;\n let totalHeightInMm = 0;\n\n const boxWidthInPt = mm2pt(boxWidth);\n const firstLineTextHeight = heightOfFontAtSize(fontKitFont, size);\n const firstLineHeightInMm = pt2mm(firstLineTextHeight * lineHeight);\n const otherRowHeightInMm = pt2mm(size * lineHeight);\n\n paragraphs.forEach((paragraph, paraIndex) => {\n const lines = getSplittedLinesBySegmenter(paragraph, {\n font: fontKitFont,\n fontSize: size,\n characterSpacing,\n boxWidthInPt,\n });\n\n lines.forEach((line, lineIndex) => {\n if (dynamicFontFit === DYNAMIC_FIT_VERTICAL) {\n // For vertical fit we want to consider the width of text lines where we detect a split\n const textWidth = widthOfTextAtSize(\n line.replace('\\n', ''),\n fontKitFont,\n size,\n characterSpacing,\n );\n const textWidthInMm = pt2mm(textWidth);\n totalWidthInMm = Math.max(totalWidthInMm, textWidthInMm);\n }\n\n if (paraIndex + lineIndex === 0) {\n totalHeightInMm += firstLineHeightInMm;\n } else {\n totalHeightInMm += otherRowHeightInMm;\n }\n });\n if (dynamicFontFit === DYNAMIC_FIT_HORIZONTAL) {\n // For horizontal fit we want to consider the line's width 'unsplit'\n const textWidth = widthOfTextAtSize(paragraph, fontKitFont, size, characterSpacing);\n const textWidthInMm = pt2mm(textWidth);\n totalWidthInMm = Math.max(totalWidthInMm, textWidthInMm);\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 // Attempt to increase the font size up to desired fit\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 // Attempt to decrease the font size down to desired fit\n while (shouldFontShrinkToFit(totalWidthInMm, totalHeightInMm)) {\n dynamicFontSize -= FONT_SIZE_ADJUSTMENT;\n ({ totalWidthInMm, totalHeightInMm } = calculateConstraints(dynamicFontSize));\n }\n\n return dynamicFontSize;\n};\n\nexport const splitTextToSize = (arg: {\n value: string;\n characterSpacing: number;\n boxWidthInPt: number;\n fontSize: number;\n fontKitFont: fontkit.Font;\n}) => {\n const { value, characterSpacing, fontSize, fontKitFont, boxWidthInPt } = arg;\n const fontWidthCalcValues: FontWidthCalcValues = {\n font: fontKitFont,\n fontSize,\n characterSpacing,\n boxWidthInPt,\n };\n let lines: string[] = [];\n value.split(/\\r\\n|\\r|\\n|\\f|\\v/g).forEach((line: string) => {\n lines = lines.concat(getSplittedLinesBySegmenter(line, fontWidthCalcValues));\n });\n return lines;\n};\nexport const isFirefox = () => navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nlet wordSegmenter: Intl.Segmenter | undefined;\n\nconst getWordSegmenter = () => {\n wordSegmenter ??= new Intl.Segmenter(undefined, { granularity: 'word' });\n return wordSegmenter;\n};\n\nconst getSplittedLinesBySegmenter = (line: string, calcValues: FontWidthCalcValues): string[] => {\n // nothing to process but need to keep this for new lines.\n if (line.trim() === '') {\n return [''];\n }\n\n const { font, fontSize, characterSpacing, boxWidthInPt } = calcValues;\n const segmenter = getWordSegmenter();\n const iterator = segmenter.segment(line.trimEnd())[Symbol.iterator]();\n\n let lines: string[] = [];\n let lineCounter: number = 0;\n let currentTextSize: number = 0;\n\n while (true) {\n const chunk = iterator.next();\n if (chunk.done) break;\n const segment = chunk.value.segment;\n const textWidth = widthOfTextAtSize(segment, font, fontSize, characterSpacing);\n if (currentTextSize + textWidth <= boxWidthInPt) {\n // the size of boxWidth is large enough to add the segment\n if (lines[lineCounter]) {\n lines[lineCounter] += segment;\n currentTextSize += textWidth + characterSpacing;\n } else {\n lines[lineCounter] = segment;\n currentTextSize = textWidth + characterSpacing;\n }\n } else if (segment.trim() === '') {\n // a segment can be consist of multiple spaces like ' '\n // if they overflow the box, treat them as a line break and move to the next line\n lines[++lineCounter] = '';\n currentTextSize = 0;\n } else if (textWidth <= boxWidthInPt) {\n // the segment is small enough to be added to the next line\n lines[++lineCounter] = segment;\n currentTextSize = textWidth + characterSpacing;\n } else {\n // the segment is too large to fit in the boxWidth, we wrap the segment\n for (const char of segment) {\n const size = widthOfTextAtSize(char, font, fontSize, characterSpacing);\n if (currentTextSize + size <= boxWidthInPt) {\n if (lines[lineCounter]) {\n lines[lineCounter] += char;\n currentTextSize += size + characterSpacing;\n } else {\n lines[lineCounter] = char;\n currentTextSize = size + characterSpacing;\n }\n } else {\n lines[++lineCounter] = char;\n currentTextSize = size + characterSpacing;\n }\n }\n }\n }\n\n if (lines.some(containsJapanese)) {\n return adjustEndOfLine(filterEndJP(filterStartJP(lines)));\n } else {\n return adjustEndOfLine(lines);\n }\n};\n\n// add a newline if the line is the end of the paragraph\nconst adjustEndOfLine = (lines: string[]): string[] => {\n return lines.map((line, index) => {\n if (index === lines.length - 1) {\n return line.trimEnd() + '\\n';\n } else {\n return line.trimEnd();\n }\n });\n};\n\nfunction containsJapanese(text: string): boolean {\n return /[\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Han}]/u.test(text);\n}\n//\n// 日本語禁則処理\n//\n// https://www.morisawa.co.jp/blogs/MVP/8760\n//\n// 行頭禁則\nexport const filterStartJP = (lines: string[]): string[] => {\n const filtered: string[] = [];\n let charToAppend: string | null = null;\n\n lines\n .slice()\n .reverse()\n .forEach((line) => {\n if (line.trim().length === 0) {\n filtered.push('');\n } else {\n const charAtStart: string = line.charAt(0);\n if (LINE_START_FORBIDDEN_CHARS.includes(charAtStart)) {\n if (line.trim().length === 1) {\n filtered.push(line);\n charToAppend = null;\n } else {\n if (charToAppend) {\n filtered.push(line.slice(1) + charToAppend);\n } else {\n filtered.push(line.slice(1));\n }\n charToAppend = charAtStart;\n }\n } else {\n if (charToAppend) {\n filtered.push(line + charToAppend);\n charToAppend = null;\n } else {\n filtered.push(line);\n }\n }\n }\n });\n\n if (charToAppend) {\n // Handle the case where filtered might be empty\n const firstItem = filtered.length > 0 ? filtered[0] : '';\n // Ensure we're concatenating strings\n const combinedItem = String(charToAppend) + String(firstItem);\n return [combinedItem, ...filtered.slice(1)].reverse();\n } else {\n return filtered.reverse();\n }\n};\n\n// 行末禁則\nexport const filterEndJP = (lines: string[]): string[] => {\n const filtered: string[] = [];\n let charToPrepend: string | null = null;\n\n lines.forEach((line) => {\n if (line.trim().length === 0) {\n filtered.push('');\n } else {\n const chartAtEnd = line.slice(-1);\n\n if (LINE_END_FORBIDDEN_CHARS.includes(chartAtEnd)) {\n if (line.trim().length === 1) {\n filtered.push(line);\n charToPrepend = null;\n } else {\n if (charToPrepend) {\n filtered.push(charToPrepend + line.slice(0, -1));\n } else {\n filtered.push(line.slice(0, -1));\n }\n charToPrepend = chartAtEnd;\n }\n } else {\n if (charToPrepend) {\n filtered.push(charToPrepend + line);\n charToPrepend = null;\n } else {\n filtered.push(line);\n }\n }\n }\n });\n\n if (charToPrepend) {\n // Handle the case where filtered might be empty\n const lastItem = filtered.length > 0 ? filtered[filtered.length - 1] : '';\n // Ensure we're concatenating strings\n const combinedItem = String(lastItem) + String(charToPrepend);\n return [...filtered.slice(0, -1), combinedItem];\n } else {\n return filtered;\n }\n};\n"],"mappings":"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"}
|