From 97cfcf830623056fdeb9af08cf0d90590a640c48 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 21 Jul 2026 23:29:20 +0200 Subject: [PATCH] fix(app): stop markdown lines joining Custom line-break rules dropped the resolved full-width break style, allowing adjacent native text spans to collapse onto one line. Preserve the break styles in both chat and shared Markdown renderers. --- .../app/src/components/markdown/renderer.tsx | 22 +++++++++++++-- packages/app/src/components/message.tsx | 27 ++++++++++++++++--- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/packages/app/src/components/markdown/renderer.tsx b/packages/app/src/components/markdown/renderer.tsx index 2eb619b9a..6c1eb4e01 100644 --- a/packages/app/src/components/markdown/renderer.tsx +++ b/packages/app/src/components/markdown/renderer.tsx @@ -569,8 +569,26 @@ export function createSharedMarkdownRules(): RenderRules { {children} ), - hardbreak: (node: ASTNode) => {"\n"}, - softbreak: (node: ASTNode) => {"\n"}, + hardbreak: ( + node: ASTNode, + _children: ReactNode[], + _parent: ASTNode[], + styles: MarkdownStyles, + ) => ( + + {"\n"} + + ), + softbreak: ( + node: ASTNode, + _children: ReactNode[], + _parent: ASTNode[], + styles: MarkdownStyles, + ) => ( + + {"\n"} + + ), code_block: ( node: ASTNode, _children: ReactNode[], diff --git a/packages/app/src/components/message.tsx b/packages/app/src/components/message.tsx index 08792bfd5..b17982a6e 100644 --- a/packages/app/src/components/message.tsx +++ b/packages/app/src/components/message.tsx @@ -1689,10 +1689,29 @@ export const AssistantMessage = memo(function AssistantMessage({ // plain is not hoisted into a UITextViewChild and is dropped (same // root cause as strong/em/s) — so on iOS a hard line break vanished, and // a softbreak between words jammed them together ("one\ntwo" -> "onetwo"). - // Emit the break through MarkdownTextSpan so it composes on iOS; web and - // Android keep the same "\n" they rendered before. - hardbreak: (node: ASTNode) => {"\n"}, - softbreak: (node: ASTNode) => {"\n"}, + // Emit the break through MarkdownTextSpan so it composes on iOS. Keep + // the resolved break styles: hardbreak is a full-width flex-row child on + // Android, and dropping that width joins the surrounding text spans. + hardbreak: ( + node: ASTNode, + _children: ReactNode[], + _parent: ASTNode[], + styles: MarkdownStyles, + ) => ( + + {"\n"} + + ), + softbreak: ( + node: ASTNode, + _children: ReactNode[], + _parent: ASTNode[], + styles: MarkdownStyles, + ) => ( + + {"\n"} + + ), code_block: ( node: ASTNode, _children: ReactNode[],