import React, { useEffect, useRef, useState } from 'react'; import mermaid from 'mermaid'; import { AlertTriangle } from 'lucide-react'; interface Props { chart: string; theme?: 'light' | 'dark'; } const MermaidDiagram: React.FC = ({ chart, theme = 'light' }) => { const containerRef = useRef(null); const [svg, setSvg] = useState(''); const [error, setError] = useState(''); useEffect(() => { mermaid.initialize({ startOnLoad: false, theme: theme === 'dark' ? 'dark' : 'default', securityLevel: 'loose', fontFamily: 'Inter, sans-serif', }); }, [theme]); useEffect(() => { const renderChart = async () => { if (!containerRef.current) return; setError(''); try { // Clean up the chart string - remove any markdown code fences let cleanChart = chart.trim(); if (cleanChart.startsWith('```')) { cleanChart = cleanChart.replace(/^```(?:mermaid)?\n?/, '').replace(/\n?```$/, ''); } const id = `mermaid-${Math.random().toString(36).substr(2, 9)}`; // Mermaid render returns an object with svg property in newer versions const { svg } = await mermaid.render(id, cleanChart); setSvg(svg); } catch (err: any) { console.error('Mermaid failed to render:', err); setError(err.message || 'Failed to render diagram'); setSvg(''); } }; if (chart) { renderChart(); } }, [chart, theme]); if (error) { return (

Diagram could not be rendered

{error}

Show raw diagram code
                {chart}
              
); } if (!svg) { return (
); } return (
); }; export default MermaidDiagram;