{split.blocks.map((source, i) => (
))}
{tail.source &&
(tail.asCode ? (
// Unterminated fence → render as an in-progress code block so
// it doesn't swallow the rest of the message. The close fence
// is virtual (appended to a copy); stored content is untouched.
) : (
// Boundary buffering: the trailing incomplete line/block stays
// raw `whitespace-pre-wrap` until a newline promotes it — no
// flash of half-written `**bold` / `[link](`.
{tail.source}
))}