🧠 Next.js + Mermaid.jsによるインタラクティブなマインドマップアプリケーション
Streamlitでのクリックイベント取得の課題を解決し、Mermaid.js nativeアプローチで実装したインタラクティブなマインドマップ可視化ツールです。ノードクリックで詳細情報をサイドバーに表示し、リアルタイムでMermaidコードを編集できます。
- フレームワーク: Next.js 14 (App Router)
- 描画ライブラリ: Mermaid.js
- 状態管理: Zustand
- スタイリング: Tailwind CSS
- 言語: TypeScript
✅ 実装済み機能
- Mermaid形式テキストの直接描画
- ノードクリックによるインタラクティブ操作
- リアルタイムサイドバー詳細表示
- エラーハンドリング
- レスポンシブデザイン
- TypeScript完全対応
/src
/app
page.tsx # メインページ
/components
MermaidRenderer.tsx # Mermaid描画コンポーネント
MermaidEditor.tsx # テキスト入力エディタ
DetailsSidebar.tsx # 詳細表示サイドバー
/store
mindmapStore.ts # Zustand状態管理
/lib
mermaidParser.ts # Mermaidパーサー
/types
mindmap.ts # TypeScript型定義
npm install
npm run dev
# または
yarn dev
# または
pnpm dev
# または
bun dev
http://localhost:3000 でアプリケーションを確認できます。
- マインドマップ表示: デフォルトでMermaid形式のマインドマップが表示されます
- ノードクリック: 任意のノードをクリックすると、右側のサイドバーに詳細情報が表示されます
- エディタモード: 「エディタを表示」ボタンでMermaidコードを直接編集できます
- リアルタイム更新: コード変更は即座にマインドマップに反映されます
// MermaidRenderer.tsx の核心部分
const renderMermaid = async () => {
const { svg } = await mermaid.render(id, mermaidCode);
containerRef.current.innerHTML = svg;
addClickEventListeners(); // SVGノードにクリックイベントを追加
};
const addClickEventListeners = () => {
const nodes = containerRef.current.querySelectorAll('.mindmap-node, .node');
nodes.forEach((node) => {
node.addEventListener('click', (event) => {
const nodeText = node.querySelector('text')?.textContent;
setSelectedNode(nodeText); // Zustand storeで状態管理
});
});
};
// mindmapStore.ts
export const useMindmapStore = create<MindmapStore>((set, get) => ({
selectedNodeId: null,
mermaidInput: `mindmap
root((中心テーマ))
起源
ロングテール
研究
論文発表`,
setSelectedNode: (nodeId: string | null) => set({ selectedNodeId: nodeId }),
parseMermaidForNodeData: (mermaidText: string) => { /* パースロジック */ }
}));
- ちらつき解決: CSS transitionを軽量なopacityエフェクトに変更
- 重複防止: イベントリスナーの重複追加を防止する仕組み
- 軽量レンダリング: Mermaid.js nativeによる高速描画
npm run build
npm run lint
このプロジェクトは以下の技術課題を解決しています:
- Streamlitでのクリックイベント取得問題 → Next.js + DOM操作による解決
- Mermaidパーサーの親子関係構築 → インデント解析アルゴリズムの改良
- CSS Animationによるちらつき → 軽量エフェクトとアニメーション無効化
- イベントリスナー重複 → フラグベースの重複防止
詳細な実装過程は tech-blog.md
を参照してください。
MIT License