Kraft102's picture
fix: sql.js Docker/Alpine compatibility layer for PatternMemory and FailureMemory
5a81b95
/**
* ╔═══════════════════════════════════════════════════════════════════════════╗
* β•‘ MIND MAP VIEW COMPONENT β•‘
* ║═══════════════════════════════════════════════════════════════════════════║
* β•‘ Hierarchical idea visualization and brainstorming β•‘
* β•‘ Part of the Visual Cortex Layer β•‘
* β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
*/
import { useMemo } from 'react';
import { MermaidDiagram } from './MermaidDiagram';
import { cn } from '@/lib/utils';
export interface MindMapNode {
id: string;
label: string;
children?: MindMapNode[];
icon?: string;
style?: 'default' | 'highlight' | 'warning' | 'success';
}
export interface MindMapViewProps {
/** Central topic / root node */
root: MindMapNode;
/** Diagram title */
title?: string;
/** Custom class */
className?: string;
/** Callback when rendered */
onRender?: (svg: string) => void;
}
// Style to color mapping
const STYLE_COLORS: Record<string, string> = {
default: '#3b82f6',
highlight: '#f59e0b',
warning: '#ef4444',
success: '#22c55e',
};
export function MindMapView({
root,
title,
className,
onRender,
}: MindMapViewProps) {
const mermaidCode = useMemo(() => {
const lines: string[] = ['mindmap'];
// Recursively build mindmap structure
const buildNode = (node: MindMapNode, indent: number = 1) => {
const indentStr = ' '.repeat(indent);
const icon = node.icon ? `::icon(${node.icon})` : '';
// Root uses different syntax
if (indent === 1) {
lines.push(`${indentStr}root((${node.label}))${icon}`);
} else {
// Alternate shapes for visual variety
const shapes = ['', '()', '[]', '{{}}'];
const shapeIndex = (indent - 1) % shapes.length;
const shape = shapes[shapeIndex];
if (shape === '()') {
lines.push(`${indentStr}(${node.label})${icon}`);
} else if (shape === '[]') {
lines.push(`${indentStr}[${node.label}]${icon}`);
} else if (shape === '{{}}') {
lines.push(`${indentStr}{{${node.label}}}${icon}`);
} else {
lines.push(`${indentStr}${node.label}${icon}`);
}
}
// Process children
if (node.children && node.children.length > 0) {
node.children.forEach(child => {
buildNode(child, indent + 1);
});
}
};
buildNode(root);
return lines.join('\n');
}, [root]);
return (
<div className={cn('mindmap-view', className)}>
<MermaidDiagram
code={mermaidCode}
title={title}
theme="dark"
zoomable={true}
onRender={onRender}
/>
</div>
);
}
export default MindMapView;