"use client"; import React, { useState } from "react"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import rehypeSlug from "rehype-slug"; import rehypeHighlight from "rehype-highlight"; import { Copy, Check, Info, Lightbulb, AlertTriangle, Flame, ShieldAlert, } from "lucide-react"; function extractText(node: React.ReactNode): string { if (node === null || node === undefined || typeof node === "boolean") { return ""; } if (typeof node === "string" || typeof node === "number") { return String(node); } if (Array.isArray(node)) { return node.map(extractText).join(""); } if (React.isValidElement(node)) { return extractText((node.props as { children?: React.ReactNode })?.children); } return ""; } function PreBlock({ children, ...props }: React.HTMLAttributes) { const [copied, setCopied] = useState(false); const textContent = extractText(children).replace(/\n$/, ""); let language = "text"; if (React.isValidElement(children)) { const className = (children.props as { className?: string })?.className || ""; const match = /language-(\w+)/.exec(className); if (match) { language = match[1]; } } function handleCopy() { navigator.clipboard.writeText(textContent); setCopied(true); setTimeout(() => setCopied(false), 2000); } return (
{/* Code block header bar */}
{language}
        {children}
      
); } export default function Markdown({ source }: { source: string }) { return (
) => { if (className?.includes("hljs") || className?.includes("language-")) { return ( {children} ); } return ( {children} ); }, table: ({ node, ...props }) => (
), blockquote: ({ children }) => { const rawText = extractText(children).trim(); const alertMatch = rawText.match(/^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]/i); if (alertMatch) { const alertType = alertMatch[1].toUpperCase(); let borderClass = "border-indigo-500 bg-indigo-500/10 text-indigo-900 dark:text-indigo-200 print:bg-indigo-50 print:text-indigo-950"; let Icon = Info; let title = "Note"; if (alertType === "TIP") { borderClass = "border-emerald-500 bg-emerald-500/10 text-emerald-900 dark:text-emerald-200 print:bg-emerald-50 print:text-emerald-950"; Icon = Lightbulb; title = "Tip"; } else if (alertType === "IMPORTANT") { borderClass = "border-violet-500 bg-violet-500/10 text-violet-900 dark:text-violet-200 print:bg-violet-50 print:text-violet-950"; Icon = Flame; title = "Important"; } else if (alertType === "WARNING") { borderClass = "border-amber-500 bg-amber-500/10 text-amber-900 dark:text-amber-200 print:bg-amber-50 print:text-amber-950"; Icon = AlertTriangle; title = "Warning"; } else if (alertType === "CAUTION") { borderClass = "border-rose-500 bg-rose-500/10 text-rose-900 dark:text-rose-200 print:bg-rose-50 print:text-rose-950"; Icon = ShieldAlert; title = "Caution"; } return (
{title}
{children}
); } return (
{children}
); }, }} > {source} ); }