import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import remarkMath from "remark-math"; import rehypeKatex from "rehype-katex"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { oneDark, oneLight, } from "react-syntax-highlighter/dist/esm/styles/prism"; import { useState } from "react"; import { Copy, Check } from "lucide-react"; import { cn } from "@/lib/utils"; import "katex/dist/katex.min.css"; interface MessageBubbleProps { content: string; role: "human" | "ai"; } function CodeBlock({ language, children, }: { language: string; children: string; }) { const [copied, setCopied] = useState(false); const handleCopy = () => { navigator.clipboard.writeText(children).then(() => { setCopied(true); setTimeout(() => setCopied(false), 2000); }); }; // Detect dark mode via document class const isDark = typeof document !== "undefined" && document.documentElement.classList.contains("dark"); return (
{/* Language label + copy button */}
{language || "text"}
{children}
); } export default function MessageBubble({ content }: MessageBubbleProps) { return ( {children} ); } return ( {codeStr} ); }, // Tables table({ children }) { return (
{children}
); }, th({ children }) { return ( {children} ); }, td({ children }) { return ( {children} ); }, // Headings h1({ children }) { return (

{children}

); }, h2({ children }) { return (

{children}

); }, h3({ children }) { return (

{children}

); }, // Lists ul({ children }) { return ( ); }, ol({ children }) { return (
    {children}
); }, // Paragraphs p({ children }) { return

{children}

; }, // Links a({ href, children }) { return ( {children} ); }, // Blockquote blockquote({ children }) { return (
{children}
); }, // Horizontal rule hr() { return
; }, // Strong / em strong({ children }) { return ( {children} ); }, em({ children }) { return {children}; }, }} > {content}
); }