From 0ac67b20e6dca1aebe077eaf5e7e116ad61b2135 Mon Sep 17 00:00:00 2001 From: Artem Nistuley Date: Fri, 23 Jan 2026 21:27:13 +0200 Subject: [PATCH] fix: annotation formatting --- .../painters/dom/src/paragraph-hash-utils.ts | 3 +++ .../pm-adapter/src/converters/paragraph.ts | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/layout-engine/painters/dom/src/paragraph-hash-utils.ts b/packages/layout-engine/painters/dom/src/paragraph-hash-utils.ts index 605e251e31..62def18ba8 100644 --- a/packages/layout-engine/painters/dom/src/paragraph-hash-utils.ts +++ b/packages/layout-engine/painters/dom/src/paragraph-hash-utils.ts @@ -164,6 +164,9 @@ export const getRunBooleanProp = (run: Run, prop: string): boolean => { * @returns The underline style or empty string if not present */ export const getRunUnderlineStyle = (run: Run): string => { + if ('underline' in run && typeof run.underline === 'boolean') { + return run.underline ? 'single' : ''; + } if ('underline' in run && run.underline && typeof run.underline === 'object') { return (run.underline as { style?: string }).style ?? ''; } diff --git a/packages/layout-engine/pm-adapter/src/converters/paragraph.ts b/packages/layout-engine/pm-adapter/src/converters/paragraph.ts index 111be4564d..1182fde05c 100644 --- a/packages/layout-engine/pm-adapter/src/converters/paragraph.ts +++ b/packages/layout-engine/pm-adapter/src/converters/paragraph.ts @@ -338,10 +338,16 @@ export function fieldAnnotationNodeToRun( if (typeof textHighlight === 'string') run.textHighlight = textHighlight; // Text formatting + // Prefer explicit attrs on the annotation node; they should override metadata formatting. const formatting = fieldMetadata?.formatting; - if (attrs.bold === true || formatting?.bold === true) run.bold = true; - if (attrs.italic === true || formatting?.italic === true) run.italic = true; - if (attrs.underline === true || formatting?.underline === true) run.underline = true; + if (attrs.bold === true) run.bold = true; + else if (attrs.bold !== false && formatting?.bold === true) run.bold = true; + + if (attrs.italic === true) run.italic = true; + else if (attrs.italic !== false && formatting?.italic === true) run.italic = true; + + if (attrs.underline === true) run.underline = true; + else if (attrs.underline !== false && formatting?.underline === true) run.underline = true; // Position tracking const pos = positions.get(node);