"use client"; import React, { useEffect, useRef, useState, useId } from "react"; import { ZoomIn, ZoomOut, RotateCcw, Copy, CheckCircle2, Maximize2, Minimize2, Terminal, Code2 } from "lucide-react"; interface MermaidChartProps { chart: string; title?: string; } export default function MermaidChart({ chart, title = "SYSTEM ARCHITECTURE PIPELINE FLOW" }: MermaidChartProps) { const containerRef = useRef(null); const [svgContent, setSvgContent] = useState(""); const [error, setError] = useState(null); const [isLoading, setIsLoading] = useState(true); const [zoom, setZoom] = useState(1); const [isFullscreen, setIsFullscreen] = useState(false); const [copied, setCopied] = useState(false); const [viewCode, setViewCode] = useState(false); const rawId = useId(); const chartId = `mermaid_${rawId.replace(/[^a-zA-Z0-9_-]/g, "_")}`; useEffect(() => { let isMounted = true; async function renderChart() { setIsLoading(true); setError(null); try { const mermaid = (await import("mermaid")).default; mermaid.initialize({ startOnLoad: false, securityLevel: "loose", fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace", theme: "base", themeVariables: { darkMode: false, background: "#FBFBFA", primaryColor: "#FFFFFF", primaryTextColor: "#141413", primaryBorderColor: "#141413", lineColor: "#141413", secondaryColor: "#F4F4F0", tertiaryColor: "#E7E7E2", clusterBkg: "#F8F8F6", clusterBorder: "#141413", edgeLabelBackground: "#FFFFFF", fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace", fontSize: "12px", mainBkg: "#FFFFFF" } }); // Ensure clean syntax const { svg } = await mermaid.render(chartId, chart); if (isMounted) { setSvgContent(svg); setIsLoading(false); } } catch (err: unknown) { console.error("Mermaid rendering error:", err); if (isMounted) { setError(err instanceof Error ? err.message : "Failed to render Mermaid diagram visually."); setIsLoading(false); } } } renderChart(); return () => { isMounted = false; }; }, [chart, chartId]); const handleCopy = () => { navigator.clipboard.writeText(chart); setCopied(true); setTimeout(() => setCopied(false), 2000); }; const resetZoom = () => setZoom(1); const zoomIn = () => setZoom((z) => Math.min(z + 0.15, 2.0)); const zoomOut = () => setZoom((z) => Math.max(z - 0.15, 0.5)); return (
{/* Visual Header Toolbar */}
{title} VISUAL FLOWCHART (SVG)
{/* Zoom controls */}
{Math.round(zoom * 100)}%
{/* Toggle Code / Diagram */} {/* Copy Mermaid Source */} {/* Fullscreen Toggle */}
{/* Main View Area */}
{isLoading && (
Compiling Visual Vector Graph...
)} {error && (
Diagram Rendering Error
{error}
)} {!isLoading && !error && !viewCode && svgContent && (
)} {!isLoading && viewCode && (
RAW MERMAID SOURCE (.MMD) Flowchart TD
              {chart}
            
)}
{/* Visual Subtitle / Metadata Footer */}
Nodes: 19 Elements · Subgraphs: 5 Lifecycle Stages Rendered via Mermaid SVG Engine · Standard Vector Protocol
); }