Browse Source

feat(33): render markdown in chat assistant messages

Add react-markdown to parse assistant responses so bold, italic,
lists, blockquotes, and code render properly instead of showing
raw asterisks and markdown syntax.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
handoff-20260429-1057
shrimbly 6 months ago
parent
commit
7f7e080e5f
  1. 1251
      package-lock.json
  2. 1
      package.json
  3. 20
      src/components/ChatPanel.tsx

1251
package-lock.json

File diff suppressed because it is too large

1
package.json

@ -26,6 +26,7 @@
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"react-konva": "^19.2.1", "react-konva": "^19.2.1",
"react-markdown": "^10.1.0",
"tailwindcss": "^4.1.17", "tailwindcss": "^4.1.17",
"zustand": "^5.0.9" "zustand": "^5.0.9"
}, },

20
src/components/ChatPanel.tsx

@ -3,6 +3,7 @@
import { useRef, useEffect, useState } from "react"; import { useRef, useEffect, useState } from "react";
import { useChat } from "@ai-sdk/react"; import { useChat } from "@ai-sdk/react";
import { DefaultChatTransport } from "ai"; import { DefaultChatTransport } from "ai";
import ReactMarkdown from "react-markdown";
interface ChatPanelProps { interface ChatPanelProps {
isOpen: boolean; isOpen: boolean;
@ -118,7 +119,24 @@ export function ChatPanel({ isOpen, onClose, onBuildWorkflow, isBuildingWorkflow
: "bg-neutral-700 text-neutral-200" : "bg-neutral-700 text-neutral-200"
}`} }`}
> >
<p className="whitespace-pre-wrap">{textContent}</p> {message.role === "user" ? (
<p className="whitespace-pre-wrap">{textContent}</p>
) : (
<ReactMarkdown
components={{
p: ({ children }) => <p className="mb-2 last:mb-0">{children}</p>,
strong: ({ children }) => <strong className="font-semibold text-neutral-100">{children}</strong>,
em: ({ children }) => <em className="italic">{children}</em>,
ul: ({ children }) => <ul className="list-disc pl-4 mb-2 last:mb-0 space-y-1">{children}</ul>,
ol: ({ children }) => <ol className="list-decimal pl-4 mb-2 last:mb-0 space-y-1">{children}</ol>,
li: ({ children }) => <li>{children}</li>,
blockquote: ({ children }) => <blockquote className="border-l-2 border-neutral-500 pl-2 my-2 text-neutral-300 italic">{children}</blockquote>,
code: ({ children }) => <code className="bg-neutral-600 px-1 rounded text-xs">{children}</code>,
}}
>
{textContent}
</ReactMarkdown>
)}
</div> </div>
</div> </div>
); );

Loading…
Cancel
Save