boxpdf-html 1.0.0 → 1.1.0
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/{chunk-23KN7BKZ.js → chunk-PGLA67N2.js} +66 -5
- package/dist/chunk-PGLA67N2.js.map +1 -0
- package/dist/cli.cjs +65 -4
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +65 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-23KN7BKZ.js.map +0 -1
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "boxpdf-html",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Readable HTML-to-PDF translator built on boxpdf.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"url": "https://github.com/earonesty/boxpdf-html/issues"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"boxpdf": "^1.
|
|
45
|
+
"boxpdf": "^1.8.0",
|
|
46
46
|
"css-tree": "^3.1.0",
|
|
47
47
|
"parse5": "^8.0.0",
|
|
48
48
|
"pdf-lib": "^1.17.1"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/css.ts","../src/color.ts","../src/units.ts","../src/dom.ts","../src/render.ts","../src/style.ts","../src/font.ts","../src/index.ts"],"sourcesContent":["import { generate, parse as parseCss, walk } from \"css-tree\";\nimport { parseColor } from \"./color.js\";\nimport { parseLength, parseLengthPercentage, parseLineHeight, parseLineHeightScale, parsePercentage } from \"./units.js\";\nimport type { CssDeclaration, CssRule, CssStyle, Display, GridTrack, HtmlElementNode } from \"./types.js\";\nimport type { Border, EdgesInput } from \"boxpdf\";\n\ntype CssNode = { type: string; [key: string]: unknown };\nexport type DeclarationSet = { declarations: Partial<CssStyle>; importantDeclarations: Partial<CssStyle> };\nexport type UnsupportedCssSink = (declaration: CssDeclaration) => void;\n\nexport function parseStylesheets(stylesheets: string[]): CssRule[] {\n let order = 0;\n const rules: CssRule[] = [];\n for (const css of stylesheets) {\n const ast = parseCss(css, { parseValue: false, parseCustomProperty: false }) as CssNode;\n walk(ast, (node: CssNode) => {\n if (node.type !== \"Rule\") return;\n const prelude = node.prelude as CssNode | undefined;\n const block = node.block as CssNode | undefined;\n if (!prelude || !block) return;\n const declarations = rawDeclarationsFromBlock(block);\n for (const selector of selectorList(prelude)) {\n rules.push({\n selector,\n declarations: declarations.declarations.map((declaration) => ({ ...declaration, selector })),\n importantDeclarations: declarations.importantDeclarations.map((declaration) => ({ ...declaration, selector })),\n specificity: specificity(selector),\n order: order++\n });\n }\n });\n }\n return rules;\n}\n\nexport function parseStyleAttribute(\n value: string | undefined,\n fontSize: number,\n customProperties: Record<string, string> = {},\n unsupportedCss?: UnsupportedCssSink\n): DeclarationSet {\n const declarations: DeclarationSet = { declarations: {}, importantDeclarations: {} };\n if (!value) return declarations;\n const raw = rawDeclarationsFromStyleAttribute(value);\n const vars = mergeCustomProperties(customProperties, raw.declarations, raw.importantDeclarations);\n parseDeclarationsInto(declarations.declarations, raw.declarations, fontSize, vars, unsupportedCss);\n parseDeclarationsInto(declarations.importantDeclarations, raw.importantDeclarations, fontSize, vars, unsupportedCss);\n return declarations;\n}\n\nexport function ruleDeclarationsFor(\n node: HtmlElementNode,\n rules: CssRule[],\n fontSize: number,\n customProperties: Record<string, string> = {},\n unsupportedCss?: UnsupportedCssSink\n): DeclarationSet {\n const out: DeclarationSet = { declarations: {}, importantDeclarations: {} };\n const declarations: CssDeclaration[] = [];\n const importantDeclarations: CssDeclaration[] = [];\n for (const rule of rules.filter((r) => matchesSelector(node, r.selector)).sort(compareRule)) {\n declarations.push(...rule.declarations);\n importantDeclarations.push(...rule.importantDeclarations);\n }\n const vars = mergeCustomProperties(customProperties, declarations, importantDeclarations);\n parseDeclarationsInto(out.declarations, declarations, fontSize, vars, unsupportedCss);\n parseDeclarationsInto(out.importantDeclarations, importantDeclarations, fontSize, vars, unsupportedCss);\n return out;\n}\n\nfunction mergeDeclarations(target: Partial<CssStyle>, source: Partial<CssStyle>): void {\n const borderSides = target.borderSides;\n Object.assign(target, source);\n if (source.borderSides) {\n target.borderSides = { ...borderSides, ...source.borderSides };\n }\n}\n\nfunction rawDeclarationsFromBlock(block: CssNode): { declarations: CssDeclaration[]; importantDeclarations: CssDeclaration[] } {\n const out: { declarations: CssDeclaration[]; importantDeclarations: CssDeclaration[] } = { declarations: [], importantDeclarations: [] };\n const children = block.children as { forEach: (fn: (node: CssNode) => void) => void } | undefined;\n children?.forEach((node) => {\n if (node.type !== \"Declaration\") return;\n const target = node.important ? out.importantDeclarations : out.declarations;\n target.push({ property: String(node.property), value: generate(node.value) });\n });\n return out;\n}\n\nfunction rawDeclarationsFromStyleAttribute(value: string): { declarations: CssDeclaration[]; importantDeclarations: CssDeclaration[] } {\n const out: { declarations: CssDeclaration[]; importantDeclarations: CssDeclaration[] } = { declarations: [], importantDeclarations: [] };\n for (const chunk of value.split(\";\")) {\n const colon = chunk.indexOf(\":\");\n if (colon === -1) continue;\n const parsed = stripImportant(chunk.slice(colon + 1).trim());\n const target = parsed.important ? out.importantDeclarations : out.declarations;\n target.push({ property: chunk.slice(0, colon).trim(), value: parsed.value });\n }\n return out;\n}\n\nfunction parseDeclarationsInto(\n out: Partial<CssStyle>,\n declarations: CssDeclaration[],\n fontSize: number,\n customProperties: Record<string, string>,\n unsupportedCss?: UnsupportedCssSink\n): void {\n const vars = customPropertiesFrom(declarations, customProperties);\n for (const declaration of declarations) {\n const property = declaration.property.trim();\n if (property.startsWith(\"--\")) continue;\n if (!isSupportedCssProperty(property)) {\n if (shouldReportUnsupportedCss(declaration)) unsupportedCss?.(declaration);\n continue;\n }\n applyDeclaration(out, property, resolveVars(declaration.value, vars), fontSize);\n }\n if (Object.keys(vars).length > 0) out.customProperties = vars;\n}\n\nfunction shouldReportUnsupportedCss(declaration: CssDeclaration): boolean {\n return declaration.selector === undefined || declaration.selector.includes(\".\");\n}\n\nconst supportedCssProperties = new Set([\n \"display\", \"float\", \"order\", \"flex-direction\", \"align-items\", \"justify-content\",\n \"color\", \"background\", \"background-color\", \"background-image\", \"background-size\", \"background-repeat\", \"background-position\",\n \"object-fit\", \"overflow\", \"overflow-x\", \"overflow-y\",\n \"font-size\", \"font\", \"font-family\", \"font-weight\", \"font-style\", \"line-height\",\n \"white-space\", \"text-align\", \"text-decoration\", \"text-decoration-line\", \"text-transform\", \"text-indent\", \"vertical-align\",\n \"box-sizing\", \"position\", \"top\", \"right\", \"bottom\", \"left\", \"inset\", \"inset-block\", \"inset-inline\", \"inset-block-start\", \"inset-block-end\", \"inset-inline-start\", \"inset-inline-end\",\n \"z-index\", \"list-style\", \"list-style-type\",\n \"width\", \"min-width\", \"max-width\", \"height\", \"aspect-ratio\",\n \"margin\", \"margin-block\", \"margin-inline\", \"margin-block-start\", \"margin-block-end\", \"margin-inline-start\", \"margin-inline-end\", \"margin-top\", \"margin-right\", \"margin-bottom\", \"margin-left\",\n \"padding\", \"padding-block\", \"padding-inline\", \"padding-block-start\", \"padding-block-end\", \"padding-inline-start\", \"padding-inline-end\", \"padding-top\", \"padding-right\", \"padding-bottom\", \"padding-left\",\n \"gap\", \"column-gap\", \"grid-column-gap\", \"row-gap\", \"grid-row-gap\",\n \"grid-template-columns\", \"grid-column\", \"grid-column-start\", \"grid-column-end\",\n \"border\", \"border-top\", \"border-right\", \"border-bottom\", \"border-left\", \"border-block\", \"border-inline\", \"border-block-start\", \"border-block-end\", \"border-inline-start\", \"border-inline-end\",\n \"border-style\", \"border-top-style\", \"border-right-style\", \"border-bottom-style\", \"border-left-style\", \"border-block-start-style\", \"border-block-end-style\", \"border-inline-start-style\", \"border-inline-end-style\",\n \"border-width\", \"border-top-width\", \"border-right-width\", \"border-bottom-width\", \"border-left-width\", \"border-block-start-width\", \"border-block-end-width\", \"border-inline-start-width\", \"border-inline-end-width\",\n \"border-color\", \"border-top-color\", \"border-right-color\", \"border-bottom-color\", \"border-left-color\", \"border-block-start-color\", \"border-block-end-color\", \"border-inline-start-color\", \"border-inline-end-color\",\n \"border-radius\", \"border-collapse\"\n]);\n\nfunction isSupportedCssProperty(property: string): boolean {\n return supportedCssProperties.has(property.trim().toLowerCase());\n}\n\nfunction mergeCustomProperties(\n inherited: Record<string, string>,\n declarations: CssDeclaration[],\n importantDeclarations: CssDeclaration[]\n): Record<string, string> {\n return customPropertiesFrom(importantDeclarations, customPropertiesFrom(declarations, inherited));\n}\n\nfunction customPropertiesFrom(declarations: CssDeclaration[], inherited: Record<string, string>): Record<string, string> {\n let out = inherited;\n for (const declaration of declarations) {\n const property = declaration.property.trim();\n if (!property.startsWith(\"--\")) continue;\n if (out === inherited) out = { ...inherited };\n out[property] = declaration.value.trim();\n }\n return out;\n}\n\nfunction resolveVars(value: string, customProperties: Record<string, string>, seen = new Set<string>()): string {\n let out = \"\";\n let index = 0;\n while (index < value.length) {\n const start = value.indexOf(\"var(\", index);\n if (start === -1) {\n out += value.slice(index);\n break;\n }\n out += value.slice(index, start);\n const end = closingParenIndex(value, start + 4);\n if (end === -1) {\n out += value.slice(start);\n break;\n }\n out += resolveVarFunction(value.slice(start + 4, end), customProperties, seen);\n index = end + 1;\n }\n return out;\n}\n\nfunction resolveVarFunction(args: string, customProperties: Record<string, string>, seen: Set<string>): string {\n const comma = topLevelCommaIndex(args);\n const name = (comma === -1 ? args : args.slice(0, comma)).trim();\n if (!/^--[A-Za-z0-9_-]+$/.test(name)) return \"\";\n const fallback = comma === -1 ? undefined : args.slice(comma + 1).trim();\n if (seen.has(name)) return fallback ? resolveVars(fallback, customProperties, seen) : \"\";\n const replacement = customProperties[name];\n if (replacement === undefined) return fallback ? resolveVars(fallback, customProperties, seen) : \"\";\n const nextSeen = new Set(seen);\n nextSeen.add(name);\n return resolveVars(replacement, customProperties, nextSeen);\n}\n\nfunction closingParenIndex(value: string, openIndex: number): number {\n let depth = 0;\n for (let index = openIndex; index < value.length; index += 1) {\n const char = value[index];\n if (char === \"(\") depth += 1;\n if (char === \")\") {\n if (depth === 0) return index;\n depth -= 1;\n }\n }\n return -1;\n}\n\nfunction topLevelCommaIndex(value: string): number {\n let depth = 0;\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index];\n if (char === \"(\") depth += 1;\n if (char === \")\") depth = Math.max(0, depth - 1);\n if (char === \",\" && depth === 0) return index;\n }\n return -1;\n}\n\nfunction stripImportant(value: string): { value: string; important: boolean } {\n if (!/!\\s*important\\s*$/i.test(value)) return { value, important: false };\n return { value: value.replace(/!\\s*important\\s*$/i, \"\").trim(), important: true };\n}\n\nfunction applyDeclaration(out: Partial<CssStyle>, property: string, rawValue: string, fontSize: number): void {\n const value = rawValue.trim().toLowerCase();\n switch (property.trim().toLowerCase()) {\n case \"display\":\n if (value === \"flow-root\" || value === \"list-item\") out.display = \"block\";\n else if ([\"block\", \"inline\", \"inline-block\", \"flex\", \"inline-flex\", \"grid\", \"inline-grid\", \"contents\", \"none\"].includes(value)) {\n out.display = value as Display;\n }\n break;\n case \"float\":\n if (value === \"none\" || value === \"left\" || value === \"right\") out.float = value;\n break;\n case \"order\": {\n const order = Number.parseInt(value, 10);\n if (Number.isFinite(order)) out.order = order;\n break;\n }\n case \"flex-direction\":\n if (value === \"row\" || value === \"row-reverse\" || value === \"column\" || value === \"column-reverse\") out.flexDirection = value;\n break;\n case \"align-items\":\n if (value === \"flex-start\") out.alignItems = \"start\";\n else if (value === \"flex-end\") out.alignItems = \"end\";\n else if ([\"start\", \"center\", \"end\", \"stretch\", \"baseline\"].includes(value)) {\n out.alignItems = value as CssStyle[\"alignItems\"];\n }\n break;\n case \"justify-content\":\n if (value === \"flex-start\") out.justifyContent = \"start\";\n else if (value === \"flex-end\") out.justifyContent = \"end\";\n else if (value === \"space-between\") out.justifyContent = \"between\";\n else if (value === \"space-around\") out.justifyContent = \"around\";\n else if (value === \"space-evenly\") out.justifyContent = \"evenly\";\n else if ([\"start\", \"center\", \"end\"].includes(value)) out.justifyContent = value as CssStyle[\"justifyContent\"];\n break;\n case \"color\":\n out.color = parseColor(value);\n break;\n case \"background\":\n parseBackground(out, rawValue);\n break;\n case \"background-color\":\n out.background = parseColor(value);\n break;\n case \"background-image\":\n out.backgroundImageUrl = parseBackgroundImageUrl(rawValue);\n break;\n case \"background-size\":\n if (value === \"auto\" || value === \"cover\" || value === \"contain\") out.backgroundSize = value;\n break;\n case \"background-repeat\":\n if (value === \"repeat\" || value === \"repeat-x\" || value === \"repeat-y\" || value === \"no-repeat\") out.backgroundRepeat = value;\n break;\n case \"background-position\":\n parseBackgroundPosition(out, value);\n break;\n case \"object-fit\":\n if (value === \"fill\" || value === \"contain\" || value === \"cover\") out.objectFit = value;\n break;\n case \"overflow\":\n case \"overflow-x\":\n case \"overflow-y\":\n if (value === \"hidden\" || value === \"clip\") out.overflow = \"hidden\";\n else if (value === \"visible\") out.overflow = \"visible\";\n break;\n case \"font-size\":\n out.fontSize = parseLength(value, fontSize) ?? out.fontSize;\n break;\n case \"font\":\n parseFontShorthand(out, rawValue, fontSize);\n break;\n case \"font-family\":\n out.fontFamily = parseFontFamily(rawValue);\n break;\n case \"font-weight\":\n out.fontWeight = parseFontWeight(value);\n break;\n case \"font-style\":\n out.fontStyle = value === \"italic\" ? \"italic\" : \"normal\";\n break;\n case \"line-height\":\n {\n const scale = parseLineHeightScale(value);\n if (scale !== undefined) {\n out.lineHeightScale = scale;\n out.lineHeight = undefined;\n } else {\n out.lineHeight = parseLineHeight(value, fontSize);\n out.lineHeightScale = undefined;\n }\n }\n break;\n case \"white-space\":\n if (value === \"normal\" || value === \"nowrap\" || value === \"pre\" || value === \"pre-wrap\" || value === \"pre-line\") {\n out.whiteSpace = value;\n }\n break;\n case \"text-align\":\n if (value === \"left\" || value === \"center\" || value === \"right\") out.textAlign = value;\n break;\n case \"text-decoration\":\n case \"text-decoration-line\":\n out.textDecorationLine = parseTextDecoration(value);\n break;\n case \"text-transform\":\n if (value === \"none\" || value === \"uppercase\" || value === \"lowercase\" || value === \"capitalize\") {\n out.textTransform = value;\n }\n break;\n case \"text-indent\":\n out.textIndent = parseLength(value, fontSize);\n break;\n case \"vertical-align\":\n if (value === \"middle\" || value === \"baseline\") out.verticalAlign = value;\n break;\n case \"box-sizing\":\n if (value === \"content-box\" || value === \"border-box\") out.boxSizing = value;\n break;\n case \"position\":\n if (value === \"relative\" || value === \"absolute\") out.position = value;\n break;\n case \"top\":\n case \"right\":\n case \"bottom\":\n case \"left\":\n out[property as \"top\" | \"right\" | \"bottom\" | \"left\"] = parseLength(value, fontSize);\n break;\n case \"inset\":\n applyInset(out, value, fontSize);\n break;\n case \"inset-block\":\n applyTwoValueInset(out, \"top\", \"bottom\", value, fontSize);\n break;\n case \"inset-inline\":\n applyTwoValueInset(out, \"left\", \"right\", value, fontSize);\n break;\n case \"inset-block-start\":\n out.top = parseLength(value, fontSize);\n break;\n case \"inset-block-end\":\n out.bottom = parseLength(value, fontSize);\n break;\n case \"inset-inline-start\":\n out.left = parseLength(value, fontSize);\n break;\n case \"inset-inline-end\":\n out.right = parseLength(value, fontSize);\n break;\n case \"z-index\": {\n const zIndex = Number.parseInt(value, 10);\n if (Number.isFinite(zIndex)) out.zIndex = zIndex;\n break;\n }\n case \"list-style\":\n case \"list-style-type\":\n if (value.includes(\"none\")) out.listStyleType = \"none\";\n else if (value.includes(\"decimal\")) out.listStyleType = \"decimal\";\n else if (value.includes(\"disc\")) out.listStyleType = \"disc\";\n break;\n case \"width\":\n setLengthPercentage(out, \"width\", value, fontSize);\n break;\n case \"min-width\":\n setLengthPercentage(out, \"minWidth\", value, fontSize);\n break;\n case \"max-width\":\n if (value === \"none\") {\n out.maxWidth = undefined;\n out.maxWidthPercent = undefined;\n out.maxWidthCalc = undefined;\n } else {\n setLengthPercentage(out, \"maxWidth\", value, fontSize);\n }\n break;\n case \"height\":\n out.height = parseLength(value, fontSize);\n break;\n case \"aspect-ratio\":\n out.aspectRatio = parseAspectRatio(value);\n break;\n case \"margin\":\n applyMargin(out, value, fontSize);\n break;\n case \"margin-block\":\n applyTwoValueEdges(out, \"margin\", \"top\", \"bottom\", value, fontSize);\n break;\n case \"margin-inline\":\n applyTwoValueMargin(out, \"left\", \"right\", value, fontSize);\n break;\n case \"margin-block-start\":\n out.margin = setEdge(out.margin, \"top\", parseLength(value, fontSize));\n break;\n case \"margin-block-end\":\n out.margin = setEdge(out.margin, \"bottom\", parseLength(value, fontSize));\n break;\n case \"margin-inline-start\":\n setMarginEdge(out, \"left\", value, fontSize);\n break;\n case \"margin-inline-end\":\n setMarginEdge(out, \"right\", value, fontSize);\n break;\n case \"margin-top\":\n case \"margin-right\":\n case \"margin-bottom\":\n case \"margin-left\":\n setMarginEdge(out, property.slice(\"margin-\".length) as \"top\" | \"right\" | \"bottom\" | \"left\", value, fontSize);\n break;\n case \"padding\":\n out.padding = parseEdges(value, fontSize);\n break;\n case \"padding-block\":\n applyTwoValueEdges(out, \"padding\", \"top\", \"bottom\", value, fontSize);\n break;\n case \"padding-inline\":\n applyTwoValueEdges(out, \"padding\", \"left\", \"right\", value, fontSize);\n break;\n case \"padding-block-start\":\n out.padding = setEdge(out.padding, \"top\", parseLength(value, fontSize));\n break;\n case \"padding-block-end\":\n out.padding = setEdge(out.padding, \"bottom\", parseLength(value, fontSize));\n break;\n case \"padding-inline-start\":\n out.padding = setEdge(out.padding, \"left\", parseLength(value, fontSize));\n break;\n case \"padding-inline-end\":\n out.padding = setEdge(out.padding, \"right\", parseLength(value, fontSize));\n break;\n case \"padding-top\":\n case \"padding-right\":\n case \"padding-bottom\":\n case \"padding-left\":\n out.padding = setEdge(out.padding, property.slice(\"padding-\".length), parseLength(value, fontSize));\n break;\n case \"gap\":\n out.gap = parseLength(value, fontSize);\n break;\n case \"column-gap\":\n case \"grid-column-gap\":\n out.columnGap = parseLength(value, fontSize);\n break;\n case \"row-gap\":\n case \"grid-row-gap\":\n out.rowGap = parseLength(value, fontSize);\n break;\n case \"grid-template-columns\":\n out.gridTemplateColumns = parseGridTemplateColumns(value, fontSize);\n break;\n case \"grid-column\":\n parseGridColumn(out, value);\n break;\n case \"grid-column-start\":\n parseGridColumnLine(out, \"gridColumnStart\", value);\n break;\n case \"grid-column-end\":\n parseGridColumnLine(out, \"gridColumnEnd\", value);\n break;\n case \"border\":\n parseBorder(out, value, fontSize);\n break;\n case \"border-style\":\n case \"border-top-style\":\n case \"border-right-style\":\n case \"border-bottom-style\":\n case \"border-left-style\":\n case \"border-block-start-style\":\n case \"border-block-end-style\":\n case \"border-inline-start-style\":\n case \"border-inline-end-style\":\n break;\n case \"border-top\":\n case \"border-right\":\n case \"border-bottom\":\n case \"border-left\":\n setBorderSide(out, property.slice(\"border-\".length), parseBorderValue(value, fontSize));\n break;\n case \"border-block\":\n setBorderSide(out, \"top\", parseBorderValue(value, fontSize));\n setBorderSide(out, \"bottom\", parseBorderValue(value, fontSize));\n break;\n case \"border-inline\":\n setBorderSide(out, \"left\", parseBorderValue(value, fontSize));\n setBorderSide(out, \"right\", parseBorderValue(value, fontSize));\n break;\n case \"border-block-start\":\n setBorderSide(out, \"top\", parseBorderValue(value, fontSize));\n break;\n case \"border-block-end\":\n setBorderSide(out, \"bottom\", parseBorderValue(value, fontSize));\n break;\n case \"border-inline-start\":\n setBorderSide(out, \"left\", parseBorderValue(value, fontSize));\n break;\n case \"border-inline-end\":\n setBorderSide(out, \"right\", parseBorderValue(value, fontSize));\n break;\n case \"border-width\":\n out.borderWidth = parseLength(value, fontSize);\n break;\n case \"border-top-width\":\n case \"border-right-width\":\n case \"border-bottom-width\":\n case \"border-left-width\":\n setBorderSide(out, borderSideFromProperty(property, \"-width\"), { width: parseLength(value, fontSize) });\n break;\n case \"border-block-start-width\":\n setBorderSide(out, \"top\", { width: parseLength(value, fontSize) });\n break;\n case \"border-block-end-width\":\n setBorderSide(out, \"bottom\", { width: parseLength(value, fontSize) });\n break;\n case \"border-inline-start-width\":\n setBorderSide(out, \"left\", { width: parseLength(value, fontSize) });\n break;\n case \"border-inline-end-width\":\n setBorderSide(out, \"right\", { width: parseLength(value, fontSize) });\n break;\n case \"border-color\":\n out.borderColor = parseColor(value);\n break;\n case \"border-top-color\":\n case \"border-right-color\":\n case \"border-bottom-color\":\n case \"border-left-color\":\n setBorderSide(out, borderSideFromProperty(property, \"-color\"), { color: parseColor(value) });\n break;\n case \"border-block-start-color\":\n setBorderSide(out, \"top\", { color: parseColor(value) });\n break;\n case \"border-block-end-color\":\n setBorderSide(out, \"bottom\", { color: parseColor(value) });\n break;\n case \"border-inline-start-color\":\n setBorderSide(out, \"left\", { color: parseColor(value) });\n break;\n case \"border-inline-end-color\":\n setBorderSide(out, \"right\", { color: parseColor(value) });\n break;\n case \"border-radius\":\n out.borderRadius = parseLength(value.split(/\\s+/)[0], fontSize);\n break;\n case \"border-collapse\":\n if (value === \"collapse\" || value === \"separate\") out.borderCollapse = value;\n break;\n }\n}\n\nfunction parseAspectRatio(value: string): number | undefined {\n const normalized = value.replace(/\\bauto\\b/g, \"\").trim();\n if (!normalized) return undefined;\n const slash = /^([0-9.]+)\\s*\\/\\s*([0-9.]+)$/.exec(normalized);\n if (slash) {\n const width = Number(slash[1]);\n const height = Number(slash[2]);\n return Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0 ? width / height : undefined;\n }\n const ratio = Number(normalized);\n return Number.isFinite(ratio) && ratio > 0 ? ratio : undefined;\n}\n\nfunction setLengthPercentage(out: Partial<CssStyle>, property: \"width\" | \"minWidth\" | \"maxWidth\", value: string, fontSize: number): void {\n const parsed = parseLengthPercentage(value, fontSize);\n const percentKey = `${property}Percent` as \"widthPercent\" | \"minWidthPercent\" | \"maxWidthPercent\";\n const calcKey = `${property}Calc` as \"widthCalc\" | \"minWidthCalc\" | \"maxWidthCalc\";\n out[property] = undefined;\n out[percentKey] = undefined;\n out[calcKey] = undefined;\n if (!parsed) return;\n if (parsed.percent !== 0 && parsed.length !== 0) out[calcKey] = parsed;\n else if (parsed.percent !== 0) out[percentKey] = parsed.percent;\n else out[property] = parsed.length;\n}\n\nfunction applyInset(out: Partial<CssStyle>, value: string, fontSize: number): void {\n const lengths = cssValueTokens(value).map((part) => parseLength(part, fontSize));\n if (lengths.some((length) => length === undefined)) return;\n const [top, right = top, bottom = top, left = right] = lengths as number[];\n out.top = top;\n out.right = right;\n out.bottom = bottom;\n out.left = left;\n}\n\nfunction applyTwoValueInset(\n out: Partial<CssStyle>,\n firstSide: \"top\" | \"right\" | \"bottom\" | \"left\",\n secondSide: \"top\" | \"right\" | \"bottom\" | \"left\",\n value: string,\n fontSize: number\n): void {\n const [firstRaw, secondRaw = firstRaw] = cssValueTokens(value);\n const first = parseLength(firstRaw, fontSize);\n const second = parseLength(secondRaw, fontSize);\n if (first !== undefined) out[firstSide] = first;\n if (second !== undefined) out[secondSide] = second;\n}\n\nfunction applyTwoValueEdges(\n out: Partial<CssStyle>,\n property: \"margin\" | \"padding\",\n firstSide: \"top\" | \"right\" | \"bottom\" | \"left\",\n secondSide: \"top\" | \"right\" | \"bottom\" | \"left\",\n value: string,\n fontSize: number\n): void {\n const [firstRaw, secondRaw = firstRaw] = cssValueTokens(value);\n out[property] = setEdge(out[property], firstSide, parseLength(firstRaw, fontSize));\n out[property] = setEdge(out[property], secondSide, parseLength(secondRaw, fontSize));\n}\n\nfunction applyMargin(out: Partial<CssStyle>, value: string, fontSize: number): void {\n const [topRaw, rightRaw = topRaw, bottomRaw = topRaw, leftRaw = rightRaw] = cssValueTokens(value);\n setMarginEdge(out, \"top\", topRaw, fontSize);\n setMarginEdge(out, \"right\", rightRaw, fontSize);\n setMarginEdge(out, \"bottom\", bottomRaw, fontSize);\n setMarginEdge(out, \"left\", leftRaw, fontSize);\n}\n\nfunction applyTwoValueMargin(\n out: Partial<CssStyle>,\n firstSide: \"top\" | \"right\" | \"bottom\" | \"left\",\n secondSide: \"top\" | \"right\" | \"bottom\" | \"left\",\n value: string,\n fontSize: number\n): void {\n const [firstRaw, secondRaw = firstRaw] = cssValueTokens(value);\n setMarginEdge(out, firstSide, firstRaw, fontSize);\n setMarginEdge(out, secondSide, secondRaw, fontSize);\n}\n\nfunction setMarginEdge(out: Partial<CssStyle>, side: \"top\" | \"right\" | \"bottom\" | \"left\", value: string | undefined, fontSize: number): void {\n if (value === undefined) return;\n if (value === \"auto\" && (side === \"left\" || side === \"right\")) {\n out.margin = setEdge(out.margin, side, 0);\n if (side === \"left\") out.marginAutoLeft = true;\n else out.marginAutoRight = true;\n return;\n }\n const parsed = parseLength(value, fontSize);\n out.margin = setEdge(out.margin, side, parsed);\n if (parsed !== undefined) {\n if (side === \"left\") out.marginAutoLeft = undefined;\n if (side === \"right\") out.marginAutoRight = undefined;\n }\n}\n\nfunction parseGridColumn(out: Partial<CssStyle>, value: string): void {\n const [startRaw, endRaw] = value.split(\"/\").map((part) => part.trim().toLowerCase());\n if (startRaw) parseGridColumnLine(out, \"gridColumnStart\", startRaw);\n if (endRaw) parseGridColumnLine(out, \"gridColumnEnd\", endRaw);\n else if (startRaw?.startsWith(\"span \")) parseGridColumnLine(out, \"gridColumnEnd\", startRaw);\n}\n\nfunction parseGridColumnLine(out: Partial<CssStyle>, property: \"gridColumnStart\" | \"gridColumnEnd\", value: string): void {\n const normalized = value.trim().toLowerCase();\n const span = /^span\\s+(\\d+)$/.exec(normalized);\n if (span) {\n const amount = Number(span[1]);\n if (Number.isInteger(amount) && amount > 0) out.gridColumnSpan = amount;\n return;\n }\n const line = Number.parseInt(normalized, 10);\n if (!Number.isInteger(line)) return;\n out[property] = line;\n}\n\nfunction parseGridTemplateColumns(value: string, fontSize: number): GridTrack[] | undefined {\n const expanded = expandGridRepeats(value);\n const tracks = gridTrackTokens(expanded).map((token): GridTrack | undefined => {\n if (token === \"auto\" || token === \"min-content\" || token === \"max-content\") return { kind: \"fr\", value: 1 };\n const fr = /^([0-9.]+)fr$/.exec(token);\n if (fr) {\n const amount = Number(fr[1]);\n return Number.isFinite(amount) && amount > 0 ? { kind: \"fr\", value: amount } : undefined;\n }\n const percent = parsePercentage(token);\n if (percent !== undefined) return { kind: \"percent\", value: percent };\n const minmax = /^minmax\\([^,]+,\\s*([^)]+)\\)$/.exec(token);\n if (minmax) return parseGridTemplateColumns(minmax[1]!, fontSize)?.[0];\n const length = parseLength(token, fontSize);\n return length === undefined ? undefined : { kind: \"length\", value: length };\n });\n if (tracks.length === 0 || tracks.some((track) => track === undefined)) return undefined;\n return tracks as GridTrack[];\n}\n\nfunction expandGridRepeats(value: string): string {\n let out = \"\";\n let index = 0;\n while (index < value.length) {\n const repeatStart = value.toLowerCase().indexOf(\"repeat(\", index);\n if (repeatStart === -1) {\n out += value.slice(index);\n break;\n }\n out += value.slice(index, repeatStart);\n const argsStart = repeatStart + \"repeat(\".length;\n const close = closingParenIndex(value, argsStart);\n if (close === -1) {\n out += value.slice(repeatStart);\n break;\n }\n const args = value.slice(argsStart, close);\n const comma = topLevelCommaIndex(args);\n const count = Number(comma === -1 ? NaN : args.slice(0, comma).trim());\n const repeated = comma === -1 ? \"\" : args.slice(comma + 1).trim();\n out += Number.isInteger(count) && count > 0 && count <= 24\n ? Array.from({ length: count }, () => repeated).join(\" \")\n : \"\";\n index = close + 1;\n }\n return out;\n}\n\nfunction gridTrackTokens(value: string): string[] {\n return cssValueTokens(value).map((token) => token.toLowerCase());\n}\n\nfunction cssValueTokens(value: string): string[] {\n return cssValueTokensPreservingCase(value).map((token) => token.toLowerCase());\n}\n\nfunction cssValueTokensPreservingCase(value: string): string[] {\n const tokens: string[] = [];\n let token = \"\";\n let depth = 0;\n for (const char of value.trim()) {\n if (char === \"(\") depth += 1;\n if (char === \")\") depth = Math.max(0, depth - 1);\n if (/\\s/.test(char) && depth === 0) {\n if (token) tokens.push(token);\n token = \"\";\n continue;\n }\n token += char;\n }\n if (token) tokens.push(token);\n return tokens;\n}\n\nfunction parseTextDecoration(value: string): CssStyle[\"textDecorationLine\"] | undefined {\n if (value === \"none\") return \"none\";\n if (value.includes(\"underline\")) return \"underline\";\n if (value.includes(\"line-through\")) return \"line-through\";\n return undefined;\n}\n\nfunction parseBackground(out: Partial<CssStyle>, value: string): void {\n out.background = parseBackgroundColor(value) ?? out.background;\n out.backgroundImageUrl = parseBackgroundImageUrl(value) ?? out.backgroundImageUrl;\n const lower = value.toLowerCase();\n if (/\\bcover\\b/.test(lower)) out.backgroundSize = \"cover\";\n else if (/\\bcontain\\b/.test(lower)) out.backgroundSize = \"contain\";\n if (/\\bno-repeat\\b/.test(lower)) out.backgroundRepeat = \"no-repeat\";\n else if (/\\brepeat-x\\b/.test(lower)) out.backgroundRepeat = \"repeat-x\";\n else if (/\\brepeat-y\\b/.test(lower)) out.backgroundRepeat = \"repeat-y\";\n else if (/\\brepeat\\b/.test(lower)) out.backgroundRepeat = \"repeat\";\n parseBackgroundPosition(out, lower.replace(/\\/\\s*(cover|contain|auto)\\b/g, \"\"));\n}\n\nfunction parseBackgroundColor(value: string): CssStyle[\"background\"] | undefined {\n const withoutUrls = value.replace(/url\\([^)]*\\)/gi, \" \");\n const tokens = withoutUrls.match(/#[0-9a-f]{3,8}\\b|rgba?\\([^)]*\\)|hsla?\\([^)]*\\)|[a-zA-Z]+/g) ?? [];\n for (const token of tokens) {\n const color = parseColor(token);\n if (color) return color;\n }\n return undefined;\n}\n\nfunction parseBackgroundImageUrl(value: string): string | undefined {\n const match = /url\\(\\s*(?:\"([^\"]+)\"|'([^']+)'|([^)]*?))\\s*\\)/i.exec(value);\n return match ? (match[1] ?? match[2] ?? match[3])?.trim() : undefined;\n}\n\nfunction parseBackgroundPosition(out: Partial<CssStyle>, value: string): void {\n const tokens = value\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean)\n .filter((token) => ![\"url\", \"repeat\", \"repeat-x\", \"repeat-y\", \"no-repeat\", \"cover\", \"contain\", \"auto\"].includes(token));\n const normalized = tokens.join(\" \");\n if (!normalized) return;\n if (/\\bleft\\b/.test(normalized)) out.backgroundPositionX = 0;\n else if (/\\bright\\b/.test(normalized)) out.backgroundPositionX = 1;\n else if (/\\bcenter\\b/.test(normalized)) out.backgroundPositionX = 0.5;\n const percentX = /(^|\\s)([0-9.]+)%/.exec(normalized);\n if (percentX) out.backgroundPositionX = Number(percentX[2]) / 100;\n if (/\\btop\\b/.test(normalized)) out.backgroundPositionY = 0;\n else if (/\\bbottom\\b/.test(normalized)) out.backgroundPositionY = 1;\n else if (/\\bcenter\\b/.test(normalized)) out.backgroundPositionY ??= 0.5;\n const percents = [...normalized.matchAll(/([0-9.]+)%/g)];\n if (percents[1]) out.backgroundPositionY = Number(percents[1][1]) / 100;\n}\n\nfunction parseFontFamily(value: string): string[] {\n return value\n .split(\",\")\n .map((family) => family.trim().replace(/^['\"]|['\"]$/g, \"\"))\n .filter(Boolean);\n}\n\nfunction parseFontShorthand(out: Partial<CssStyle>, value: string, inheritedFontSize: number): void {\n const tokens = cssValueTokensPreservingCase(value);\n const sizeIndex = tokens.findIndex((token) => {\n const [size] = token.split(\"/\");\n return isFontSizeToken(size) && parseLength(size, inheritedFontSize) !== undefined;\n });\n if (sizeIndex < 0) return;\n\n for (const token of tokens.slice(0, sizeIndex)) {\n const normalized = token.toLowerCase();\n if (normalized === \"italic\" || normalized === \"oblique\") out.fontStyle = \"italic\";\n else if (normalized === \"normal\") {\n out.fontStyle ??= \"normal\";\n out.fontWeight ??= \"normal\";\n } else if (normalized === \"bold\" || normalized === \"bolder\" || normalized === \"lighter\" || /^[1-9]00$/.test(normalized)) {\n out.fontWeight = parseFontWeight(normalized);\n }\n }\n\n const [sizePart, lineHeightPart] = tokens[sizeIndex]!.split(\"/\");\n const parsedSize = parseLength(sizePart, inheritedFontSize);\n if (parsedSize !== undefined) out.fontSize = parsedSize;\n if (lineHeightPart) out.lineHeight = parseLineHeight(lineHeightPart, parsedSize ?? inheritedFontSize);\n\n const family = tokens.slice(sizeIndex + 1).join(\" \");\n if (family.trim()) out.fontFamily = parseFontFamily(family);\n}\n\nfunction isFontSizeToken(value: string | undefined): boolean {\n return value !== undefined && /^-?(?:\\d+|\\d*\\.\\d+)(px|pt|em|rem|vw|vh)$/i.test(value.trim());\n}\n\nfunction parseFontWeight(value: string): CssStyle[\"fontWeight\"] {\n if (value === \"bold\" || value === \"bolder\") return \"bold\";\n if (value === \"normal\" || value === \"lighter\") return \"normal\";\n const numeric = Number(value);\n if (Number.isFinite(numeric)) return numeric;\n return \"normal\";\n}\n\nfunction parseEdges(value: string, fontSize: number): EdgesInput | undefined {\n const lengths = cssValueTokens(value).map((part) => parseLength(part, fontSize));\n if (lengths.some((length) => length === undefined)) return undefined;\n const [top, right = top, bottom = top, left = right] = lengths as number[];\n if (top === right && right === bottom && bottom === left) return top;\n return { top, right, bottom, left };\n}\n\nfunction setEdge(edges: EdgesInput | undefined, side: string, value: number | undefined): EdgesInput | undefined {\n if (value === undefined) return edges;\n const out = typeof edges === \"number\"\n ? { top: edges, right: edges, bottom: edges, left: edges }\n : { ...edges };\n if (side === \"top\" || side === \"right\" || side === \"bottom\" || side === \"left\") out[side] = value;\n return out;\n}\n\nfunction parseBorder(out: Partial<CssStyle>, value: string, fontSize: number): void {\n const parsed = parseBorderValue(value, fontSize);\n out.borderWidth ??= parsed.width;\n out.borderColor ??= parsed.color;\n}\n\nfunction parseBorderValue(value: string, fontSize: number): Partial<Border> {\n const out: Partial<Border> = {};\n if (/\\bnone\\b/.test(value)) out.width = 0;\n for (const token of cssValueTokens(value)) {\n out.width ??= parseLength(token, fontSize);\n out.color ??= parseColor(token);\n }\n return out;\n}\n\nfunction setBorderSide(out: Partial<CssStyle>, side: string, value: Partial<Border>): void {\n if (side !== \"top\" && side !== \"right\" && side !== \"bottom\" && side !== \"left\") return;\n const current = out.borderSides?.[side];\n const width = value.width ?? current?.width ?? out.borderWidth ?? 0.75;\n const color = value.color ?? current?.color ?? out.borderColor ?? { r: 0, g: 0, b: 0 };\n out.borderSides = { ...out.borderSides, [side]: { width, color } };\n}\n\nfunction borderSideFromProperty(property: string, suffix: string): string {\n return property.slice(\"border-\".length, -suffix.length);\n}\n\nfunction selectorList(prelude: CssNode): string[] {\n return generate(prelude)\n .split(\",\")\n .map((selector) => stripWhereSelectors(selector.trim()))\n .filter(Boolean);\n}\n\nfunction stripWhereSelectors(selector: string): string {\n let out = \"\";\n let index = 0;\n while (index < selector.length) {\n const start = selector.indexOf(\":where(\", index);\n if (start === -1) {\n out += selector.slice(index);\n break;\n }\n out += selector.slice(index, start);\n const argsStart = start + \":where(\".length;\n const close = closingParenIndex(selector, argsStart);\n if (close === -1) {\n out += selector.slice(start);\n break;\n }\n out += selector.slice(argsStart, close);\n index = close + 1;\n }\n return out;\n}\n\nfunction matchesSelector(node: HtmlElementNode, selector: string): boolean {\n const parts = selectorParts(selector);\n if (parts.length === 0) return false;\n const last = parts[parts.length - 1]!;\n if (!matchesCompound(node, last.selector)) return false;\n last.node = node;\n\n let cursor: HtmlElementNode | undefined = node.parent;\n for (let i = parts.length - 2; i >= 0; i -= 1) {\n const part = parts[i]!;\n const combinator = parts[i + 1]!.combinator;\n if (combinator === \">\") {\n if (!cursor || !matchesCompound(cursor, part.selector)) return false;\n cursor = cursor.parent;\n continue;\n }\n if (combinator === \"+\") {\n const previous = previousElement(parts[i + 1]!.node ?? node);\n if (!previous || !matchesCompound(previous, part.selector)) return false;\n cursor = previous.parent;\n parts[i]!.node = previous;\n continue;\n }\n if (combinator === \"~\") {\n let sibling = previousElement(parts[i + 1]!.node ?? node);\n while (sibling && !matchesCompound(sibling, part.selector)) sibling = previousElement(sibling);\n if (!sibling) return false;\n cursor = sibling.parent;\n parts[i]!.node = sibling;\n continue;\n }\n while (cursor && !matchesCompound(cursor, part.selector)) cursor = cursor.parent;\n if (!cursor) return false;\n parts[i]!.node = cursor;\n cursor = cursor.parent;\n }\n return true;\n}\n\nfunction selectorParts(selector: string): Array<{ selector: string; combinator: \" \" | \">\" | \"+\" | \"~\"; node?: HtmlElementNode }> {\n const parts: Array<{ selector: string; combinator: \" \" | \">\" | \"+\" | \"~\" }> = [];\n let buffer = \"\";\n let combinator: \" \" | \">\" | \"+\" | \"~\" = \" \";\n let depth = 0;\n let quote = \"\";\n\n const flush = (): void => {\n const trimmed = buffer.trim();\n if (trimmed) parts.push({ selector: trimmed, combinator });\n buffer = \"\";\n combinator = \" \";\n };\n\n for (let i = 0; i < selector.length; i += 1) {\n const char = selector[i]!;\n if (quote) {\n buffer += char;\n if (char === quote) quote = \"\";\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n buffer += char;\n continue;\n }\n if (char === \"[\" || char === \"(\") depth += 1;\n if (char === \"]\" || char === \")\") depth = Math.max(0, depth - 1);\n if (depth === 0 && (char === \">\" || char === \"+\" || char === \"~\")) {\n flush();\n combinator = char;\n continue;\n }\n if (depth === 0 && /\\s/.test(char)) {\n let next = i + 1;\n while (next < selector.length && /\\s/.test(selector[next]!)) next += 1;\n if (!buffer.trim() || selector[next] === \">\" || selector[next] === \"+\" || selector[next] === \"~\") {\n i = next - 1;\n continue;\n }\n flush();\n i = next - 1;\n continue;\n }\n buffer += char;\n }\n flush();\n return parts;\n}\n\nfunction matchesCompound(node: HtmlElementNode, selector: string): boolean {\n const stripped = stripSupportedPseudos(selector, node);\n if (stripped === undefined) return false;\n selector = stripped;\n if (selector === \"*\") return true;\n if (!matchesAttributes(node, stripSimpleSelectors(selector))) return false;\n const id = simpleSelectorValues(selector, \"#\")[0];\n if (id && node.attrs.id !== id) return false;\n const classes = simpleSelectorValues(selector, \".\");\n const nodeClasses = new Set((node.attrs.class ?? \"\").split(/\\s+/).filter(Boolean));\n if (classes.some((klass) => !nodeClasses.has(klass))) return false;\n const tag = stripSimpleSelectors(selector).replace(/\\[[^\\]]+\\]/g, \"\").trim();\n return tag.length === 0 || tag === \"*\" || tag.toLowerCase() === node.tag;\n}\n\nfunction specificity(selector: string): number {\n const ids = selectorParts(selector).reduce((sum, part) => sum + simpleSelectorValues(part.selector, \"#\").length, 0);\n const classes =\n selectorParts(selector).reduce((sum, part) => sum + simpleSelectorValues(part.selector, \".\").length, 0) +\n (selector.match(/\\[[^\\]]+\\]/g) ?? []).length +\n pseudoSelectors(selector).length;\n const tags = selectorParts(selector).filter((part) => /^[A-Za-z]/.test(part.selector.replace(/[#.:\\[].*$/, \"\"))).length;\n return ids * 100 + classes * 10 + tags;\n}\n\nfunction stripSupportedPseudos(selector: string, node: HtmlElementNode): string | undefined {\n let out = selector;\n const pseudos = pseudoSelectors(out).reverse();\n for (const match of pseudos) {\n const name = match.name;\n const arg = match.arg?.trim();\n if (name === \"first-child\") {\n if (elementIndex(node) !== 1) return undefined;\n } else if (name === \"not\") {\n if (arg === \":last-child\" && elementIndex(node) === elementSiblings(node).length) return undefined;\n else if (arg === \":first-child\" && elementIndex(node) === 1) return undefined;\n else if (arg !== \":last-child\" && arg !== \":first-child\") return undefined;\n } else if (name === \"root\") {\n if (node.parent !== undefined) return undefined;\n } else if (name === \"last-child\") {\n if (elementIndex(node) !== elementSiblings(node).length) return undefined;\n } else if (name === \"nth-child\") {\n if (!matchesNth(elementIndex(node), arg)) return undefined;\n } else if (name === \"first-of-type\") {\n if (typeIndex(node) !== 1) return undefined;\n } else if (name === \"last-of-type\") {\n if (typeIndex(node) !== typeSiblings(node).length) return undefined;\n } else if (name === \"nth-of-type\") {\n if (!matchesNth(typeIndex(node), arg)) return undefined;\n } else {\n return undefined;\n }\n out = out.slice(0, match.start) + out.slice(match.end);\n }\n return out;\n}\n\nfunction simpleSelectorValues(selector: string, prefix: \".\" | \"#\"): string[] {\n const values: string[] = [];\n for (let index = 0; index < selector.length; index += 1) {\n if (selector[index] !== prefix || isEscaped(selector, index)) continue;\n const read = readCssIdentifier(selector, index + 1);\n if (read.value) values.push(read.value);\n index = read.end - 1;\n }\n return values;\n}\n\nfunction stripSimpleSelectors(selector: string): string {\n let out = \"\";\n for (let index = 0; index < selector.length; index += 1) {\n const char = selector[index]!;\n if ((char === \".\" || char === \"#\") && !isEscaped(selector, index)) {\n index = readCssIdentifier(selector, index + 1).end - 1;\n continue;\n }\n out += char;\n }\n return out;\n}\n\nfunction readCssIdentifier(input: string, start: number): { value: string; end: number } {\n let value = \"\";\n let index = start;\n while (index < input.length) {\n const char = input[index]!;\n if (char === \"\\\\\") {\n const escaped = readCssEscape(input, index);\n value += escaped.value;\n index = escaped.end;\n continue;\n }\n if (char === \"[\") {\n const close = input.indexOf(\"]\", index + 1);\n if (close === -1) break;\n const body = input.slice(index + 1, close);\n if (body.includes(\"=\")) break;\n value += input.slice(index, close + 1);\n index = close + 1;\n continue;\n }\n if (/[\\s>+~.#(]/.test(char)) break;\n value += char;\n index += 1;\n }\n return { value, end: index };\n}\n\nfunction readCssEscape(input: string, start: number): { value: string; end: number } {\n let index = start + 1;\n const hex = /^[0-9a-fA-F]{1,6}/.exec(input.slice(index))?.[0];\n if (hex) {\n index += hex.length;\n if (/\\s/.test(input[index] ?? \"\")) index += 1;\n return { value: String.fromCodePoint(Number.parseInt(hex, 16)), end: index };\n }\n if (index >= input.length) return { value: \"\", end: index };\n return { value: input[index]!, end: index + 1 };\n}\n\nfunction isEscaped(input: string, index: number): boolean {\n let slashCount = 0;\n for (let cursor = index - 1; cursor >= 0 && input[cursor] === \"\\\\\"; cursor -= 1) slashCount += 1;\n return slashCount % 2 === 1;\n}\n\nfunction pseudoSelectors(selector: string): Array<{ name: string; arg?: string; start: number; end: number }> {\n const pseudos: Array<{ name: string; arg?: string; start: number; end: number }> = [];\n for (let index = 0; index < selector.length; index += 1) {\n if (selector[index] !== \":\" || isEscaped(selector, index)) continue;\n if (isInsideClassSelector(selector, index)) continue;\n if (selector[index + 1] === \":\") {\n const read = readCssIdentifier(selector, index + 2);\n if (read.value) pseudos.push({ name: `:${read.value}`, start: index, end: read.end });\n index = read.end - 1;\n continue;\n }\n const read = readCssIdentifier(selector, index + 1);\n if (!read.value) continue;\n let end = read.end;\n let arg: string | undefined;\n if (selector[end] === \"(\") {\n const close = closingParenIndex(selector, end + 1);\n if (close === -1) return pseudos;\n arg = selector.slice(end + 1, close);\n end = close + 1;\n }\n pseudos.push({ name: read.value, arg, start: index, end });\n index = end - 1;\n }\n return pseudos;\n}\n\nfunction isInsideClassSelector(selector: string, index: number): boolean {\n for (let cursor = index - 1; cursor >= 0; cursor -= 1) {\n const char = selector[cursor]!;\n if (isEscaped(selector, cursor)) continue;\n if (char === \".\") return true;\n if (/[\\s>+~#\\[]/.test(char)) return false;\n }\n return false;\n}\n\nfunction matchesAttributes(node: HtmlElementNode, selector: string): boolean {\n for (const match of selector.matchAll(/\\[([^\\]=~|^$*\\s]+)(?:\\s*([~|^$*]?=)\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\]\\s]+)))?\\]/g)) {\n const name = match[1]!;\n const op = match[2];\n const expected = match[3] ?? match[4] ?? match[5] ?? \"\";\n const actual = node.attrs[name];\n if (actual === undefined) return false;\n if (!op) continue;\n if (op === \"=\" && actual !== expected) return false;\n if (op === \"~=\" && !actual.split(/\\s+/).includes(expected)) return false;\n if (op === \"|=\" && actual !== expected && !actual.startsWith(`${expected}-`)) return false;\n if (op === \"^=\" && !actual.startsWith(expected)) return false;\n if (op === \"$=\" && !actual.endsWith(expected)) return false;\n if (op === \"*=\" && !actual.includes(expected)) return false;\n }\n return true;\n}\n\nfunction previousElement(node: HtmlElementNode): HtmlElementNode | undefined {\n const siblings = elementSiblings(node);\n return siblings[elementIndex(node) - 2];\n}\n\nfunction elementSiblings(node: HtmlElementNode): HtmlElementNode[] {\n return node.parent?.children.filter((child): child is HtmlElementNode => child.kind === \"element\") ?? [];\n}\n\nfunction typeSiblings(node: HtmlElementNode): HtmlElementNode[] {\n return elementSiblings(node).filter((sibling) => sibling.tag === node.tag);\n}\n\nfunction elementIndex(node: HtmlElementNode): number {\n return elementSiblings(node).indexOf(node) + 1;\n}\n\nfunction typeIndex(node: HtmlElementNode): number {\n return typeSiblings(node).indexOf(node) + 1;\n}\n\nfunction matchesNth(index: number, arg: string | undefined): boolean {\n if (!arg) return false;\n const normalized = arg.replace(/\\s+/g, \"\").toLowerCase();\n if (normalized === \"odd\") return index % 2 === 1;\n if (normalized === \"even\") return index % 2 === 0;\n const exact = Number(normalized);\n if (Number.isInteger(exact)) return index === exact;\n const match = /^([+-]?\\d*)n([+-]\\d+)?$/.exec(normalized);\n if (!match) return false;\n const aRaw = match[1]!;\n const a = aRaw === \"\" || aRaw === \"+\" ? 1 : aRaw === \"-\" ? -1 : Number(aRaw);\n const b = match[2] ? Number(match[2]) : 0;\n if (!Number.isFinite(a) || !Number.isFinite(b) || a === 0) return index === b;\n return (index - b) / a >= 0 && Number.isInteger((index - b) / a);\n}\n\nfunction compareRule(a: CssRule, b: CssRule): number {\n return a.specificity - b.specificity || a.order - b.order;\n}\n","import type { RGB } from \"boxpdf\";\n\nconst namedColors: Record<string, string> = {\n black: \"#000000\",\n white: \"#ffffff\",\n red: \"#ff0000\",\n green: \"#008000\",\n blue: \"#0000ff\",\n transparent: \"transparent\"\n};\n\nexport function parseColor(value: string | undefined): RGB | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n const resolved = namedColors[normalized] ?? normalized;\n if (resolved === \"transparent\") return undefined;\n const hex = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(resolved);\n if (hex) {\n const body = hex[1]!;\n const rgb = body.length === 4 ? body.slice(0, 3) : body.length === 8 ? body.slice(0, 6) : body;\n const full = rgb.length === 3 ? rgb.split(\"\").map((c) => c + c).join(\"\") : rgb;\n return {\n r: Number.parseInt(full.slice(0, 2), 16) / 255,\n g: Number.parseInt(full.slice(2, 4), 16) / 255,\n b: Number.parseInt(full.slice(4, 6), 16) / 255\n };\n }\n const rgb = parseRgbFunction(resolved);\n if (rgb) return rgb;\n const hsl = parseHslFunction(resolved);\n if (hsl) return hsl;\n const oklch = parseOklchFunction(resolved);\n if (oklch) return oklch;\n return undefined;\n}\n\nfunction parseRgbFunction(value: string): RGB | undefined {\n const match = /^rgba?\\(\\s*(.+)\\s*\\)$/.exec(value);\n if (!match) return undefined;\n const body = match[1]!.split(\"/\")[0]!.trim();\n const parts = body.includes(\",\") ? body.split(\",\") : body.split(/\\s+/);\n if (parts.length < 3) return undefined;\n const channels = parts.slice(0, 3).map((part) => parseRgbChannel(part.trim()));\n if (channels.some((channel) => channel === undefined)) return undefined;\n return {\n r: channels[0]!,\n g: channels[1]!,\n b: channels[2]!\n };\n}\n\nfunction parseRgbChannel(value: string): number | undefined {\n const percent = /^(-?[0-9.]+)%$/.exec(value);\n if (percent) {\n const amount = Number(percent[1]);\n return Number.isFinite(amount) ? clamp01(amount / 100) : undefined;\n }\n const amount = Number(value);\n return Number.isFinite(amount) ? clamp255(amount) : undefined;\n}\n\nfunction parseHslFunction(value: string): RGB | undefined {\n const match = /^hsla?\\(\\s*(.+)\\s*\\)$/.exec(value);\n if (!match) return undefined;\n const body = match[1]!.split(\"/\")[0]!.trim();\n const parts = body.includes(\",\") ? body.split(\",\") : body.split(/\\s+/);\n if (parts.length < 3) return undefined;\n const hue = parseHue(parts[0]!.trim());\n const saturation = parsePercentChannel(parts[1]!.trim());\n const lightness = parsePercentChannel(parts[2]!.trim());\n if (hue === undefined || saturation === undefined || lightness === undefined) return undefined;\n return hslToRgb(hue, saturation, lightness);\n}\n\nfunction parseHue(value: string): number | undefined {\n const match = /^(-?[0-9.]+)(deg|turn|rad)?$/.exec(value);\n if (!match) return undefined;\n const amount = Number(match[1]);\n if (!Number.isFinite(amount)) return undefined;\n const unit = match[2] ?? \"deg\";\n if (unit === \"turn\") return amount * 360;\n if (unit === \"rad\") return amount * (180 / Math.PI);\n return amount;\n}\n\nfunction parseOklchFunction(value: string): RGB | undefined {\n const match = /^oklch\\(\\s*(.+)\\s*\\)$/.exec(value);\n if (!match) return undefined;\n const body = match[1]!.split(\"/\")[0]!.trim();\n const parts = body.split(/\\s+/);\n if (parts.length < 3) return undefined;\n const lightness = parseOklchLightness(parts[0]!);\n const chroma = Number(parts[1]);\n const hue = parseHue(parts[2]!);\n if (lightness === undefined || !Number.isFinite(chroma) || hue === undefined) return undefined;\n return oklchToRgb(lightness, chroma, hue);\n}\n\nfunction parseOklchLightness(value: string): number | undefined {\n const percent = /^(-?[0-9.]+)%$/.exec(value);\n if (percent) {\n const amount = Number(percent[1]);\n return Number.isFinite(amount) ? clamp01(amount / 100) : undefined;\n }\n const amount = Number(value);\n return Number.isFinite(amount) ? clamp01(amount) : undefined;\n}\n\nfunction oklchToRgb(lightness: number, chroma: number, hue: number): RGB {\n const radians = (hue * Math.PI) / 180;\n const a = chroma * Math.cos(radians);\n const b = chroma * Math.sin(radians);\n const lPrime = lightness + 0.3963377774 * a + 0.2158037573 * b;\n const mPrime = lightness - 0.1055613458 * a - 0.0638541728 * b;\n const sPrime = lightness - 0.0894841775 * a - 1.291485548 * b;\n const l = lPrime ** 3;\n const m = mPrime ** 3;\n const s = sPrime ** 3;\n return {\n r: linearSrgbToRgb(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n g: linearSrgbToRgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n b: linearSrgbToRgb(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s)\n };\n}\n\nfunction linearSrgbToRgb(value: number): number {\n const converted = value <= 0.0031308 ? 12.92 * value : 1.055 * value ** (1 / 2.4) - 0.055;\n return clamp01(converted);\n}\n\nfunction parsePercentChannel(value: string): number | undefined {\n const match = /^(-?[0-9.]+)%$/.exec(value);\n if (!match) return undefined;\n const amount = Number(match[1]);\n return Number.isFinite(amount) ? clamp01(amount / 100) : undefined;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): RGB {\n const normalizedHue = ((((hue % 360) + 360) % 360) / 360);\n if (saturation === 0) return { r: lightness, g: lightness, b: lightness };\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n return {\n r: hueToRgb(p, q, normalizedHue + 1 / 3),\n g: hueToRgb(p, q, normalizedHue),\n b: hueToRgb(p, q, normalizedHue - 1 / 3)\n };\n}\n\nfunction hueToRgb(p: number, q: number, t: number): number {\n let value = t;\n if (value < 0) value += 1;\n if (value > 1) value -= 1;\n if (value < 1 / 6) return p + (q - p) * 6 * value;\n if (value < 1 / 2) return q;\n if (value < 2 / 3) return p + (q - p) * (2 / 3 - value) * 6;\n return p;\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction clamp255(value: number): number {\n return clamp01(value / 255);\n}\n","export interface LengthPercentage {\n length: number;\n percent: number;\n}\n\nconst ROOT_FONT_SIZE = 12;\nconst VIEWPORT_WIDTH = 612;\nconst VIEWPORT_HEIGHT = 792;\n\nexport function parseLength(value: string | undefined, fontSize: number): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"auto\" || normalized.endsWith(\"%\")) return undefined;\n if (isCalc(normalized)) {\n const parsed = parseLengthPercentage(normalized, fontSize);\n return parsed && parsed.percent === 0 ? parsed.length : undefined;\n }\n return parseSimpleLength(normalized, fontSize);\n}\n\nexport function parsePercentage(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n if (isCalc(normalized)) {\n const parsed = parseLengthPercentage(normalized, 12);\n return parsed && parsed.length === 0 ? parsed.percent : undefined;\n }\n const match = /^(-?[0-9.]+)%$/.exec(normalized);\n if (!match) return undefined;\n const amount = Number(match[1]);\n return Number.isFinite(amount) ? amount / 100 : undefined;\n}\n\nexport function parseLengthPercentage(value: string | undefined, fontSize: number): LengthPercentage | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n return parseCalcLengthPercentage(normalized, fontSize);\n}\n\nexport function parseLineHeight(value: string | undefined, fontSize: number): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"normal\") return undefined;\n const unitless = /^([0-9.]+)$/.exec(normalized);\n if (unitless) return Number(unitless[1]) * fontSize;\n if (isCalc(normalized)) {\n const number = parseCalcNumber(normalized);\n if (number !== undefined) return number * fontSize;\n }\n return parseLength(normalized, fontSize);\n}\n\nexport function parseLineHeightScale(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n const unitless = /^([0-9.]+)$/.exec(normalized);\n if (unitless) return Number(unitless[1]);\n if (!isCalc(normalized)) return undefined;\n return parseCalcNumber(normalized);\n}\n\nfunction isCalc(value: string): boolean {\n return /^calc\\(.+\\)$/.test(value);\n}\n\nfunction parseSimplePercentage(value: string): number | undefined {\n const match = /^(-?[0-9.]+)%$/.exec(value);\n if (!match) return undefined;\n const amount = Number(match[1]);\n return Number.isFinite(amount) ? amount / 100 : undefined;\n}\n\nfunction parseSimpleLength(value: string, fontSize: number): number | undefined {\n const match = /^(-?[0-9.]+)(px|pt|em|rem|vw|vh)?$/.exec(value);\n if (!match) return undefined;\n const amount = Number(match[1]);\n if (!Number.isFinite(amount)) return undefined;\n const unit = match[2] ?? \"px\";\n if (unit === \"pt\") return amount;\n if (unit === \"em\") return amount * fontSize;\n if (unit === \"rem\") return amount * ROOT_FONT_SIZE;\n if (unit === \"vw\") return (amount / 100) * VIEWPORT_WIDTH;\n if (unit === \"vh\") return (amount / 100) * VIEWPORT_HEIGHT;\n return amount * 0.75;\n}\n\nfunction parseCalcLengthPercentage(value: string, fontSize: number): LengthPercentage | undefined {\n const stripped = stripCalc(value.trim());\n const simplePercent = parseSimplePercentage(stripped);\n if (simplePercent !== undefined) return { length: 0, percent: simplePercent };\n const simpleLength = parseSimpleLength(stripped, fontSize);\n if (simpleLength !== undefined) return { length: simpleLength, percent: 0 };\n\n const sum = topLevelOperator(stripped, [\"+\", \"-\"]);\n if (sum) {\n const left = parseCalcLengthPercentage(stripped.slice(0, sum.index), fontSize);\n const right = parseCalcLengthPercentage(stripped.slice(sum.index + 1), fontSize);\n if (!left || !right) return undefined;\n const sign = sum.operator === \"-\" ? -1 : 1;\n return { length: left.length + sign * right.length, percent: left.percent + sign * right.percent };\n }\n\n const product = topLevelOperator(stripped, [\"*\", \"/\"]);\n if (product) {\n const leftRaw = stripped.slice(0, product.index);\n const rightRaw = stripped.slice(product.index + 1);\n const leftLength = parseCalcLengthPercentage(leftRaw, fontSize);\n const rightLength = parseCalcLengthPercentage(rightRaw, fontSize);\n const leftNumber = parseCalcNumber(leftRaw);\n const rightNumber = parseCalcNumber(rightRaw);\n if (product.operator === \"*\" && leftLength && rightNumber !== undefined) {\n return { length: leftLength.length * rightNumber, percent: leftLength.percent * rightNumber };\n }\n if (product.operator === \"*\" && rightLength && leftNumber !== undefined) {\n return { length: rightLength.length * leftNumber, percent: rightLength.percent * leftNumber };\n }\n if (product.operator === \"/\" && leftLength && rightNumber !== undefined && rightNumber !== 0) {\n return { length: leftLength.length / rightNumber, percent: leftLength.percent / rightNumber };\n }\n }\n return undefined;\n}\n\nfunction parseCalcNumber(value: string): number | undefined {\n const stripped = stripCalc(value.trim());\n const sum = topLevelOperator(stripped, [\"+\", \"-\"]);\n if (sum) {\n const left = parseCalcNumber(stripped.slice(0, sum.index));\n const right = parseCalcNumber(stripped.slice(sum.index + 1));\n if (left === undefined || right === undefined) return undefined;\n return sum.operator === \"-\" ? left - right : left + right;\n }\n const product = topLevelOperator(stripped, [\"*\", \"/\"]);\n if (product) {\n const left = parseCalcNumber(stripped.slice(0, product.index));\n const right = parseCalcNumber(stripped.slice(product.index + 1));\n if (left === undefined || right === undefined) return undefined;\n return product.operator === \"/\" ? (right === 0 ? undefined : left / right) : left * right;\n }\n const number = Number(stripped);\n return Number.isFinite(number) ? number : undefined;\n}\n\nfunction stripCalc(value: string): string {\n let out = value.trim();\n while (isCalc(out)) out = out.slice(5, -1).trim();\n return out;\n}\n\nfunction topLevelOperator(value: string, operators: string[]): { operator: string; index: number } | undefined {\n let depth = 0;\n for (let index = value.length - 1; index >= 0; index -= 1) {\n const char = value[index]!;\n if (char === \")\") depth += 1;\n else if (char === \"(\") depth = Math.max(0, depth - 1);\n else if (depth === 0 && operators.includes(char)) {\n const prev = value[index - 1];\n if ((char === \"+\" || char === \"-\") && (index === 0 || prev === undefined || /[+\\-*/(]/.test(prev))) continue;\n return { operator: char, index };\n }\n }\n return undefined;\n}\n","import { parseFragment, type DefaultTreeAdapterMap } from \"parse5\";\nimport type { HtmlElementNode, HtmlNode, ParsedHtml } from \"./types.js\";\n\ntype ParseNode = DefaultTreeAdapterMap[\"node\"];\ntype ParseElement = DefaultTreeAdapterMap[\"element\"];\ntype ParseText = DefaultTreeAdapterMap[\"textNode\"];\n\nexport function parseHtml(html: string): ParsedHtml {\n const fragment = parseFragment(html);\n const root: HtmlElementNode = {\n kind: \"element\",\n tag: \"body\",\n attrs: {},\n children: []\n };\n const stylesheets: string[] = [];\n root.children = fragment.childNodes.flatMap((child) => convertNode(child, root, stylesheets));\n return { root, stylesheets };\n}\n\nfunction convertNode(\n node: ParseNode,\n parent: HtmlElementNode,\n stylesheets: string[]\n): HtmlNode[] {\n if (isText(node)) {\n return [{ kind: \"text\", value: node.value, parent }];\n }\n if (!isElement(node)) return [];\n\n const tag = node.tagName.toLowerCase();\n const attrs = Object.fromEntries(node.attrs.map((attr) => [attr.name, attr.value]));\n const element: HtmlElementNode = { kind: \"element\", tag, attrs, children: [], parent };\n element.children = node.childNodes.flatMap((child) => convertNode(child, element, stylesheets));\n\n if (tag === \"style\") {\n const css = element.children\n .filter((child) => child.kind === \"text\")\n .map((child) => child.value)\n .join(\"\");\n if (css.trim()) stylesheets.push(css);\n return [];\n }\n if (tag === \"script\" || tag === \"noscript\" || tag === \"template\") return [];\n return [element];\n}\n\nfunction isText(node: ParseNode): node is ParseText {\n return node.nodeName === \"#text\";\n}\n\nfunction isElement(node: ParseNode): node is ParseElement {\n return \"tagName\" in node && Array.isArray(node.childNodes);\n}\n","import {\n type BackgroundImage,\n hline,\n hstack,\n image as boxImage,\n imageFit,\n inlineNode,\n measure,\n paragraph,\n type ParagraphFloat,\n run,\n table,\n text,\n vstack,\n type Node as BoxNode,\n type ParagraphItem,\n type TextRunStyle\n} from \"boxpdf\";\nimport type { GridTrack, HtmlToBoxpdfOptions, RenderResult, StyledElement, StyledNode, StyledText } from \"./types.js\";\nimport type { EdgesInput } from \"boxpdf\";\n\nexport function renderStyledTree(root: StyledElement, options: HtmlToBoxpdfOptions): RenderResult {\n const warnings: string[] = [];\n const nodes = root.children.flatMap((child) => renderNode(child, options, warnings));\n return { nodes, warnings };\n}\n\nfunction renderNode(node: StyledNode, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode[] {\n if (\"text\" in node) {\n const trimmed = node.text.trim();\n return trimmed ? [text(trimmed, textOptions(node, options))] : [];\n }\n if (node.style.display === \"none\") return [];\n if (node.style.display === \"contents\") return node.children.flatMap((child) => renderNode(child, options, warnings));\n if (node.node.tag === \"img\") {\n const rendered = renderImageForLayout(node, options, warnings);\n return rendered ? [rendered] : [];\n }\n if (node.node.tag === \"br\") return [text(\"\", textOptions({ style: node.style } as StyledText, options))];\n if (node.node.tag === \"hr\") return [hline({ color: node.style.borderColor ?? { r: 0, g: 0, b: 0 }, thickness: node.style.borderWidth ?? 1 })];\n if (node.node.tag === \"ul\" || node.node.tag === \"ol\") return [renderList(node, options, warnings)];\n if (node.node.tag === \"table\") return renderTable(node, options, warnings);\n if (node.style.display === \"grid\" || node.style.display === \"inline-grid\") return [renderGrid(node, options, warnings)];\n if (node.style.display === \"flex\" || node.style.display === \"inline-flex\") return [renderFlex(node, options, warnings)];\n if (isInlineContainer(node)) {\n return renderInlineGroup(node, options, warnings);\n }\n return [renderBlock(node, options, warnings)];\n}\n\nfunction renderBlock(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[], stretch = node.style.display === \"block\"): BoxNode {\n const children = renderBlockChildren(node, options, warnings);\n return vstack(\n {\n width: cssBoxWidth(node),\n height: cssBoxHeight(node),\n margin: node.style.margin,\n padding: layoutPadding(node),\n gap: node.style.gap ?? 0,\n background: node.style.background,\n backgroundImage: backgroundImage(node, options),\n border: border(node),\n borderSides: node.style.borderSides,\n borderRadius: node.style.borderRadius,\n overflow: node.style.overflow,\n position: node.style.position,\n top: node.style.top,\n right: node.style.right,\n bottom: node.style.bottom,\n left: node.style.left,\n zIndex: node.style.zIndex,\n align: stretch ? \"stretch\" : \"start\"\n },\n ...children\n );\n}\n\nfunction renderBlockChildren(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode[] {\n const out: BoxNode[] = [];\n let inlineBuffer: StyledNode[] = [];\n let floats: ParagraphFloat[] = [];\n\n const flushInline = (): void => {\n const runs = collectInlineRuns(inlineBuffer, options, warnings);\n if (runs.length > 0 || floats.length > 0) {\n out.push(paragraph({ width: contentWidth(node), align: node.style.textAlign, wrap: shouldWrap(node.style), floats, textIndent: node.style.textIndent }, ...runs));\n floats = [];\n }\n inlineBuffer = [];\n };\n\n for (const child of flattenDisplayContents(node.children)) {\n if (!(\"text\" in child) && child.style.float && child.style.float !== \"none\") {\n floats.push({ node: renderFloatNode(child, options, warnings), side: child.style.float });\n continue;\n }\n if (isInlineLike(child)) {\n inlineBuffer.push(child);\n continue;\n }\n if (inlineBuffer.some(hasInlineContent)) flushInline();\n else inlineBuffer = [];\n const rendered = renderNode(child, options, warnings);\n if (floats.length > 0) {\n const attached = attachFloatsToFirstParagraph(rendered, floats);\n if (attached.attached) {\n out.push(...attached.nodes);\n floats = [];\n continue;\n }\n flushInline();\n }\n out.push(...rendered);\n }\n flushInline();\n return out;\n}\n\nfunction hasInlineContent(node: StyledNode): boolean {\n if (\"text\" in node) return node.text.trim().length > 0;\n if (node.node.tag === \"br\") return true;\n return node.children.some(hasInlineContent);\n}\n\nfunction flattenDisplayContents(nodes: StyledNode[]): StyledNode[] {\n return nodes.flatMap((node) => {\n if (\"text\" in node || node.style.display !== \"contents\") return [node];\n return flattenDisplayContents(node.children);\n });\n}\n\nfunction renderFloatNode(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode {\n if (node.node.tag === \"table\") return renderTable(node, options, warnings)[0] ?? renderBlock(node, options, warnings);\n if (node.style.display === \"flex\" || node.style.display === \"inline-flex\") return renderFlex(node, options, warnings);\n if (node.style.display === \"grid\" || node.style.display === \"inline-grid\") return renderGrid(node, options, warnings);\n return renderBlock(node, options, warnings);\n}\n\nfunction attachFloatsToFirstParagraph(nodes: BoxNode[], floats: ParagraphFloat[]): { nodes: BoxNode[]; attached: boolean } {\n let attached = false;\n const next = nodes.map((node) => {\n if (attached) return node;\n const result = attachFloatsToNode(node, floats);\n attached = result.attached;\n return result.node;\n });\n return { nodes: next, attached };\n}\n\nfunction attachFloatsToNode(node: BoxNode, floats: ParagraphFloat[]): { node: BoxNode; attached: boolean } {\n if (node.kind === \"paragraph\") {\n return { node: { ...node, props: { ...node.props, floats: [...floats, ...(node.props.floats ?? [])] } }, attached: true };\n }\n if (node.kind !== \"vstack\" && node.kind !== \"hstack\") return { node, attached: false };\n let attached = false;\n const children = node.children.map((child) => {\n if (attached) return child;\n const result = attachFloatsToNode(child, floats);\n attached = result.attached;\n return result.node;\n });\n return attached ? { node: { ...node, children }, attached } : { node, attached };\n}\n\nfunction renderFlex(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode {\n const ordered = orderedChildren(node.children);\n const sourceChildren = node.style.flexDirection.endsWith(\"-reverse\") ? [...ordered].reverse() : ordered;\n const width = cssBoxWidth(node);\n const justifyWidth = contentWidth(node);\n const children = flexChildrenWithJustification(\n sourceChildren.flatMap((child) => renderFlexChild(child, options, warnings)).map(defaultFlexItem),\n node.style.justifyContent,\n node.style.flexDirection,\n justifyWidth,\n node.style.gap ?? 0\n );\n const style = {\n width,\n height: cssBoxHeight(node),\n margin: node.style.margin,\n padding: layoutPadding(node),\n gap: node.style.gap ?? 0,\n align: node.style.alignItems,\n justify: children.justify,\n background: node.style.background,\n backgroundImage: backgroundImage(node, options),\n border: border(node),\n borderSides: node.style.borderSides,\n borderRadius: node.style.borderRadius,\n overflow: node.style.overflow,\n position: node.style.position,\n top: node.style.top,\n right: node.style.right,\n bottom: node.style.bottom,\n left: node.style.left,\n zIndex: node.style.zIndex\n };\n return node.style.flexDirection.startsWith(\"row\") ? hstack(style, ...children.nodes) : vstack(style, ...children.nodes);\n}\n\nfunction flexChildrenWithJustification(\n children: BoxNode[],\n justify: StyledElement[\"style\"][\"justifyContent\"],\n direction: StyledElement[\"style\"][\"flexDirection\"],\n width: number | undefined,\n gap: number\n): { nodes: BoxNode[]; justify: StyledElement[\"style\"][\"justifyContent\"] } {\n if (!direction.startsWith(\"row\") || justify !== \"between\" || children.length < 2) return { nodes: children, justify };\n const available = width ?? Number.POSITIVE_INFINITY;\n if (!Number.isFinite(available)) return { nodes: children, justify };\n const measuredWidths = children.map((child) => measure(child, Number.POSITIVE_INFINITY).width);\n const childWidth = measuredWidths.reduce((sum, width) => sum + width, 0);\n const spacerWidth = Math.max(0, (available - childWidth - gap * (children.length - 1)) / (children.length - 1));\n const nodes = children.map((child, index) => setFlexItemWidth(child, measuredWidths[index]! + (index === children.length - 1 ? 0 : spacerWidth)));\n return { nodes, justify: \"start\" };\n}\n\nfunction setFlexItemWidth(node: BoxNode, width: number): BoxNode {\n if (node.kind === \"vstack\" || node.kind === \"hstack\") {\n return { ...node, style: { ...node.style, width, shrink: 0 } };\n }\n if (node.kind === \"text\") {\n return { ...node, props: { ...node.props, width, shrink: 0 } };\n }\n return node;\n}\n\nfunction renderFlexChild(node: StyledNode, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode[] {\n if (!(\"text\" in node) && node.node.tag === \"img\") {\n const rendered = renderImageForLayout(node, options, warnings);\n return rendered ? [rendered] : [];\n }\n if (!(\"text\" in node) && isInlineContainer(node)) return [renderBlock(node, options, warnings)];\n if (!(\"text\" in node) && node.style.display === \"block\") return [renderBlock(node, options, warnings, false)];\n return renderNode(node, options, warnings);\n}\n\nfunction renderGrid(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode {\n const gridGap = node.style.columnGap ?? node.style.gap ?? 0;\n const gridWidth =\n contentWidth(node) ??\n (node.style.display === \"inline-grid\"\n ? inlineGridIntrinsicWidth(node.children.filter(hasRenderedContent).flatMap((child) => renderNode(child, options, warnings)), node.style.gridTemplateColumns, gridGap, options.width)\n : options.width);\n const tracks = resolveGridTracks(node.style.gridTemplateColumns, gridWidth, gridGap);\n if (tracks.length === 0) return renderBlock(node, options, warnings);\n const rows = gridRows(node, tracks, options, warnings);\n return vstack(\n {\n width: cssBoxWidth(node),\n height: cssBoxHeight(node),\n margin: node.style.margin,\n padding: layoutPadding(node),\n gap: node.style.rowGap ?? node.style.gap ?? 0,\n background: node.style.background,\n backgroundImage: backgroundImage(node, options),\n border: border(node),\n borderSides: node.style.borderSides,\n borderRadius: node.style.borderRadius,\n overflow: node.style.overflow,\n position: node.style.position,\n top: node.style.top,\n right: node.style.right,\n bottom: node.style.bottom,\n left: node.style.left,\n zIndex: node.style.zIndex\n },\n ...rows\n );\n}\n\ninterface GridCell {\n column: number;\n span: number;\n node: BoxNode;\n}\n\nfunction gridRows(node: StyledElement, tracks: number[], options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode[] {\n const rows: GridCell[][] = [];\n let row: GridCell[] = [];\n let cursor = 0;\n const gap = node.style.columnGap ?? node.style.gap ?? 0;\n for (const child of orderedChildren(node.children).filter(hasRenderedContent)) {\n const rendered = renderNode(child, options, warnings);\n if (rendered.length === 0) continue;\n const requestedStart = !(\"text\" in child) ? child.style.gridColumnStart : undefined;\n let column = requestedStart !== undefined ? Math.max(0, requestedStart - 1) : cursor;\n let span = gridColumnSpan(child, tracks.length, column);\n if (column >= tracks.length) column = tracks.length - 1;\n span = Math.max(1, Math.min(span, tracks.length - column));\n if (column < cursor || column + span > tracks.length) {\n rows.push(row);\n row = [];\n cursor = 0;\n column = requestedStart !== undefined ? Math.max(0, Math.min(requestedStart - 1, tracks.length - 1)) : 0;\n span = Math.max(1, Math.min(gridColumnSpan(child, tracks.length, column), tracks.length - column));\n }\n row.push({ column, span, node: gridCellNode(rendered, gridSpanWidth(tracks, column, span, gap)) });\n cursor = column + span;\n if (cursor >= tracks.length) {\n rows.push(row);\n row = [];\n cursor = 0;\n }\n }\n if (row.length > 0) rows.push(row);\n return rows.map((cells) => renderGridRow(cells, tracks, gap, node.style.alignItems));\n}\n\nfunction gridColumnSpan(child: StyledNode, trackCount: number, column: number): number {\n if (\"text\" in child) return 1;\n if (child.style.gridColumnSpan !== undefined) return child.style.gridColumnSpan;\n if (child.style.gridColumnStart !== undefined && child.style.gridColumnEnd !== undefined) {\n return Math.max(1, child.style.gridColumnEnd - child.style.gridColumnStart);\n }\n return Math.max(1, Math.min(1, trackCount - column));\n}\n\nfunction gridSpanWidth(tracks: number[], column: number, span: number, gap: number): number {\n return tracks.slice(column, column + span).reduce((sum, width) => sum + width, 0) + gap * Math.max(0, span - 1);\n}\n\nfunction gridCellNode(nodes: BoxNode[], width: number): BoxNode {\n const node = nodes.length === 1 ? nodes[0]! : vstack({}, ...nodes);\n return constrainGridItem(node, width);\n}\n\nfunction renderGridRow(cells: GridCell[], tracks: number[], gap: number, align: StyledElement[\"style\"][\"alignItems\"]): BoxNode {\n const rowChildren: BoxNode[] = [];\n let cursor = 0;\n for (const cell of cells.sort((a, b) => a.column - b.column)) {\n while (cursor < cell.column) {\n rowChildren.push(vstack({ width: tracks[cursor] ?? 0 }));\n cursor += 1;\n }\n rowChildren.push(cell.node);\n cursor = cell.column + cell.span;\n }\n while (cursor < tracks.length) {\n rowChildren.push(vstack({ width: tracks[cursor] ?? 0 }));\n cursor += 1;\n }\n return hstack({ gap, align }, ...stretchGridRow(rowChildren, tracksForCells(cells, tracks, gap, rowChildren.length)));\n}\n\nfunction tracksForCells(cells: GridCell[], tracks: number[], gap: number, childCount: number): number[] {\n if (cells.every((cell) => cell.span === 1) && childCount === tracks.length) return tracks;\n const out: number[] = [];\n let cursor = 0;\n for (const cell of cells.sort((a, b) => a.column - b.column)) {\n while (cursor < cell.column) {\n out.push(tracks[cursor] ?? 0);\n cursor += 1;\n }\n out.push(gridSpanWidth(tracks, cell.column, cell.span, gap));\n cursor = cell.column + cell.span;\n }\n while (cursor < tracks.length) {\n out.push(tracks[cursor] ?? 0);\n cursor += 1;\n }\n return out;\n}\n\nfunction inlineGridIntrinsicWidth(children: BoxNode[], tracks: GridTrack[] | undefined, gap: number, parentWidth: number | undefined): number | undefined {\n if (!tracks || tracks.length === 0) {\n const widths = children.map((child) => measure(child, parentWidth ?? Number.POSITIVE_INFINITY).width);\n return widths.length === 0 ? undefined : Math.max(0, ...widths);\n }\n const widths = tracks.map((track, trackIndex) => {\n if (track.kind === \"length\") return track.value;\n return children\n .filter((_, childIndex) => childIndex % tracks.length === trackIndex)\n .reduce((max, child) => Math.max(max, measure(child, parentWidth ?? Number.POSITIVE_INFINITY).width), 0);\n });\n return widths.reduce((sum, width) => sum + width, 0) + gap * Math.max(0, widths.length - 1);\n}\n\nfunction hasRenderedContent(node: StyledNode): boolean {\n if (\"text\" in node) return node.text.trim().length > 0;\n return node.style.display !== \"none\";\n}\n\nfunction orderedChildren(nodes: StyledNode[]): StyledNode[] {\n return nodes\n .map((node, index) => ({ node, index }))\n .sort((a, b) => orderFor(a.node) - orderFor(b.node) || a.index - b.index)\n .map(({ node }) => node);\n}\n\nfunction orderFor(node: StyledNode): number {\n return \"text\" in node ? 0 : node.style.order ?? 0;\n}\n\nfunction resolveGridTracks(tracks: GridTrack[] | undefined, width: number | undefined, gap: number): number[] {\n if (!tracks || tracks.length === 0) {\n return width === undefined ? [] : [width];\n }\n const available = width === undefined ? undefined : Math.max(0, width - gap * Math.max(0, tracks.length - 1));\n const fixed = tracks.reduce((sum, track) => {\n if (track.kind === \"length\") return sum + track.value;\n if (track.kind === \"percent\" && available !== undefined) return sum + available * track.value;\n return sum;\n }, 0);\n const fr = tracks.reduce((sum, track) => sum + (track.kind === \"fr\" ? track.value : 0), 0);\n const frUnit = available === undefined || fr === 0 ? 0 : Math.max(0, available - fixed) / fr;\n return tracks.map((track) => {\n if (track.kind === \"length\") return track.value;\n if (track.kind === \"percent\" && available !== undefined) return available * track.value;\n return frUnit * track.value;\n });\n}\n\nfunction constrainGridItem(node: BoxNode, width: number): BoxNode {\n if (node.kind === \"vstack\" || node.kind === \"hstack\") {\n return constrainBlockDescendants({ ...node, style: { ...node.style, width: node.style.width ?? width, shrink: node.style.shrink ?? 1 } }, width);\n }\n if (node.kind === \"paragraph\") {\n return { ...node, props: { ...node.props, width: node.props.width ?? width } };\n }\n if (node.kind === \"text\") {\n return { ...node, props: { ...node.props, width: node.props.width ?? width, shrink: node.props.shrink ?? 1 } };\n }\n return vstack({ width, shrink: 1 }, node);\n}\n\nfunction constrainBlockDescendants<T extends Extract<BoxNode, { kind: \"vstack\" | \"hstack\" }>>(node: T, width: number): T {\n const innerWidth = boxNodeContentWidth(node, width);\n const children = node.children.map((child) => constrainFlowChild(child, innerWidth));\n return { ...node, children };\n}\n\nfunction constrainFlowChild(child: BoxNode, width: number): BoxNode {\n if (child.kind === \"paragraph\") {\n return { ...child, props: { ...child.props, width: child.props.width === undefined ? width : Math.min(child.props.width, width) } };\n }\n if (child.kind === \"text\") {\n return { ...child, props: { ...child.props, width: child.props.width === undefined ? width : Math.min(child.props.width, width) } };\n }\n if (child.kind === \"vstack\" || child.kind === \"hstack\") {\n const nextWidth = child.style.width === undefined ? width : Math.min(child.style.width, width);\n return constrainBlockDescendants({ ...child, style: { ...child.style, width: nextWidth } }, nextWidth);\n }\n return child;\n}\n\nfunction boxNodeContentWidth(node: Extract<BoxNode, { kind: \"vstack\" | \"hstack\" }>, width: number): number {\n const padding = edges(node.style.padding);\n const borderWidth = node.style.border?.width ?? 0;\n const leftBorder = node.style.borderSides?.left?.width ?? borderWidth;\n const rightBorder = node.style.borderSides?.right?.width ?? borderWidth;\n return Math.max(0, width - padding.left - padding.right - leftBorder - rightBorder);\n}\n\nfunction stretchGridRow(nodes: BoxNode[], tracks: number[]): BoxNode[] {\n const heights = nodes.map((node, index) => measure(node, tracks[index] ?? tracks[tracks.length - 1] ?? Number.POSITIVE_INFINITY).height);\n const rowHeight = Math.max(0, ...heights);\n return nodes.map((node, index) => {\n if (node.kind === \"vstack\" || node.kind === \"hstack\") {\n return { ...node, style: { ...node.style, height: node.style.height ?? rowHeight } };\n }\n return vstack({ width: tracks[index], height: rowHeight }, node);\n });\n}\n\nfunction defaultFlexItem(node: BoxNode): BoxNode {\n if (node.kind === \"vstack\" || node.kind === \"hstack\") {\n return { ...node, style: { ...node.style, shrink: node.style.shrink ?? 1 } };\n }\n if (node.kind === \"text\") {\n return { ...node, props: { ...node.props, shrink: node.props.shrink ?? 1 } };\n }\n return node;\n}\n\nfunction renderInlineGroup(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode[] {\n const runs = collectInlineRuns([node], options, warnings);\n if (runs.length === 0) return [];\n return [paragraph({ width: contentWidth(node), align: node.style.textAlign, wrap: shouldWrap(node.style) }, ...runs)];\n}\n\nfunction renderList(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode {\n const items = node.children.filter((child): child is StyledElement => !(\"text\" in child) && child.node.tag === \"li\");\n const listPadding = edges(node.style.padding);\n const markerWidth = Math.max(node.style.fontSize * 1.5, listPadding.left * 0.65);\n const leftPadding = node.style.listStyleType === \"none\" ? listPadding.left : Math.max(0, listPadding.left - markerWidth);\n return vstack(\n {\n margin: node.style.margin,\n padding: { ...listPadding, left: leftPadding },\n gap: node.style.gap ?? 0\n },\n ...items.flatMap((item, index) => renderListItem(item, index, node.style.listStyleType, markerWidth, options, warnings))\n );\n}\n\nfunction renderListItem(\n item: StyledElement,\n index: number,\n listStyleType: StyledElement[\"style\"][\"listStyleType\"],\n markerWidth: number,\n options: HtmlToBoxpdfOptions,\n warnings: string[]\n): BoxNode[] {\n const runs = collectInlineRuns(item.children, options, warnings);\n const marker = listStyleType === \"none\" ? \"\" : listStyleType === \"decimal\" ? `${index + 1}. ` : \"• \";\n const paragraphs = runs.length > 0\n ? [\n paragraph(\n {\n width: item.style.width,\n align: item.style.textAlign,\n margin: item.style.margin,\n paddingLeft: marker ? markerWidth : 0,\n textIndent: marker ? -markerWidth : 0,\n wrap: shouldWrap(item.style)\n },\n ...(marker ? [run(marker, runStyle({ style: item.style } as StyledText, options))] : []),\n ...runs\n )\n ]\n : [];\n const blockChildren = item.children.filter((child) => !isInlineLike(child)).flatMap((child) => renderNode(child, options, warnings));\n return [...paragraphs, ...blockChildren];\n}\n\nfunction collectInlineRuns(nodes: StyledNode[], options: HtmlToBoxpdfOptions, warnings: string[]): ParagraphItem[] {\n const runs: ParagraphItem[] = [];\n for (const node of nodes) {\n if (\"text\" in node) {\n if (preservesWhitespace(node.style) && node.text.length > 0) {\n runs.push(run(node.text, runStyle(node, options)));\n } else if (node.text.trim()) {\n runs.push(run(node.text, runStyle(node, options)));\n } else if (runs.length > 0) {\n runs.push(run(\" \", runStyle(node, options)));\n }\n continue;\n }\n if (node.node.tag === \"br\") {\n runs.push(run(\"\\n\", runStyle({ style: node.style } as StyledText, options)));\n continue;\n }\n if (node.node.tag === \"img\") {\n const rendered = renderImageForLayout(node, options, warnings);\n if (rendered) {\n const measured = measure(rendered, contentWidth(node) ?? options.width ?? Number.POSITIVE_INFINITY);\n runs.push(inlineNode(rendered, { width: measured.width, height: measured.height, verticalAlign: node.style.verticalAlign === \"middle\" ? \"middle\" : undefined }));\n }\n continue;\n }\n if (isAtomicInlineContainer(node)) {\n const rendered = renderAtomicInlineNode(node, options, warnings);\n const measured = measure(rendered, contentWidth(node) ?? options.width ?? Number.POSITIVE_INFINITY);\n runs.push(inlineNode(rendered, { width: measured.width, height: measured.height, verticalAlign: node.style.verticalAlign === \"middle\" ? \"middle\" : undefined }));\n continue;\n }\n if (node.style.display === \"inline\" || node.style.display === \"contents\") {\n runs.push(...collectInlineRuns(node.children, options, warnings));\n }\n }\n return runs;\n}\n\nfunction renderAtomicInlineNode(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode {\n if (node.style.display === \"inline-flex\") return renderFlex(node, options, warnings);\n if (node.style.display === \"inline-grid\") return renderGrid(node, options, warnings);\n return renderBlock(node, options, warnings);\n}\n\nfunction renderImageNode(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode | undefined {\n return renderImageContent(node, options, warnings, node.style.margin, true);\n}\n\nfunction renderImageForLayout(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode | undefined {\n if (!hasImageBoxStyling(node)) return renderImageNode(node, options, warnings);\n const content = renderImageContent(node, options, warnings, undefined, false);\n if (!content) return undefined;\n return vstack(\n {\n width: cssBoxWidth(node),\n height: cssBoxHeight(node),\n margin: node.style.margin,\n padding: layoutPadding(node),\n background: node.style.background,\n border: border(node),\n borderSides: node.style.borderSides,\n borderRadius: node.style.borderRadius,\n overflow: node.style.overflow,\n shrink: 0\n },\n content\n );\n}\n\nfunction renderImageContent(\n node: StyledElement,\n options: HtmlToBoxpdfOptions,\n warnings: string[],\n margin: EdgesInput | undefined,\n decoratedFallback: boolean\n): BoxNode | undefined {\n const src = imageUrl(node);\n if (!src) {\n warnings.push(\"img without a resolvable src was skipped\");\n return undefined;\n }\n const pdfImage = options.resolveImage?.({ url: src, baseUrl: options.baseUrl });\n if (!pdfImage) {\n const size = imageSize(node, options);\n if (hasExplicitImageSize(node)) {\n warnings.push(`img src \"${src}\" did not resolve; preserved its layout box`);\n return vstack({\n width: size.width,\n height: size.height,\n margin,\n border: decoratedFallback ? border(node) : undefined,\n borderSides: decoratedFallback ? node.style.borderSides : undefined,\n borderRadius: decoratedFallback ? node.style.borderRadius : undefined,\n background: decoratedFallback ? node.style.background : undefined\n });\n }\n warnings.push(`img src \"${src}\" did not resolve`);\n return undefined;\n }\n const size = imageSize(node, options, pdfImage);\n if (node.style.objectFit === \"contain\" || node.style.objectFit === \"cover\") {\n return imageFit(pdfImage, { width: size.width, height: size.height, fit: node.style.objectFit, margin });\n }\n return boxImage(pdfImage, { width: size.width, height: size.height, margin });\n}\n\nfunction hasExplicitImageSize(node: StyledElement): boolean {\n return node.style.width !== undefined || node.style.height !== undefined || node.node.attrs.width !== undefined || node.node.attrs.height !== undefined;\n}\n\nfunction hasImageBoxStyling(node: StyledElement): boolean {\n return Boolean(\n node.style.background ||\n node.style.borderWidth ||\n node.style.borderSides ||\n node.style.borderRadius ||\n node.style.padding ||\n node.style.overflow\n );\n}\n\nfunction imageSize(node: StyledElement, options: HtmlToBoxpdfOptions, resolvedImage?: ReturnType<NonNullable<HtmlToBoxpdfOptions[\"resolveImage\"]>>): { width: number; height: number } {\n const src = imageUrl(node);\n const pdfImage = resolvedImage ?? (src ? options.resolveImage?.({ url: src, baseUrl: options.baseUrl }) : undefined);\n const naturalWidth = Math.max(1, (pdfImage?.width ?? 1) * 0.75);\n const naturalHeight = Math.max(1, (pdfImage?.height ?? 1) * 0.75);\n const naturalRatio = node.style.aspectRatio ?? (naturalWidth / naturalHeight);\n const width = node.style.width;\n const height = node.style.height;\n if (width !== undefined && height !== undefined) return { width, height };\n if (width !== undefined) return { width, height: width / naturalRatio };\n if (height !== undefined) return { width: height * naturalRatio, height };\n return { width: naturalWidth, height: naturalHeight };\n}\n\nfunction imageUrl(node: StyledElement): string | undefined {\n if (node.node.parent?.tag === \"picture\") {\n for (const child of node.node.parent.children) {\n if (child.kind !== \"element\") continue;\n if (child === node.node) break;\n if (child.tag !== \"source\") continue;\n const selected = srcsetUrl(child.attrs.srcset, targetImageCssWidth(node));\n if (selected) return selected;\n }\n }\n return srcsetUrl(node.node.attrs.srcset, targetImageCssWidth(node)) ?? node.node.attrs.src;\n}\n\nfunction srcsetUrl(value: string | undefined, targetCssPx?: number): string | undefined {\n const candidates = srcsetCandidates(value);\n if (candidates.length === 0) return undefined;\n const widthCandidates = candidates.filter((candidate) => candidate.width !== undefined);\n if (widthCandidates.length > 0) {\n const sorted = widthCandidates.sort((a, b) => a.width! - b.width!);\n if (targetCssPx !== undefined) return sorted.find((candidate) => candidate.width! >= targetCssPx)?.url ?? sorted[sorted.length - 1]?.url;\n return sorted[sorted.length - 1]?.url;\n }\n const densityCandidates = candidates.filter((candidate) => candidate.density !== undefined).sort((a, b) => a.density! - b.density!);\n if (densityCandidates.length > 0) return densityCandidates.find((candidate) => candidate.density! >= 1)?.url ?? densityCandidates[densityCandidates.length - 1]?.url;\n return candidates[0]?.url;\n}\n\nfunction srcsetCandidates(value: string | undefined): Array<{ url: string; width?: number; density?: number }> {\n if (!value) return [];\n return value\n .split(\",\")\n .map((raw) => raw.trim())\n .filter(Boolean)\n .map((candidate): { url: string; width?: number; density?: number } | undefined => {\n const [url, descriptor] = candidate.split(/\\s+/, 2);\n if (!url) return undefined;\n if (descriptor?.endsWith(\"w\")) {\n const width = Number.parseFloat(descriptor.slice(0, -1));\n return Number.isFinite(width) && width > 0 ? { url, width } : { url };\n }\n if (descriptor?.endsWith(\"x\")) {\n const density = Number.parseFloat(descriptor.slice(0, -1));\n return Number.isFinite(density) && density > 0 ? { url, density } : { url };\n }\n return { url };\n })\n .filter((candidate): candidate is { url: string; width?: number; density?: number } => candidate !== undefined);\n}\n\nfunction targetImageCssWidth(node: StyledElement): number | undefined {\n return node.style.width === undefined ? undefined : node.style.width / 0.75;\n}\n\nfunction renderTable(node: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode[] {\n const rows = tableRows(node);\n if (rows.length === 0) {\n warnings.push(\"table without direct tr children was flattened as a block\");\n return [renderBlock(node, options, warnings)];\n }\n return [\n table({\n width: cssBoxWidth(node) ?? options.width,\n columns: inferColumns(rows),\n columnGap: 0,\n borderCollapse: node.style.borderCollapse,\n margin: node.style.margin,\n rows: rows.map((row) =>\n row.children\n .filter((child): child is StyledElement => !(\"text\" in child) && (child.node.tag === \"td\" || child.node.tag === \"th\"))\n .map((cell) => ({\n content: renderCellContent(cell, options, warnings),\n padding: layoutPadding(cell, 4),\n background: cell.style.background,\n backgroundImage: backgroundImage(cell, options),\n border: border(cell),\n borderSides: cell.style.borderSides,\n borderRadius: cell.style.borderRadius,\n overflow: cell.style.overflow,\n align: cell.style.textAlign,\n valign: cell.style.verticalAlign === \"middle\" ? \"middle\" : \"top\"\n }))\n )\n })\n ];\n}\n\nfunction renderCellContent(cell: StyledElement, options: HtmlToBoxpdfOptions, warnings: string[]): BoxNode {\n const children = renderBlockChildren(cell, options, warnings);\n if (children.length === 1) return children[0]!;\n return vstack({ gap: cell.style.gap ?? 0 }, ...children);\n}\n\nfunction tableRows(node: StyledElement): StyledElement[] {\n const rows: StyledElement[] = [];\n for (const child of node.children) {\n if (\"text\" in child) continue;\n if (child.node.tag === \"tr\") rows.push(child);\n if (child.node.tag === \"thead\" || child.node.tag === \"tbody\" || child.node.tag === \"tfoot\") {\n rows.push(...child.children.filter((row): row is StyledElement => !(\"text\" in row) && row.node.tag === \"tr\"));\n }\n }\n return rows;\n}\n\nfunction isInlineLike(node: StyledNode): boolean {\n return \"text\" in node || isInlineContainer(node);\n}\n\nfunction isInlineContainer(node: StyledElement): boolean {\n return node.style.display === \"inline\" || isAtomicInlineContainer(node);\n}\n\nfunction isAtomicInlineContainer(node: StyledElement): boolean {\n return node.style.display === \"inline-block\" || node.style.display === \"inline-flex\" || node.style.display === \"inline-grid\";\n}\n\nfunction inferColumns(rows: StyledElement[]): Array<{ width: `${number}fr` }> {\n const count = Math.max(\n 1,\n ...rows.map((row) =>\n row.children.filter((child) => !(\"text\" in child) && (child.node.tag === \"td\" || child.node.tag === \"th\")).length\n )\n );\n return Array.from({ length: count }, () => ({ width: \"1fr\" as const }));\n}\n\nfunction cssBoxWidth(node: StyledElement): number | undefined {\n if (node.style.width === undefined) return undefined;\n if (node.style.boxSizing === \"border-box\") return node.style.width;\n const padding = edges(node.style.padding);\n const borders = borderWidths(node);\n return node.style.width + padding.left + padding.right + borders.left + borders.right;\n}\n\nfunction cssBoxHeight(node: StyledElement): number | undefined {\n if (node.style.height === undefined) return undefined;\n if (node.style.boxSizing === \"border-box\") return node.style.height;\n const padding = edges(node.style.padding);\n const borders = borderWidths(node);\n return node.style.height + padding.top + padding.bottom + borders.top + borders.bottom;\n}\n\nfunction contentWidth(node: StyledElement): number | undefined {\n if (node.style.width !== undefined && node.style.boxSizing === \"border-box\") {\n const padding = edges(node.style.padding);\n const borders = borderWidths(node);\n return Math.max(0, node.style.width - padding.left - padding.right - borders.left - borders.right);\n }\n return node.style.width;\n}\n\nfunction edges(input: EdgesInput | undefined): { top: number; right: number; bottom: number; left: number } {\n if (input === undefined) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof input === \"number\") return { top: input, right: input, bottom: input, left: input };\n return {\n top: input.top ?? 0,\n right: input.right ?? 0,\n bottom: input.bottom ?? 0,\n left: input.left ?? 0\n };\n}\n\nfunction borderWidths(node: StyledElement): { top: number; right: number; bottom: number; left: number } {\n const all = node.style.borderWidth ?? 0;\n return {\n top: node.style.borderSides?.top?.width ?? all,\n right: node.style.borderSides?.right?.width ?? all,\n bottom: node.style.borderSides?.bottom?.width ?? all,\n left: node.style.borderSides?.left?.width ?? all\n };\n}\n\nfunction layoutPadding(node: StyledElement, fallback?: EdgesInput): EdgesInput | undefined {\n const padding = edges(node.style.padding ?? fallback);\n const borders = borderWidths(node);\n const out = {\n top: padding.top + borders.top,\n right: padding.right + borders.right,\n bottom: padding.bottom + borders.bottom,\n left: padding.left + borders.left\n };\n if (out.top === 0 && out.right === 0 && out.bottom === 0 && out.left === 0) return undefined;\n if (out.top === out.right && out.right === out.bottom && out.bottom === out.left) return out.top;\n return out;\n}\n\nfunction backgroundImage(node: StyledElement, options: HtmlToBoxpdfOptions): BackgroundImage | undefined {\n if (!node.style.backgroundImageUrl || !options.resolveImage) return undefined;\n const image = options.resolveImage({ url: node.style.backgroundImageUrl, baseUrl: options.baseUrl });\n if (!image) return undefined;\n const width = cssBoxWidth(node);\n const height = cssBoxHeight(node);\n if (width === undefined || height === undefined || width <= 0 || height <= 0) return undefined;\n const sizing = node.style.backgroundSize ?? \"auto\";\n const naturalWidth = image.width * 0.75;\n const naturalHeight = image.height * 0.75;\n const scale =\n sizing === \"cover\"\n ? Math.max(width / naturalWidth, height / naturalHeight)\n : sizing === \"contain\"\n ? Math.min(width / naturalWidth, height / naturalHeight)\n : 1;\n const imageWidth = naturalWidth * scale;\n const imageHeight = naturalHeight * scale;\n const x = node.style.backgroundPositionX ?? 0;\n const y = node.style.backgroundPositionY ?? 0;\n return {\n image,\n width: imageWidth,\n height: imageHeight,\n offsetX: (width - imageWidth) * x,\n offsetY: (height - imageHeight) * y,\n repeat: node.style.backgroundRepeat ?? \"repeat\"\n };\n}\n\nfunction textOptions(node: StyledText, options: HtmlToBoxpdfOptions) {\n return {\n ...runStyle(node, options),\n width: node.style.width,\n wrap: shouldWrap(node.style),\n align: node.style.textAlign,\n margin: node.style.margin\n };\n}\n\nfunction runStyle(node: StyledText, options: HtmlToBoxpdfOptions): TextRunStyle {\n return {\n size: node.style.fontSize,\n font: fontFor(node, options),\n color: node.style.color ?? options.defaultColor,\n lineHeight: node.style.lineHeight,\n underline: node.style.textDecorationLine === \"underline\",\n strikethrough: node.style.textDecorationLine === \"line-through\"\n };\n}\n\nfunction fontFor(node: StyledText, options: HtmlToBoxpdfOptions) {\n const resolved = options.resolveFont?.({\n families: node.style.fontFamily ?? [],\n weight: node.style.fontWeight,\n style: node.style.fontStyle\n });\n if (resolved) return resolved;\n if (isBold(node.style.fontWeight)) return options.boldFont ?? options.font;\n if (node.style.fontStyle === \"italic\") return options.italicFont ?? options.font;\n return options.font;\n}\n\nfunction isBold(weight: StyledText[\"style\"][\"fontWeight\"]): boolean {\n return weight === \"bold\" || (typeof weight === \"number\" && weight >= 600);\n}\n\nfunction shouldWrap(style: StyledText[\"style\"]): boolean {\n return style.whiteSpace !== \"nowrap\" && style.whiteSpace !== \"pre\";\n}\n\nfunction preservesWhitespace(style: StyledText[\"style\"]): boolean {\n return style.whiteSpace === \"pre\" || style.whiteSpace === \"pre-wrap\";\n}\n\nfunction border(node: StyledElement) {\n if (!node.style.borderWidth || !node.style.borderColor) return undefined;\n return { width: node.style.borderWidth, color: node.style.borderColor };\n}\n\nfunction hasBoxStyling(node: StyledElement): boolean {\n return Boolean(\n node.style.background ||\n node.style.backgroundImageUrl ||\n node.style.borderWidth ||\n node.style.borderSides ||\n node.style.borderRadius ||\n node.style.padding ||\n node.style.width !== undefined ||\n node.style.height !== undefined\n );\n}\n","import type { CssRule, CssStyle, HtmlElementNode, HtmlNode, StyledElement, StyledNode } from \"./types.js\";\nimport { parseStyleAttribute, ruleDeclarationsFor, type UnsupportedCssSink } from \"./css.js\";\nimport type { EdgesInput } from \"boxpdf\";\n\nconst blockTags = new Set([\n \"address\", \"article\", \"aside\", \"blockquote\", \"body\", \"div\", \"dl\", \"fieldset\", \"figcaption\",\n \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"header\", \"hr\", \"li\", \"main\",\n \"nav\", \"ol\", \"p\", \"pre\", \"section\", \"table\", \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\", \"ul\"\n]);\n\nexport function computeStyles(\n root: HtmlElementNode,\n rules: CssRule[],\n base: CssStyle,\n containingWidth?: number,\n unsupportedCss?: UnsupportedCssSink\n): StyledElement {\n return styleElement(root, rules, base, containingWidth, unsupportedCss);\n}\n\nfunction styleNode(\n node: HtmlNode,\n rules: CssRule[],\n inherited: CssStyle,\n containingWidth?: number,\n unsupportedCss?: UnsupportedCssSink,\n parentDisplay?: CssStyle[\"display\"]\n): StyledNode | undefined {\n if (node.kind === \"text\") {\n return { node, style: inherited, text: transformText(normalizeWhitespace(node.value, inherited.whiteSpace), inherited.textTransform) };\n }\n return styleElement(node, rules, inherited, containingWidth, unsupportedCss, parentDisplay);\n}\n\nfunction styleElement(\n node: HtmlElementNode,\n rules: CssRule[],\n inherited: CssStyle,\n containingWidth?: number,\n unsupportedCss?: UnsupportedCssSink,\n parentDisplay?: CssStyle[\"display\"]\n): StyledElement {\n const tagDefaults = defaultsForTag(node.tag, inherited);\n const ruleDeclarations = ruleDeclarationsFor(node, rules, tagDefaults.fontSize, tagDefaults.customProperties, unsupportedCss);\n const withRules = mergeStyles(tagDefaults, ruleDeclarations.declarations);\n const inlineDeclarations = parseStyleAttribute(node.attrs.style, withRules.fontSize, withRules.customProperties, unsupportedCss);\n const style = mergeStyles(\n withRules,\n inlineDeclarations.declarations,\n ruleDeclarations.importantDeclarations,\n inlineDeclarations.importantDeclarations\n );\n if (style.widthPercent !== undefined && containingWidth !== undefined) style.width = containingWidth * style.widthPercent;\n if (style.minWidthPercent !== undefined && containingWidth !== undefined) style.minWidth = containingWidth * style.minWidthPercent;\n if (style.maxWidthPercent !== undefined && containingWidth !== undefined) style.maxWidth = containingWidth * style.maxWidthPercent;\n if (style.widthCalc !== undefined && containingWidth !== undefined) style.width = containingWidth * style.widthCalc.percent + style.widthCalc.length;\n if (style.minWidthCalc !== undefined && containingWidth !== undefined) style.minWidth = containingWidth * style.minWidthCalc.percent + style.minWidthCalc.length;\n if (style.maxWidthCalc !== undefined && containingWidth !== undefined) style.maxWidth = containingWidth * style.maxWidthCalc.percent + style.maxWidthCalc.length;\n if (\n (style.display === \"block\" || style.display === \"flex\" || style.display === \"grid\") &&\n parentDisplay !== \"flex\" &&\n parentDisplay !== \"grid\" &&\n style.width === undefined &&\n containingWidth !== undefined\n ) {\n style.width = autoContentWidth(style, containingWidth);\n }\n if (node.tag === \"img\") {\n style.width ??= parseDimensionAttr(node.attrs.width);\n style.height ??= parseDimensionAttr(node.attrs.height);\n }\n if (style.width === undefined && containingWidth !== undefined && (style.minWidth !== undefined || style.maxWidth !== undefined)) {\n style.width = containingWidth;\n }\n if (style.width !== undefined) style.width = clamp(style.width, style.minWidth, style.maxWidth);\n applyAspectRatio(style);\n applyAutoMargins(style, containingWidth);\n if (style.lineHeightScale !== undefined) style.lineHeight = style.fontSize * style.lineHeightScale;\n const inheritedForChildren = inherit(style);\n const childContainingWidth =\n parentDisplay === \"flex\" && style.width === undefined ? undefined : contentWidthForChildren(style, containingWidth);\n const children = node.children\n .map((child) => styleNode(child, rules, inheritedForChildren, childContainingWidth, unsupportedCss, style.display))\n .filter((child): child is StyledNode => child !== undefined);\n return { node, style, children };\n}\n\nexport function defaultStyle(fontSize = 12): CssStyle {\n return {\n display: \"block\",\n flexDirection: \"row\",\n alignItems: \"stretch\",\n justifyContent: \"start\",\n fontSize,\n fontWeight: \"normal\",\n fontStyle: \"normal\",\n textAlign: \"left\",\n verticalAlign: \"baseline\",\n boxSizing: \"content-box\",\n whiteSpace: \"normal\"\n };\n}\n\nfunction defaultsForTag(tag: string, inherited: CssStyle): CssStyle {\n const style: CssStyle = {\n ...inherited,\n display: blockTags.has(tag) ? \"block\" : \"inline\",\n float: undefined,\n order: undefined,\n margin: undefined,\n marginAutoLeft: undefined,\n marginAutoRight: undefined,\n padding: undefined,\n background: undefined,\n backgroundImageUrl: undefined,\n backgroundSize: undefined,\n backgroundRepeat: undefined,\n backgroundPositionX: undefined,\n backgroundPositionY: undefined,\n objectFit: undefined,\n overflow: undefined,\n borderWidth: undefined,\n borderColor: undefined,\n borderSides: undefined,\n borderRadius: undefined,\n boxSizing: \"content-box\",\n width: undefined,\n widthPercent: undefined,\n widthCalc: undefined,\n minWidth: undefined,\n minWidthPercent: undefined,\n minWidthCalc: undefined,\n maxWidth: undefined,\n maxWidthPercent: undefined,\n maxWidthCalc: undefined,\n height: undefined,\n aspectRatio: undefined,\n position: undefined,\n top: undefined,\n right: undefined,\n bottom: undefined,\n left: undefined,\n zIndex: undefined,\n columnGap: undefined,\n rowGap: undefined,\n gridTemplateColumns: undefined,\n gridColumnStart: undefined,\n gridColumnEnd: undefined,\n gridColumnSpan: undefined\n };\n if (tag === \"strong\" || tag === \"b\" || tag === \"th\") style.fontWeight = \"bold\";\n if (tag === \"em\" || tag === \"i\") style.fontStyle = \"italic\";\n if (tag === \"h1\") {\n Object.assign(style, {\n fontSize: inherited.fontSize * 2,\n fontWeight: \"bold\",\n margin: { top: 0.67 * inherited.fontSize * 2, bottom: 0.67 * inherited.fontSize * 2 }\n });\n }\n if (tag === \"h2\") {\n Object.assign(style, {\n fontSize: inherited.fontSize * 1.5,\n fontWeight: \"bold\",\n margin: { top: 0.83 * inherited.fontSize * 1.5, bottom: 0.83 * inherited.fontSize * 1.5 }\n });\n }\n if (tag === \"h3\") {\n Object.assign(style, {\n fontSize: inherited.fontSize * 1.17,\n fontWeight: \"bold\",\n margin: { top: inherited.fontSize * 1.17, bottom: inherited.fontSize * 1.17 }\n });\n }\n if (tag === \"p\") style.margin = { top: inherited.fontSize, bottom: inherited.fontSize };\n if (tag === \"ul\" || tag === \"ol\") {\n style.margin = { top: inherited.fontSize, bottom: inherited.fontSize };\n style.padding = { left: inherited.fontSize * 2.5 };\n style.listStyleType = tag === \"ol\" ? \"decimal\" : \"disc\";\n }\n if (tag === \"li\") style.display = \"block\";\n if (tag === \"img\") style.display = \"inline\";\n if (tag === \"pre\") style.whiteSpace = \"pre\";\n if (tag === \"br\") style.display = \"inline\";\n return style;\n}\n\nfunction inherit(style: CssStyle): CssStyle {\n return {\n ...style,\n display: \"inline\",\n float: undefined,\n order: undefined,\n margin: undefined,\n marginAutoLeft: undefined,\n marginAutoRight: undefined,\n padding: undefined,\n background: undefined,\n backgroundImageUrl: undefined,\n backgroundSize: undefined,\n backgroundRepeat: undefined,\n backgroundPositionX: undefined,\n backgroundPositionY: undefined,\n objectFit: undefined,\n overflow: undefined,\n borderWidth: undefined,\n borderColor: undefined,\n borderSides: undefined,\n borderRadius: undefined,\n boxSizing: \"content-box\",\n width: undefined,\n widthPercent: undefined,\n widthCalc: undefined,\n minWidth: undefined,\n minWidthPercent: undefined,\n minWidthCalc: undefined,\n maxWidth: undefined,\n maxWidthPercent: undefined,\n maxWidthCalc: undefined,\n height: undefined,\n aspectRatio: undefined,\n position: undefined,\n top: undefined,\n right: undefined,\n bottom: undefined,\n left: undefined,\n zIndex: undefined,\n columnGap: undefined,\n rowGap: undefined,\n gridTemplateColumns: undefined,\n gridColumnStart: undefined,\n gridColumnEnd: undefined,\n gridColumnSpan: undefined\n };\n}\n\nfunction applyAspectRatio(style: CssStyle): void {\n if (style.aspectRatio === undefined || style.aspectRatio <= 0) return;\n if (style.width !== undefined && style.height === undefined) style.height = style.width / style.aspectRatio;\n else if (style.height !== undefined && style.width === undefined) style.width = style.height * style.aspectRatio;\n}\n\nfunction parseDimensionAttr(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (/^\\d+(?:\\.\\d+)?$/.test(normalized)) return Number(normalized) * 0.75;\n return undefined;\n}\n\nfunction mergeStyles(...styles: Array<Partial<CssStyle>>): CssStyle {\n const out: Partial<CssStyle> = {};\n for (const style of styles) {\n const borderSides = out.borderSides;\n Object.assign(out, style);\n if (style.borderSides) {\n out.borderSides = { ...borderSides, ...style.borderSides };\n }\n }\n return out as CssStyle;\n}\n\nfunction contentWidthForChildren(style: CssStyle, containingWidth: number | undefined): number | undefined {\n if (style.width !== undefined) return contentWidth(style);\n if (containingWidth === undefined) return undefined;\n const padding = edges(style.padding);\n const borders = borderWidths(style);\n return Math.max(0, containingWidth - padding.left - padding.right - borders.left - borders.right);\n}\n\nfunction autoContentWidth(style: CssStyle, containingWidth: number): number {\n if (style.boxSizing === \"border-box\") return containingWidth;\n const padding = edges(style.padding);\n const borders = borderWidths(style);\n return Math.max(0, containingWidth - padding.left - padding.right - borders.left - borders.right);\n}\n\nfunction applyAutoMargins(style: CssStyle, containingWidth: number | undefined): void {\n if (containingWidth === undefined || style.width === undefined || (!style.marginAutoLeft && !style.marginAutoRight)) return;\n const margin = edges(style.margin);\n const remaining = Math.max(0, containingWidth - outerWidth(style) + margin.left + margin.right);\n if (style.marginAutoLeft && style.marginAutoRight) {\n style.margin = { ...margin, left: remaining / 2, right: remaining / 2 };\n } else if (style.marginAutoLeft) {\n style.margin = { ...margin, left: remaining };\n } else if (style.marginAutoRight) {\n style.margin = { ...margin, right: remaining };\n }\n}\n\nfunction outerWidth(style: CssStyle): number {\n const margin = edges(style.margin);\n const padding = edges(style.padding);\n const borders = borderWidths(style);\n const box = style.boxSizing === \"border-box\" ? style.width ?? 0 : (style.width ?? 0) + padding.left + padding.right + borders.left + borders.right;\n return box + margin.left + margin.right;\n}\n\nfunction contentWidth(style: CssStyle): number {\n if (style.width === undefined || style.boxSizing !== \"border-box\") return style.width ?? 0;\n const padding = edges(style.padding);\n const borders = borderWidths(style);\n return Math.max(0, style.width - padding.left - padding.right - borders.left - borders.right);\n}\n\nfunction clamp(value: number, min: number | undefined, max: number | undefined): number {\n if (min !== undefined) value = Math.max(value, min);\n if (max !== undefined) value = Math.min(value, max);\n return value;\n}\n\nfunction edges(input: EdgesInput | undefined): { top: number; right: number; bottom: number; left: number } {\n if (input === undefined) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof input === \"number\") return { top: input, right: input, bottom: input, left: input };\n return {\n top: input.top ?? 0,\n right: input.right ?? 0,\n bottom: input.bottom ?? 0,\n left: input.left ?? 0\n };\n}\n\nfunction borderWidths(style: CssStyle): { top: number; right: number; bottom: number; left: number } {\n const all = style.borderWidth ?? 0;\n return {\n top: style.borderSides?.top?.width ?? all,\n right: style.borderSides?.right?.width ?? all,\n bottom: style.borderSides?.bottom?.width ?? all,\n left: style.borderSides?.left?.width ?? all\n };\n}\n\nfunction normalizeWhitespace(value: string, whiteSpace: CssStyle[\"whiteSpace\"]): string {\n const normalized = value.replace(/\\r\\n?/g, \"\\n\");\n if (whiteSpace === \"pre\" || whiteSpace === \"pre-wrap\") return normalized;\n if (whiteSpace === \"pre-line\") return normalized.replace(/[^\\S\\n]+/g, \" \");\n return normalized.replace(/\\s+/g, \" \");\n}\n\nfunction transformText(value: string, transform: CssStyle[\"textTransform\"]): string {\n if (transform === \"uppercase\") return value.toUpperCase();\n if (transform === \"lowercase\") return value.toLowerCase();\n if (transform === \"capitalize\") {\n return value.replace(/\\p{L}[\\p{L}\\p{N}'-]*/gu, (word) => word[0]!.toUpperCase() + word.slice(1).toLowerCase());\n }\n return value;\n}\n","import type { PDFFont } from \"pdf-lib\";\nimport type { FontStyle, FontWeight, HtmlFontResolver, HtmlFontRequest } from \"./types.js\";\n\nexport type FontFamilyFace = PDFFont | Partial<Record<FontStyle | \"bold\" | \"boldItalic\" | `${number}`, PDFFont>>;\nexport type FontFamilyMap = Record<string, FontFamilyFace>;\n\nexport function fontFamily(families: FontFamilyMap): HtmlFontResolver {\n const normalized = new Map<string, FontFamilyFace>();\n for (const [name, face] of Object.entries(families)) {\n normalized.set(normalizeFamily(name), face);\n }\n\n return (request) => {\n for (const family of request.families) {\n const face = normalized.get(normalizeFamily(family));\n const font = face && resolveFace(face, request);\n if (font) return font;\n }\n return undefined;\n };\n}\n\nfunction resolveFace(face: FontFamilyFace, request: HtmlFontRequest): PDFFont | undefined {\n if (isPdfFont(face)) return face;\n const preferred = preferredKeys(request.weight, request.style);\n for (const key of preferred) {\n const font = face[key];\n if (font) return font;\n }\n return face.normal ?? face.bold ?? face.italic;\n}\n\nfunction preferredKeys(weight: FontWeight, style: FontStyle): Array<keyof Exclude<FontFamilyFace, PDFFont>> {\n const keys: Array<keyof Exclude<FontFamilyFace, PDFFont>> = [];\n if (typeof weight === \"number\") keys.push(`${weight}`);\n if (isBold(weight) && style === \"italic\") keys.push(\"boldItalic\");\n if (style === \"italic\") keys.push(\"italic\");\n if (isBold(weight)) keys.push(\"bold\");\n keys.push(\"normal\");\n return keys;\n}\n\nfunction isBold(weight: FontWeight): boolean {\n return weight === \"bold\" || (typeof weight === \"number\" && weight >= 600);\n}\n\nfunction normalizeFamily(family: string): string {\n return family.trim().replace(/^['\"]|['\"]$/g, \"\").toLowerCase();\n}\n\nfunction isPdfFont(value: FontFamilyFace): value is PDFFont {\n return \"embedder\" in value;\n}\n","export type {\n FontStyle,\n FontWeight,\n HtmlFontRequest,\n HtmlFontResolver,\n HtmlDiagnostics,\n HtmlDiagnosticsOptions,\n HtmlProfileEvent,\n HtmlProfileCallback,\n HtmlToBoxpdfOptions,\n HtmlUnsupportedCss,\n ParsedHtml,\n RenderResult\n} from \"./types.js\";\nexport type { FontFamilyFace, FontFamilyMap } from \"./font.js\";\n\nimport { parseStylesheets } from \"./css.js\";\nimport { parseHtml } from \"./dom.js\";\nimport { renderStyledTree } from \"./render.js\";\nimport { computeStyles, defaultStyle } from \"./style.js\";\nimport type { CssDeclaration, HtmlDiagnostics, HtmlNode, HtmlProfileEvent, HtmlToBoxpdfOptions, RenderResult, StyledNode } from \"./types.js\";\nimport type { Node as BoxNode } from \"boxpdf\";\n\nexport function htmlToBoxpdf(html: string, options: HtmlToBoxpdfOptions): RenderResult {\n const startedAt = now();\n const profile = (event: Omit<HtmlProfileEvent, \"elapsedMs\">): void => {\n options.profile?.({ ...event, elapsedMs: now() - startedAt });\n };\n profile({ phase: \"start\", htmlBytes: byteLength(html) });\n const parsed = parseHtml(html);\n profile({ phase: \"parse-html\", domNodes: countDomNodes(parsed.root), stylesheets: parsed.stylesheets.length });\n const rules = parseStylesheets(parsed.stylesheets);\n profile({ phase: \"parse-css\", cssRules: rules.length });\n const diagnostics = createDiagnostics(options);\n const styled = computeStyles(parsed.root, rules, {\n ...defaultStyle(options.defaultFontSize ?? 12),\n color: options.defaultColor,\n lineHeight: options.defaultLineHeight\n }, options.width, diagnostics ? (declaration) => diagnostics.recordUnsupportedCss(declaration) : undefined);\n profile({ phase: \"compute-styles\", styledNodes: countStyledNodes(styled) });\n const result = renderStyledTree(styled, options);\n if (diagnostics) result.diagnostics = diagnostics.toJSON();\n profile({ phase: \"render-tree\", ...countBoxNodes(result.nodes) });\n profile({ phase: \"finish\" });\n return result;\n}\n\nfunction createDiagnostics(options: HtmlToBoxpdfOptions): { recordUnsupportedCss: (declaration: CssDeclaration) => void; toJSON: () => HtmlDiagnostics } | undefined {\n if (!options.diagnostics?.unsupportedCss) return undefined;\n const sampleLimit = options.diagnostics.sampleLimit ?? 3;\n const unsupported = new Map<string, { property: string; value: string; count: number; samples: string[] }>();\n return {\n recordUnsupportedCss(declaration) {\n const property = declaration.property.trim().toLowerCase();\n const value = declaration.value.trim();\n const key = `${property}\\n${value}`;\n const entry = unsupported.get(key) ?? { property, value, count: 0, samples: [] };\n entry.count += 1;\n const sample = declaration.selector ? `${declaration.selector} { ${property}: ${value} }` : `${property}: ${value}`;\n if (entry.samples.length < sampleLimit && !entry.samples.includes(sample)) entry.samples.push(sample);\n unsupported.set(key, entry);\n },\n toJSON() {\n return {\n unsupportedCss: [...unsupported.values()]\n .sort((a, b) => b.count - a.count || a.property.localeCompare(b.property))\n .map(({ property, value, count, samples }) => ({ property, value, count, samples: samples.length > 0 ? samples : undefined }))\n };\n }\n };\n}\n\nexport { parseHtml };\nexport { fontFamily } from \"./font.js\";\n\nfunction now(): number {\n return typeof performance === \"undefined\" ? Date.now() : performance.now();\n}\n\nfunction byteLength(value: string): number {\n return typeof TextEncoder === \"undefined\" ? value.length : new TextEncoder().encode(value).length;\n}\n\nfunction countDomNodes(node: HtmlNode): number {\n if (node.kind === \"text\") return 1;\n return 1 + node.children.reduce((sum, child) => sum + countDomNodes(child), 0);\n}\n\nfunction countStyledNodes(node: StyledNode): number {\n if (\"text\" in node) return 1;\n return 1 + node.children.reduce((sum, child) => sum + countStyledNodes(child), 0);\n}\n\nfunction countBoxNodes(nodes: BoxNode[]): { boxNodes: number; paragraphs: number; textRuns: number } {\n return nodes.reduce(\n (sum, node) => {\n const counted = countBoxNode(node);\n return {\n boxNodes: sum.boxNodes + counted.boxNodes,\n paragraphs: sum.paragraphs + counted.paragraphs,\n textRuns: sum.textRuns + counted.textRuns\n };\n },\n { boxNodes: 0, paragraphs: 0, textRuns: 0 }\n );\n}\n\nfunction countBoxNode(node: BoxNode): { boxNodes: number; paragraphs: number; textRuns: number } {\n let out = {\n boxNodes: 1,\n paragraphs: node.kind === \"paragraph\" ? 1 : 0,\n textRuns: node.kind === \"paragraph\" ? node.runs.filter((run) => \"text\" in run).length : node.kind === \"text\" ? 1 : 0\n };\n if (\"children\" in node) {\n for (const child of node.children) {\n const counted = countBoxNode(child);\n out = {\n boxNodes: out.boxNodes + counted.boxNodes,\n paragraphs: out.paragraphs + counted.paragraphs,\n textRuns: out.textRuns + counted.textRuns\n };\n }\n }\n return out;\n}\n"],"mappings":"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","names":["rgb","amount","edges","read","width","widths","size","contentWidth","edges","borderWidths","isBold","run"]}
|