@aiready/components 0.13.5 → 0.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/charts/ForceDirectedGraph.js +265 -281
- package/dist/charts/ForceDirectedGraph.js.map +1 -1
- package/dist/index.d.ts +32 -77
- package/dist/index.js +428 -637
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/charts/ForceDirectedGraph.tsx +192 -393
- package/src/charts/PackageBoundaries.tsx +55 -0
- package/src/charts/constants.ts +30 -0
- package/src/charts/hooks.ts +87 -0
- package/src/charts/layout-utils.ts +93 -0
- package/src/components/icons/IconBase.tsx +38 -0
- package/src/components/icons/index.tsx +367 -0
- package/src/components/icons.tsx +3 -564
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/cn.ts","../../src/charts/NodeItem.tsx","../../src/charts/LinkItem.tsx","../../src/charts/ForceDirectedGraph.tsx"],"names":["jsxs","jsx","zoom"],"mappings":"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","file":"ForceDirectedGraph.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges class names using clsx and tailwind-merge\n * @param inputs - Class values to merge\n * @returns Merged class names\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from 'react';\nimport type { GraphNode } from './types';\n\nexport interface NodeItemProps {\n node: GraphNode;\n isSelected: boolean;\n isHovered: boolean;\n pinned: boolean;\n defaultNodeSize: number;\n defaultNodeColor: string;\n showLabel?: boolean;\n onClick?: (n: GraphNode) => void;\n onDoubleClick?: (e: React.MouseEvent, n: GraphNode) => void;\n onMouseEnter?: (n: GraphNode) => void;\n onMouseLeave?: () => void;\n onMouseDown?: (e: React.MouseEvent, n: GraphNode) => void;\n}\n\nexport const NodeItem: React.FC<NodeItemProps> = ({\n node,\n isSelected,\n isHovered,\n pinned,\n defaultNodeSize,\n defaultNodeColor,\n showLabel = true,\n onClick,\n onDoubleClick,\n onMouseEnter,\n onMouseLeave,\n onMouseDown,\n}) => {\n const nodeSize = node.size || defaultNodeSize;\n const nodeColor = node.color || defaultNodeColor;\n\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n\n return (\n <g\n key={node.id}\n className=\"cursor-pointer node\"\n data-id={node.id}\n transform={`translate(${x},${y})`}\n onClick={() => onClick?.(node)}\n onDoubleClick={(e) => onDoubleClick?.(e, node)}\n onMouseEnter={() => onMouseEnter?.(node)}\n onMouseLeave={() => onMouseLeave?.()}\n onMouseDown={(e) => onMouseDown?.(e, node)}\n >\n <circle\n r={nodeSize}\n fill={nodeColor}\n stroke={isSelected ? '#000' : isHovered ? '#666' : 'none'}\n strokeWidth={pinned ? 3 : isSelected ? 2.5 : isHovered ? 2 : 1.5}\n opacity={isHovered || isSelected ? 1 : 0.9}\n />\n {pinned && (\n <circle\n r={nodeSize + 4}\n fill=\"none\"\n stroke=\"#ff6b6b\"\n strokeWidth={1}\n opacity={0.5}\n className=\"pointer-events-none\"\n />\n )}\n {showLabel && node.label && (\n <text\n y={nodeSize + 15}\n fill=\"#333\"\n fontSize=\"12\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n pointerEvents=\"none\"\n className=\"select-none\"\n >\n {node.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default NodeItem;\n","import React from 'react';\nimport type { GraphLink, GraphNode } from './types';\n\nexport interface LinkItemProps {\n link: GraphLink;\n onClick?: (l: GraphLink) => void;\n defaultWidth?: number;\n showLabel?: boolean;\n nodes?: GraphNode[]; // Optional nodes array to resolve string IDs to node objects\n}\n\nexport const LinkItem: React.FC<LinkItemProps> = ({\n link,\n onClick,\n defaultWidth,\n showLabel = true,\n nodes = [],\n}) => {\n const src =\n (link.source as any)?.id ??\n (typeof link.source === 'string' ? link.source : undefined);\n const tgt =\n (link.target as any)?.id ??\n (typeof link.target === 'string' ? link.target : undefined);\n\n // Helper to get node position from source/target (which could be node object or string ID)\n const getNodePosition = (\n nodeOrId: string | GraphNode\n ): { x: number; y: number } | null => {\n if (typeof nodeOrId === 'object' && nodeOrId !== null) {\n // It's a node object\n const node = nodeOrId as GraphNode;\n return { x: node.x ?? 0, y: node.y ?? 0 };\n } else if (typeof nodeOrId === 'string') {\n // It's a string ID, try to find in nodes array\n const found = nodes.find((n) => n.id === nodeOrId);\n if (found) return { x: found.x ?? 0, y: found.y ?? 0 };\n }\n return null;\n };\n\n const sourcePos = getNodePosition(link.source);\n const targetPos = getNodePosition(link.target);\n\n // If we can't get positions, render nothing (or a placeholder)\n if (!sourcePos || !targetPos) {\n return null;\n }\n\n // Calculate midpoint for label positioning\n const midX = (sourcePos.x + targetPos.x) / 2;\n const midY = (sourcePos.y + targetPos.y) / 2;\n\n return (\n <g>\n <line\n x1={sourcePos.x}\n y1={sourcePos.y}\n x2={targetPos.x}\n y2={targetPos.y}\n data-source={src}\n data-target={tgt}\n stroke={link.color}\n strokeWidth={link.width ?? defaultWidth ?? 1}\n opacity={0.6}\n className=\"cursor-pointer transition-opacity hover:opacity-100\"\n onClick={() => onClick?.(link)}\n />\n {showLabel && link.label && (\n <text\n x={midX}\n y={midY}\n fill=\"#666\"\n fontSize=\"10\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n pointerEvents=\"none\"\n >\n {link.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default LinkItem;\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport * as d3 from 'd3';\nimport { cn } from '../utils/cn';\nimport NodeItem from './NodeItem';\nimport LinkItem from './LinkItem';\n\nimport { GraphNode, GraphLink, LayoutType } from './types';\nexport type { GraphNode, GraphLink, LayoutType };\n\nexport interface ForceDirectedGraphHandle {\n pinAll: () => void;\n unpinAll: () => void;\n resetLayout: () => void;\n fitView: () => void;\n getPinnedNodes: () => string[];\n /**\n * Enable or disable drag mode for nodes.\n * @param enabled - When true, nodes can be dragged; when false, dragging is disabled\n */\n setDragMode: (enabled: boolean) => void;\n setLayout: (layout: LayoutType) => void;\n getLayout: () => LayoutType;\n}\n\nexport interface ForceDirectedGraphProps {\n nodes: GraphNode[];\n links: GraphLink[];\n width: number;\n height: number;\n enableZoom?: boolean;\n enableDrag?: boolean;\n onNodeClick?: (node: GraphNode) => void;\n onNodeHover?: (node: GraphNode | null) => void;\n onLinkClick?: (link: GraphLink) => void;\n selectedNodeId?: string;\n hoveredNodeId?: string;\n defaultNodeColor?: string;\n defaultNodeSize?: number;\n defaultLinkColor?: string;\n defaultLinkWidth?: number;\n showNodeLabels?: boolean;\n showLinkLabels?: boolean;\n className?: string;\n manualLayout?: boolean;\n /**\n * Callback fired when manual layout mode changes.\n * @param enabled - True when manual layout mode is enabled, false when disabled\n */\n onManualLayoutChange?: (enabled: boolean) => void;\n packageBounds?: Record<string, { x: number; y: number; r: number }>;\n layout?: LayoutType;\n onLayoutChange?: (layout: LayoutType) => void;\n}\n\nexport const ForceDirectedGraph = forwardRef<\n ForceDirectedGraphHandle,\n ForceDirectedGraphProps\n>(\n (\n {\n nodes: initialNodes,\n links: initialLinks,\n width,\n height,\n enableZoom = true,\n enableDrag = true,\n onNodeClick,\n onNodeHover,\n onLinkClick,\n selectedNodeId,\n hoveredNodeId,\n defaultNodeColor = '#69b3a2',\n defaultNodeSize = 10,\n defaultLinkColor = '#999',\n defaultLinkWidth = 1,\n showNodeLabels = true,\n showLinkLabels = false,\n className,\n manualLayout = false,\n onManualLayoutChange,\n packageBounds,\n layout: externalLayout,\n onLayoutChange,\n },\n ref\n ) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const gRef = useRef<SVGGElement>(null);\n const [transform, setTransform] = useState({ k: 1, x: 0, y: 0 });\n const transformRef = useRef(transform);\n const dragNodeRef = useRef<GraphNode | null>(null);\n const dragActiveRef = useRef(false);\n const [pinnedNodes, setPinnedNodes] = useState<Set<string>>(new Set());\n const internalDragEnabledRef = useRef(enableDrag);\n const [layout, setLayout] = useState<LayoutType>(externalLayout || 'force');\n\n // Sync external layout prop with internal state\n useEffect(() => {\n if (externalLayout && externalLayout !== layout) {\n setLayout(externalLayout);\n }\n }, [externalLayout]);\n\n // Handle layout change and notify parent\n const handleLayoutChange = useCallback(\n (newLayout: LayoutType) => {\n setLayout(newLayout);\n onLayoutChange?.(newLayout);\n },\n [onLayoutChange]\n );\n\n // Update the ref when enableDrag prop changes\n useEffect(() => {\n internalDragEnabledRef.current = enableDrag;\n }, [enableDrag]);\n\n // Static layout - compute positions directly without force simulation\n const nodes = React.useMemo(() => {\n if (!initialNodes || !initialNodes.length) return initialNodes;\n\n const centerX = width / 2;\n const centerY = height / 2;\n\n // For force layout, use random positions but don't animate\n if (layout === 'force') {\n return initialNodes.map((n: any) => ({\n ...n,\n x: Math.random() * width,\n y: Math.random() * height,\n }));\n }\n\n // For circular layout, arrange in a circle\n if (layout === 'circular') {\n const radius = Math.min(width, height) * 0.35;\n return initialNodes.map((n: any, i: number) => ({\n ...n,\n x:\n centerX +\n Math.cos((2 * Math.PI * i) / initialNodes.length) * radius,\n y:\n centerY +\n Math.sin((2 * Math.PI * i) / initialNodes.length) * radius,\n }));\n }\n\n // For hierarchical layout, arrange in a grid\n if (layout === 'hierarchical') {\n const cols = Math.ceil(Math.sqrt(initialNodes.length));\n const spacingX = width / (cols + 1);\n const spacingY = height / (Math.ceil(initialNodes.length / cols) + 1);\n return initialNodes.map((n: any, i: number) => ({\n ...n,\n x: spacingX * ((i % cols) + 1),\n y: spacingY * (Math.floor(i / cols) + 1),\n }));\n }\n\n return initialNodes;\n }, [initialNodes, width, height, layout]);\n\n // Static links - just use initial links\n const links = initialLinks;\n\n // No force simulation - static layout only\n const restart = React.useCallback(() => {\n // No-op for static layout\n }, []);\n\n const stop = React.useCallback(() => {\n // No-op for static layout\n }, []);\n\n const setForcesEnabled = React.useCallback((enabled?: boolean) => {\n // No-op for static layout; accept optional `enabled` arg for API compatibility\n void enabled;\n }, []);\n\n // Remove package bounds effect - boundary packing disabled for faster convergence\n\n // Apply layout-specific positioning when layout changes\n useEffect(() => {\n if (!nodes || nodes.length === 0) return;\n\n const applyLayout = () => {\n const centerX = width / 2;\n const centerY = height / 2;\n\n if (layout === 'circular') {\n // Place all nodes in a circle\n const radius = Math.min(width, height) * 0.35;\n nodes.forEach((node, i) => {\n const angle = (2 * Math.PI * i) / nodes.length;\n node.fx = centerX + Math.cos(angle) * radius;\n node.fy = centerY + Math.sin(angle) * radius;\n });\n } else if (layout === 'hierarchical') {\n // Place packages in rows, files within packages in columns\n const groups = new Map<string, typeof nodes>();\n nodes.forEach((n: any) => {\n const key = n.packageGroup || n.group || 'root';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(n);\n });\n\n const groupArray = Array.from(groups.entries());\n const cols = Math.ceil(Math.sqrt(groupArray.length));\n const groupSpacingX = (width * 0.8) / cols;\n const groupSpacingY =\n (height * 0.8) / Math.ceil(groupArray.length / cols);\n\n groupArray.forEach(([groupKey, groupNodes], gi) => {\n const col = gi % cols;\n const row = Math.floor(gi / cols);\n const groupX = (col + 0.5) * groupSpacingX;\n const groupY = (row + 0.5) * groupSpacingY;\n\n // Place group nodes in a small circle within their area\n if (groupKey.startsWith('pkg:') || groupKey === groupKey) {\n groupNodes.forEach((n, ni) => {\n const angle = (2 * Math.PI * ni) / groupNodes.length;\n const r = Math.min(80, 20 + groupNodes.length * 8);\n n.fx = groupX + Math.cos(angle) * r;\n n.fy = groupY + Math.sin(angle) * r;\n });\n }\n });\n }\n // 'force' layout - just restart with default behavior (no fx/fy set)\n\n try {\n restart();\n } catch (e) {\n void e;\n }\n };\n\n applyLayout();\n }, [layout, nodes, width, height, restart]);\n\n // If manual layout is enabled or any nodes are pinned, disable forces\n useEffect(() => {\n try {\n if (manualLayout || pinnedNodes.size > 0) setForcesEnabled(false);\n else setForcesEnabled(true);\n } catch (e) {\n void e;\n }\n }, [manualLayout, pinnedNodes, setForcesEnabled]);\n\n // Expose imperative handle for parent components\n useImperativeHandle(\n ref,\n () => ({\n pinAll: () => {\n const newPinned = new Set<string>();\n nodes.forEach((node) => {\n node.fx = node.x;\n node.fy = node.y;\n newPinned.add(node.id);\n });\n setPinnedNodes(newPinned);\n restart();\n },\n\n unpinAll: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n\n resetLayout: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n\n fitView: () => {\n if (!svgRef.current || !nodes.length) return;\n\n // Calculate bounds\n let minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity;\n nodes.forEach((node) => {\n if (node.x !== undefined && node.y !== undefined) {\n const size = node.size || 10;\n minX = Math.min(minX, node.x - size);\n maxX = Math.max(maxX, node.x + size);\n minY = Math.min(minY, node.y - size);\n maxY = Math.max(maxY, node.y + size);\n }\n });\n\n if (!isFinite(minX)) return;\n\n const padding = 40;\n const nodeWidth = maxX - minX;\n const nodeHeight = maxY - minY;\n const scale = Math.min(\n (width - padding * 2) / nodeWidth,\n (height - padding * 2) / nodeHeight,\n 10\n );\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n\n const x = width / 2 - centerX * scale;\n const y = height / 2 - centerY * scale;\n\n if (gRef.current && svgRef.current) {\n const svg = d3.select(svgRef.current);\n const newTransform = d3.zoomIdentity.translate(x, y).scale(scale);\n svg\n .transition()\n .duration(300)\n .call((d3 as any).zoom().transform as any, newTransform);\n setTransform(newTransform);\n }\n },\n\n getPinnedNodes: () => Array.from(pinnedNodes),\n\n setDragMode: (enabled: boolean) => {\n internalDragEnabledRef.current = enabled;\n },\n\n setLayout: (newLayout: LayoutType) => {\n handleLayoutChange(newLayout);\n },\n\n getLayout: () => layout,\n }),\n [nodes, pinnedNodes, restart, width, height, layout, handleLayoutChange]\n );\n\n // Notify parent when manual layout mode changes (uses the prop so it's not unused)\n useEffect(() => {\n try {\n if (typeof onManualLayoutChange === 'function')\n onManualLayoutChange(manualLayout);\n } catch (e) {\n void e;\n }\n }, [manualLayout, onManualLayoutChange]);\n\n // Set up zoom behavior\n useEffect(() => {\n if (!enableZoom || !svgRef.current || !gRef.current) return;\n\n const svg = d3.select(svgRef.current);\n const g = d3.select(gRef.current);\n\n const zoom = (d3 as any)\n .zoom()\n .scaleExtent([0.1, 10])\n .on('zoom', (event: any) => {\n g.attr('transform', event.transform);\n transformRef.current = event.transform;\n setTransform(event.transform);\n });\n\n svg.call(zoom);\n\n return () => {\n svg.on('.zoom', null);\n };\n }, [enableZoom]);\n\n // Run a one-time DOM positioning pass when nodes/links change so elements\n // rendered by React are positioned to the simulation's seeded coordinates\n useEffect(() => {\n if (!gRef.current) return;\n try {\n const g = d3.select(gRef.current);\n g.selectAll('g.node').each(function (this: any) {\n const datum = d3.select(this).datum() as any;\n if (!datum) return;\n d3.select(this).attr(\n 'transform',\n `translate(${datum.x || 0},${datum.y || 0})`\n );\n });\n\n g.selectAll('line').each(function (this: any) {\n const l = d3.select(this).datum() as any;\n if (!l) return;\n const s: any =\n typeof l.source === 'object'\n ? l.source\n : nodes.find((n) => n.id === l.source) || l.source;\n const t: any =\n typeof l.target === 'object'\n ? l.target\n : nodes.find((n) => n.id === l.target) || l.target;\n if (!s || !t) return;\n d3.select(this)\n .attr('x1', s.x)\n .attr('y1', s.y)\n .attr('x2', t.x)\n .attr('y2', t.y);\n });\n } catch (e) {\n void e;\n }\n }, [nodes, links]);\n\n // Set up drag behavior with global listeners for smoother dragging\n const handleDragStart = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n if (!enableDrag) return;\n event.preventDefault();\n event.stopPropagation();\n // pause forces while dragging to avoid the whole graph moving\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n try {\n stop();\n } catch (e) {\n void e;\n }\n },\n [enableDrag, restart]\n );\n\n useEffect(() => {\n if (!enableDrag) return;\n\n const handleWindowMove = (event: MouseEvent) => {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const t: any = transformRef.current;\n const x = (event.clientX - rect.left - t.x) / t.k;\n const y = (event.clientY - rect.top - t.y) / t.k;\n dragNodeRef.current.fx = x;\n dragNodeRef.current.fy = y;\n };\n\n const handleWindowUp = () => {\n if (!dragActiveRef.current) return;\n // Keep fx/fy set to pin the node where it was dropped.\n try {\n setForcesEnabled(true);\n restart();\n } catch (e) {\n void e;\n }\n dragNodeRef.current = null;\n dragActiveRef.current = false;\n };\n\n const handleWindowLeave = (event: MouseEvent) => {\n if (event.relatedTarget === null) handleWindowUp();\n };\n\n window.addEventListener('mousemove', handleWindowMove);\n window.addEventListener('mouseup', handleWindowUp);\n window.addEventListener('mouseout', handleWindowLeave);\n window.addEventListener('blur', handleWindowUp);\n\n return () => {\n window.removeEventListener('mousemove', handleWindowMove);\n window.removeEventListener('mouseup', handleWindowUp);\n window.removeEventListener('mouseout', handleWindowLeave);\n window.removeEventListener('blur', handleWindowUp);\n };\n }, [enableDrag]);\n\n // Attach d3.drag behavior to node groups rendered by React. This helps make\n // dragging more robust across transforms and pointer behaviors.\n useEffect(() => {\n if (!gRef.current || !enableDrag) return;\n const g = d3.select(gRef.current);\n const dragBehavior = (d3 as any)\n .drag()\n .on('start', function (this: any, event: any) {\n try {\n const target =\n (event.sourceEvent && (event.sourceEvent.target as Element)) ||\n (event.target as Element);\n const grp = target.closest?.('g.node') as Element | null;\n const id = grp?.getAttribute('data-id');\n if (!id) return;\n const node = nodes.find((n) => n.id === id) as\n | GraphNode\n | undefined;\n if (!node) return;\n if (!internalDragEnabledRef.current) return;\n if (!event.active) restart();\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n } catch (e) {\n void e;\n }\n })\n .on('drag', function (this: any, event: any) {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const x =\n (event.sourceEvent.clientX - rect.left - transform.x) / transform.k;\n const y =\n (event.sourceEvent.clientY - rect.top - transform.y) / transform.k;\n dragNodeRef.current.fx = x;\n dragNodeRef.current.fy = y;\n })\n .on('end', function () {\n // re-enable forces when drag ends\n try {\n setForcesEnabled(true);\n restart();\n } catch (e) {\n void e;\n }\n });\n\n try {\n g.selectAll('g.node').call(dragBehavior as any);\n } catch (e) {\n void e;\n }\n\n return () => {\n try {\n g.selectAll('g.node').on('.drag', null as any);\n } catch (e) {\n void e;\n }\n };\n }, [gRef, enableDrag, nodes, transform, restart]);\n\n const handleNodeClick = useCallback(\n (node: GraphNode) => {\n onNodeClick?.(node);\n },\n [onNodeClick]\n );\n\n const handleNodeDoubleClick = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n event.stopPropagation();\n if (!enableDrag) return;\n if (node.fx === null || node.fx === undefined) {\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n } else {\n node.fx = null;\n node.fy = null;\n setPinnedNodes((prev) => {\n const next = new Set(prev);\n next.delete(node.id);\n return next;\n });\n }\n restart();\n },\n [enableDrag, restart]\n );\n\n const handleCanvasDoubleClick = useCallback(() => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n }, [nodes, restart]);\n\n const handleNodeMouseEnter = useCallback(\n (node: GraphNode) => {\n onNodeHover?.(node);\n },\n [onNodeHover]\n );\n\n const handleNodeMouseLeave = useCallback(() => {\n onNodeHover?.(null);\n }, [onNodeHover]);\n\n const handleLinkClick = useCallback(\n (link: GraphLink) => {\n onLinkClick?.(link);\n },\n [onLinkClick]\n );\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={cn('bg-white dark:bg-gray-900', className)}\n onDoubleClick={handleCanvasDoubleClick}\n >\n <defs>\n {/* Arrow marker for directed graphs */}\n <marker\n id=\"arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"20\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill={defaultLinkColor} />\n </marker>\n </defs>\n\n <g ref={gRef}>\n {/* Render links via LinkItem (positions updated by D3) */}\n {links.map((link, i) => (\n <LinkItem\n key={`link-${i}`}\n link={link as GraphLink}\n onClick={handleLinkClick}\n defaultWidth={defaultLinkWidth}\n showLabel={showLinkLabels}\n nodes={nodes}\n />\n ))}\n\n {/* Render nodes via NodeItem (D3 will set transforms) */}\n {nodes.map((node) => (\n <NodeItem\n key={node.id}\n node={node as GraphNode}\n isSelected={selectedNodeId === node.id}\n isHovered={hoveredNodeId === node.id}\n pinned={pinnedNodes.has(node.id)}\n defaultNodeSize={defaultNodeSize}\n defaultNodeColor={defaultNodeColor}\n showLabel={showNodeLabels}\n onClick={handleNodeClick}\n onDoubleClick={handleNodeDoubleClick}\n onMouseEnter={handleNodeMouseEnter}\n onMouseLeave={handleNodeMouseLeave}\n onMouseDown={handleDragStart}\n />\n ))}\n {/* Package boundary circles (from parent pack layout) - drawn on top for visibility */}\n {packageBounds && Object.keys(packageBounds).length > 0 && (\n <g className=\"package-boundaries\" pointerEvents=\"none\">\n {Object.entries(packageBounds).map(([pid, b]) => (\n <g key={pid}>\n <circle\n cx={b.x}\n cy={b.y}\n r={b.r}\n fill=\"rgba(148,163,184,0.06)\"\n stroke=\"#475569\"\n strokeWidth={2}\n strokeDasharray=\"6 6\"\n opacity={0.9}\n />\n <text\n x={b.x}\n y={Math.max(12, b.y - b.r + 14)}\n fill=\"#475569\"\n fontSize={11}\n textAnchor=\"middle\"\n pointerEvents=\"none\"\n >\n {pid.replace(/^pkg:/, '')}\n </text>\n </g>\n ))}\n </g>\n )}\n </g>\n </svg>\n );\n }\n);\n\nForceDirectedGraph.displayName = 'ForceDirectedGraph';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/charts/NodeItem.tsx","../../src/charts/LinkItem.tsx","../../src/charts/constants.ts","../../src/charts/PackageBoundaries.tsx","../../src/charts/layout-utils.ts","../../src/charts/hooks.ts","../../src/charts/ForceDirectedGraph.tsx"],"names":["jsxs","jsx","d3","zoom","useEffect"],"mappings":"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","file":"ForceDirectedGraph.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges class names using clsx and tailwind-merge\n * @param inputs - Class values to merge\n * @returns Merged class names\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from 'react';\nimport type { GraphNode } from './types';\n\nexport interface NodeItemProps {\n node: GraphNode;\n isSelected: boolean;\n isHovered: boolean;\n pinned: boolean;\n defaultNodeSize: number;\n defaultNodeColor: string;\n showLabel?: boolean;\n onClick?: (n: GraphNode) => void;\n onDoubleClick?: (e: React.MouseEvent, n: GraphNode) => void;\n onMouseEnter?: (n: GraphNode) => void;\n onMouseLeave?: () => void;\n onMouseDown?: (e: React.MouseEvent, n: GraphNode) => void;\n}\n\nexport const NodeItem: React.FC<NodeItemProps> = ({\n node,\n isSelected,\n isHovered,\n pinned,\n defaultNodeSize,\n defaultNodeColor,\n showLabel = true,\n onClick,\n onDoubleClick,\n onMouseEnter,\n onMouseLeave,\n onMouseDown,\n}) => {\n const nodeSize = node.size || defaultNodeSize;\n const nodeColor = node.color || defaultNodeColor;\n\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n\n return (\n <g\n key={node.id}\n className=\"cursor-pointer node\"\n data-id={node.id}\n transform={`translate(${x},${y})`}\n onClick={() => onClick?.(node)}\n onDoubleClick={(e) => onDoubleClick?.(e, node)}\n onMouseEnter={() => onMouseEnter?.(node)}\n onMouseLeave={() => onMouseLeave?.()}\n onMouseDown={(e) => onMouseDown?.(e, node)}\n >\n <circle\n r={nodeSize}\n fill={nodeColor}\n stroke={isSelected ? '#000' : isHovered ? '#666' : 'none'}\n strokeWidth={pinned ? 3 : isSelected ? 2.5 : isHovered ? 2 : 1.5}\n opacity={isHovered || isSelected ? 1 : 0.9}\n />\n {pinned && (\n <circle\n r={nodeSize + 4}\n fill=\"none\"\n stroke=\"#ff6b6b\"\n strokeWidth={1}\n opacity={0.5}\n className=\"pointer-events-none\"\n />\n )}\n {showLabel && node.label && (\n <text\n y={nodeSize + 15}\n fill=\"#333\"\n fontSize=\"12\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n pointerEvents=\"none\"\n className=\"select-none\"\n >\n {node.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default NodeItem;\n","import React from 'react';\nimport type { GraphLink, GraphNode } from './types';\n\nexport interface LinkItemProps {\n link: GraphLink;\n onClick?: (l: GraphLink) => void;\n defaultWidth?: number;\n showLabel?: boolean;\n nodes?: GraphNode[]; // Optional nodes array to resolve string IDs to node objects\n}\n\nexport const LinkItem: React.FC<LinkItemProps> = ({\n link,\n onClick,\n defaultWidth,\n showLabel = true,\n nodes = [],\n}) => {\n const src =\n (link.source as any)?.id ??\n (typeof link.source === 'string' ? link.source : undefined);\n const tgt =\n (link.target as any)?.id ??\n (typeof link.target === 'string' ? link.target : undefined);\n\n // Helper to get node position from source/target (which could be node object or string ID)\n const getNodePosition = (\n nodeOrId: string | GraphNode\n ): { x: number; y: number } | null => {\n if (typeof nodeOrId === 'object' && nodeOrId !== null) {\n // It's a node object\n const node = nodeOrId as GraphNode;\n return { x: node.x ?? 0, y: node.y ?? 0 };\n } else if (typeof nodeOrId === 'string') {\n // It's a string ID, try to find in nodes array\n const found = nodes.find((n) => n.id === nodeOrId);\n if (found) return { x: found.x ?? 0, y: found.y ?? 0 };\n }\n return null;\n };\n\n const sourcePos = getNodePosition(link.source);\n const targetPos = getNodePosition(link.target);\n\n // If we can't get positions, render nothing (or a placeholder)\n if (!sourcePos || !targetPos) {\n return null;\n }\n\n // Calculate midpoint for label positioning\n const midX = (sourcePos.x + targetPos.x) / 2;\n const midY = (sourcePos.y + targetPos.y) / 2;\n\n return (\n <g>\n <line\n x1={sourcePos.x}\n y1={sourcePos.y}\n x2={targetPos.x}\n y2={targetPos.y}\n data-source={src}\n data-target={tgt}\n stroke={link.color}\n strokeWidth={link.width ?? defaultWidth ?? 1}\n opacity={0.6}\n className=\"cursor-pointer transition-opacity hover:opacity-100\"\n onClick={() => onClick?.(link)}\n />\n {showLabel && link.label && (\n <text\n x={midX}\n y={midY}\n fill=\"#666\"\n fontSize=\"10\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n pointerEvents=\"none\"\n >\n {link.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default LinkItem;\n","/**\n * Default visual constants for the ForceDirectedGraph component.\n */\nexport const DEFAULT_NODE_COLOR = '#64748b';\nexport const DEFAULT_NODE_SIZE = 10;\nexport const DEFAULT_LINK_COLOR = '#94a3b8';\nexport const DEFAULT_LINK_WIDTH = 1;\n\n/**\n * Layout and interaction thresholds.\n */\nexport const CIRCULAR_LAYOUT_RADIUS_RATIO = 0.35;\nexport const FIT_VIEW_PADDING = 40;\nexport const ZOOM_MIN_SCALE = 0.1;\nexport const ZOOM_MAX_SCALE = 10;\n\n/**\n * Transition and animation durations.\n */\nexport const TRANSITION_DURATION_MS = 300;\n\n/**\n * Package boundary styling.\n */\nexport const PACKAGE_BOUNDARY_FILL = 'rgba(148,163,184,0.06)';\nexport const PACKAGE_BOUNDARY_STROKE = '#475569';\nexport const PACKAGE_BOUNDARY_STROKE_WIDTH = 2;\nexport const PACKAGE_BOUNDARY_DASH = '6 6';\nexport const PACKAGE_LABEL_FONT_SIZE = 11;\nexport const PACKAGE_LABEL_COLOR = '#475569';\n","import React from 'react';\nimport {\n PACKAGE_BOUNDARY_FILL,\n PACKAGE_BOUNDARY_STROKE,\n PACKAGE_BOUNDARY_STROKE_WIDTH,\n PACKAGE_BOUNDARY_DASH,\n PACKAGE_LABEL_COLOR,\n PACKAGE_LABEL_FONT_SIZE,\n} from './constants';\n\ninterface PackageBoundariesProps {\n packageBounds: Record<string, { x: number; y: number; r: number }>;\n}\n\n/**\n * Renders the circular boundaries and labels for package groups in the force-directed graph.\n *\n * @lastUpdated 2026-03-18\n */\nexport const PackageBoundaries: React.FC<PackageBoundariesProps> = ({\n packageBounds,\n}) => {\n if (!packageBounds || Object.keys(packageBounds).length === 0) return null;\n\n return (\n <g className=\"package-boundaries\" pointerEvents=\"none\">\n {Object.entries(packageBounds).map(([pid, b]) => (\n <g key={pid}>\n <circle\n cx={b.x}\n cy={b.y}\n r={b.r}\n fill={PACKAGE_BOUNDARY_FILL}\n stroke={PACKAGE_BOUNDARY_STROKE}\n strokeWidth={PACKAGE_BOUNDARY_STROKE_WIDTH}\n strokeDasharray={PACKAGE_BOUNDARY_DASH}\n opacity={0.9}\n />\n <text\n x={b.x}\n y={Math.max(12, b.y - b.r + 14)}\n fill={PACKAGE_LABEL_COLOR}\n fontSize={PACKAGE_LABEL_FONT_SIZE}\n textAnchor=\"middle\"\n pointerEvents=\"none\"\n >\n {pid.replace(/^pkg:/, '')}\n </text>\n </g>\n ))}\n </g>\n );\n};\n\nPackageBoundaries.displayName = 'PackageBoundaries';\n","import { GraphNode } from './types';\nimport { CIRCULAR_LAYOUT_RADIUS_RATIO } from './constants';\n\n/**\n * Calculates node positions for a circular layout.\n *\n * @param nodes - Array of dependency nodes.\n * @param width - Canvas width.\n * @param height - Canvas height.\n * @lastUpdated 2026-03-18\n */\nexport function applyCircularLayout(\n nodes: GraphNode[],\n width: number,\n height: number\n): void {\n const centerX = width / 2;\n const centerY = height / 2;\n const radius = Math.min(width, height) * CIRCULAR_LAYOUT_RADIUS_RATIO;\n\n nodes.forEach((node, i) => {\n const angle = (2 * Math.PI * i) / nodes.length;\n node.fx = centerX + Math.cos(angle) * radius;\n node.fy = centerY + Math.sin(angle) * radius;\n node.x = node.fx;\n node.y = node.fy;\n });\n}\n\n/**\n * Calculates node positions for a hierarchical layout by grouping packages.\n *\n * @param nodes - Array of dependency nodes.\n * @param width - Canvas width.\n * @param height - Canvas height.\n * @lastUpdated 2026-03-18\n */\nexport function applyHierarchicalLayout(\n nodes: GraphNode[],\n width: number,\n height: number\n): void {\n const groups = new Map<string, GraphNode[]>();\n nodes.forEach((n: any) => {\n const key = n.packageGroup || n.group || 'root';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(n);\n });\n\n const groupArray = Array.from(groups.entries());\n const cols = Math.ceil(Math.sqrt(groupArray.length));\n const groupSpacingX = (width * 0.8) / cols;\n const groupSpacingY = (height * 0.8) / Math.ceil(groupArray.length / cols);\n\n groupArray.forEach(([groupKey, groupNodes], gi) => {\n const col = gi % cols;\n const row = Math.floor(gi / cols);\n const groupX = (col + 0.5) * groupSpacingX;\n const groupY = (row + 0.5) * groupSpacingY;\n\n if (groupKey.startsWith('pkg:') || groupKey === groupKey) {\n groupNodes.forEach((n, ni) => {\n const angle = (2 * Math.PI * ni) / groupNodes.length;\n const r = Math.min(80, 20 + groupNodes.length * 8);\n n.fx = groupX + Math.cos(angle) * r;\n n.fy = groupY + Math.sin(angle) * r;\n n.x = n.fx;\n n.y = n.fy;\n });\n }\n });\n}\n\n/**\n * Calculates initial random positions for nodes in a force-directed layout.\n *\n * @param nodes - Array of dependency nodes.\n * @param width - Canvas width.\n * @param height - Canvas height.\n * @lastUpdated 2026-03-18\n */\nexport function applyInitialForceLayout(\n nodes: GraphNode[],\n width: number,\n height: number\n): void {\n nodes.forEach((node) => {\n if (node.fx === undefined || node.fx === null) {\n node.x = Math.random() * width;\n node.y = Math.random() * height;\n }\n });\n}\n","import { useEffect } from 'react';\nimport * as d3 from 'd3';\nimport { GraphNode } from './types';\n\n/**\n * Hook for managing D3 zoom behavior on an SVG element.\n */\nexport function useGraphZoom(\n svgRef: React.RefObject<SVGSVGElement | null>,\n gRef: React.RefObject<SVGGElement | null>,\n enableZoom: boolean,\n setTransform: (transform: { k: number; x: number; y: number }) => void,\n transformRef: React.MutableRefObject<{ k: number; x: number; y: number }>\n) {\n useEffect(() => {\n if (!enableZoom || !svgRef.current || !gRef.current) return;\n\n const svg = d3.select(svgRef.current);\n const g = d3.select(gRef.current);\n\n const zoom = (d3 as any)\n .zoom()\n .scaleExtent([0.1, 10])\n .on('zoom', (event: any) => {\n g.attr('transform', event.transform);\n transformRef.current = event.transform;\n setTransform(event.transform);\n });\n\n svg.call(zoom);\n\n return () => {\n svg.on('.zoom', null);\n };\n }, [enableZoom, svgRef, gRef, setTransform, transformRef]);\n}\n\n/**\n * Hook for managing window-level drag events for smooth node dragging.\n */\nexport function useWindowDrag(\n enableDrag: boolean,\n svgRef: React.RefObject<SVGSVGElement | null>,\n transformRef: React.MutableRefObject<{ k: number; x: number; y: number }>,\n dragActiveRef: React.MutableRefObject<boolean>,\n dragNodeRef: React.MutableRefObject<GraphNode | null>,\n onDragEnd: () => void\n) {\n useEffect(() => {\n if (!enableDrag) return;\n\n const handleWindowMove = (event: MouseEvent) => {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const t: any = transformRef.current;\n const x = (event.clientX - rect.left - t.x) / t.k;\n const y = (event.clientY - rect.top - t.y) / t.k;\n dragNodeRef.current.fx = x;\n dragNodeRef.current.fy = y;\n };\n\n const handleWindowUp = () => {\n if (!dragActiveRef.current) return;\n onDragEnd();\n dragNodeRef.current = null;\n dragActiveRef.current = false;\n };\n\n const handleWindowLeave = (event: MouseEvent) => {\n if (event.relatedTarget === null) handleWindowUp();\n };\n\n window.addEventListener('mousemove', handleWindowMove);\n window.addEventListener('mouseup', handleWindowUp);\n window.addEventListener('mouseout', handleWindowLeave);\n window.addEventListener('blur', handleWindowUp);\n\n return () => {\n window.removeEventListener('mousemove', handleWindowMove);\n window.removeEventListener('mouseup', handleWindowUp);\n window.removeEventListener('mouseout', handleWindowLeave);\n window.removeEventListener('blur', handleWindowUp);\n };\n }, [enableDrag, svgRef, transformRef, dragActiveRef, dragNodeRef, onDragEnd]);\n}\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport * as d3 from 'd3';\nimport { cn } from '../utils/cn';\nimport NodeItem from './NodeItem';\nimport LinkItem from './LinkItem';\nimport { PackageBoundaries } from './PackageBoundaries';\nimport {\n applyCircularLayout,\n applyHierarchicalLayout,\n applyInitialForceLayout,\n} from './layout-utils';\nimport {\n DEFAULT_NODE_COLOR,\n DEFAULT_NODE_SIZE,\n DEFAULT_LINK_COLOR,\n DEFAULT_LINK_WIDTH,\n FIT_VIEW_PADDING,\n TRANSITION_DURATION_MS,\n} from './constants';\nimport { useGraphZoom, useWindowDrag } from './hooks';\n\nimport { GraphNode, GraphLink, LayoutType } from './types';\nexport type { GraphNode, GraphLink, LayoutType };\n\n/**\n * Handle for imperative actions on the ForceDirectedGraph.\n */\nexport interface ForceDirectedGraphHandle {\n /** Pins all nodes to their current positions. */\n pinAll: () => void;\n /** Unpins all nodes, allowing them to move freely in the simulation. */\n unpinAll: () => void;\n /** Resets the layout by unpinning all nodes and restarting the simulation. */\n resetLayout: () => void;\n /** Rescales and re-centers the view to fit all nodes. */\n fitView: () => void;\n /** Returns the IDs of all currently pinned nodes. */\n getPinnedNodes: () => string[];\n /**\n * Enable or disable drag mode for nodes.\n * @param enabled - When true, nodes can be dragged; when false, dragging is disabled\n */\n setDragMode: (enabled: boolean) => void;\n /** Sets the current layout type. */\n setLayout: (layout: LayoutType) => void;\n /** Gets the current layout type. */\n getLayout: () => LayoutType;\n}\n\n/**\n * Props for the ForceDirectedGraph component.\n */\nexport interface ForceDirectedGraphProps {\n /** Array of node objects to render. */\n nodes: GraphNode[];\n /** Array of link objects to render. */\n links: GraphLink[];\n /** Width of the SVG canvas. */\n width: number;\n /** Height of the SVG canvas. */\n height: number;\n /** Whether to enable zoom and pan interactions. */\n enableZoom?: boolean;\n /** Whether to enable node dragging. */\n enableDrag?: boolean;\n /** Callback fired when a node is clicked. */\n onNodeClick?: (node: GraphNode) => void;\n /** Callback fired when a node is hovered. */\n onNodeHover?: (node: GraphNode | null) => void;\n /** Callback fired when a link is clicked. */\n onLinkClick?: (link: GraphLink) => void;\n /** ID of the currently selected node. */\n selectedNodeId?: string;\n /** ID of the currently hovered node. */\n hoveredNodeId?: string;\n /** Default fallback color for nodes. */\n defaultNodeColor?: string;\n /** Default fallback size for nodes. */\n defaultNodeSize?: number;\n /** Default fallback color for links. */\n defaultLinkColor?: string;\n /** Default fallback width for links. */\n defaultLinkWidth?: number;\n /** Whether to show labels on nodes. */\n showNodeLabels?: boolean;\n /** Whether to show labels on links. */\n showLinkLabels?: boolean;\n /** Additional CSS classes for the SVG element. */\n className?: string;\n /** Whether manual layout mode is active. */\n manualLayout?: boolean;\n /** Callback fired when manual layout mode changes. */\n onManualLayoutChange?: (enabled: boolean) => void;\n /** Optional bounds for package groups. */\n packageBounds?: Record<string, { x: number; y: number; r: number }>;\n /** Current layout algorithm. */\n layout?: LayoutType;\n /** Callback fired when layout changes. */\n onLayoutChange?: (layout: LayoutType) => void;\n}\n\n/**\n * An interactive Force-Directed Graph component using D3.js for physics and React for rendering.\n *\n * Supports multiple layout modes (force, circular, hierarchical), pinning, zooming, and dragging.\n * Optimal for visualizing complex dependency networks and codebase structures.\n *\n * @lastUpdated 2026-03-18\n */\nexport const ForceDirectedGraph = forwardRef<\n ForceDirectedGraphHandle,\n ForceDirectedGraphProps\n>(\n (\n {\n nodes: initialNodes,\n links: initialLinks,\n width,\n height,\n enableZoom = true,\n enableDrag = true,\n onNodeClick,\n onNodeHover,\n onLinkClick,\n selectedNodeId,\n hoveredNodeId,\n defaultNodeColor = DEFAULT_NODE_COLOR,\n defaultNodeSize = DEFAULT_NODE_SIZE,\n defaultLinkColor = DEFAULT_LINK_COLOR,\n defaultLinkWidth = DEFAULT_LINK_WIDTH,\n showNodeLabels = true,\n showLinkLabels = false,\n className,\n manualLayout = false,\n onManualLayoutChange,\n packageBounds,\n layout: externalLayout,\n onLayoutChange,\n },\n ref\n ) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const gRef = useRef<SVGGElement>(null);\n const [transform, setTransform] = useState({ k: 1, x: 0, y: 0 });\n const transformRef = useRef(transform);\n const dragNodeRef = useRef<GraphNode | null>(null);\n const dragActiveRef = useRef(false);\n const [pinnedNodes, setPinnedNodes] = useState<Set<string>>(new Set());\n const internalDragEnabledRef = useRef(enableDrag);\n const [layout, setLayout] = useState<LayoutType>(externalLayout || 'force');\n\n // Sync external layout prop with internal state\n useEffect(() => {\n if (externalLayout && externalLayout !== layout) {\n setLayout(externalLayout);\n }\n }, [externalLayout, layout]);\n\n // Handle layout change and notify parent\n const handleLayoutChange = useCallback(\n (newLayout: LayoutType) => {\n setLayout(newLayout);\n onLayoutChange?.(newLayout);\n },\n [onLayoutChange]\n );\n\n // Update the ref when enableDrag prop changes\n useEffect(() => {\n internalDragEnabledRef.current = enableDrag;\n }, [enableDrag]);\n\n // Initial positioning - delegate to layout utils\n const nodes = React.useMemo(() => {\n if (!initialNodes || !initialNodes.length) return initialNodes;\n const copy = initialNodes.map((n) => ({ ...n }));\n if (layout === 'circular') applyCircularLayout(copy, width, height);\n else if (layout === 'hierarchical')\n applyHierarchicalLayout(copy, width, height);\n else applyInitialForceLayout(copy, width, height);\n return copy;\n }, [initialNodes, width, height, layout]);\n\n // No force simulation - static layout only (stubs for API compatibility)\n const restart = React.useCallback(() => {}, []);\n const stop = React.useCallback(() => {}, []);\n const setForcesEnabled = React.useCallback((enabled?: boolean) => {\n void enabled;\n }, []);\n\n // Apply layout-specific positioning when layout changes\n useEffect(() => {\n if (!nodes || nodes.length === 0) return;\n if (layout === 'circular') applyCircularLayout(nodes, width, height);\n else if (layout === 'hierarchical')\n applyHierarchicalLayout(nodes, width, height);\n\n restart();\n }, [layout, nodes, width, height, restart]);\n\n // If manual layout is enabled or any nodes are pinned, disable forces\n useEffect(() => {\n if (manualLayout || pinnedNodes.size > 0) setForcesEnabled(false);\n else setForcesEnabled(true);\n }, [manualLayout, pinnedNodes, setForcesEnabled]);\n\n // Expose imperative handle for parent components\n useImperativeHandle(\n ref,\n () => ({\n pinAll: () => {\n const newPinned = new Set<string>();\n nodes.forEach((node) => {\n node.fx = node.x;\n node.fy = node.y;\n newPinned.add(node.id);\n });\n setPinnedNodes(newPinned);\n restart();\n },\n unpinAll: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n resetLayout: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n fitView: () => {\n if (!svgRef.current || !nodes.length) return;\n let minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity;\n nodes.forEach((node) => {\n if (node.x !== undefined && node.y !== undefined) {\n const size = node.size || DEFAULT_NODE_SIZE;\n minX = Math.min(minX, node.x - size);\n maxX = Math.max(maxX, node.x + size);\n minY = Math.min(minY, node.y - size);\n maxY = Math.max(maxY, node.y + size);\n }\n });\n if (!isFinite(minX)) return;\n const scale = Math.min(\n (width - FIT_VIEW_PADDING * 2) / (maxX - minX),\n (height - FIT_VIEW_PADDING * 2) / (maxY - minY),\n 10\n );\n const x = width / 2 - ((minX + maxX) / 2) * scale;\n const y = height / 2 - ((minY + maxY) / 2) * scale;\n if (gRef.current && svgRef.current) {\n const svg = d3.select(svgRef.current);\n const newTransform = d3.zoomIdentity.translate(x, y).scale(scale);\n svg\n .transition()\n .duration(TRANSITION_DURATION_MS)\n .call((d3 as any).zoom().transform as any, newTransform);\n setTransform(newTransform);\n }\n },\n getPinnedNodes: () => Array.from(pinnedNodes),\n setDragMode: (enabled: boolean) => {\n internalDragEnabledRef.current = enabled;\n },\n setLayout: (newLayout: LayoutType) => handleLayoutChange(newLayout),\n getLayout: () => layout,\n }),\n [\n nodes,\n pinnedNodes,\n restart,\n width,\n height,\n layout,\n handleLayoutChange,\n setForcesEnabled,\n ]\n );\n\n // Notify parent when manual layout mode changes\n useEffect(() => {\n if (typeof onManualLayoutChange === 'function')\n onManualLayoutChange(manualLayout);\n }, [manualLayout, onManualLayoutChange]);\n\n // Use custom hooks for zoom and window-level drag\n useGraphZoom(svgRef, gRef, enableZoom, setTransform, transformRef);\n useWindowDrag(\n enableDrag,\n svgRef,\n transformRef,\n dragActiveRef,\n dragNodeRef,\n () => {\n setForcesEnabled(true);\n restart();\n }\n );\n\n // Run positioning pass when nodes/links change\n useEffect(() => {\n if (!gRef.current) return;\n const g = d3.select(gRef.current);\n g.selectAll('g.node').each(function (this: any) {\n const datum = d3.select(this).datum() as any;\n if (!datum) return;\n d3.select(this).attr(\n 'transform',\n `translate(${datum.x || 0},${datum.y || 0})`\n );\n });\n g.selectAll('line').each(function (this: any) {\n const l = d3.select(this).datum() as any;\n if (!l) return;\n const s: any =\n typeof l.source === 'object'\n ? l.source\n : nodes.find((n) => n.id === l.source) || l.source;\n const t: any =\n typeof l.target === 'object'\n ? l.target\n : nodes.find((n) => n.id === l.target) || l.target;\n if (!s || !t) return;\n d3.select(this)\n .attr('x1', s.x)\n .attr('y1', s.y)\n .attr('x2', t.x)\n .attr('y2', t.y);\n });\n }, [nodes, initialLinks]);\n\n const handleDragStart = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n if (!enableDrag) return;\n event.preventDefault();\n event.stopPropagation();\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n stop();\n },\n [enableDrag, stop]\n );\n\n // Attach d3.drag behavior to nodes\n useEffect(() => {\n if (!gRef.current || !enableDrag) return;\n const g = d3.select(gRef.current);\n const dragBehavior = (d3 as any)\n .drag()\n .on('start', (event: any) => {\n const target =\n (event.sourceEvent && (event.sourceEvent.target as Element)) ||\n (event.target as Element);\n const grp = target.closest?.('g.node') as Element | null;\n const id = grp?.getAttribute('data-id');\n if (!id || !internalDragEnabledRef.current) return;\n const node = nodes.find((n) => n.id === id);\n if (!node) return;\n if (!event.active) restart();\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n })\n .on('drag', (event: any) => {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n dragNodeRef.current.fx =\n (event.sourceEvent.clientX - rect.left - transform.x) / transform.k;\n dragNodeRef.current.fy =\n (event.sourceEvent.clientY - rect.top - transform.y) / transform.k;\n })\n .on('end', () => {\n setForcesEnabled(true);\n restart();\n });\n\n g.selectAll('g.node').call(dragBehavior as any);\n return () => {\n g.selectAll('g.node').on('.drag', null as any);\n };\n }, [\n gRef,\n enableDrag,\n nodes,\n transform,\n restart,\n setForcesEnabled,\n internalDragEnabledRef,\n ]);\n\n const handleNodeDoubleClick = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n event.stopPropagation();\n if (!enableDrag) return;\n if (node.fx === null || node.fx === undefined) {\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n } else {\n node.fx = null;\n node.fy = null;\n setPinnedNodes((prev) => {\n const next = new Set(prev);\n next.delete(node.id);\n return next;\n });\n }\n restart();\n },\n [enableDrag, restart]\n );\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={cn('bg-white dark:bg-gray-900', className)}\n onDoubleClick={() => {\n nodes.forEach((n) => {\n n.fx = null;\n n.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n }}\n >\n <defs>\n <marker\n id=\"arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"20\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill={defaultLinkColor} />\n </marker>\n </defs>\n\n <g ref={gRef}>\n {initialLinks.map((link, i) => (\n <LinkItem\n key={`link-${i}`}\n link={link as GraphLink}\n onClick={onLinkClick}\n defaultWidth={defaultLinkWidth}\n showLabel={showLinkLabels}\n nodes={nodes}\n />\n ))}\n\n {nodes.map((node) => (\n <NodeItem\n key={node.id}\n node={node}\n isSelected={selectedNodeId === node.id}\n isHovered={hoveredNodeId === node.id}\n pinned={pinnedNodes.has(node.id)}\n defaultNodeSize={defaultNodeSize}\n defaultNodeColor={defaultNodeColor}\n showLabel={showNodeLabels}\n onClick={onNodeClick}\n onDoubleClick={handleNodeDoubleClick}\n onMouseEnter={(n) => onNodeHover?.(n)}\n onMouseLeave={() => onNodeHover?.(null)}\n onMouseDown={handleDragStart}\n />\n ))}\n <PackageBoundaries packageBounds={packageBounds || {}} />\n </g>\n </svg>\n );\n }\n);\n\nForceDirectedGraph.displayName = 'ForceDirectedGraph';\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { Input, InputProps } from './components/input.js';
|
|
|
4
4
|
export { Label, LabelProps } from './components/label.js';
|
|
5
5
|
export { Badge, BadgeProps, badgeVariants } from './components/badge.js';
|
|
6
6
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
7
|
-
import * as React from 'react';
|
|
7
|
+
import * as React$1 from 'react';
|
|
8
8
|
import React__default from 'react';
|
|
9
9
|
export { Container, ContainerProps } from './components/container.js';
|
|
10
10
|
export { Grid, GridProps } from './components/grid.js';
|
|
@@ -31,88 +31,43 @@ import 'd3';
|
|
|
31
31
|
interface ModalProps {
|
|
32
32
|
isOpen: boolean;
|
|
33
33
|
onClose: () => void;
|
|
34
|
-
children: React.ReactNode;
|
|
34
|
+
children: React$1.ReactNode;
|
|
35
35
|
maxWidth?: string;
|
|
36
36
|
showClose?: boolean;
|
|
37
37
|
variant?: 'default' | 'glass';
|
|
38
38
|
}
|
|
39
39
|
declare function Modal({ isOpen, onClose, children, maxWidth, showClose, variant, }: ModalProps): react_jsx_runtime.JSX.Element;
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
interface IconBaseProps extends React.SVGProps<SVGSVGElement> {
|
|
42
42
|
className?: string;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
declare function
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
declare function
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
declare function FileIcon(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
declare function
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
declare function
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
declare function
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
declare function
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
declare function UploadIcon(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
declare function AlertCircleIcon({ className, ...props }: {
|
|
72
|
-
className?: string;
|
|
73
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
74
|
-
declare function InfoIcon({ className, ...props }: {
|
|
75
|
-
className?: string;
|
|
76
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
77
|
-
declare function BrainIcon({ className, ...props }: {
|
|
78
|
-
className?: string;
|
|
79
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
80
|
-
declare function TerminalIcon({ className, ...props }: {
|
|
81
|
-
className?: string;
|
|
82
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
83
|
-
declare function CommandLineIcon(props: {
|
|
84
|
-
className?: string;
|
|
85
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
86
|
-
declare function SettingsIcon({ className, ...props }: {
|
|
87
|
-
className?: string;
|
|
88
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
89
|
-
declare function SaveIcon({ className, ...props }: {
|
|
90
|
-
className?: string;
|
|
91
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
92
|
-
declare function RefreshCwIcon({ className, ...props }: {
|
|
93
|
-
className?: string;
|
|
94
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
95
|
-
declare function WalletIcon({ className, ...props }: {
|
|
96
|
-
className?: string;
|
|
97
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
98
|
-
declare function ClockIcon({ className, ...props }: {
|
|
99
|
-
className?: string;
|
|
100
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
101
|
-
declare function ZapIcon({ className, ...props }: {
|
|
102
|
-
className?: string;
|
|
103
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
104
|
-
declare function HammerIcon({ className, ...props }: {
|
|
105
|
-
className?: string;
|
|
106
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
107
|
-
declare function ArrowRightIcon({ className, ...props }: {
|
|
108
|
-
className?: string;
|
|
109
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
110
|
-
declare function ShieldCheckIcon({ className, ...props }: {
|
|
111
|
-
className?: string;
|
|
112
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
113
|
-
declare function AlertTriangleIcon({ className, ...props }: {
|
|
114
|
-
className?: string;
|
|
115
|
-
} & React__default.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
43
|
+
children?: React.ReactNode;
|
|
44
|
+
viewBox?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
declare function AlertCircleIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
declare function AlertTriangleIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
49
|
+
declare function ArrowRightIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
50
|
+
declare function BrainIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
51
|
+
declare function ChartIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
52
|
+
declare function ClockIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
53
|
+
declare function FileIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
54
|
+
declare function HammerIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
55
|
+
declare function InfoIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
56
|
+
declare function PlayIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
57
|
+
declare function RefreshCwIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
58
|
+
declare function RobotIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
59
|
+
declare function RocketIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
60
|
+
declare function SaveIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
61
|
+
declare function SettingsIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
62
|
+
declare function ShieldCheckIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
63
|
+
declare function ShieldIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
64
|
+
declare function TargetIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
65
|
+
declare function TerminalIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
66
|
+
declare function TrashIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
67
|
+
declare function TrendingUpIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
68
|
+
declare function UploadIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
69
|
+
declare function WalletIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
70
|
+
declare function ZapIcon(props: IconBaseProps): react_jsx_runtime.JSX.Element;
|
|
116
71
|
|
|
117
72
|
interface CodeBlockProps {
|
|
118
73
|
children: React__default.ReactNode;
|
|
@@ -281,4 +236,4 @@ interface GraphControlsProps {
|
|
|
281
236
|
}
|
|
282
237
|
declare const GraphControls: React__default.FC<GraphControlsProps>;
|
|
283
238
|
|
|
284
|
-
export { AlertCircleIcon, AlertTriangleIcon, ArrowRightIcon, BrainIcon, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, ChartIcon, ClockIcon, CodeBlock, type CodeBlockProps,
|
|
239
|
+
export { AlertCircleIcon, AlertTriangleIcon, ArrowRightIcon, BrainIcon, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, ChartIcon, ClockIcon, CodeBlock, type CodeBlockProps, type EffectiveTheme, EmptyState, type EmptyStateProps, ErrorDisplay, type ErrorDisplayProps, FeedbackWidget, type FeedbackWidgetProps, FileIcon, GraphControls, type GraphControlsProps, HammerIcon, InfoIcon, InlineCode, LoadingOverlay, type LoadingOverlayProps, LoadingSpinner, type LoadingSpinnerProps, Modal, type ModalProps, type NavItem, PlatformShell, type PlatformShellProps, PlayIcon, RefreshCwIcon, RobotIcon, RocketIcon, SaveIcon, ScoreBar, type ScoreBarProps, ScoreCard, type ScoreCardProps, ScoreCircle, type ScoreCircleProps, type ScoreRating, SettingsIcon, ShieldCheckIcon, ShieldIcon, TargetIcon, type Team, type TeamMember, TerminalIcon, type Theme, ThemeProvider, TrashIcon, TrendingUpIcon, UploadIcon, type User, WalletIcon, ZapIcon, getScoreRating, scoreBg, scoreColor, scoreGlow, scoreLabel, useTheme };
|