@quantumwake/kgraph 0.1.2 → 0.2.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/KGraphProvider.tsx","../src/NodeRenderer.tsx","../src/bezier.ts","../src/EdgeRenderer.tsx","../src/ConnectionLine.tsx","../src/DotGrid.tsx","../src/MiniMap.tsx","../src/KGraphCanvas.tsx","../src/useKGraph.ts","../src/Handle.tsx","../src/EdgeLabel.tsx","../src/applyChanges.ts"],"names":["useRef","useCallback","jsx","React","jsxs","useMemo","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import React, { createContext, useContext, useState, useCallback, useRef, useMemo } from 'react';\nimport { KGraphContextValue, KGraphViewport, HandleInfo, KGraphNode, KGraphEdge } from './types';\n\nconst KGraphContext = createContext<KGraphContextValue | null>(null);\n\nexport function useKGraphContext(): KGraphContextValue {\n const ctx = useContext(KGraphContext);\n if (!ctx) {\n throw new Error('useKGraphContext must be used within a KGraphProvider');\n }\n return ctx;\n}\n\ninterface KGraphProviderProps {\n children: React.ReactNode;\n nodes: KGraphNode[];\n edges: KGraphEdge[];\n initialViewport?: KGraphViewport;\n minZoom?: number;\n maxZoom?: number;\n}\n\nexport const KGraphProvider: React.FC<KGraphProviderProps> = ({\n children,\n nodes,\n edges,\n initialViewport = { x: 0, y: 0, zoom: 1 },\n minZoom = 0.1,\n maxZoom = 4,\n}) => {\n const [viewport, setViewport] = useState<KGraphViewport>(initialViewport);\n const containerRef = useRef<HTMLDivElement>(null);\n const handlesRef = useRef<Map<string, HandleInfo>>(new Map());\n\n const screenToCanvasPosition = useCallback((screenX: number, screenY: number) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return { x: screenX, y: screenY };\n const x = (screenX - rect.left - viewport.x) / viewport.zoom;\n const y = (screenY - rect.top - viewport.y) / viewport.zoom;\n return { x, y };\n }, [viewport]);\n\n const canvasToScreenPosition = useCallback((canvasX: number, canvasY: number) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return { x: canvasX, y: canvasY };\n const x = canvasX * viewport.zoom + viewport.x + rect.left;\n const y = canvasY * viewport.zoom + viewport.y + rect.top;\n return { x, y };\n }, [viewport]);\n\n const fitView = useCallback((options?: { padding?: number }) => {\n if (nodes.length === 0) return;\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const padding = options?.padding ?? 0.2;\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const node of nodes) {\n const w = node.width || 200;\n const h = node.height || 100;\n minX = Math.min(minX, node.position.x);\n minY = Math.min(minY, node.position.y);\n maxX = Math.max(maxX, node.position.x + w);\n maxY = Math.max(maxY, node.position.y + h);\n }\n\n const graphWidth = maxX - minX;\n const graphHeight = maxY - minY;\n\n if (graphWidth <= 0 || graphHeight <= 0) return;\n\n const availW = rect.width * (1 - padding * 2);\n const availH = rect.height * (1 - padding * 2);\n const zoom = Math.min(\n Math.max(availW / graphWidth, minZoom),\n Math.max(availH / graphHeight, minZoom),\n maxZoom,\n );\n const clampedZoom = Math.min(Math.max(zoom, minZoom), maxZoom);\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n\n setViewport({\n x: rect.width / 2 - centerX * clampedZoom,\n y: rect.height / 2 - centerY * clampedZoom,\n zoom: clampedZoom,\n });\n }, [nodes, minZoom, maxZoom]);\n\n const zoomIn = useCallback(() => {\n setViewport(v => {\n const rect = containerRef.current?.getBoundingClientRect();\n const newZoom = Math.min(v.zoom * 1.2, maxZoom);\n if (!rect) return { ...v, zoom: newZoom };\n const cx = rect.width / 2;\n const cy = rect.height / 2;\n return {\n x: cx - (cx - v.x) * (newZoom / v.zoom),\n y: cy - (cy - v.y) * (newZoom / v.zoom),\n zoom: newZoom,\n };\n });\n }, [maxZoom]);\n\n const zoomOut = useCallback(() => {\n setViewport(v => {\n const rect = containerRef.current?.getBoundingClientRect();\n const newZoom = Math.max(v.zoom / 1.2, minZoom);\n if (!rect) return { ...v, zoom: newZoom };\n const cx = rect.width / 2;\n const cy = rect.height / 2;\n return {\n x: cx - (cx - v.x) * (newZoom / v.zoom),\n y: cy - (cy - v.y) * (newZoom / v.zoom),\n zoom: newZoom,\n };\n });\n }, [minZoom]);\n\n const zoomTo = useCallback((level: number) => {\n setViewport(v => {\n const rect = containerRef.current?.getBoundingClientRect();\n const newZoom = Math.min(Math.max(level, minZoom), maxZoom);\n if (!rect) return { ...v, zoom: newZoom };\n const cx = rect.width / 2;\n const cy = rect.height / 2;\n return {\n x: cx - (cx - v.x) * (newZoom / v.zoom),\n y: cy - (cy - v.y) * (newZoom / v.zoom),\n zoom: newZoom,\n };\n });\n }, [minZoom, maxZoom]);\n\n const registerHandle = useCallback((info: HandleInfo) => {\n handlesRef.current.set(`${info.nodeId}:${info.handleId}`, info);\n }, []);\n\n const unregisterHandle = useCallback((nodeId: string, handleId: string) => {\n handlesRef.current.delete(`${nodeId}:${handleId}`);\n }, []);\n\n const getHandlePosition = useCallback((nodeId: string, handleId: string) => {\n return handlesRef.current.get(`${nodeId}:${handleId}`);\n }, []);\n\n const getAllHandles = useCallback(() => {\n return handlesRef.current;\n }, []);\n\n const value = useMemo<KGraphContextValue>(() => ({\n viewport,\n setViewport,\n screenToCanvasPosition,\n canvasToScreenPosition,\n fitView,\n zoomIn,\n zoomOut,\n zoomTo,\n registerHandle,\n unregisterHandle,\n getHandlePosition,\n getAllHandles,\n containerRef,\n nodes,\n edges,\n }), [viewport, screenToCanvasPosition, canvasToScreenPosition, fitView, zoomIn, zoomOut, zoomTo, registerHandle, unregisterHandle, getHandlePosition, getAllHandles, nodes, edges]);\n\n return (\n <KGraphContext.Provider value={value}>\n {children}\n </KGraphContext.Provider>\n );\n};\n\nexport default KGraphProvider;\n","import React, { useCallback, useRef, useEffect } from 'react';\nimport { KGraphNode, NodeComponentProps, NodeChange, HandlePosition } from './types';\nimport { useKGraphContext } from './KGraphProvider';\n\ninterface NodeWrapperProps {\n node: KGraphNode;\n nodeComponent: React.ComponentType<NodeComponentProps>;\n onNodesChange?: (changes: NodeChange[]) => void;\n snapToGrid: boolean;\n snapGrid: [number, number];\n draggable: boolean;\n selectable: boolean;\n onNodeClick?: (event: React.MouseEvent, node: KGraphNode) => void;\n onConnectionStart?: (nodeId: string, handleId: string, type: 'source' | 'target', e: React.MouseEvent) => void;\n zoom: number;\n}\n\nconst NodeWrapper: React.FC<NodeWrapperProps> = ({\n node,\n nodeComponent: NodeComponent,\n onNodesChange,\n snapToGrid,\n snapGrid,\n draggable,\n selectable,\n onNodeClick,\n onConnectionStart,\n zoom,\n}) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<{\n startX: number;\n startY: number;\n startNodeX: number;\n startNodeY: number;\n isDragging: boolean;\n lastPosition: { x: number; y: number };\n } | null>(null);\n\n // Use refs for values accessed inside drag event handlers to avoid stale closures\n const onNodesChangeRef = useRef(onNodesChange);\n onNodesChangeRef.current = onNodesChange;\n const zoomRef = useRef(zoom);\n zoomRef.current = zoom;\n const snapRef = useRef({ snapToGrid, snapGrid });\n snapRef.current = { snapToGrid, snapGrid };\n\n const { registerHandle, unregisterHandle } = useKGraphContext();\n\n // Measure and register handle positions\n const updateHandlePositions = useCallback(() => {\n if (!wrapperRef.current) return;\n\n const handles = wrapperRef.current.querySelectorAll('[data-handleid]');\n handles.forEach((el) => {\n const handleId = el.getAttribute('data-handleid');\n const handleType = el.getAttribute('data-handletype') as 'source' | 'target';\n const handlePosition = el.getAttribute('data-handleposition') as HandlePosition;\n if (!handleId || !handleType || !handlePosition) return;\n\n const nodeW = wrapperRef.current!.offsetWidth;\n const nodeH = wrapperRef.current!.offsetHeight;\n\n let hx = node.position.x;\n let hy = node.position.y;\n\n switch (handlePosition) {\n case 'top':\n hx += nodeW / 2;\n break;\n case 'bottom':\n hx += nodeW / 2;\n hy += nodeH;\n break;\n case 'left':\n hy += nodeH / 2;\n break;\n case 'right':\n hx += nodeW;\n hy += nodeH / 2;\n break;\n }\n\n registerHandle({\n nodeId: node.id,\n handleId,\n type: handleType,\n position: handlePosition,\n x: hx,\n y: hy,\n });\n });\n }, [node.id, node.position.x, node.position.y, registerHandle]);\n\n // Observe size changes\n useEffect(() => {\n if (!wrapperRef.current) return;\n\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n if (width > 0 && height > 0 && (width !== node.width || height !== node.height)) {\n onNodesChangeRef.current?.([{\n type: 'dimensions',\n id: node.id,\n dimensions: { width, height },\n }]);\n }\n }\n updateHandlePositions();\n });\n\n ro.observe(wrapperRef.current);\n return () => ro.disconnect();\n }, [node.id, node.width, node.height, updateHandlePositions]);\n\n // Update handles when position changes\n useEffect(() => {\n updateHandlePositions();\n }, [updateHandlePositions]);\n\n // Cleanup handles on unmount\n useEffect(() => {\n return () => {\n if (!wrapperRef.current) return;\n const handles = wrapperRef.current.querySelectorAll('[data-handleid]');\n handles.forEach((el) => {\n const handleId = el.getAttribute('data-handleid');\n if (handleId) unregisterHandle(node.id, handleId);\n });\n };\n }, [node.id, unregisterHandle]);\n\n // Drag handling — uses refs to avoid stale closures in window event listeners\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n // Don't start drag from handles\n const target = e.target as HTMLElement;\n if (target.closest('[data-handleid]')) return;\n\n // Don't interfere with interactions inside dialogs (e.g. HeadlessUI)\n if (target.closest('[role=\"dialog\"]')) return;\n\n if (selectable) {\n onNodeClick?.(e, node);\n }\n\n if (!draggable) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n dragRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startNodeX: node.position.x,\n startNodeY: node.position.y,\n isDragging: false,\n lastPosition: { x: node.position.x, y: node.position.y },\n };\n\n const nodeId = node.id;\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!dragRef.current) return;\n\n const currentZoom = zoomRef.current;\n const dx = (ev.clientX - dragRef.current.startX) / currentZoom;\n const dy = (ev.clientY - dragRef.current.startY) / currentZoom;\n\n // Threshold to distinguish click from drag\n if (!dragRef.current.isDragging && (Math.abs(dx) > 2 || Math.abs(dy) > 2)) {\n dragRef.current.isDragging = true;\n }\n\n if (!dragRef.current.isDragging) return;\n\n let newX = dragRef.current.startNodeX + dx;\n let newY = dragRef.current.startNodeY + dy;\n\n const { snapToGrid: snap, snapGrid: grid } = snapRef.current;\n if (snap) {\n newX = Math.round(newX / grid[0]) * grid[0];\n newY = Math.round(newY / grid[1]) * grid[1];\n }\n\n // Track the last position so mouseup can include it\n dragRef.current.lastPosition = { x: newX, y: newY };\n\n onNodesChangeRef.current?.([{\n type: 'position',\n id: nodeId,\n position: { x: newX, y: newY },\n dragging: true,\n }]);\n };\n\n const handleMouseUp = () => {\n if (dragRef.current?.isDragging) {\n // Always include the final position to avoid stale closure issues\n onNodesChangeRef.current?.([{\n type: 'position',\n id: nodeId,\n position: dragRef.current.lastPosition,\n dragging: false,\n }]);\n }\n dragRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [node.id, node.position.x, node.position.y, draggable, selectable, onNodeClick]);\n\n return (\n <div\n ref={wrapperRef}\n className=\"kgraph-node-wrapper\"\n style={{\n position: 'absolute',\n left: node.position.x,\n top: node.position.y,\n cursor: draggable ? 'grab' : 'default',\n userSelect: 'none',\n }}\n onMouseDown={handleMouseDown}\n >\n <HandleContext.Provider value={{ nodeId: node.id, onConnectionStart }}>\n <NodeComponent\n id={node.id}\n data={node.data}\n selected={node.selected || false}\n type={node.type}\n />\n </HandleContext.Provider>\n </div>\n );\n};\n\n// Context for passing nodeId to Handle components nested inside node components\ninterface HandleContextValue {\n nodeId: string;\n onConnectionStart?: (nodeId: string, handleId: string, type: 'source' | 'target', e: React.MouseEvent) => void;\n}\n\nconst HandleContext = React.createContext<HandleContextValue>({ nodeId: '' });\nexport const useHandleContext = () => React.useContext(HandleContext);\n\n// ============================================================================\n// NodeRenderer - renders all visible nodes\n// ============================================================================\n\ninterface NodeRendererProps {\n nodes: KGraphNode[];\n nodeTypes: Record<string, React.ComponentType<NodeComponentProps>>;\n defaultNodeType?: React.ComponentType<NodeComponentProps>;\n onNodesChange?: (changes: NodeChange[]) => void;\n snapToGrid: boolean;\n snapGrid: [number, number];\n draggable: boolean;\n selectable: boolean;\n onNodeClick?: (event: React.MouseEvent, node: KGraphNode) => void;\n onConnectionStart?: (nodeId: string, handleId: string, type: 'source' | 'target', e: React.MouseEvent) => void;\n zoom: number;\n}\n\nconst NodeRenderer: React.FC<NodeRendererProps> = ({\n nodes,\n nodeTypes,\n defaultNodeType,\n onNodesChange,\n snapToGrid,\n snapGrid,\n draggable,\n selectable,\n onNodeClick,\n onConnectionStart,\n zoom,\n}) => {\n const DefaultNode: React.ComponentType<NodeComponentProps> = defaultNodeType || (({ data }) => (\n <div style={{\n padding: '10px 20px',\n border: '2px solid #8b5cf6',\n borderRadius: 4,\n background: '#1a1a2e',\n color: '#fff',\n fontSize: 14,\n }}>\n {data.label || 'Node'}\n </div>\n ));\n\n return (\n <>\n {nodes.filter(n => !n.hidden).map(node => {\n const Component = nodeTypes[node.type] || DefaultNode;\n return (\n <NodeWrapper\n key={node.id}\n node={node}\n nodeComponent={Component}\n onNodesChange={onNodesChange}\n snapToGrid={snapToGrid}\n snapGrid={snapGrid}\n draggable={draggable}\n selectable={selectable}\n onNodeClick={onNodeClick}\n onConnectionStart={onConnectionStart}\n zoom={zoom}\n />\n );\n })}\n </>\n );\n};\n\nexport default NodeRenderer;\n","import { HandlePosition } from './types';\n\n/**\n * Compute a cubic bezier path between two points with directional control points.\n * Drop-in replacement for ReactFlow's getBezierPath — uses the same control point\n * algorithm so curves look identical.\n *\n * Returns [pathString, labelX, labelY, offsetX, offsetY]\n */\nexport function getBezierPath({\n sourceX,\n sourceY,\n sourcePosition = 'bottom',\n targetX,\n targetY,\n targetPosition = 'top',\n curvature = 0.25,\n}: {\n sourceX: number;\n sourceY: number;\n sourcePosition?: HandlePosition;\n targetX: number;\n targetY: number;\n targetPosition?: HandlePosition;\n curvature?: number;\n}): [string, number, number, number, number] {\n const [sourceControlX, sourceControlY] = getControlWithCurvature(\n sourcePosition, sourceX, sourceY, targetX, targetY, curvature,\n );\n const [targetControlX, targetControlY] = getControlWithCurvature(\n targetPosition, targetX, targetY, sourceX, sourceY, curvature,\n );\n\n const path = `M${sourceX},${sourceY} C${sourceControlX},${sourceControlY} ${targetControlX},${targetControlY} ${targetX},${targetY}`;\n\n // Label center using cubic bezier at t=0.5 (matching ReactFlow's getBezierEdgeCenter)\n const labelX = sourceX * 0.125 + sourceControlX * 0.375 + targetControlX * 0.375 + targetX * 0.125;\n const labelY = sourceY * 0.125 + sourceControlY * 0.375 + targetControlY * 0.375 + targetY * 0.125;\n\n const offsetX = Math.abs(labelX - sourceX);\n const offsetY = Math.abs(labelY - sourceY);\n\n return [path, labelX, labelY, offsetX, offsetY];\n}\n\n/**\n * ReactFlow-compatible control offset:\n * - When target is in the natural direction from the handle: offset = 0.5 * distance\n * - When target is in the opposite direction: offset = curvature * 25 * sqrt(-distance)\n */\nfunction calculateControlOffset(distance: number, curvature: number): number {\n if (distance >= 0) {\n return 0.5 * distance;\n }\n return curvature * 25 * Math.sqrt(-distance);\n}\n\nfunction getControlWithCurvature(\n pos: HandlePosition,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n c: number,\n): [number, number] {\n switch (pos) {\n case 'left':\n return [x1 - calculateControlOffset(x1 - x2, c), y1];\n case 'right':\n return [x1 + calculateControlOffset(x2 - x1, c), y1];\n case 'top':\n return [x1, y1 - calculateControlOffset(y1 - y2, c)];\n case 'bottom':\n return [x1, y1 + calculateControlOffset(y2 - y1, c)];\n default:\n return [x1, y1 + calculateControlOffset(y2 - y1, c)];\n }\n}\n","import React from 'react';\nimport { KGraphEdge, EdgeComponentProps, HandlePosition } from './types';\nimport { getBezierPath } from './bezier';\nimport { useKGraphContext } from './KGraphProvider';\n\n// ============================================================================\n// Default Edge Component\n// ============================================================================\n\nconst DefaultEdge: React.FC<EdgeComponentProps> = ({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n}) => {\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n return (\n <g>\n <path\n d={edgePath}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={20}\n style={{ cursor: 'pointer' }}\n />\n <path\n d={edgePath}\n fill=\"none\"\n stroke={selected ? '#a78bfa' : '#8b5cf6'}\n strokeWidth={selected ? 2.5 : 1.5}\n markerEnd={selected ? 'url(#kgraph-arrow-selected)' : 'url(#kgraph-arrow)'}\n style={{ cursor: 'pointer' }}\n />\n </g>\n );\n};\n\n// ============================================================================\n// EdgeRenderer\n// ============================================================================\n\n// Map handle IDs to positions (matches the convention from CustomStudio.jsx)\nfunction handleIdToPosition(handleId?: string): HandlePosition {\n if (!handleId) return 'bottom';\n // target-1/source-1 = top, target-2/source-2 = left,\n // target-3/source-3 = right, target-4/source-4 = bottom\n const num = handleId.split('-')[1];\n switch (num) {\n case '1': return 'top';\n case '2': return 'left';\n case '3': return 'right';\n case '4': return 'bottom';\n default: return 'bottom';\n }\n}\n\ninterface EdgeRendererProps {\n edges: KGraphEdge[];\n edgeTypes: Record<string, React.ComponentType<EdgeComponentProps>>;\n onEdgeClick?: (event: React.MouseEvent, edge: KGraphEdge) => void;\n selectedEdgeId?: string | null;\n}\n\nconst EdgeRenderer: React.FC<EdgeRendererProps> = ({\n edges,\n edgeTypes,\n onEdgeClick,\n selectedEdgeId,\n}) => {\n const { getHandlePosition, nodes } = useKGraphContext();\n\n return (\n <g className=\"kgraph-edges\">\n {edges.map(edge => {\n // Look up handle positions\n const sourceHandle = getHandlePosition(edge.source, edge.sourceHandle || 'source-4');\n const targetHandle = getHandlePosition(edge.target, edge.targetHandle || 'target-1');\n\n // Fallback: use node positions if handles aren't registered yet\n const sourceNode = nodes.find(n => n.id === edge.source);\n const targetNode = nodes.find(n => n.id === edge.target);\n\n if (!sourceNode && !sourceHandle) return null;\n if (!targetNode && !targetHandle) return null;\n\n const sourceX = sourceHandle?.x ?? (sourceNode!.position.x + (sourceNode!.width || 200) / 2);\n const sourceY = sourceHandle?.y ?? (sourceNode!.position.y + (sourceNode!.height || 100));\n const targetX = targetHandle?.x ?? (targetNode!.position.x + (targetNode!.width || 200) / 2);\n const targetY = targetHandle?.y ?? targetNode!.position.y;\n\n const sourcePosition = sourceHandle?.position ?? handleIdToPosition(edge.sourceHandle);\n const targetPosition = targetHandle?.position ?? handleIdToPosition(edge.targetHandle);\n\n const isSelected = edge.selected || edge.id === selectedEdgeId;\n const EdgeComponent = edgeTypes[edge.type || 'default'] || edgeTypes['default'] || DefaultEdge;\n\n return (\n <g\n key={edge.id}\n className=\"kgraph-edge\"\n onClick={(e) => onEdgeClick?.(e, edge)}\n >\n <EdgeComponent\n id={edge.id}\n sourceX={sourceX}\n sourceY={sourceY}\n targetX={targetX}\n targetY={targetY}\n sourcePosition={sourcePosition}\n targetPosition={targetPosition}\n selected={isSelected}\n data={edge.data}\n animated={edge.animated}\n />\n </g>\n );\n })}\n </g>\n );\n};\n\nexport default EdgeRenderer;\n","import React from 'react';\nimport { getBezierPath } from './bezier';\nimport { HandlePosition } from './types';\n\ninterface ConnectionLineProps {\n sourceX: number;\n sourceY: number;\n sourcePosition: HandlePosition;\n targetX: number;\n targetY: number;\n}\n\nconst ConnectionLine: React.FC<ConnectionLineProps> = ({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n}) => {\n // Pick a reasonable target position based on relative location\n let targetPosition: HandlePosition = 'top';\n const dx = targetX - sourceX;\n const dy = targetY - sourceY;\n if (Math.abs(dx) > Math.abs(dy)) {\n targetPosition = dx > 0 ? 'left' : 'right';\n } else {\n targetPosition = dy > 0 ? 'top' : 'bottom';\n }\n\n const [path] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n return (\n <g className=\"kgraph-connection-line\">\n <path\n d={path}\n fill=\"none\"\n stroke=\"#8b5cf6\"\n strokeWidth={2}\n strokeDasharray=\"6 3\"\n opacity={0.8}\n />\n <circle\n cx={targetX}\n cy={targetY}\n r={6}\n fill=\"#8b5cf6\"\n opacity={0.6}\n />\n </g>\n );\n};\n\nexport default ConnectionLine;\n","import React from 'react';\nimport { KGraphViewport } from './types';\n\ninterface DotGridProps {\n viewport: KGraphViewport;\n gap?: number;\n color?: string;\n size?: number;\n}\n\nconst DotGrid: React.FC<DotGridProps> = ({\n viewport,\n gap = 32,\n color = 'rgba(255, 255, 255, 0.15)',\n size = 1.5,\n}) => {\n const scaledGap = gap * viewport.zoom;\n const scaledSize = size * viewport.zoom;\n const patternId = 'kgraph-dot-pattern';\n\n // Offset pattern to follow viewport\n const offsetX = viewport.x % scaledGap;\n const offsetY = viewport.y % scaledGap;\n\n return (\n <svg\n className=\"kgraph-background\"\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n >\n <defs>\n <pattern\n id={patternId}\n x={offsetX}\n y={offsetY}\n width={scaledGap}\n height={scaledGap}\n patternUnits=\"userSpaceOnUse\"\n >\n <circle\n cx={scaledSize}\n cy={scaledSize}\n r={scaledSize}\n fill={color}\n />\n </pattern>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill={`url(#${patternId})`}\n />\n </svg>\n );\n};\n\nexport default DotGrid;\n","import React, { useRef, useCallback, useMemo } from 'react';\nimport { KGraphNode, KGraphViewport } from './types';\n\ninterface MiniMapProps {\n nodes: KGraphNode[];\n viewport: KGraphViewport;\n width?: number;\n height?: number;\n nodeColor?: string | ((node: KGraphNode) => string);\n maskColor?: string;\n backgroundColor?: string;\n borderColor?: string;\n onViewportChange?: (viewport: KGraphViewport) => void;\n containerWidth: number;\n containerHeight: number;\n}\n\nconst MiniMap: React.FC<MiniMapProps> = ({\n nodes,\n viewport,\n width = 200,\n height = 150,\n nodeColor = '#60a5fa',\n maskColor = 'rgba(14, 14, 16, 0.9)',\n backgroundColor = '#161618',\n borderColor = '#333338',\n onViewportChange,\n containerWidth,\n containerHeight,\n}) => {\n const miniMapRef = useRef<SVGSVGElement>(null);\n\n // Compute graph bounds\n const bounds = useMemo(() => {\n if (nodes.length === 0) return { minX: 0, minY: 0, maxX: 1000, maxY: 1000 };\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const node of nodes) {\n const w = node.width || 200;\n const h = node.height || 100;\n minX = Math.min(minX, node.position.x);\n minY = Math.min(minY, node.position.y);\n maxX = Math.max(maxX, node.position.x + w);\n maxY = Math.max(maxY, node.position.y + h);\n }\n\n // Add padding\n const padX = (maxX - minX) * 0.2;\n const padY = (maxY - minY) * 0.2;\n return {\n minX: minX - padX,\n minY: minY - padY,\n maxX: maxX + padX,\n maxY: maxY + padY,\n };\n }, [nodes]);\n\n const graphW = bounds.maxX - bounds.minX;\n const graphH = bounds.maxY - bounds.minY;\n const scale = Math.min(width / graphW, height / graphH);\n\n // Viewport rectangle in minimap space\n const viewRect = useMemo(() => {\n const vx = (-viewport.x / viewport.zoom - bounds.minX) * scale;\n const vy = (-viewport.y / viewport.zoom - bounds.minY) * scale;\n const vw = (containerWidth / viewport.zoom) * scale;\n const vh = (containerHeight / viewport.zoom) * scale;\n return { x: vx, y: vy, width: vw, height: vh };\n }, [viewport, bounds, scale, containerWidth, containerHeight]);\n\n const getColor = useCallback((node: KGraphNode) => {\n if (typeof nodeColor === 'function') return nodeColor(node);\n return nodeColor;\n }, [nodeColor]);\n\n // Click on minimap to pan\n const handleClick = useCallback((e: React.MouseEvent<SVGSVGElement>) => {\n if (!miniMapRef.current || !onViewportChange) return;\n const rect = miniMapRef.current.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const clickY = e.clientY - rect.top;\n\n // Convert minimap click to canvas coordinates\n const canvasX = clickX / scale + bounds.minX;\n const canvasY = clickY / scale + bounds.minY;\n\n // Center viewport on clicked point\n onViewportChange({\n x: -(canvasX * viewport.zoom - containerWidth / 2),\n y: -(canvasY * viewport.zoom - containerHeight / 2),\n zoom: viewport.zoom,\n });\n }, [bounds, scale, viewport.zoom, containerWidth, containerHeight, onViewportChange]);\n\n return (\n <div\n className=\"kgraph-minimap\"\n style={{\n position: 'absolute',\n bottom: 10,\n right: 10,\n zIndex: 20,\n borderRadius: 2,\n overflow: 'hidden',\n border: `1px solid ${borderColor}`,\n }}\n >\n <svg\n ref={miniMapRef}\n width={width}\n height={height}\n style={{ backgroundColor, display: 'block', cursor: 'pointer' }}\n onClick={handleClick}\n >\n {/* Nodes */}\n {nodes.filter(n => !n.hidden).map(node => {\n const nx = (node.position.x - bounds.minX) * scale;\n const ny = (node.position.y - bounds.minY) * scale;\n const nw = (node.width || 200) * scale;\n const nh = (node.height || 100) * scale;\n return (\n <rect\n key={node.id}\n x={nx}\n y={ny}\n width={Math.max(nw, 4)}\n height={Math.max(nh, 3)}\n fill={getColor(node)}\n rx={1}\n />\n );\n })}\n\n {/* Mask everything outside viewport */}\n <rect\n x={0} y={0}\n width={width} height={viewRect.y}\n fill={maskColor}\n />\n <rect\n x={0} y={viewRect.y + viewRect.height}\n width={width} height={height - viewRect.y - viewRect.height}\n fill={maskColor}\n />\n <rect\n x={0} y={viewRect.y}\n width={viewRect.x} height={viewRect.height}\n fill={maskColor}\n />\n <rect\n x={viewRect.x + viewRect.width} y={viewRect.y}\n width={width - viewRect.x - viewRect.width} height={viewRect.height}\n fill={maskColor}\n />\n\n {/* Viewport indicator */}\n <rect\n x={viewRect.x}\n y={viewRect.y}\n width={viewRect.width}\n height={viewRect.height}\n fill=\"none\"\n stroke=\"rgba(96, 165, 250, 0.5)\"\n strokeWidth={1.5}\n />\n </svg>\n </div>\n );\n};\n\nexport default MiniMap;\n","import React, { useCallback, useRef, useState, useEffect } from 'react';\nimport {\n KGraphCanvasProps,\n KGraphViewport,\n NodeChange,\n EdgeChange,\n HandlePosition,\n KGraphNode,\n KGraphEdge,\n} from './types';\nimport { KGraphProvider, useKGraphContext } from './KGraphProvider';\nimport NodeRenderer from './NodeRenderer';\nimport EdgeRenderer from './EdgeRenderer';\nimport ConnectionLine from './ConnectionLine';\nimport DotGrid from './DotGrid';\nimport MiniMap from './MiniMap';\n\n// ============================================================================\n// Inner Canvas (requires KGraphProvider context)\n// ============================================================================\n\ninterface InnerCanvasProps extends KGraphCanvasProps {}\n\nconst InnerCanvas: React.FC<InnerCanvasProps> = ({\n nodes,\n edges,\n onNodesChange,\n onEdgesChange,\n onConnect,\n onNodeClick,\n onEdgeClick,\n onPaneClick,\n onDrop,\n onDragOver,\n nodeTypes = {},\n edgeTypes = {},\n snapToGrid = true,\n snapGrid = [16, 16],\n panOnDrag = true,\n zoomOnScroll = true,\n nodesDraggable = true,\n nodesConnectable = true,\n elementsSelectable = true,\n fitView: fitViewOnMount = false,\n showMiniMap = true,\n showBackground = true,\n backgroundGap = 32,\n minZoom = 0.1,\n maxZoom = 4,\n className = '',\n style = {},\n children,\n}) => {\n const ctx = useKGraphContext();\n const { viewport, setViewport, containerRef, screenToCanvasPosition } = ctx;\n\n const panRef = useRef<{\n startX: number;\n startY: number;\n startVX: number;\n startVY: number;\n isPanning: boolean;\n } | null>(null);\n\n const [connectionDrag, setConnectionDrag] = useState<{\n sourceNodeId: string;\n sourceHandleId: string;\n sourcePosition: HandlePosition;\n sourceX: number;\n sourceY: number;\n mouseX: number;\n mouseY: number;\n } | null>(null);\n\n const [containerSize, setContainerSize] = useState({ width: 0, height: 0 });\n\n // Refs for stable access in pane-click closures (avoids stale nodes/edges)\n const nodesRef = useRef(nodes);\n nodesRef.current = nodes;\n const edgesRef = useRef(edges);\n edgesRef.current = edges;\n const onNodesChangeRef = useRef(onNodesChange);\n onNodesChangeRef.current = onNodesChange;\n const onEdgesChangeRef = useRef(onEdgesChange);\n onEdgesChangeRef.current = onEdgesChange;\n\n // Deselect all nodes and edges (uses refs so it's closure-safe)\n const deselectAll = useCallback(() => {\n const nodeDeselects: NodeChange[] = nodesRef.current\n .filter(n => n.selected)\n .map(n => ({ type: 'select' as const, id: n.id, selected: false }));\n const edgeDeselects: EdgeChange[] = edgesRef.current\n .filter(e => e.selected)\n .map(e => ({ type: 'select' as const, id: e.id, selected: false }));\n if (nodeDeselects.length) onNodesChangeRef.current?.(nodeDeselects);\n if (edgeDeselects.length) onEdgesChangeRef.current?.(edgeDeselects);\n }, []);\n\n // Track container size\n useEffect(() => {\n if (!containerRef.current) return;\n const ro = new ResizeObserver(entries => {\n for (const entry of entries) {\n setContainerSize({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n });\n }\n });\n ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [containerRef]);\n\n // Fit view on mount\n useEffect(() => {\n if (fitViewOnMount && nodes.length > 0) {\n // Small delay to allow handle registration\n const t = setTimeout(() => ctx.fitView({ padding: 0.2 }), 100);\n return () => clearTimeout(t);\n }\n }, [fitViewOnMount, nodes.length > 0]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ==================== Pan ====================\n const handlePaneMouseDown = useCallback((e: React.MouseEvent) => {\n // Only start pan from the canvas itself (not nodes/edges)\n if ((e.target as HTMLElement).closest('.kgraph-node-wrapper')) return;\n if ((e.target as HTMLElement).closest('.kgraph-edge-label')) return;\n\n if (!panOnDrag) {\n // Still handle pane click for deselection\n deselectAll();\n onPaneClick?.(e);\n return;\n }\n\n // Left button only\n if (e.button !== 0) return;\n\n panRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startVX: viewport.x,\n startVY: viewport.y,\n isPanning: false,\n };\n\n const handleMouseMove = (ev: MouseEvent) => {\n const pan = panRef.current;\n if (!pan) return;\n const dx = ev.clientX - pan.startX;\n const dy = ev.clientY - pan.startY;\n\n if (!pan.isPanning && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) {\n pan.isPanning = true;\n }\n\n if (!pan.isPanning) return;\n\n setViewport(v => ({\n ...v,\n x: pan.startVX + dx,\n y: pan.startVY + dy,\n }));\n };\n\n const handleMouseUp = (ev: MouseEvent) => {\n if (panRef.current && !panRef.current.isPanning) {\n // It was a click, not a drag — deselect all nodes/edges\n deselectAll();\n onPaneClick?.(ev as unknown as React.MouseEvent);\n }\n panRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [panOnDrag, viewport, setViewport, onPaneClick]);\n\n // ==================== Zoom (wheel + trackpad pinch) ====================\n // Use a native event listener so we can preventDefault on non-passive wheel events.\n // Trackpad pinch-to-zoom fires wheel events with ctrlKey=true and smaller deltaY.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const handleWheel = (e: WheelEvent) => {\n if (!zoomOnScroll) return;\n e.preventDefault();\n\n const rect = el.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n setViewport(v => {\n // ctrlKey = trackpad pinch gesture — use larger multiplier\n const sensitivity = e.ctrlKey ? 0.01 : 0.001;\n const zoomDelta = -e.deltaY * sensitivity;\n const newZoom = Math.min(Math.max(v.zoom * (1 + zoomDelta), minZoom), maxZoom);\n\n // Zoom toward mouse/finger position\n return {\n x: mouseX - (mouseX - v.x) * (newZoom / v.zoom),\n y: mouseY - (mouseY - v.y) * (newZoom / v.zoom),\n zoom: newZoom,\n };\n });\n };\n\n el.addEventListener('wheel', handleWheel, { passive: false });\n return () => el.removeEventListener('wheel', handleWheel);\n }, [zoomOnScroll, setViewport, containerRef, minZoom, maxZoom]);\n\n // ==================== Connection Drawing ====================\n const handleConnectionStart = useCallback((nodeId: string, handleId: string, type: 'source' | 'target', e: React.MouseEvent) => {\n if (!nodesConnectable) return;\n\n const handle = ctx.getHandlePosition(nodeId, handleId);\n if (!handle) return;\n\n setConnectionDrag({\n sourceNodeId: nodeId,\n sourceHandleId: handleId,\n sourcePosition: handle.position,\n sourceX: handle.x,\n sourceY: handle.y,\n mouseX: handle.x,\n mouseY: handle.y,\n });\n\n const handleMouseMove = (ev: MouseEvent) => {\n const pos = screenToCanvasPosition(ev.clientX, ev.clientY);\n setConnectionDrag(prev => prev ? { ...prev, mouseX: pos.x, mouseY: pos.y } : null);\n };\n\n const handleMouseUp = (ev: MouseEvent) => {\n // Check if mouse is over a handle\n const target = document.elementFromPoint(ev.clientX, ev.clientY);\n const handleEl = target?.closest?.('[data-handleid]');\n\n if (handleEl) {\n const targetNodeId = handleEl.getAttribute('data-nodeid');\n let targetHandleId = handleEl.getAttribute('data-handleid');\n const targetHandleType = handleEl.getAttribute('data-handletype');\n\n // If we landed on a source handle (invisible, stacked on top),\n // use the corresponding target handle ID instead\n if (targetHandleType === 'source' && targetHandleId) {\n targetHandleId = targetHandleId.replace('source-', 'target-');\n }\n\n if (targetNodeId && targetHandleId && targetNodeId !== nodeId) {\n onConnect?.({\n source: nodeId,\n target: targetNodeId,\n sourceHandle: handleId,\n targetHandle: targetHandleId,\n });\n }\n }\n\n setConnectionDrag(null);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [nodesConnectable, ctx, screenToCanvasPosition, onConnect]);\n\n // ==================== Drag & Drop ====================\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n onDragOver?.(e);\n }, [onDragOver]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n const position = screenToCanvasPosition(e.clientX, e.clientY);\n onDrop?.(e, position);\n }, [screenToCanvasPosition, onDrop]);\n\n // ==================== Node Click ====================\n const handleNodeClick = useCallback((e: React.MouseEvent, node: KGraphNode) => {\n if (!elementsSelectable) return;\n\n const isMultiSelect = e.shiftKey || e.metaKey;\n\n const nodeChanges: NodeChange[] = [];\n if (isMultiSelect) {\n // Toggle clicked node's selection without affecting others\n nodeChanges.push({ type: 'select', id: node.id, selected: !node.selected });\n } else {\n // Select clicked node, deselect all others\n for (const n of nodes) {\n if (n.id === node.id && !n.selected) {\n nodeChanges.push({ type: 'select', id: n.id, selected: true });\n } else if (n.id !== node.id && n.selected) {\n nodeChanges.push({ type: 'select', id: n.id, selected: false });\n }\n }\n }\n if (nodeChanges.length) onNodesChange?.(nodeChanges);\n\n // Deselect all edges (unless multi-select)\n if (!isMultiSelect) {\n const edgeDeselects: EdgeChange[] = edges\n .filter(ed => ed.selected)\n .map(ed => ({ type: 'select' as const, id: ed.id, selected: false }));\n if (edgeDeselects.length) onEdgesChange?.(edgeDeselects);\n }\n\n onNodeClick?.(e, node);\n }, [elementsSelectable, nodes, edges, onNodesChange, onEdgesChange, onNodeClick]);\n\n // ==================== Edge Click ====================\n const handleEdgeClick = useCallback((e: React.MouseEvent, edge: KGraphEdge) => {\n if (!elementsSelectable) return;\n e.stopPropagation();\n\n // Select clicked edge, deselect all others\n const edgeChanges: EdgeChange[] = [];\n for (const ed of edges) {\n if (ed.id === edge.id && !ed.selected) {\n edgeChanges.push({ type: 'select', id: ed.id, selected: true });\n } else if (ed.id !== edge.id && ed.selected) {\n edgeChanges.push({ type: 'select', id: ed.id, selected: false });\n }\n }\n if (edgeChanges.length) onEdgesChange?.(edgeChanges);\n\n // Deselect all nodes\n const nodeDeselects: NodeChange[] = nodes\n .filter(n => n.selected)\n .map(n => ({ type: 'select' as const, id: n.id, selected: false }));\n if (nodeDeselects.length) onNodesChange?.(nodeDeselects);\n\n onEdgeClick?.(e, edge);\n }, [elementsSelectable, nodes, edges, onNodesChange, onEdgesChange, onEdgeClick]);\n\n // ==================== Keyboard ====================\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n const target = e.target as HTMLElement;\n\n // Skip if focus is in any interactive element or inside a dialog\n if (\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.isContentEditable ||\n target.closest('[role=\"dialog\"]') ||\n target.closest('[role=\"combobox\"]') ||\n target.closest('[role=\"listbox\"]')\n ) return;\n\n const selectedNodes = nodes.filter(n => n.selected);\n const selectedEdges = edges.filter(ed => ed.selected);\n\n if (selectedNodes.length) {\n onNodesChange?.(selectedNodes.map(n => ({ type: 'remove' as const, id: n.id })));\n }\n if (selectedEdges.length) {\n onEdgesChange?.(selectedEdges.map(ed => ({ type: 'remove' as const, id: ed.id })));\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [nodes, edges, onNodesChange, onEdgesChange]);\n\n const transformStr = `translate(${viewport.x}px, ${viewport.y}px) scale(${viewport.zoom})`;\n\n return (\n <div\n ref={containerRef as React.RefObject<HTMLDivElement>}\n className={`kgraph-canvas ${className}`}\n style={{\n width: '100%',\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n backgroundColor: '#0e0e10',\n ...style,\n }}\n onMouseDown={handlePaneMouseDown}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {/* Background layer */}\n {showBackground && (\n <DotGrid viewport={viewport} gap={backgroundGap} />\n )}\n\n {/* SVG layer for edges */}\n <svg\n className=\"kgraph-svg-layer\"\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n overflow: 'visible',\n }}\n >\n <defs>\n <marker id=\"kgraph-arrow\" viewBox=\"0 0 12 12\" refX=\"12\" refY=\"6\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 1 L 12 6 L 0 11 z\" fill=\"#8b5cf6\" />\n </marker>\n <marker id=\"kgraph-arrow-selected\" viewBox=\"0 0 12 12\" refX=\"12\" refY=\"6\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 1 L 12 6 L 0 11 z\" fill=\"#a78bfa\" />\n </marker>\n </defs>\n <g\n transform={`translate(${viewport.x}, ${viewport.y}) scale(${viewport.zoom})`}\n style={{ pointerEvents: 'all' }}\n >\n <EdgeRenderer\n edges={edges}\n edgeTypes={edgeTypes}\n onEdgeClick={handleEdgeClick}\n />\n\n {/* Connection line while drawing */}\n {connectionDrag && (\n <ConnectionLine\n sourceX={connectionDrag.sourceX}\n sourceY={connectionDrag.sourceY}\n sourcePosition={connectionDrag.sourcePosition}\n targetX={connectionDrag.mouseX}\n targetY={connectionDrag.mouseY}\n />\n )}\n </g>\n </svg>\n\n {/* HTML layer for nodes */}\n <div\n className=\"kgraph-node-layer\"\n style={{\n position: 'absolute',\n inset: 0,\n transformOrigin: '0 0',\n transform: transformStr,\n pointerEvents: 'none',\n }}\n >\n <div style={{ pointerEvents: 'all' }}>\n <NodeRenderer\n nodes={nodes}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n snapToGrid={snapToGrid}\n snapGrid={snapGrid}\n draggable={nodesDraggable}\n selectable={elementsSelectable}\n onNodeClick={handleNodeClick}\n onConnectionStart={handleConnectionStart}\n zoom={viewport.zoom}\n />\n </div>\n </div>\n\n {/* Edge label overlay layer (HTML, inside viewport transform) */}\n <div\n className=\"kgraph-edge-label-layer\"\n style={{\n position: 'absolute',\n inset: 0,\n transformOrigin: '0 0',\n transform: transformStr,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n {/* Edge labels are rendered by custom edge components via EdgeLabel */}\n </div>\n\n {/* MiniMap */}\n {showMiniMap && containerSize.width > 0 && (\n <MiniMap\n nodes={nodes}\n viewport={viewport}\n onViewportChange={setViewport}\n containerWidth={containerSize.width}\n containerHeight={containerSize.height}\n />\n )}\n\n {/* Toolbar / overlays via children */}\n {children}\n </div>\n );\n};\n\n// ============================================================================\n// KGraphCanvas - Public component with provider\n// ============================================================================\n\nconst KGraphCanvas: React.FC<KGraphCanvasProps> = (props) => {\n return (\n <KGraphProvider\n nodes={props.nodes}\n edges={props.edges}\n minZoom={props.minZoom}\n maxZoom={props.maxZoom}\n >\n <InnerCanvas {...props} />\n </KGraphProvider>\n );\n};\n\nexport default KGraphCanvas;\n","import { useKGraphContext } from './KGraphProvider';\n\n/**\n * Public hook for accessing KGraph viewport controls.\n * Drop-in replacement for ReactFlow's useReactFlow().\n */\nexport function useKGraph() {\n const ctx = useKGraphContext();\n\n return {\n screenToCanvasPosition: ctx.screenToCanvasPosition,\n fitView: ctx.fitView,\n zoomIn: ctx.zoomIn,\n zoomOut: ctx.zoomOut,\n zoomTo: ctx.zoomTo,\n getViewport: () => ctx.viewport,\n setViewport: ctx.setViewport,\n getNodes: () => ctx.nodes,\n getEdges: () => ctx.edges,\n };\n}\n\nexport default useKGraph;\n","import React, { useCallback, useState } from 'react';\nimport { HandleProps, HandlePosition } from './types';\nimport { useHandleContext } from './NodeRenderer';\n\n// Map position to CSS placement\nfunction getPositionStyle(position: HandlePosition): React.CSSProperties {\n const base: React.CSSProperties = {\n position: 'absolute',\n zIndex: 20,\n };\n\n switch (position) {\n case 'top':\n return { ...base, top: 0, left: '50%', transform: 'translate(-50%, -50%)' };\n case 'bottom':\n return { ...base, bottom: 0, left: '50%', transform: 'translate(-50%, 50%)' };\n case 'left':\n return { ...base, left: 0, top: '50%', transform: 'translate(-50%, -50%)' };\n case 'right':\n return { ...base, right: 0, top: '50%', transform: 'translate(50%, -50%)' };\n }\n}\n\ninterface KGraphHandleProps extends HandleProps {\n nodeId?: string;\n onConnectionStart?: (nodeId: string, handleId: string, type: 'source' | 'target', e: React.MouseEvent) => void;\n}\n\nconst Handle: React.FC<KGraphHandleProps> = ({\n id,\n type,\n position,\n style,\n className = '',\n nodeId: nodeIdProp,\n onConnectionStart: onConnectionStartProp,\n}) => {\n const [hovered, setHovered] = useState(false);\n\n // Get nodeId and onConnectionStart from HandleContext if not provided as props\n const handleCtx = useHandleContext();\n const nodeId = nodeIdProp ?? handleCtx.nodeId;\n const onConnectionStart = onConnectionStartProp ?? handleCtx.onConnectionStart;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (type === 'source' && nodeId && onConnectionStart) {\n e.stopPropagation();\n e.preventDefault();\n onConnectionStart(nodeId, id, type, e);\n }\n }, [type, nodeId, id, onConnectionStart]);\n\n const posStyle = getPositionStyle(position);\n\n // Default colors — source handles are slightly brighter to signal \"drag from here\"\n const defaultBg = type === 'source' ? '#8b5cf6' : '#6d28d9';\n const hoverBg = type === 'source' ? '#a78bfa' : '#8b5cf6';\n const borderColor = type === 'source' ? '#a78bfa' : '#7c3aed';\n\n return (\n <div\n className={`kgraph-handle kgraph-handle-${type} kgraph-handle-${position} ${className}`}\n style={{\n width: hovered ? 12 : 8,\n height: hovered ? 12 : 8,\n borderRadius: '50%',\n background: style?.background as string || (hovered ? hoverBg : defaultBg),\n border: `2px solid ${style?.borderColor as string || borderColor}`,\n cursor: type === 'source' ? 'crosshair' : 'default',\n transition: 'width 0.15s, height 0.15s, background 0.15s, box-shadow 0.15s',\n boxShadow: hovered ? `0 0 6px ${borderColor}88` : 'none',\n ...posStyle,\n ...style,\n }}\n data-handleid={id}\n data-handletype={type}\n data-handleposition={position}\n data-nodeid={nodeId}\n onMouseDown={handleMouseDown}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n />\n );\n};\n\nexport default Handle;\n","import React from 'react';\n\ninterface EdgeLabelProps {\n x: number;\n y: number;\n zoom: number;\n children: React.ReactNode;\n}\n\n/**\n * EdgeLabel renders children as an HTML overlay at the given canvas coordinates.\n * Replaces ReactFlow's EdgeLabelRenderer.\n * The content is scaled inversely to the zoom level so it stays a consistent screen size.\n */\nconst EdgeLabel: React.FC<EdgeLabelProps> = ({ x, y, zoom, children }) => {\n return (\n <div\n className=\"kgraph-edge-label\"\n style={{\n position: 'absolute',\n left: x,\n top: y,\n transform: `translate(-50%, -50%) scale(${1 / zoom})`,\n transformOrigin: 'center center',\n pointerEvents: 'all',\n zIndex: 10,\n }}\n >\n {children}\n </div>\n );\n};\n\nexport default EdgeLabel;\n","import { KGraphNode, KGraphEdge, NodeChange, EdgeChange } from './types';\n\n/**\n * Apply an array of node changes immutably.\n * Drop-in replacement for ReactFlow's applyNodeChanges.\n */\nexport function applyNodeChanges(changes: NodeChange[], nodes: KGraphNode[]): KGraphNode[] {\n let result = nodes;\n\n for (const change of changes) {\n switch (change.type) {\n case 'position':\n result = result.map(n =>\n n.id === change.id\n ? {\n ...n,\n position: change.position ?? n.position,\n dragging: change.dragging,\n }\n : n\n );\n break;\n\n case 'select':\n result = result.map(n =>\n n.id === change.id\n ? { ...n, selected: change.selected }\n : n\n );\n break;\n\n case 'remove':\n result = result.filter(n => n.id !== change.id);\n break;\n\n case 'add':\n result = [...result, change.item];\n break;\n\n case 'dimensions':\n result = result.map(n =>\n n.id === change.id\n ? {\n ...n,\n width: change.dimensions.width,\n height: change.dimensions.height,\n }\n : n\n );\n break;\n }\n }\n\n return result;\n}\n\n/**\n * Apply an array of edge changes immutably.\n * Drop-in replacement for ReactFlow's applyEdgeChanges.\n */\nexport function applyEdgeChanges(changes: EdgeChange[], edges: KGraphEdge[]): KGraphEdge[] {\n let result = edges;\n\n for (const change of changes) {\n switch (change.type) {\n case 'select':\n result = result.map(e =>\n e.id === change.id\n ? { ...e, selected: change.selected }\n : e\n );\n break;\n\n case 'remove':\n result = result.filter(e => e.id !== change.id);\n break;\n\n case 'add':\n result = [...result, change.item];\n break;\n }\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,206 @@
1
+ 'use strict';
2
+
3
+ var chunkKII5OTZR_cjs = require('../chunk-KII5OTZR.cjs');
4
+ var lucideReact = require('lucide-react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var react = require('react');
7
+
8
+ var NODE_WIDTH = 208;
9
+ var NODE_HEIGHT = 120;
10
+ var NODE_COLLAPSED = 44;
11
+ var KIND = {
12
+ state: { accent: "#34d399", glow: "rgba(16,185,129,0.18)", icon: lucideReact.Database },
13
+ // emerald
14
+ processor: { accent: "#fbbf24", glow: "rgba(245,158,11,0.18)", icon: lucideReact.Cpu },
15
+ // amber
16
+ transform: { accent: "#a78bfa", glow: "rgba(139,92,246,0.18)", icon: lucideReact.Shuffle },
17
+ // violet
18
+ function: { accent: "#38bdf8", glow: "rgba(14,165,233,0.18)", icon: lucideReact.FunctionSquare },
19
+ // sky
20
+ connector: { accent: "#94a3b8", glow: "rgba(100,116,139,0.18)", icon: lucideReact.Plug }
21
+ // slate
22
+ };
23
+ function kindForNodeType(nodeType) {
24
+ if (nodeType === "state") return "state";
25
+ if (nodeType.includes("coalescer") || nodeType.includes("composite")) return "transform";
26
+ if (nodeType.startsWith("function")) return "function";
27
+ if (nodeType.startsWith("connector")) return "connector";
28
+ return "processor";
29
+ }
30
+ var PROCESSOR_LABELS = {
31
+ processor_openai: "OpenAI",
32
+ processor_visual_openai: "Vision",
33
+ processor_anthropic: "Anthropic",
34
+ processor_google_ai: "Google AI",
35
+ processor_llama: "Llama",
36
+ processor_mistral: "Mistral",
37
+ processor_python: "Python",
38
+ processor_provider: "Provider",
39
+ processor_state_coalescer: "Coalescer",
40
+ processor_state_composite: "Composite",
41
+ function_datasource_sql: "SQL Source",
42
+ connector_source: "Source",
43
+ connector_sink: "Sink",
44
+ trainer: "Trainer",
45
+ processor: "Processor"
46
+ };
47
+ function displayType(nodeType) {
48
+ if (PROCESSOR_LABELS[nodeType]) return PROCESSOR_LABELS[nodeType];
49
+ const cleaned = nodeType.replace(/^processor_/, "").replace(/_/g, " ");
50
+ return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);
51
+ }
52
+ var HANDLES = [
53
+ { id: "target-1", type: "target", position: "top" },
54
+ { id: "target-2", type: "target", position: "left" },
55
+ { id: "target-3", type: "target", position: "right" },
56
+ { id: "target-4", type: "target", position: "bottom" },
57
+ { id: "source-1", type: "source", position: "top" },
58
+ { id: "source-2", type: "source", position: "left" },
59
+ { id: "source-3", type: "source", position: "right" },
60
+ { id: "source-4", type: "source", position: "bottom" }
61
+ ];
62
+ var hiddenHandle = { opacity: 0, width: 8, height: 8, pointerEvents: "none" };
63
+ function StudioNode({ data, selected }) {
64
+ const d = data;
65
+ const kind = d.kind && d.kind in KIND ? d.kind : "processor";
66
+ const cfg = KIND[kind];
67
+ const Icon = cfg.icon;
68
+ const title = d.title || d.typeLabel || kind;
69
+ const shellStyle = {
70
+ backgroundImage: `linear-gradient(135deg, ${cfg.glow} 0%, #1e1e22 55%, #161618 100%)`,
71
+ border: `1.5px solid ${selected ? cfg.accent : "#33333a"}`,
72
+ boxShadow: selected ? `0 0 0 1px ${cfg.accent}, 0 0 18px ${cfg.glow}` : "0 1px 3px rgba(0,0,0,0.4)"
73
+ };
74
+ const toggle = (e) => {
75
+ e.stopPropagation();
76
+ d.onToggleCollapse?.();
77
+ };
78
+ if (d.collapsed) {
79
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group relative flex items-center justify-center rounded-lg", style: { width: NODE_COLLAPSED, height: NODE_COLLAPSED, ...shellStyle }, title: `${d.typeLabel ?? ""} \xB7 ${title}`, children: [
80
+ HANDLES.map((h) => /* @__PURE__ */ jsxRuntime.jsx(chunkKII5OTZR_cjs.Handle_default, { id: h.id, type: h.type, position: h.position, style: hiddenHandle }, `${h.type}-${h.position}`)),
81
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-5 w-5", style: { color: cfg.accent } }),
82
+ /* @__PURE__ */ jsxRuntime.jsx(
83
+ "button",
84
+ {
85
+ onClick: toggle,
86
+ title: "Expand",
87
+ className: "absolute right-0.5 top-0.5 hidden rounded p-0.5 text-slate-400 hover:bg-white/10 hover:text-slate-100 group-hover:block",
88
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "h-3 w-3" })
89
+ }
90
+ )
91
+ ] });
92
+ }
93
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group relative overflow-hidden rounded-lg", style: { width: NODE_WIDTH, height: NODE_HEIGHT, ...shellStyle }, children: [
94
+ HANDLES.map((h) => /* @__PURE__ */ jsxRuntime.jsx(chunkKII5OTZR_cjs.Handle_default, { id: h.id, type: h.type, position: h.position, style: hiddenHandle }, `${h.type}-${h.position}`)),
95
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 px-3 py-2", style: { borderBottom: "1px solid rgba(255,255,255,0.06)" }, children: [
96
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-4 w-4 flex-shrink-0", style: { color: cfg.accent } }),
97
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[11px] font-semibold uppercase tracking-wide", style: { color: cfg.accent }, children: d.typeLabel }),
98
+ d.onToggleCollapse ? /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: toggle, title: "Collapse", className: "ml-auto rounded p-0.5 text-slate-500 hover:bg-white/10 hover:text-slate-200", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { className: "h-3.5 w-3.5" }) }) : null
99
+ ] }),
100
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-3 py-2", children: [
101
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate text-sm font-medium", style: { color: "#f1f5f9" }, title, children: title }),
102
+ d.subtitle ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 truncate text-xs", style: { color: "#94a3b8" }, children: d.subtitle }) : null
103
+ ] })
104
+ ] });
105
+ }
106
+ function CleanEdge({ sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, selected }) {
107
+ const [d] = chunkKII5OTZR_cjs.getBezierPath({ sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition });
108
+ const stroke = selected ? "#c4b5fd" : "#7c8499";
109
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
110
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "kgraph-ism-arrow", markerWidth: "10", markerHeight: "10", refX: "7", refY: "3", orient: "auto", markerUnits: "strokeWidth", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M0,0 L6,3 L0,6 Z", fill: stroke }) }) }),
111
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d, fill: "none", stroke: "transparent", strokeWidth: 18 }),
112
+ /* @__PURE__ */ jsxRuntime.jsx(
113
+ "path",
114
+ {
115
+ d,
116
+ fill: "none",
117
+ stroke,
118
+ strokeWidth: selected ? 2 : 1.5,
119
+ strokeDasharray: "6 3",
120
+ markerEnd: "url(#kgraph-ism-arrow)"
121
+ }
122
+ )
123
+ ] });
124
+ }
125
+ function seedCollapsed(nodes) {
126
+ return new Set(nodes.filter((n) => n.data?.collapsed).map((n) => n.id));
127
+ }
128
+ function StudioGraph({ nodes, edges, onNodeClick, collapsible = true, selectedNodeId, className, style }) {
129
+ const [collapsed, setCollapsed] = react.useState(() => seedCollapsed(nodes));
130
+ const seedKey = react.useRef("");
131
+ react.useEffect(() => {
132
+ const key = nodes.map((n) => n.id).sort().join("\0");
133
+ if (key !== seedKey.current) {
134
+ seedKey.current = key;
135
+ setCollapsed(seedCollapsed(nodes));
136
+ }
137
+ }, [nodes]);
138
+ const toggleCollapse = react.useCallback((id) => {
139
+ setCollapsed((prev) => {
140
+ const next = new Set(prev);
141
+ if (next.has(id)) next.delete(id);
142
+ else next.add(id);
143
+ return next;
144
+ });
145
+ }, []);
146
+ const renderNodes = react.useMemo(
147
+ () => nodes.map((n) => {
148
+ const isCollapsed = collapsed.has(n.id);
149
+ return {
150
+ ...n,
151
+ width: isCollapsed ? NODE_COLLAPSED : NODE_WIDTH,
152
+ height: isCollapsed ? NODE_COLLAPSED : NODE_HEIGHT,
153
+ selected: selectedNodeId != null && n.id === selectedNodeId,
154
+ data: {
155
+ ...n.data,
156
+ collapsed: isCollapsed,
157
+ onToggleCollapse: collapsible ? () => toggleCollapse(n.id) : void 0
158
+ }
159
+ };
160
+ }),
161
+ [nodes, collapsed, collapsible, toggleCollapse, selectedNodeId]
162
+ );
163
+ const nodeTypes = react.useMemo(() => {
164
+ const m = { state: StudioNode, processor: StudioNode };
165
+ renderNodes.forEach((n) => {
166
+ m[n.type] = StudioNode;
167
+ });
168
+ return m;
169
+ }, [renderNodes]);
170
+ const edgeTypes = react.useMemo(() => {
171
+ const m = { default: CleanEdge };
172
+ edges.forEach((e) => {
173
+ if (e.type) m[e.type] = CleanEdge;
174
+ });
175
+ return m;
176
+ }, [edges]);
177
+ return /* @__PURE__ */ jsxRuntime.jsx(
178
+ chunkKII5OTZR_cjs.KGraphCanvas_default,
179
+ {
180
+ nodes: renderNodes,
181
+ edges,
182
+ nodeTypes,
183
+ edgeTypes,
184
+ nodesDraggable: false,
185
+ nodesConnectable: false,
186
+ elementsSelectable: true,
187
+ fitView: true,
188
+ showMiniMap: false,
189
+ showBackground: true,
190
+ className,
191
+ style: { width: "100%", height: "100%", background: "#0e0e10", ...style },
192
+ onNodeClick: onNodeClick ? (_evt, node) => onNodeClick(node) : void 0
193
+ }
194
+ );
195
+ }
196
+
197
+ exports.CleanEdge = CleanEdge;
198
+ exports.NODE_COLLAPSED = NODE_COLLAPSED;
199
+ exports.NODE_HEIGHT = NODE_HEIGHT;
200
+ exports.NODE_WIDTH = NODE_WIDTH;
201
+ exports.StudioGraph = StudioGraph;
202
+ exports.StudioNode = StudioNode;
203
+ exports.displayType = displayType;
204
+ exports.kindForNodeType = kindForNodeType;
205
+ //# sourceMappingURL=index.cjs.map
206
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ism/nodes.tsx","../../src/ism/edges.tsx","../../src/ism/StudioGraph.tsx"],"names":["Database","Cpu","Shuffle","FunctionSquare","Plug","jsxs","jsx","Handle_default","Plus","Minus","getBezierPath","useState","useRef","useEffect","useCallback","useMemo","KGraphCanvas_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MouseEvent } from 'react';\nimport { Handle } from '../index';\nimport type { NodeComponentProps, HandleType, HandlePosition } from '../types';\nimport { Database, Cpu, Shuffle, FunctionSquare, Plug, Minus, Plus, type LucideIcon } from 'lucide-react';\n\n// Footprint matches the Alethic ISM studio so published/exported layouts align.\nexport const NODE_WIDTH = 208;\nexport const NODE_HEIGHT = 120;\nexport const NODE_COLLAPSED = 44;\n\nexport type StudioNodeKind = 'state' | 'processor' | 'transform' | 'function' | 'connector';\n\n// Display fields precomputed by the host and placed on node.data.\nexport interface StudioNodeData {\n kind?: StudioNodeKind;\n typeLabel?: string;\n title?: string;\n subtitle?: string;\n // Injected by StudioGraph for collapse support.\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n [key: string]: unknown;\n}\n\n// Dark studio palette (self-contained — no consumer Tailwind tokens needed).\nconst KIND: Record<StudioNodeKind, { accent: string; glow: string; icon: LucideIcon }> = {\n state: { accent: '#34d399', glow: 'rgba(16,185,129,0.18)', icon: Database }, // emerald\n processor: { accent: '#fbbf24', glow: 'rgba(245,158,11,0.18)', icon: Cpu }, // amber\n transform: { accent: '#a78bfa', glow: 'rgba(139,92,246,0.18)', icon: Shuffle }, // violet\n function: { accent: '#38bdf8', glow: 'rgba(14,165,233,0.18)', icon: FunctionSquare }, // sky\n connector: { accent: '#94a3b8', glow: 'rgba(100,116,139,0.18)', icon: Plug }, // slate\n};\n\nexport function kindForNodeType(nodeType: string): StudioNodeKind {\n if (nodeType === 'state') return 'state';\n if (nodeType.includes('coalescer') || nodeType.includes('composite')) return 'transform';\n if (nodeType.startsWith('function')) return 'function';\n if (nodeType.startsWith('connector')) return 'connector';\n return 'processor';\n}\n\nconst PROCESSOR_LABELS: Record<string, string> = {\n processor_openai: 'OpenAI',\n processor_visual_openai: 'Vision',\n processor_anthropic: 'Anthropic',\n processor_google_ai: 'Google AI',\n processor_llama: 'Llama',\n processor_mistral: 'Mistral',\n processor_python: 'Python',\n processor_provider: 'Provider',\n processor_state_coalescer: 'Coalescer',\n processor_state_composite: 'Composite',\n function_datasource_sql: 'SQL Source',\n connector_source: 'Source',\n connector_sink: 'Sink',\n trainer: 'Trainer',\n processor: 'Processor',\n};\n\nexport function displayType(nodeType: string): string {\n if (PROCESSOR_LABELS[nodeType]) return PROCESSOR_LABELS[nodeType];\n const cleaned = nodeType.replace(/^processor_/, '').replace(/_/g, ' ');\n return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n}\n\nconst HANDLES: { id: string; type: HandleType; position: HandlePosition }[] = [\n { id: 'target-1', type: 'target', position: 'top' },\n { id: 'target-2', type: 'target', position: 'left' },\n { id: 'target-3', type: 'target', position: 'right' },\n { id: 'target-4', type: 'target', position: 'bottom' },\n { id: 'source-1', type: 'source', position: 'top' },\n { id: 'source-2', type: 'source', position: 'left' },\n { id: 'source-3', type: 'source', position: 'right' },\n { id: 'source-4', type: 'source', position: 'bottom' },\n];\nconst hiddenHandle = { opacity: 0, width: 8, height: 8, pointerEvents: 'none' as const };\n\n/**\n * StudioNode — read-only kgraph node card in the Alethic ISM studio aesthetic\n * (gradient tinted by type, neon accent header, glowing border when selected).\n * Display fields come from node.data (StudioNodeData).\n */\nexport function StudioNode({ data, selected }: NodeComponentProps) {\n const d = data as StudioNodeData;\n const kind: StudioNodeKind = d.kind && d.kind in KIND ? d.kind : 'processor';\n const cfg = KIND[kind];\n const Icon = cfg.icon;\n const title = d.title || d.typeLabel || kind;\n\n const shellStyle = {\n backgroundImage: `linear-gradient(135deg, ${cfg.glow} 0%, #1e1e22 55%, #161618 100%)`,\n border: `1.5px solid ${selected ? cfg.accent : '#33333a'}`,\n boxShadow: selected ? `0 0 0 1px ${cfg.accent}, 0 0 18px ${cfg.glow}` : '0 1px 3px rgba(0,0,0,0.4)',\n };\n\n const toggle = (e: MouseEvent) => {\n e.stopPropagation();\n d.onToggleCollapse?.();\n };\n\n if (d.collapsed) {\n return (\n <div className=\"group relative flex items-center justify-center rounded-lg\" style={{ width: NODE_COLLAPSED, height: NODE_COLLAPSED, ...shellStyle }} title={`${d.typeLabel ?? ''} · ${title}`}>\n {HANDLES.map((h) => (\n <Handle key={`${h.type}-${h.position}`} id={h.id} type={h.type} position={h.position} style={hiddenHandle} />\n ))}\n <Icon className=\"h-5 w-5\" style={{ color: cfg.accent }} />\n <button\n onClick={toggle}\n title=\"Expand\"\n className=\"absolute right-0.5 top-0.5 hidden rounded p-0.5 text-slate-400 hover:bg-white/10 hover:text-slate-100 group-hover:block\"\n >\n <Plus className=\"h-3 w-3\" />\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"group relative overflow-hidden rounded-lg\" style={{ width: NODE_WIDTH, height: NODE_HEIGHT, ...shellStyle }}>\n {HANDLES.map((h) => (\n <Handle key={`${h.type}-${h.position}`} id={h.id} type={h.type} position={h.position} style={hiddenHandle} />\n ))}\n\n <div className=\"flex items-center gap-2 px-3 py-2\" style={{ borderBottom: '1px solid rgba(255,255,255,0.06)' }}>\n <Icon className=\"h-4 w-4 flex-shrink-0\" style={{ color: cfg.accent }} />\n <span className=\"truncate text-[11px] font-semibold uppercase tracking-wide\" style={{ color: cfg.accent }}>\n {d.typeLabel}\n </span>\n {d.onToggleCollapse ? (\n <button onClick={toggle} title=\"Collapse\" className=\"ml-auto rounded p-0.5 text-slate-500 hover:bg-white/10 hover:text-slate-200\">\n <Minus className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n\n <div className=\"px-3 py-2\">\n <div className=\"truncate text-sm font-medium\" style={{ color: '#f1f5f9' }} title={title}>\n {title}\n </div>\n {d.subtitle ? (\n <div className=\"mt-0.5 truncate text-xs\" style={{ color: '#94a3b8' }}>\n {d.subtitle}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","import { getBezierPath } from '../index';\nimport type { EdgeComponentProps } from '../types';\n\n/**\n * CleanEdge — read-only kgraph edge for the dark studio (kgraph's default edge\n * is hardcoded purple). Dashed bezier that reads on a dark canvas, with an\n * arrowhead; brighter on hover/selection.\n */\nexport function CleanEdge({ sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, selected }: EdgeComponentProps) {\n const [d] = getBezierPath({ sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition });\n const stroke = selected ? '#c4b5fd' : '#7c8499'; // violet-300 / slate\n return (\n <g>\n <defs>\n <marker id=\"kgraph-ism-arrow\" markerWidth=\"10\" markerHeight=\"10\" refX=\"7\" refY=\"3\" orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0 L6,3 L0,6 Z\" fill={stroke} />\n </marker>\n </defs>\n <path d={d} fill=\"none\" stroke=\"transparent\" strokeWidth={18} />\n <path\n d={d}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={selected ? 2 : 1.5}\n strokeDasharray=\"6 3\"\n markerEnd=\"url(#kgraph-ism-arrow)\"\n />\n </g>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\nimport { KGraphCanvas } from '../index';\nimport type { KGraphNode, KGraphEdge } from '../types';\nimport { StudioNode, NODE_WIDTH, NODE_HEIGHT, NODE_COLLAPSED } from './nodes';\nimport { CleanEdge } from './edges';\n\nexport interface StudioGraphProps {\n /** Pre-mapped kgraph nodes; node.data should carry StudioNodeData fields. */\n nodes: KGraphNode[];\n /** Pre-mapped kgraph edges. */\n edges: KGraphEdge[];\n /** Fired when a node is clicked. */\n onNodeClick?: (node: KGraphNode) => void;\n /** Allow per-node collapse (default true). */\n collapsible?: boolean;\n /**\n * Id of the node to render as selected (glowing accent border). Selection is\n * host-controlled — clicking a node reports via onNodeClick; the host decides\n * what is selected and passes it back here.\n */\n selectedNodeId?: string;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Node ids whose data carries a truthy `collapsed` flag (seeded from the host). */\nfunction seedCollapsed(nodes: KGraphNode[]): Set<string> {\n return new Set(nodes.filter((n) => (n.data as { collapsed?: boolean })?.collapsed).map((n) => n.id));\n}\n\n/**\n * StudioGraph — a read-only kgraph canvas with the Alethic ISM studio look:\n * every node renders as StudioNode, every edge as CleanEdge, non-interactive\n * (no drag/connect), fit-to-view. Manages per-node collapse: collapsed nodes\n * shrink to an icon and their kgraph dimensions/edge anchors shrink with them.\n */\nexport function StudioGraph({ nodes, edges, onNodeClick, collapsible = true, selectedNodeId, className, style }: StudioGraphProps) {\n // Seed collapse from each node's data.collapsed (carried from the manifest);\n // the user can then toggle. Re-seed only when the node id set changes (a new\n // graph is loaded) so selection re-renders don't discard user toggles.\n const [collapsed, setCollapsed] = useState<Set<string>>(() => seedCollapsed(nodes));\n const seedKey = useRef<string>('');\n useEffect(() => {\n const key = nodes.map((n) => n.id).sort().join('\u0000');\n if (key !== seedKey.current) {\n seedKey.current = key;\n setCollapsed(seedCollapsed(nodes));\n }\n }, [nodes]);\n\n const toggleCollapse = useCallback((id: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const renderNodes = useMemo<KGraphNode[]>(\n () =>\n nodes.map((n) => {\n const isCollapsed = collapsed.has(n.id);\n return {\n ...n,\n width: isCollapsed ? NODE_COLLAPSED : NODE_WIDTH,\n height: isCollapsed ? NODE_COLLAPSED : NODE_HEIGHT,\n selected: selectedNodeId != null && n.id === selectedNodeId,\n data: {\n ...n.data,\n collapsed: isCollapsed,\n onToggleCollapse: collapsible ? () => toggleCollapse(n.id) : undefined,\n },\n };\n }),\n [nodes, collapsed, collapsible, toggleCollapse, selectedNodeId],\n );\n\n const nodeTypes = useMemo(() => {\n const m: Record<string, typeof StudioNode> = { state: StudioNode, processor: StudioNode };\n renderNodes.forEach((n) => {\n m[n.type] = StudioNode;\n });\n return m;\n }, [renderNodes]);\n\n const edgeTypes = useMemo(() => {\n const m: Record<string, typeof CleanEdge> = { default: CleanEdge };\n edges.forEach((e) => {\n if (e.type) m[e.type] = CleanEdge;\n });\n return m;\n }, [edges]);\n\n return (\n <KGraphCanvas\n nodes={renderNodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable\n fitView\n showMiniMap={false}\n showBackground\n className={className}\n style={{ width: '100%', height: '100%', background: '#0e0e10', ...style }}\n onNodeClick={onNodeClick ? (_evt, node) => onNodeClick(node) : undefined}\n />\n );\n}\n"]}
@@ -0,0 +1,60 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { N as NodeComponentProps, E as EdgeComponentProps, a as KGraphNode, b as KGraphEdge } from '../types-C9DQLToO.cjs';
3
+ import { CSSProperties } from 'react';
4
+
5
+ declare const NODE_WIDTH = 208;
6
+ declare const NODE_HEIGHT = 120;
7
+ declare const NODE_COLLAPSED = 44;
8
+ type StudioNodeKind = 'state' | 'processor' | 'transform' | 'function' | 'connector';
9
+ interface StudioNodeData {
10
+ kind?: StudioNodeKind;
11
+ typeLabel?: string;
12
+ title?: string;
13
+ subtitle?: string;
14
+ collapsed?: boolean;
15
+ onToggleCollapse?: () => void;
16
+ [key: string]: unknown;
17
+ }
18
+ declare function kindForNodeType(nodeType: string): StudioNodeKind;
19
+ declare function displayType(nodeType: string): string;
20
+ /**
21
+ * StudioNode — read-only kgraph node card in the Alethic ISM studio aesthetic
22
+ * (gradient tinted by type, neon accent header, glowing border when selected).
23
+ * Display fields come from node.data (StudioNodeData).
24
+ */
25
+ declare function StudioNode({ data, selected }: NodeComponentProps): react_jsx_runtime.JSX.Element;
26
+
27
+ /**
28
+ * CleanEdge — read-only kgraph edge for the dark studio (kgraph's default edge
29
+ * is hardcoded purple). Dashed bezier that reads on a dark canvas, with an
30
+ * arrowhead; brighter on hover/selection.
31
+ */
32
+ declare function CleanEdge({ sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, selected }: EdgeComponentProps): react_jsx_runtime.JSX.Element;
33
+
34
+ interface StudioGraphProps {
35
+ /** Pre-mapped kgraph nodes; node.data should carry StudioNodeData fields. */
36
+ nodes: KGraphNode[];
37
+ /** Pre-mapped kgraph edges. */
38
+ edges: KGraphEdge[];
39
+ /** Fired when a node is clicked. */
40
+ onNodeClick?: (node: KGraphNode) => void;
41
+ /** Allow per-node collapse (default true). */
42
+ collapsible?: boolean;
43
+ /**
44
+ * Id of the node to render as selected (glowing accent border). Selection is
45
+ * host-controlled — clicking a node reports via onNodeClick; the host decides
46
+ * what is selected and passes it back here.
47
+ */
48
+ selectedNodeId?: string;
49
+ className?: string;
50
+ style?: CSSProperties;
51
+ }
52
+ /**
53
+ * StudioGraph — a read-only kgraph canvas with the Alethic ISM studio look:
54
+ * every node renders as StudioNode, every edge as CleanEdge, non-interactive
55
+ * (no drag/connect), fit-to-view. Manages per-node collapse: collapsed nodes
56
+ * shrink to an icon and their kgraph dimensions/edge anchors shrink with them.
57
+ */
58
+ declare function StudioGraph({ nodes, edges, onNodeClick, collapsible, selectedNodeId, className, style }: StudioGraphProps): react_jsx_runtime.JSX.Element;
59
+
60
+ export { CleanEdge, NODE_COLLAPSED, NODE_HEIGHT, NODE_WIDTH, StudioGraph, type StudioGraphProps, StudioNode, type StudioNodeData, type StudioNodeKind, displayType, kindForNodeType };