Skip to content

Commit 6587181

Browse files
authored
Add architecture patterns document (#277)
1 parent eb6563d commit 6587181

File tree

13 files changed

+2763
-99
lines changed

13 files changed

+2763
-99
lines changed

components/Mermaid.tsx

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { useEffect, useRef } from 'react';
2+
import mermaid from 'mermaid';
3+
4+
type MermaidProps = {
5+
chart: string;
6+
};
7+
8+
let mermaidInitialized = false;
9+
10+
function MermaidComponent({ chart }: MermaidProps) {
11+
const ref = useRef<HTMLDivElement>(null);
12+
const idRef = useRef<string>(`mermaid-${Math.random().toString(36).substr(2, 9)}-${Date.now()}`);
13+
14+
useEffect(() => {
15+
if (!mermaidInitialized) {
16+
mermaid.initialize({
17+
startOnLoad: false,
18+
theme: 'default',
19+
securityLevel: 'loose',
20+
fontFamily: 'inherit',
21+
});
22+
mermaidInitialized = true;
23+
}
24+
25+
const renderDiagram = async () => {
26+
if (ref.current && chart) {
27+
try {
28+
const { svg } = await mermaid.render(idRef.current, chart);
29+
ref.current.innerHTML = svg;
30+
} catch (error) {
31+
console.error('Failed to render mermaid diagram:', error);
32+
ref.current.innerHTML = `<pre>Error rendering diagram: ${error}</pre>`;
33+
}
34+
}
35+
};
36+
37+
renderDiagram();
38+
}, [chart]);
39+
40+
return <div ref={ref} className="mermaid" />;
41+
}
42+
43+
import dynamic from 'next/dynamic';
44+
export const Mermaid = dynamic(() => Promise.resolve(MermaidComponent), {
45+
ssr: false,
46+
});

components/docs/CodeBlock.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import { CodeBlock } from '@/components';
2+
import { Mermaid } from '@/components/Mermaid';
23

34
export function CustomCodeBlock(props: any) {
45
const code = props.children.props.children.replace(/\n$/, '');
56
let language = props.children.props.className?.replace(/language-/, '') || '';
7+
8+
// Handle mermaid diagrams
9+
if (language === 'mermaid') {
10+
return <Mermaid chart={code} />;
11+
}
12+
613
language = language === 'js' ? 'javascript' : language === 'ts' ? 'typescript' : language;
714

815
return (

components/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export * from './Accordion/Accordion';
88
export * from './CodeBlock';
99
export * from './CopyButton';
1010
export * from './Image';
11+
export * from './Mermaid';

0 commit comments

Comments
 (0)