From 8f6f1c8284495357795eccafef252352a6a1b14e Mon Sep 17 00:00:00 2001 From: Henry Moran Date: Mon, 16 Mar 2026 17:45:10 -0700 Subject: [PATCH] fix(ui): wrap "Add to chat" selections in md fenced blocks (#641) (#684) packages/ui/src/components/chat/message/TextSelectionMenu.tsx - What: Wrap selectedText in ```md fenced block before appending to composer. - Why: Selections were appended as raw inline text with no visual distinction. packages/ui/src/components/chat/ChatInput.tsx - What: Replace trimEnd()/trim() + single-space join with raw prev + \n\n separator in append branch. - Why: Existing composer newlines were being destroyed and multiple appends ran together. packages/ui/src/components/session/ProjectNotesTodoPanel.tsx - What: Wrap todoText in ```md fenced block before appending to composer. - Why: Todo text sent to current session should have the same fenced formatting. --- packages/ui/src/components/chat/ChatInput.tsx | 8 +++----- .../ui/src/components/chat/message/TextSelectionMenu.tsx | 3 ++- .../ui/src/components/session/ProjectNotesTodoPanel.tsx | 3 ++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/ui/src/components/chat/ChatInput.tsx b/packages/ui/src/components/chat/ChatInput.tsx index e4fbb54c..ea084d5e 100644 --- a/packages/ui/src/components/chat/ChatInput.tsx +++ b/packages/ui/src/components/chat/ChatInput.tsx @@ -589,11 +589,9 @@ export const ChatInput: React.FC = ({ onOpenSettings, scrollToBo if (pending?.text) { if (pending.mode === 'append') { setMessage((prev) => { - const next = pending.text.trim(); - if (!next) return prev; - const base = prev.trimEnd(); - if (!base.trim()) return next; - return `${base} ${next}`; + if (!pending.text) return prev; + if (!prev.trim()) return pending.text; + return `${prev}\n\n${pending.text}`; }); } else { setMessage(pending.text); diff --git a/packages/ui/src/components/chat/message/TextSelectionMenu.tsx b/packages/ui/src/components/chat/message/TextSelectionMenu.tsx index 2487908f..35f6a59b 100644 --- a/packages/ui/src/components/chat/message/TextSelectionMenu.tsx +++ b/packages/ui/src/components/chat/message/TextSelectionMenu.tsx @@ -249,7 +249,8 @@ export const TextSelectionMenu: React.FC = ({ containerR const handleAddToChat = React.useCallback(() => { if (!selectedText) return; - setPendingInputText(selectedText, 'append'); + const fenced = `\`\`\`md\n${selectedText}\n\`\`\``; + setPendingInputText(fenced, 'append'); hideMenu(); diff --git a/packages/ui/src/components/session/ProjectNotesTodoPanel.tsx b/packages/ui/src/components/session/ProjectNotesTodoPanel.tsx index 41d95620..4b92233d 100644 --- a/packages/ui/src/components/session/ProjectNotesTodoPanel.tsx +++ b/packages/ui/src/components/session/ProjectNotesTodoPanel.tsx @@ -192,7 +192,8 @@ export const ProjectNotesTodoPanel: React.FC = ({ return; } routeToChat(); - setPendingInputText(todoText, 'append'); + const fenced = `\`\`\`md\n${todoText}\n\`\`\``; + setPendingInputText(fenced, 'append'); toast.success('Todo sent to current session'); onActionComplete?.(); },