PaperStack / components /MermaidDiagram.tsx
Akhil-Theerthala's picture
Upload 14 files
6fe3275 verified
import React, { useEffect, useRef, useState } from 'react';
import mermaid from 'mermaid';
interface Props {
chart: string;
theme?: 'light' | 'dark';
}
const MermaidDiagram: React.FC<Props> = ({ chart, theme = 'light' }) => {
const containerRef = useRef<HTMLDivElement>(null);
const [svg, setSvg] = useState<string>('');
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;
try {
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, chart);
setSvg(svg);
} catch (error) {
console.error('Mermaid failed to render:', error);
setSvg(''); // Clear on error
}
};
renderChart();
}, [chart, theme]);
if (!svg) return null;
return (
<div
className="w-full h-full flex items-center justify-center p-4 mermaid-container overflow-hidden"
ref={containerRef}
dangerouslySetInnerHTML={{ __html: svg }}
/>
);
};
export default MermaidDiagram;