'use client'; import { useTheme } from 'next-themes'; import { useEffect, useId, useRef, useState } from 'react'; export const Mermaid = ({ chart }: { chart: string }) => { const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); if (!mounted) { return null; } return ; }; const MermaidContent = ({ chart }: { chart: string }) => { const id = useId(); const containerRef = useRef(null); const { resolvedTheme } = useTheme(); const [svg, setSvg] = useState(null); useEffect(() => { let cancelled = false; const render = async () => { const mermaid = (await import('mermaid')).default; mermaid.initialize({ startOnLoad: false, securityLevel: 'loose', fontFamily: 'inherit', themeCSS: 'margin: 1.5rem auto 0;', theme: resolvedTheme === 'dark' ? 'dark' : 'default', }); const { svg: rendered, bindFunctions } = await mermaid.render( id.replaceAll(':', ''), chart.replaceAll('\\n', '\n'), ); if (!cancelled) { setSvg(rendered); if (containerRef.current) { bindFunctions?.(containerRef.current); } } }; void render(); return () => { cancelled = true; }; }, [chart, id, resolvedTheme]); if (!svg) { return null; } return
; };