@ankhzet/graph 0.3.0 → 0.3.2
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/CHANGELOG.md +14 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.js +250 -250
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/src/graph/Viewport.tsx +9 -9
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["ConnectionPoint","Position","snap","v","grid","Math","round","addOffset","t","s","dir","x","y","isConnectionPoint","node","ID","port","point","isNodePoint","connectNodes","connect","joint","nodes","target","idx","findIndex","has","push","splice","intersect","x1","y1","x2","y2","x3","y3","x4","y4","denominator","ua","ub","ConnectionPoint","NodeJoinRequest","NodeJoint","NodeJoints","connectNodes","isConnectionPoint","isNodePoint","GraphNodeJoints","ID","joints","Map","parentId","constructor","ports","joint","set","port","Symbol","iterator","Iterator","values","connected","result","Array","nodes","length","push","find","predicate","map","mapper","index","R","size","has","nodeId","portId","getPort","hasAtPort","nodePortId","get","some","found","undefined","connect","target","Error","getNodes","ids","Set","node","add","count","IEventHandler","DisposableEventSource","Disposer","ConnectionPoint","Coordinator","GraphNodeDescriptor","GraphNodeInterface","IMenu","NodeConnection","NodeConnectionRequest","NodeJoint","NodeJoints","Position","GraphNodeJoints","E_CONNECT","Symbol","E_MOVE","GraphNode","ID","Data","R","id","description","inputs","outputs","coordinator","pos","x","y","constructor","render","content","getMenu","tag","handleMenu","data","title","width","sizes","lane","space","height","Math","max","count","position","snap","dispatchEvent","isInput","portId","nodeId","nodePortId","hasAtPort","isOutput","isConnected","port","input","to","node","getNodes","connect","nodes","source","target","map","at","output","move","onConnect","handler","handleEvent","onMove","isLike","GraphNodeInterface","Position","GraphBarrier","node","N","NodesGraph","_barriers","Partial","Record","Node","_isBarrier","map","nodes","constructor","isBarrier","Object","fromEntries","id","cached","undefined","getSubGraphs","subset","rest","keys","result","nodeId","pop","sub","getConnectedNodes","idx","indexOf","splice","push","inputs","ids","outputs","target","includes","found","getCenter","mapper","offsets","filter","length","x","y","min","Infinity","max","offset","isLike","GraphNodeInterface","Position","NodesGraph","Layout","Layer","id","Node","Layers","Iterable","idx","LayeredLayout","layers","hash","center","getCenter","node","position","spread","layer","nodes","chain","max","map","height","shift","findLayer","Math","findMax","findLayers","get","inputs","ids","Object","values","dependants","found","other","has","push","filter","remove","put","group","entries","Partial","Record","exclude","indexOf","fromLayer","offset","includes","toLayer","min","dependant","all","candidates","concat","walk","consumer","input","GraphNodeInterface","Position","NodesGraph","Layout","ClusteredLayout","Node","cache","Record","hash","center","getCenter","node","position","splice","rest","pos","put","id","processed","includes","isBarrier","inputs","outputs","align","height","ids","space","length","map","index","result","offset","push","spread","layer","nodes","theory","bucket","x","column","Math","max","y","GraphNodeInterface","Relations","Record","K","Split","roots","joint","leafs","NodesSort","sort","nodes","dependencies","Partial","R","dependants","all","node","r","id","d","inputs","ids","indexOf","push","length","walk","cies","Object","keys","ants","split","layers","newAnts","newCies","dependant","filtered","filter","dependency","unshift","sides","concat","console","log","EdgesSort","sort","dependants","Record","dependencies","layers","leafs","pop","id","mutate","rest","variations","i","length","variation","splice","push","Constructor","GraphNodeInterface","GraphBarrier","Layout","Layouter","isBarrier","Node","klass","nodes","constructor","layout","subset","getSubGraphs","IEventHandler","DisposableEventSource","Disposer","TypeId","StoreInterface","E_CHANGED","Symbol","Store","id","Item","all","map","Record","constructor","clear","old","dispatchEvent","diff","added","find","predicate","node","filter","get","add","nodes","T","iterable","Array","isArray","includes","push","length","concat","remove","ids","trimmed","onChange","handler","handleEvent","useLayoutEffect","useState","useSyncStore","StoreInterface","isEqualIdentifiables","a","id","b","length","every","item","idx","useStore","init","S","store","args","cb","onChange","all","items","const","node","dispose","useState","useLastCallback","useDrag","DragHandler","offset","x","y","ClickHandler","e","MouseEvent","DragHandlers","position","onPointer","onClick","onUp","onDrag","onContext","useDraggable","HTMLElement","handlers","delta","anchor","setAnchor","isDragging","bind","E","pos","move","up","down","context","reset","DisposableEventSource","Batch","counter","constructor","batch","cb","begin","end","dispatchEvent","and","handler","handleEvent","ColorSource","DisplayObject","Graphics","intersect","modifiers","PI2","Math","PI","PIHalf","RectSpinner","sizeX","sizeY","lineSize","color","progress","active","mask","edge","interval","ctx","segments","corners","constructor","child","radius","lineStyle","width","drawRoundedRect","position","set","addChild","halfX","halfY","mX","mY","pX","pY","setActive","value","update","clearInterval","setInterval","destroy","_options","removeFromParent","hotSwap","removeChildren","phase","x","cos","y","sin","out","intersection","winding","i","length","segment","hit","clear","beginFill","moveTo","lineTo","endFill","Line","Point","IPointData","ColorSource","Graphics","ObservablePoint","PIXILine","from","to","angled","color","capped","width","constructor","sx","sy","tx","ty","update","eventMode","moveFromPoint","pos","moved","x","y","copyFrom","moveToPoint","setColor","setWidth","fromX","fromY","toX","toY","dx","dy","halfX","halfY","clear","lineStyle","alpha","moveTo","lineTo","beginFill","drawCircle","endFill","Connector","Position","Graphics","Point","PIXILine","PIXIConnector","ID","from","to","Record","constructor","sx","sy","line","Object","values","addChild","addTarget","node","port","key","has","x","y","moveTargetTo","pos","moveToPoint","removeTarget","removeChild","move","moved","copyFrom","moveFromPoint","Connector","ConnectorPoint","GraphNodeInterface","Position","isConnectionPoint","ColorSource","Graphics","PortConnectionPoint","PIXILine","PIXIConnector","ConnectionViability","None","Viable","Prohbited","VIABILITY_COLOR","REMOVABILITY_COLOR","getViablity","start","finish","removing","point","parent","input","hover","match","finishConnected","nodes","some","port","startConnected","isSamePoint","a","b","NodeConnection","connect","output","Node","connector","Cross","line1","line2","line12","line22","constructor","size","color","bg","half","half2","setWidth","setColor","update","addChild","show","visible","hide","setAngle","value","angle","rotation","setPosition","pos","x","y","PIXIPendingConnector","viable","line","cross","addTarget","isRemoving","remove","setLine","x1","y1","x2","y2","dx","dy","Math","atan","mid","moveToPoint","flail","hoverPort","undefined","removeStart","removeFinish","Container","BitmapFont","BitmapText","IBitmapTextStyle","TextStyle","ITextStyle","IBitmapFontOptions","ColorSource","PIXIText","makeFont","id","style","Partial","options","document","from","chars","text","factory","textStyle","Omit","fontName","constructor","addChild","String","tint","color","DisposableEventSource","IEventHandler","ConnectorPoint","GraphNodeInterface","FederatedPointerEvent","Graphics","PORT_SIZE","PIXIText","E_PORT_CLICK","Symbol","for","E_PORT_HOVER","PIXIPort","port","factory","fontFamily","fontSize","lineHeight","align","ee","active","constructor","connectorPoint","Node","hasBothLanes","nodes","length","x","y","dir","input","text","addChild","label","width","eventMode","lineStyle","beginFill","drawCircle","endFill","cursor","addEventListener","e","preventDefault","stopPropagation","dispatchEvent","String","name","slice","dispose","removeFromParent","setActive","update","onClick","handler","handleEvent","onHover","DisposableEventSource","Position","DisplayObject","Point","Draggable","_drag_meta","root","emitter","dragging","anchor","newPosition","lastPosition","onDragEnd","event","onDragMove","E_MOVE_NODE","Symbol","for","E_CAPTURE_NODE","copyPoint","target","pos","global","x","y","findRoot","p","__drag_root","parent","onDragStart","this","dispatchEvent","buttons","meta","Error","position","clone","addEventListener","capture","passive","d","removeEventListener","IEventHandler","DisposableEventSource","Connector","ConnectorId","ConnectorPoint","GraphNodeInterface","NodeConnection","Position","addOffset","connectNodes","isConnectionPoint","Container","FederatedPointerEvent","IPointData","ColorSource","Graphics","E_PORT_CLICK","E_PORT_HOVER","PIXIPort","E_CAPTURE_NODE","E_MOVE_NODE","onDragStart","PIXIConnector","PIXIText","E_NODE_CONTEXT","Symbol","for","E_CONNECTORS_UPDATE","NODE_WIDTH","LANE_WIDTH","LANE_HEIGHT","PORT_SIZE","Getter","id","ID","R","PortConnectionPoint","point","Node","pos","hover","remove","RoundRectStyle","stroke","fill","x","y","width","height","thickness","radius","PIXINode","label","factory","fontSize","align","dropShadow","dropShadowDistance","_shape","_connectors","drag","data","find","ports","Map","constructor","onConnect","connect","bind","title","dispose","port","values","map","length","dispatchEvent","removeFromParent","undefined","move","renderable","position","copyFrom","placeConnectors","hitTest","cx","cy","#connect","input","source","guid","target","connector","connectors","get","setActive","nodes","connectedAt","nodeId","portId","Input","some","idx1","idx2","joint","inputs","offset","push","parent","name","outputs","recursive","uid","active","node","targetOut","moveTargetTo","removeTarget","set","size","add","entries","block","makeRoundRect","addChild","makeLane","count","hasBothLanes","makePort","base","render","eventMode","addEventListener","e","handleClick","rect","lineStyle","beginFill","drawRoundedRect","endFill","style","Partial","Object","assign","onClick","buttons","event","tag","type","ctrlKey","metaKey","onHover","stopPropagation","preventDefault","call","onContext","handler","handleEvent","onPortClick","onPortHover","onCapture","onMove","onConnectorsUpdate","Array","update","reduce","acc","c","Record","Position","ColorSource","Container","Graphics","Rectangle","PIXIText","SnapSize","cell","count","size","width","height","identity","x","y","equalSnaps","a","b","clamp","value","min","max","clampEdge","offset","edge1","edge2","padding","nextEven","result","Math","ceil","PIXIGrid","text","factory","fontSize","fill","stroke","dropShadow","dropShadowDistance","chars","cellSize","colors","multiplier","xR","xL","yB","yT","viewport","snap","grid","rullers","constructor","addChild","lods","length","snapSize","lod","pow","ox","oy","dx","dy","toMaxSnap","makeRullers","snapOld","snapNew","left","top","copyFrom","update","removeChildren","shape","halfStroke","rightmost","topmost","lineStyle","moveTo","lineTo","th","lw","rw","tw","bw","ly","lx1","lx2","makeLOD","color","i","makeGrid","keys","c","IMenuItem","Container","Graphics","PIXIText","ITEM_HEIGHT","ITEM_H_PADDING","PIXIMenuItem","label","factory","fontSize","align","fill","bg","item","group","width","height","hover","separator","disabled","index","constructor","onSelect","addChild","eventMode","addEventListener","e","stopPropagation","preventDefault","resize","update","value","labelWidth","block","lineStyle","moveTo","lineTo","beginFill","drawRect","endFill","drawRoundedRect","clear","text","x","y","alpha","tint","IEventHandler","DisposableEventSource","IMenu","IMenuItem","Container","Graphics","Point","PIXIMenuItem","E_ITEM_SELECT","Symbol","for","E_CLOSE_MENU","dummyLocal","PIXIMenu","bg","container","mask","items","ee","hoverIndex","constructor","menu","addChild","map","item","index","handleSelect","eventMode","addEventListener","e","getItemAtY","getLocalPosition","y","update","height","value","changeHover","hover","dispatchEvent","close","visible","onSelect","handler","handleEvent","onClose","width","Math","max","labelWidth","reduce","acc","block","lineStyle","beginFill","drawRoundedRect","endFill","clear","offset","resize","debounce","Connector","ConnectorId","GraphNodeInterface","HitTestResult","IMenuProvider","Position","Renderer","RendererConfig","RendererGUI","RendererOptions","addOffset","FederatedPointerEvent","IRenderer","autoDetectRenderer","Container","Rectangle","Ticker","PIXIConnector","NodeConnection","PIXIPendingConnector","PIXINode","PIXIGrid","PIXIMenu","PIXIRenderer","Node","ticker","nodes","Map","connectors","_pending","_renderer","menu","gui","world","root","overlay","grid","capturing","options","viewport","width","height","resolution","window","devicePixelRatio","backgroundColor","antialias","transparent","throttle","speed","find","#find","id","get","constructor","maxFPS","cellSize","colors","sortableChildren","__drag_root","addChild","add","render","bind","eventMode","hitArea","contains","addEventListener","e","handlePointerMove","fromGlobal","global","handlePointerDown","fullSpeed","renderer","backgroundAlpha","autoDensity","start","value","stop","destroy","center","x","y","translation","cx","cy","transform","position","pos","fromLocal","offsetPos","dir","translate","copyFrom","updateViewport","closeMenu","close","showMenu","provider","tag","descriptor","getMenu","Object","assign","onSelect","item","handleMenu","data","onClose","removeFromParent","addNode","node","wrapped","onMove","moveNodeTo","onCapture","capture","moveToForeground","undefined","onContext","event","onPortClick","remove","point","length","pending","connect","connectNodes","onPortHover","hoverPort","onConnectorsUpdate","uid","connector","addConnector","removeConnector","onDispose","delete","set","renderable","removeNode","wrapper","dispose","clear","toRemove","values","removeChildren","flail","shiftKey","buttons","stopPropagation","preventDefault","output","port","outputPort","parent","outputNode","input","inputPort","inputNode","placeConnectors","buildConnectors","guid","has","asPixi","zIndex","removeChild","graphics","setChildIndex","children","hitTest","getNodePos","nodeId","move","layout","mount","HTMLElement","resize","appendChild","view","globalThis","unmount","update","IMenu","IMenuProvider","Position","RendererGUI","Container","Text","PIXIText","DEFAULT_LEGEND","PIXIGUI","M","text","factory","fontSize","align","fill","dropShadow","dropShadowDistance","chars","makeText","menu","mark","lineHeight","legend","dynamicText","legendText","constructor","addChild","eventMode","addEventListener","x","y","getMenu","tag","pos","handleMenu","data","value","DisplayObject","Container","PIXIStacked","first","T","constructor","rest","addChild","hotSwap","children","removeChildren","ColorSource","Graphics","OutlinedOptions","x","y","width","height","radius","lineSize","color","PIXIOutlined","options","active","constructor","value","clear","lineStyle","drawRoundedRect","GraphNodeInterface","HitTestResult","Renderer","Position","RendererConfig","RendererOptions","Batch","PIXIRenderer","GraphAdapter","Iterable","Node","renderer","nodes","constructor","config","and","render","Symbol","iterator","clear","splice","update","moveToForeground","node","hitTest","pos","getNodePos","moveNodeTo","position","addNode","idx","indexOf","push","removeNode","capturing","releaseNode","undefined","translation","translate","resize","width","height","fromGlobal","fromLocal","mount","element","HTMLElement","options","unmount","layout","useLastCallback","ChangeEvent","useState","useMemo","useEffect","useLayoutEffect","PropsWithChildren","GroupableItem","id","ID","ItemsGroup","value","label","ids","GroupResolver","node","T","NodeGroupsProps","items","resolver","onSelect","group","makeGroups","groups","push","sort","a","b","localeCompare","concat","map","length","isSameArray","i","isValue","s","String","item","NodeGroups","observer","children","rest","Item","setGroup","find","currentAsString","handleGroup","target","HTMLSelectElement","found","useMeasure","Styles","forwardRef","useEffect","useImperativeHandle","DragHandlers","useDraggable","ViewportProps","handlers","onResize","rect","width","height","Viewport","observer","props","ref","measureRef","HTMLDivElement","bind","reset","element","current","styles","root","of","flex","display","minWidth","minHeight","useLastCallback","TypeId","ItemsGroup","NodeGroups","ManagedGraphNode","GraphGroupsProps","items","onSelect","ids","GraphGroups","observer","props","handleSelect","group","resolver","node","item","isolator","id","value","label","title","TypeId","GraphListeners","ManagedGraphNode","IItem","ConnectionPoint","Coordinator","NodeConnection","Position","StoreInterface","GraphHandlers","onCreate","data","DTO","Promise","Item","onEdit","item","onAddPort","input","onDisconnectPort","portId","onDeletePort","onDelete","onMove","pos","onConnect","connection","onSelect","onContextMenu","createGraphHandlers","coordinator","nodes","Node","Partial","handleAddPort","node","handleDisconnectPort","handleDeletePort","handleDelete","handleMove","toData","handleConnect","connect","source","target","sourceNode","get","port","map","nodeId","filter","p","handleEdit","handleSelect","handleContextMenu","canvas","onSelectNode","loader","Ref","useEffect","useImperativeHandle","useLayoutEffect","useMemo","useRef","useLastCallback","IMenuProvider","Coordinator","DragHandlers","GraphNodeInterface","Position","GraphAdapter","PIXIGUI","Viewport","ZERO","x","y","GraphNodeProps","innerRef","GraphRef","Node","coordinator","nodes","subset","menu","onSelectNode","node","pos","onContextMenu","graph","element","HTMLDivElement","GraphCanvas","observer","rest","cursor","ref","reset","gui","maxFPS","grid","cellSize","gridSize","colors","current","handleResize","width","height","resize","handleGUI","toData","translation","cx","cy","text","onPointer","fromLocal","onUp","releaseNode","onClick","e","MouseEvent","capturing","shiftKey","onDrag","translate","onContext","handlers","position","renderer","ids","map","id","batch","includes","removeNode","addNode","moveNodeTo","layout","container","mount","viewport","clientWidth","clientHeight","resolution","window","devicePixelRatio","backgroundColor","antialias","transparent","TypeId","NodeConnection","Position","StoreInterface","ManagedGraphNode","GraphListeners","onEdit","node","N","onConnect","connection","Promise","onMove","pos","onAddPort","input","onDisconnectPort","portId","onDeletePort","onDelete","SyncConfig","added","removed","connectHandlers","onEditAction","onDeleteAction","onAddPortAction","onDisconnectPortAction","port","onDeletePortAction","syncNodes","nodes","handlers","length","intermediate","reduce","acc","id","Record","getNode","find","ports","item","fromId","to","toNode","toPort","getItemPort","name","connect","add","remove","Coordinator","IMenu","IMenuItem","IMenuProvider","Position","MENU_GROUPS","Array","label","items","title","args","Partial","Record","data","ports","JSON","stringify","in","out","system","instructions","llm","js","separator","GraphDTO","x","y","useGraphMenu","coordinator","onCreate","DTO","getMenu","_tag","pos","base","action","toData","map","group","rest","flat","handleMenu","payload","useRef","matchId","useIsomorphicLayoutEffect","ManagedGraphNode","IItem","useNodeSelection","nodes","Item","selected","ref","added","filter","item","current","some","id","removed","find","setSelected","IEventHandler","IMenu","IMenuProvider","NodeJoint","Position","ConnectionPoint","Coordinator","TypeId","Identifiable","GraphNode","Container","RectSpinner","PIXIStacked","PIXIOutlined","isChannelName","name","startsWith","getChannelName","slice","IItem","isolator","title","ports","IItemPort","input","to","Item","port","Resolver","id","ToTitle","item","MenuAction","action","MenuActions","ADD_PORT","DISCONNECT_PORT","DELETE_PORT","EDIT_NODE","DELETE_NODE","translatePort","find","portName","channel","nodes","node","push","NodeStatus","Idle","Processing","Done","Error","Selected","NodeData","status","progress","ManagedGraphNode","shape","outline","constructor","finder","coordinator","toTitle","inputs","filter","map","outputs","position","toGraph","dispose","destroy","undefined","getMenu","tag","type","items","label","group","data","separator","joint","output","found","bound","length","disabled","handleMenu","dispatchEvent","onAddPortAction","handler","handleEvent","onDisconnectPortAction","onDeletePortAction","onEditAction","onDeleteAction","setStatus","description","setProgress","setActive","isInProgress","setSelected","value","isSelected","first","active","getItemPort","predicate","render","content","width","height","hotSwap","color","lineSize","radius","sizeX","sizeY","useMemo","useRef","useIsomorphicLayoutEffect","usePrevious","reaction","useLastCallback","useSyncStore","Coordinator","isEqualIdentifiables","ManagedGraphNode","IItem","TypeId","useNodes","coordinator","sync","onUpdate","store","toTitle","get","Item","onChange","cb","config","added","removed","item","ref","methods","subscribe","getSnapshot","selector","items","sort","a","b","id","localeCompare","is","prev","finder","find","current","factory","cache","Record","reduce","acc","filter","map","Object","keys","length","ManagedGraphNode","Coordinator","Position","GRID_SIZE","PORT_SIZE","LANE_SIZE","SPACE_SIZE","Coordinates","grid","gridSize","sizes","port","lane","space","constructor","x","y","snap","value","negatve","mul","Math","round","toGraph","toData","groupResolver","description","item","isolator","title","re","isBarrier","test","useLastCallback","handleAsNoop","Styles","RefObject","useRef","useMemo","useState","PropsWithChildren","useImperativeHandle","GraphGroups","ManagedGraphNode","IItem","GraphHandlers","createGraphHandlers","GraphAdapter","Store","useStore","GraphCanvas","syncNodes","TypeId","Identifiable","useGraphMenu","GraphDTO","useNodeSelection","useNodes","Coordinates","GRID_SIZE","IGraph","items","Item","ManagedGraphProps","innerRef","graph","element","HTMLDivElement","Graph","selected","className","handlers","Partial","DTO","onExport","ManagedGraph","observer","children","rest","graphRef","coordinator","menu","onCreate","nodes","all","group","setGroup","canvas","loader","handleExport","current","store","get","onChange","cb","toTitle","item","title","sync","config","onUpdate","layout","styles","root","selector","undefined","of","flex","display","alignSelf","gap","flexDirection"],"sources":["../src/graph/utils.ts","../src/graph/nodes/GraphNodeJoints.ts","../src/graph/nodes/GraphNode.ts","../src/graph/nodes/layout/NodesGraph.ts","../src/graph/nodes/layout/LayeredLayout.ts","../src/graph/nodes/layout/ClusteredLayout.ts","../src/graph/nodes/layout/NodesSort.ts","../src/graph/nodes/layout/EdgesSort.ts","../src/graph/nodes/layout/Layouter.ts","../src/graph/Store.ts","../src/graph/useStore.tsx","../src/graph/useDraggable.tsx","../src/graph/render/pixi.ts","../src/graph/render/Batch.ts","../src/graph/render/PIXIRectSpinner.ts","../src/graph/render/PIXILine.ts","../src/graph/render/PIXIConnector.ts","../src/graph/render/PIXIPendingConnector.ts","../src/graph/render/PIXIText.ts","../src/graph/render/PIXIPort.ts","../src/graph/render/Draggable.ts","../src/graph/render/PIXINode.ts","../src/graph/render/PIXIGrid.ts","../src/graph/render/PIXIMenuItem.ts","../src/graph/render/PIXIMenu.ts","../src/graph/render/PIXIRenderer.ts","../src/graph/render/PIXIGUI.ts","../src/graph/render/PIXIStacked.ts","../src/graph/render/PIXIOutlined.ts","../src/graph/render/index.ts","../src/graph/GraphAdapter.ts","../src/graph/NodeGroups.tsx","../src/graph/Viewport.tsx","../src/GraphGroups.tsx","../src/createGraphHandlers.ts","../src/GraphCanvas.tsx","../src/LoadNodes.ts","../src/useGraphMenu.ts","../src/useNodeSelection.ts","../src/ManagedGraphNode.ts","../src/useNodes.tsx","../src/utils.ts","../src/ManagedGraph.tsx"],"sourcesContent":["import type { ConnectionPoint, Position } from './interfaces';\n\nexport const snap = (v: number, grid: number) => {\n if (v > 0) {\n return (Math.round(v / grid + 0.5) - 0.5) * grid;\n }\n\n return -(Math.round(-v / grid + 0.5) - 0.5) * grid;\n};\n\nexport const addOffset = (t: Position, s: Position, dir: number = 1): Position => ({\n x: ~~(t.x + s.x * dir),\n y: ~~(t.y + s.y * dir),\n});\n\nexport const isConnectionPoint = <ID>(node: ID, port: ID) => (point: ConnectionPoint<ID>) => (\n point.node === node && point.port === port\n);\n\nexport const isNodePoint = <ID>(node: ID) => (point: ConnectionPoint<ID>) => (\n point.node === node\n);\n\nexport const connectNodes = <ID>(\n connect: boolean,\n joint: { nodes: ConnectionPoint<ID>[] },\n target?: ConnectionPoint<ID>[]\n) => {\n if (target) {\n for (const point of target) {\n const idx = joint.nodes.findIndex(isConnectionPoint(point.node, point.port));\n const has = idx >= 0;\n\n if (has !== connect) {\n if (connect) {\n joint.nodes.push(point);\n } else {\n joint.nodes.splice(idx, 1);\n }\n }\n }\n } else if (!connect) {\n joint.nodes = [];\n }\n};\n\nexport const intersect = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number\n) => {\n if ((x1 === x2 && y1 === y2) || (x3 === x4 && y3 === y4)) {\n return false;\n }\n\n const denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);\n\n if (denominator === 0) {\n return false;\n }\n\n const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator;\n const ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator;\n\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n return false;\n }\n\n const x = x1 + ua * (x2 - x1);\n const y = y1 + ua * (y2 - y1);\n\n return {\n x,\n y,\n };\n};\n","import { type ConnectionPoint, type NodeJoinRequest, NodeJoint, NodeJoints } from '../interfaces';\nimport { connectNodes, isConnectionPoint, isNodePoint } from '../utils';\n\nexport class GraphNodeJoints<ID> implements NodeJoints<ID> {\n private readonly joints: Map<ID, NodeJoint<ID>> = new Map();\n private readonly parentId: ID;\n\n constructor(parentId: ID, ports: NodeJoint<ID>[]) {\n this.parentId = parentId;\n\n for (const joint of ports) {\n this.joints.set(joint.port, joint);\n }\n }\n\n [Symbol.iterator](): Iterator<NodeJoint<ID>> {\n return this.joints.values();\n }\n\n get connected() {\n const result: Array<NodeJoint<ID>> = [];\n\n for (const joint of this.joints.values()) {\n if (joint.nodes.length) {\n result.push(joint);\n }\n }\n\n return result;\n }\n\n find(predicate: (joint: NodeJoint<ID>) => boolean): NodeJoint<ID> | undefined {\n for (const joint of this.joints.values()) {\n if (predicate(joint)) {\n return joint;\n }\n }\n }\n\n map<R>(mapper: (joint: NodeJoint<ID>, index: number) => R): R[] {\n const result = Array(this.joints.size);\n let index = 0;\n\n for (const joint of this.joints.values()) {\n result[index] = mapper(joint, index);\n index++;\n }\n\n return result;\n }\n\n has(nodeId: ID, portId?: ID): boolean {\n return !!this.getPort(nodeId, portId);\n }\n\n hasAtPort(portId: ID, nodeId: ID, nodePortId: ID): boolean {\n return !!this.joints.get(portId)?.nodes.some(isConnectionPoint(nodeId, nodePortId));\n }\n\n getPort(nodeId: ID, portId?: ID): ID | undefined {\n const found = this.find(\n portId === undefined\n ? (joint) => joint.nodes.some(isNodePoint(nodeId))\n : (joint) => joint.nodes.some(isConnectionPoint(nodeId, portId))\n );\n\n if (found) {\n return found.port;\n }\n }\n\n connect({ port, target, connect }: NodeJoinRequest<ID>): NodeJoint<ID> {\n const joint = this.joints.get(port);\n\n if (!joint) {\n throw new Error(`Node ${this.parentId} does not have joint \"${port}\"`);\n }\n\n connectNodes(connect, joint, target);\n\n return joint;\n }\n\n getNodes(portId: ID): ConnectionPoint<ID>[] | undefined {\n return this.joints.get(portId)?.nodes;\n }\n\n get ids(): ID[] {\n const set = new Set<ID>();\n\n for (const { nodes } of this.joints.values()) {\n for (const { node } of nodes) {\n set.add(node);\n }\n }\n\n return [...set];\n }\n\n get count(): number {\n return this.joints.size;\n }\n}\n","import { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource, Disposer } from '@ankhzet/gcl';\nimport type {\n ConnectionPoint,\n Coordinator,\n GraphNodeDescriptor,\n GraphNodeInterface,\n IMenu,\n NodeConnection,\n NodeConnectionRequest,\n NodeJoint,\n NodeJoints,\n Position,\n} from '../interfaces';\nimport { GraphNodeJoints } from './GraphNodeJoints';\n\nconst E_CONNECT = Symbol('E_CONNECT');\nconst E_MOVE = Symbol('E_MOVE');\n\nexport abstract class GraphNode<ID, Data = {}, R = any>\n extends DisposableEventSource\n implements GraphNodeInterface<ID, Data, R>\n{\n public readonly id: ID;\n public readonly description: GraphNodeDescriptor<Data>;\n public readonly inputs: NodeJoints<ID>;\n public readonly outputs: NodeJoints<ID>;\n public readonly coordinator: Coordinator;\n readonly #pos: Position = { x: 0, y: 0 };\n\n public constructor({\n id,\n coordinator,\n inputs = [],\n outputs = [],\n ...description\n }: GraphNodeDescriptor<Data> & {\n id: ID;\n inputs?: NodeJoint<ID>[];\n outputs?: NodeJoint<ID>[];\n }) {\n super();\n this.id = id;\n this.coordinator = coordinator;\n this.description = description as GraphNodeDescriptor<Data>;\n this.inputs = new GraphNodeJoints(id, inputs);\n this.outputs = new GraphNodeJoints(id, outputs);\n }\n\n abstract render(content: R): R;\n\n abstract getMenu(tag: any, pos: Position): IMenu<any> | undefined;\n abstract handleMenu(data: any): void | false;\n\n get title() {\n return this.description.title;\n }\n\n get width() {\n return this.coordinator.sizes.lane * 2 + this.coordinator.sizes.space;\n }\n\n get height() {\n return this.coordinator.sizes.lane * Math.max(1, this.inputs.count, this.outputs.count);\n }\n\n get position(): Position {\n return this.#pos;\n }\n\n set position({ x, y }: Position) {\n x = this.coordinator.snap(x);\n y = this.coordinator.snap(y);\n\n if (this.#pos.x === x && this.#pos.y === y) {\n return;\n }\n\n this.#pos.x = x;\n this.#pos.y = y;\n\n this.dispatchEvent(E_MOVE, this.#pos);\n }\n\n isInput(portId: ID, nodeId: ID, nodePortId: ID): boolean {\n return this.inputs.hasAtPort(portId, nodeId, nodePortId);\n }\n\n isOutput(portId: ID, nodeId: ID, nodePortId: ID): boolean {\n return this.outputs.hasAtPort(portId, nodeId, nodePortId);\n }\n\n isConnected(port: ID, input: boolean, to: ConnectionPoint<ID>): boolean {\n return input ? this.inputs.hasAtPort(port, to.node, to.port) : this.outputs.hasAtPort(port, to.node, to.port);\n }\n\n getNodes(port: ID, input: boolean) {\n return input ? this.inputs.getNodes(port) : this.outputs.getNodes(port);\n }\n\n connect({ input, connect, port, nodes }: NodeConnectionRequest<ID, GraphNode<ID, Data>>): void {\n const source = { node: this.id, port };\n const target = nodes ? nodes.map(({ node, port }) => ({ node: node.id, port })) : this.getNodes(port, input);\n\n if (input) {\n this.inputs.connect({\n connect,\n port,\n target,\n });\n } else {\n this.outputs.connect({\n connect,\n port,\n target,\n });\n }\n\n if (nodes) {\n const at = [{ node: this, port }];\n\n for (const { node, port: output } of nodes) {\n if (connect !== node.isConnected(output, !input, source)) {\n node.connect({\n connect,\n input: !input,\n port: output,\n nodes: at,\n });\n }\n }\n }\n\n this.dispatchEvent(E_CONNECT, {\n connect,\n input,\n source,\n target,\n } as NodeConnection<ID>);\n }\n\n move(pos: Position): Position {\n this.position = pos;\n\n return this.position;\n }\n\n onConnect(handler: IEventHandler<NodeConnection<ID>>): Disposer {\n return this.handleEvent(E_CONNECT, handler);\n }\n\n onMove(handler: IEventHandler<Position>): Disposer {\n return this.handleEvent(E_MOVE, handler);\n }\n}\n","import { isLike } from '@ankhzet/utils';\nimport { GraphNodeInterface, type Position } from '../../interfaces';\n\nexport type GraphBarrier<N extends GraphNodeInterface> = (node: N) => boolean;\n\nexport class NodesGraph<Node extends GraphNodeInterface> {\n private readonly _barriers: Partial<Record<Node['id'], boolean>> = {};\n private readonly _isBarrier: GraphBarrier<Node>;\n public readonly map: Partial<Record<Node['id'], Node>>;\n public readonly nodes: Node[];\n\n public constructor(nodes: Node[], isBarrier: GraphBarrier<Node>) {\n this.nodes = nodes;\n this.map = Object.fromEntries(nodes.map((node) => [node.id, node]));\n this._isBarrier = isBarrier;\n }\n\n protected isBarrier(id: Node['id']) {\n const cached = this._barriers[id];\n\n if (cached !== undefined) {\n return cached;\n }\n\n return (this._barriers[id] = this._isBarrier(this.map[id]!));\n }\n\n public getSubGraphs(subset?: Node['id'][]) {\n const rest = [...(subset || (Object.keys(this.map) as Node['id'][]))];\n const result: Node['id'][][] = [];\n let nodeId;\n\n while ((nodeId = rest.pop())) {\n if (this.isBarrier(nodeId)) {\n continue;\n }\n\n const node = this.map[nodeId];\n const sub = node && this.getConnectedNodes(node, subset);\n\n if (sub) {\n for (const id of sub) {\n const idx = rest.indexOf(id);\n\n if (idx >= 0) {\n rest.splice(idx, 1);\n }\n }\n\n result.push(sub);\n }\n }\n\n return result;\n }\n\n protected inputs(nodeId: Node['id']) {\n return this.map[nodeId]!.inputs.ids;\n }\n\n protected outputs(nodeId: Node['id']) {\n return this.map[nodeId]!.outputs.ids;\n }\n\n protected getConnectedNodes(node: Node, subset?: Node['id'][], target: Node['id'][] = [node.id]): Node['id'][] {\n for (const ids of [node.inputs.ids, node.outputs.ids]) {\n for (const nodeId of ids) {\n if (target.includes(nodeId) || (subset && !subset.includes(nodeId))) {\n continue;\n }\n\n const found = this.map[nodeId as Node['id']];\n\n if (found) {\n target.push(nodeId);\n\n if (!this.isBarrier(nodeId)) {\n this.getConnectedNodes(found, subset, target);\n }\n }\n }\n }\n\n return target;\n }\n\n protected getCenter(mapper: (node: Node) => Position | undefined) {\n const offsets = this.nodes.map(mapper).filter(isLike<Position>);\n\n if (!offsets.length) {\n return { x: 0, y: 0 };\n }\n\n const min = { x: +Infinity, y: +Infinity };\n const max = { x: -Infinity, y: -Infinity };\n\n for (const { x, y } of offsets) {\n if (x < min.x) min.x = x;\n if (x > max.x) max.x = x;\n if (y < min.y) min.y = y;\n if (y > max.y) max.y = y;\n }\n\n for (const offset of offsets) {\n offset.x -= min.x;\n offset.y -= min.y;\n }\n\n return {\n x: (max.x - min.x) / 2,\n y: (max.y - min.y) / 2,\n };\n }\n}\n","import { isLike } from '@ankhzet/utils';\nimport { GraphNodeInterface, type Position } from '../../interfaces';\nimport { NodesGraph } from './NodesGraph';\nimport type { Layout } from './Layout';\n\nexport interface Layer<Node extends GraphNodeInterface> {\n [id: string]: Node;\n}\n\nexport interface Layers<Node extends GraphNodeInterface> extends Iterable<Layer<Node>> {\n [idx: number]: Layer<Node>;\n}\n\nexport class LayeredLayout<Node extends GraphNodeInterface> extends NodesGraph<Node> implements Layout<Node> {\n public layers: Layers<Node> = [];\n private hash: Position | null = null;\n\n public get center(): Position {\n if (!this.hash) {\n this.hash = this.getCenter((node) => node.position);\n }\n\n return this.hash;\n }\n\n public spread(layer: number, nodes: Node['id'][]): number {\n const chain: Node[] = [];\n let max = 0;\n\n for (const id of nodes) {\n const node = this.map[id]!;\n\n const height = this.shift(node, this.findLayer(node), layer, chain);\n\n max = Math.max(max, height);\n }\n\n return max;\n }\n\n public findMax(node: Node): number {\n const layers = this.findLayers(this.get(node.inputs.ids));\n let max = 0;\n\n for (const idx of Object.values(layers)) {\n const layer = +(idx as number);\n\n if (layer > max) {\n max = layer;\n }\n }\n\n return max || 0;\n }\n\n public dependants({ id }: Node): Node[] {\n let found = [];\n\n for (const other of this.nodes) {\n if ((other.id !== id) && other.inputs.has(id)) {\n found.push(other);\n }\n }\n\n return found;\n }\n\n public get(ids: Node['id'][]): Node[] {\n return ids.map((id) => this.map[id]).filter(isLike<Node>);\n }\n\n public remove(node: Node, layer: number) {\n return this.layers[layer] ? delete this.layers[layer][node.id as string] : false;\n }\n\n public put(node: Node, layer: number) {\n const group = this.layers[layer] || (this.layers[layer] = {});\n\n group[node.id as string] = node;\n }\n\n public findLayer(node: Node): number {\n for (const [idx, layer] of Object.entries(this.layers)) {\n if (layer[node.id]) {\n return +idx;\n }\n }\n\n return 0;\n }\n\n public findLayers(nodes: Node[]): Partial<Record<string, number>> {\n const found: Partial<Record<string, number>> = {};\n\n for (const idx in this.layers) {\n const layer = this.layers[idx]!;\n const exclude: Node[] = [];\n\n for (let node of nodes) {\n if (layer[node.id as string]) {\n found[node.id as string] = +idx;\n\n exclude.push(node);\n }\n }\n\n nodes = nodes.filter((node) => exclude.indexOf(node) < 0);\n }\n\n return found;\n }\n\n public shift(node: Node, fromLayer: number, offset: number, chain: Node[] = []) {\n if (chain.includes(node)) {\n return 0;\n }\n\n chain.push(node);\n\n const toLayer = fromLayer + offset;\n const dependants = this.dependants(node);\n let max = toLayer;\n let min = toLayer;\n\n if (fromLayer) {\n this.remove(node, fromLayer);\n }\n\n this.put(node, toLayer);\n\n for (const dependant of dependants) {\n const layer = this.findLayer(dependant);\n const offset = toLayer - layer + 1;\n\n min = Math.min(min, layer + offset);\n max = Math.max(max, layer + offset);\n\n if (layer && offset > 0) {\n this.shift(dependant, layer, offset, chain);\n }\n }\n\n return max - min + 1;\n }\n\n private all(nodes: Node[]): Node[] {\n const candidates = nodes.concat([]);\n\n this.walk(nodes, (node: Node) => {\n candidates.push(node);\n\n candidates.concat(this.all(this.get(node.inputs.ids)));\n });\n\n return candidates;\n }\n\n private walk(nodes: Node[], consumer: (node: Node) => boolean | void) {\n for (const node of nodes) {\n for (const id of node.inputs.ids) {\n const input = this.map[id as Node['id']];\n\n if (input && false === consumer(input)) {\n break;\n }\n }\n }\n }\n}\n","import { GraphNodeInterface, type Position } from '../../interfaces';\nimport { NodesGraph } from './NodesGraph';\nimport type { Layout } from './Layout';\n\nexport class ClusteredLayout<Node extends GraphNodeInterface>\n extends NodesGraph<Node>\n implements Layout<Node>\n{\n private cache: Record<string, Position> = {};\n private hash: Position | null = null;\n\n public get center(): Position {\n if (!this.hash) {\n this.hash = this.getCenter((node) => node.position);\n }\n\n return this.hash;\n }\n\n private splice(\n rest: Node['id'][],\n pos: number,\n put: (id: Node['id'], pos: number) => void,\n processed: Node['id'][] = [],\n ) {\n for (const id of rest) {\n if (processed.includes(id)) {\n continue;\n }\n\n put(id, pos);\n\n if (!this.isBarrier(id)) {\n this.splice(this.inputs(id), pos - 1, put, processed);\n this.splice(this.outputs(id), pos + 1, put, processed);\n }\n }\n }\n\n private align(height: number, ids: Node['id'][]): [Node['id'], number][] {\n const space = height - ids.length;\n\n if (space <= 0) {\n return ids.map((id, index) => [id, index]);\n }\n\n const result: [Node['id'], number][] = [];\n let offset = ~~(space / 2);\n\n for (const id of ids) {\n result.push([id, offset++]);\n }\n\n return result;\n }\n\n public spread(layer: number, nodes: Node['id'][]): number {\n const theory: Node['id'][][] = [];\n const processed: Node['id'][] = [];\n const put = (id: Node['id'], pos: number) => {\n const bucket = theory[pos];\n\n if (bucket) {\n bucket.push(id);\n } else {\n theory[pos] = [id];\n }\n\n processed.push(id);\n };\n\n this.splice(nodes, nodes.length, put, processed);\n\n const result: Node['id'][][] = [];\n let height = 1;\n let x = 0;\n\n for (const column of theory) {\n if (!column) {\n continue;\n }\n\n height = Math.max(height, column.length);\n result.push(column);\n }\n\n for (const column of result) {\n for (const [id, y] of this.align(height, column)) {\n this.cache[id as string] = { x, y: layer + y };\n }\n\n x++;\n }\n\n this.hash = null;\n\n return height;\n }\n}\n","import { GraphNodeInterface } from '../../interfaces';\n\ntype Relations<K extends string | number> = Record<K, K[]>;\n\ntype Split<R extends Relations<K>, K extends string | number> = {\n roots: K[];\n joint: K[];\n leafs: K[];\n};\n\nexport class NodesSort<R extends Relations<K>, K extends string> {\n public sort(nodes: GraphNodeInterface<K, any>[]) {\n const dependencies: Partial<R> = {};\n const dependants: Partial<R> = {};\n const all = [];\n\n for (let node of nodes) {\n const r: K[] = [];\n const id = node.id as K;\n\n for (const d of nodes) {\n if (d.inputs.ids.indexOf(id) >= 0) {\n r.push(d.id as K);\n }\n }\n\n all.push(id);\n\n if (r.length) {\n // r on id\n dependants[id] = r as R[K];\n }\n\n if (node.inputs.ids.length) {\n // id on dep\n dependencies[id] = node.inputs.ids as R[K];\n }\n }\n\n return this.walk(all, dependants, dependencies);\n }\n\n private walk(all: K[], dependants: Partial<R>, dependencies: Partial<R>): string[][] {\n const cies = Object.keys(dependants) as K[]; // (cies)-->(y)\n const ants = Object.keys(dependencies) as K[]; // (x)-->(ants)\n\n const { roots, joint, leafs } = this.split(all, ants, cies);\n const layers: string[][] = [];\n\n if (joint.length === all.length) {\n return [joint];\n }\n\n switch (joint.length) {\n case 0:\n break;\n\n case 1:\n case 2:\n layers.push(joint);\n break;\n\n default:\n const newAnts: Partial<R> = {};\n const newCies: Partial<R> = {};\n\n for (const id of cies) {\n const dependant = dependants[id];\n\n if (!dependant || joint.indexOf(id) < 0) {\n continue;\n }\n\n const filtered = dependant.filter((id) => joint.indexOf(id) >= 0);\n\n if (filtered.length) {\n newAnts[id] = filtered as R[K];\n }\n }\n\n for (const id of ants) {\n const dependency = dependencies[id];\n\n if (!dependency || joint.indexOf(id) < 0) {\n continue;\n }\n\n const filtered = dependency.filter((id) => joint.indexOf(id) >= 0);\n\n if (filtered.length) {\n newCies[id] = filtered as R[K];\n }\n }\n\n if (Object.keys(newAnts).length && Object.keys(newCies).length) {\n layers.push(...this.walk(joint, newAnts, newCies));\n } else {\n layers.push(joint);\n }\n }\n\n layers.unshift(roots);\n layers.push(leafs);\n\n return layers;\n }\n\n private split(all: K[], dependants: K[], dependencies: K[]): Split<R, K> {\n let leafs = dependencies.filter((id) => dependants.indexOf(id) < 0); // (x)->(y)->(leafs)\n let roots = dependants.filter((id) => dependencies.indexOf(id) < 0); // (roots)->(x)->(y)\n let sides = leafs.concat(roots);\n let joint = all.filter((id) => sides.indexOf(id) < 0); // (roots)->(joint)->(leafs)\n\n if (joint.length > 1) {\n console.log('left', all, { dependants, dependencies }, { roots, leafs, joint });\n }\n\n return {\n roots,\n joint,\n leafs,\n };\n }\n}\n","export class EdgesSort {\n public sort(dependants: Record<string, string[]>, dependencies: Record<string, string[]>, layers: string[][]) {\n const leafs = layers.pop()!;\n\n // @ts-ignore\n for (let id of leafs) {\n }\n }\n\n // @ts-ignore\n private mutate(id: string, rest: string[]): string[][] {\n const variations: string[][] = [];\n\n for (let i = 0; i < rest.length; i++) {\n const variation: string[] = [...rest];\n\n variation.splice(i, 0, id);\n variations.push(variation);\n }\n\n return variations;\n }\n}\n","import type { Constructor } from '@ankhzet/utils';\nimport type { GraphNodeInterface } from '../../interfaces';\nimport type { GraphBarrier } from './NodesGraph';\nimport type { Layout } from './Layout';\n\nexport class Layouter<Node extends GraphNodeInterface<any, any>> {\n private readonly isBarrier: GraphBarrier<Node>;\n private readonly klass: Constructor<Layout<Node>, [nodes: Node[], isBarrier: GraphBarrier<Node>]>;\n\n public constructor(\n klass: Constructor<Layout<Node>, [nodes: Node[], isBarrier: GraphBarrier<Node>]>,\n isBarrier: GraphBarrier<Node>,\n ) {\n this.klass = klass;\n this.isBarrier = isBarrier;\n }\n\n public layout(nodes: Node[], subset?: Node['id'][]): Layout<Node> {\n const layout = new this.klass(nodes, this.isBarrier);\n //\n // const sub = layout.getSubGraphs(subset);\n // let offset = 0;\n //\n // for (const ids of sub) {\n // offset += layout.spread(offset, ids);\n // }\n\n return layout;\n }\n\n public getSubGraphs(nodes: Node[]) {\n return new this.klass(nodes, this.isBarrier).getSubGraphs();\n }\n}\n","import { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource, Disposer } from '@ankhzet/gcl';\nimport { TypeId } from '../types';\nimport { StoreInterface } from './interfaces';\n\nconst E_CHANGED = Symbol('changed');\n\nexport class Store<Item extends { id: TypeId }> extends DisposableEventSource implements StoreInterface<Item> {\n all: Item[];\n map: Record<TypeId, Item> = {};\n\n public constructor(all: Item[] = []) {\n super();\n this.all = all;\n }\n\n clear(): void {\n const old = this.all;\n this.all = [];\n this.map = {};\n\n this.dispatchEvent(E_CHANGED, {\n diff: old,\n added: false,\n });\n }\n\n find(predicate: (node: Item) => boolean): Item | undefined {\n return this.all.find(predicate);\n }\n\n filter(predicate: (node: Item) => boolean): Item[] {\n return this.all.filter(predicate);\n }\n\n get(id: Item['id']): Item | undefined {\n return this.map[id];\n }\n\n add<T extends Item | Item[]>(nodes: T): T {\n const iterable: Item[] = Array.isArray(nodes) ? nodes : [nodes as Item];\n const added = [];\n\n for (const node of iterable) {\n if (!this.all.includes(node)) {\n added.push(node);\n this.map[node.id] = node;\n }\n }\n\n if (added.length) {\n this.all = this.all.concat(added);\n this.dispatchEvent(E_CHANGED);\n }\n\n return nodes;\n }\n\n remove(ids: Item['id'] | Item['id'][]): this {\n if (!Array.isArray(ids)) {\n ids = [ids];\n }\n\n const trimmed = this.all.filter((node) => !ids.includes(node.id));\n\n if (trimmed.length !== this.all.length) {\n for (const id of ids) {\n delete this.map[id];\n }\n\n this.all = trimmed;\n this.dispatchEvent(E_CHANGED);\n }\n\n return this;\n }\n\n onChange(handler: IEventHandler): Disposer {\n return this.handleEvent(E_CHANGED, handler);\n }\n}\n","import { useLayoutEffect, useState } from 'react';\nimport { useSyncStore } from '@ankhzet/ui';\nimport type { StoreInterface } from './interfaces';\n\nexport const isEqualIdentifiables = (a: { id: any }[], b: { id: any }[]) => {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((item, idx) => item.id === b[idx]?.id);\n};\n\nexport function useStore<S extends StoreInterface<any>>(init: () => S): [S, S['all']] {\n const [[store, args]] = useState(() => {\n const store = init();\n\n return [\n store,\n [\n (cb: () => void) => store.onChange(cb),\n () => store.all,\n () => store.all,\n (items: S['all']) => items,\n isEqualIdentifiables,\n ],\n ] as const;\n });\n\n useLayoutEffect(\n () => () => {\n for (const node of store.all) {\n node.dispose();\n }\n },\n []\n );\n\n return [store, useSyncStore(...args)];\n}\n","import { useState } from 'react';\nimport { useLastCallback, useDrag } from '@ankhzet/ui';\n\nexport type DragHandler = (offset: { x: number; y: number }) => void;\nexport type ClickHandler = (offset: { x: number; y: number }, e: MouseEvent) => void;\nexport type DragHandlers = {\n position: { x: number; y: number };\n onPointer: DragHandler;\n onClick: ClickHandler;\n onUp: DragHandler;\n onDrag: DragHandler;\n onContext: DragHandler;\n};\n\nexport const useDraggable = <E extends HTMLElement>(handlers: DragHandlers) => {\n const delta = handlers.position;\n const [anchor, setAnchor] = useState(() => ({ x: delta.x, y: delta.y }));\n const { isDragging, bind } = useDrag<E>(({ isDragging, offset, pos, move, up, down, context, e }) => {\n const { x, y } = handlers.position;\n\n if (up) {\n setAnchor({ x, y });\n handlers.onUp({\n x: anchor.x + pos.x,\n y: anchor.y + pos.y,\n });\n } else if (move) {\n if (isDragging) {\n handlers.onDrag({\n x: anchor.x + offset.x,\n y: anchor.y + offset.y,\n });\n } else {\n handlers.onPointer({\n x: x + pos.x,\n y: y + pos.y,\n });\n }\n } else if (down) {\n if (context) {\n handlers.onContext({\n x: anchor.x + pos.x,\n y: anchor.y + pos.y,\n });\n } else {\n handlers.onClick({\n x: anchor.x + pos.x,\n y: anchor.y + pos.y,\n }, e!);\n }\n }\n });\n\n const reset = useLastCallback((pos: { x: number; y: number }) => {\n handlers.onDrag(pos);\n setAnchor(pos);\n });\n\n return {\n isDragging,\n bind,\n anchor,\n reset,\n };\n};\n","export * from '@pixi/core';\nexport * from '@pixi/display';\nexport * from '@pixi/sprite';\nexport * from '@pixi/graphics';\nexport * from '@pixi/text';\nexport * from '@pixi/text-bitmap';\nexport * from '@pixi/events';\n","import { DisposableEventSource } from '@ankhzet/gcl';\n\nexport class Batch extends DisposableEventSource {\n private counter: number;\n\n public constructor() {\n super();\n this.counter = 0;\n }\n\n public batch(cb: () => void) {\n try {\n this.begin();\n\n cb();\n } finally {\n this.end();\n }\n }\n\n public begin() {\n this.counter++;\n }\n\n public end() {\n if (--this.counter <= 0) {\n this.counter = 0;\n this.dispatchEvent('.', this);\n }\n }\n\n and(handler: (batch: this) => void) {\n return this.handleEvent('.', handler);\n }\n}\n","import type { ColorSource, DisplayObject} from './pixi';\nimport { Graphics } from './pixi';\nimport { intersect } from '../utils';\n\nconst modifiers = [\n [0, -1],\n [-1, 0],\n [0, 1],\n [1, 0],\n];\nconst PI2 = Math.PI * 2;\nconst PIHalf = Math.PI / 2;\n\nexport class RectSpinner extends Graphics {\n public readonly sizeX: number;\n public readonly sizeY: number;\n public readonly lineSize: number;\n public readonly color: ColorSource;\n public progress: number;\n public active: boolean = false;\n readonly #mask: Graphics;\n readonly #edge: Graphics;\n #interval?: number;\n #ctx: { segments: [number, number, number, number][]; corners: number[] };\n\n public constructor(child: DisplayObject, {\n lineSize,\n sizeX,\n sizeY,\n radius,\n color,\n }: {\n lineSize: number;\n sizeX: number;\n sizeY: number;\n radius: number;\n color: ColorSource;\n }) {\n super();\n this.lineSize = lineSize;\n this.color = color;\n this.sizeX = sizeX;\n this.sizeY = sizeY;\n\n this.#edge = new Graphics()\n .lineStyle({\n width: lineSize,\n color,\n })\n .drawRoundedRect(0, 0, sizeX, sizeY, radius);\n\n this.#mask = new Graphics();\n this.#mask.position.set(sizeX / 2, sizeY / 2);\n this.#edge.mask = this.#mask;\n\n this.addChild(child);\n this.addChild(this.#edge);\n this.addChild(this.#mask);\n\n this.progress = 0;\n\n const halfX = this.sizeX / 2;\n const halfY = this.sizeY / 2;\n const mX = -halfX + this.lineSize;\n const mY = -halfY + this.lineSize;\n const pX = +halfX - this.lineSize;\n const pY = +halfY - this.lineSize;\n\n const segments: [number, number, number, number][] = [\n [mX, mY, pX, mY], // top segment\n [mX, mY, mX, pY], // left\n [mX, pY, pX, pY], // bottom\n [pX, mY, pX, pY], // right\n ];\n\n const corners = [\n +halfX + this.lineSize,\n -halfY - this.lineSize, // Top right\n +halfX + this.lineSize,\n +halfY + this.lineSize, // Bottom right\n -halfX - this.lineSize,\n +halfY + this.lineSize, // Bottom left\n -halfX - this.lineSize,\n -halfY - this.lineSize, // Top left,\n ];\n\n this.#ctx = {\n segments,\n corners,\n };\n }\n\n public setActive(value: boolean) {\n if (value === this.active) {\n return;\n }\n\n this.update(0);\n\n if (this.#interval) {\n clearInterval(this.#interval);\n this.#interval = 0;\n }\n\n this.active = value;\n\n if (value) {\n this.#interval = setInterval(() => this.update(this.progress + 0.005), 10) as any;\n }\n }\n\n public destroy(_options: any) {\n super.destroy(_options);\n this.removeFromParent();\n clearInterval(this.#interval);\n }\n\n public hotSwap(child: DisplayObject) {\n this.removeChildren();\n this.addChild(child);\n this.addChild(this.#edge);\n this.addChild(this.#mask);\n }\n\n public update(progress: number) {\n this.progress = progress;\n const phase = (progress * PI2) % PI2;\n\n const x = Math.cos(phase - PIHalf) * this.sizeX * 2;\n const y = Math.sin(phase - PIHalf) * this.sizeY * 2;\n\n let out: number[] | undefined;\n\n let intersection = null;\n let winding = 0;\n\n for (let i = 0; i < this.#ctx.segments.length; i++) {\n const segment = this.#ctx.segments[i]!;\n const hit = intersect(0, 0, x, y, segment[0], segment[1], segment[2], segment[3]);\n\n if (hit) {\n intersection = hit;\n\n if (i === 0) {\n winding = hit.x > 0 ? 0 : 4;\n } else {\n winding = 4 - i;\n }\n\n out = modifiers[i]!;\n\n break;\n }\n }\n\n if (!(intersection && out)) {\n return;\n }\n\n this.#mask\n .clear()\n .beginFill()\n .moveTo(0, 0)\n .moveTo(0, -(this.sizeX / 2) - this.lineSize);\n\n for (let i = 0; i < winding; i++) {\n this.#mask.lineTo(this.#ctx.corners[i * 2]!, this.#ctx.corners[i * 2 + 1]!);\n }\n\n this.#mask\n .lineTo(intersection.x + out[0]! * this.lineSize * 2, intersection.y + out[1]! * this.lineSize * 2)\n .lineTo(intersection.x, intersection.y)\n .lineTo(0, 0)\n .endFill();\n }\n}\n","import type { Line } from '../interfaces';\nimport type { Point, IPointData, ColorSource } from './pixi';\nimport { Graphics, ObservablePoint } from './pixi';\n\nexport class PIXILine extends Graphics implements Line {\n public from: Point;\n public to: Point;\n\n public angled = false;\n public color: ColorSource = 0x555555;\n readonly #capped: number;\n #width: number = 2;\n\n public constructor(sx: number, sy: number, tx: number, ty: number, capped: number = 2) {\n super();\n this.#capped = capped;\n this.from = new ObservablePoint(() => this.update(), 0, sx, sy);\n this.to = new ObservablePoint(() => this.update(), 0, tx, ty);\n this.eventMode = 'none';\n }\n\n public moveFromPoint(pos: IPointData): boolean {\n const moved = (this.from.x !== pos.x) || (this.from.y !== pos.y);\n\n if (moved) {\n this.from.copyFrom(pos);\n }\n\n return moved;\n }\n\n public moveToPoint(pos: IPointData): boolean {\n const moved = (this.to.x !== pos.x) || (this.to.y !== pos.y);\n\n if (moved) {\n this.to.copyFrom(pos);\n }\n\n return moved;\n }\n\n public setColor(color: ColorSource) {\n this.color = color;\n\n return this;\n }\n\n public setWidth(width: number) {\n this.#width = width;\n\n return this;\n }\n\n public update() {\n const { x: fromX, y: fromY } = this.from;\n const { x: toX, y: toY } = this.to;\n const dx = toX - fromX;\n const dy = toY - fromY;\n const halfX = dx / 2;\n const halfY = dy / 2;\n\n this.clear();\n this.lineStyle(this.#width, this.color, this.alpha);\n this.x = toX - halfX;\n this.y = toY - halfY;\n\n if (this.angled) {\n this.moveTo(-halfX, -halfY);\n this.lineTo(0, -halfY);\n this.lineTo(0, halfY);\n this.lineTo(halfX, halfY);\n } else {\n this.moveTo(-halfX, -halfY);\n this.lineTo(halfX, halfY);\n }\n\n if (this.#capped) {\n this.beginFill(this.color, this.alpha);\n this.drawCircle(-halfX, -halfY, this.#capped / 2);\n this.drawCircle(halfX, halfY, this.#capped / 2);\n this.endFill();\n }\n\n return this;\n }\n}\n","import type { Connector, Position } from '../interfaces';\nimport { Graphics, Point } from './pixi';\nimport { PIXILine } from './PIXILine';\n\nexport class PIXIConnector<ID> extends Graphics implements Connector<ID> {\n public from: Point;\n public to: Record<string, PIXILine>;\n\n public constructor(sx: number, sy: number) {\n super();\n this.from = new Point(sx, sy);\n this.to = {};\n\n for (const line of Object.values(this.to)) {\n this.addChild(line);\n }\n }\n\n public addTarget(node: ID, port: ID): PIXILine {\n const key = `${node}-${port}`;\n const has = this.to[key];\n\n if (has) {\n return has;\n }\n\n return (\n this.to[key] = this.addChild(new PIXILine(this.from.x, this.from.y, 0, 0))\n );\n }\n\n public moveTargetTo(node: ID, port: ID, pos: Position): boolean {\n return this.addTarget(node, port).moveToPoint(pos);\n }\n\n public removeTarget(node: ID, port: ID): void {\n const key = `${node}-${port}`;\n const has = this.to[key];\n\n if (has) {\n delete this.to[key];\n this.removeChild(has);\n }\n }\n\n public move(pos: Position): boolean {\n const moved = (this.from.x !== pos.x) || (this.from.y !== pos.y);\n\n if (moved) {\n this.from.copyFrom(pos);\n\n for (const line of Object.values(this.to)) {\n line.moveFromPoint(pos);\n }\n }\n\n return moved;\n }\n}\n","import { type Connector, ConnectorPoint, type GraphNodeInterface, type Position } from '../interfaces';\nimport { isConnectionPoint } from '../utils';\nimport { ColorSource, Graphics } from './pixi';\nimport type { PortConnectionPoint } from './PIXINode';\nimport { PIXILine } from './PIXILine';\nimport { PIXIConnector } from './PIXIConnector';\n\nenum ConnectionViability {\n None,\n Viable,\n Prohbited,\n}\n\nconst VIABILITY_COLOR = {\n [ConnectionViability.None]: 0x666666,\n [ConnectionViability.Prohbited]: 0xff6666,\n [ConnectionViability.Viable]: 0x66ff66,\n};\n\nconst REMOVABILITY_COLOR = {\n [ConnectionViability.None]: 0x666666,\n [ConnectionViability.Prohbited]: 0xaa6666,\n [ConnectionViability.Viable]: 0xff3333,\n};\n\nconst getViablity = (start: PortConnectionPoint<any>, finish: PortConnectionPoint<any>, removing: boolean) => {\n const {\n point: { parent, input },\n } = start;\n\n if (finish.hover) {\n const match =\n parent === finish.point.parent || input === finish.point.input\n ? ConnectionViability.Prohbited\n : ConnectionViability.Viable;\n\n if (match && removing) {\n const finishConnected = start.point.nodes.some(isConnectionPoint(finish.point.parent, finish.point.port));\n const startConnected = finish.point.nodes.some(isConnectionPoint(start.point.parent, start.point.port));\n\n if (finishConnected && startConnected) {\n return ConnectionViability.Viable;\n }\n\n return ConnectionViability.None;\n }\n\n return match;\n }\n\n return ConnectionViability.None;\n};\n\nconst isSamePoint = (a: ConnectorPoint<any>, b: ConnectorPoint<any>) => {\n return a.parent === b.parent && a.port === b.port;\n};\n\nexport type NodeConnection<Node extends GraphNodeInterface> = {\n connect: boolean;\n output: ConnectorPoint<Node>;\n input: ConnectorPoint<Node> & {\n connector: Connector<Node['id']>;\n };\n};\n\nclass Cross extends Graphics {\n line1: PIXILine;\n line2: PIXILine;\n line12: PIXILine;\n line22: PIXILine;\n\n constructor(size: number, color: ColorSource = 0x000000, bg: ColorSource = 0x111111) {\n super();\n const half = size / 2;\n const half2 = size / 2 + 2;\n this.line12 = new PIXILine(-half2, -half2, half2, half2, 0).setWidth(6).setColor(bg).update();\n this.line22 = new PIXILine(half2, -half2, -half2, half2, 0).setWidth(6).setColor(bg).update();\n this.line1 = new PIXILine(-half, -half, half, half, 0);\n this.line2 = new PIXILine(half, -half, -half, half, 0);\n this.setColor(color);\n this.addChild(this.line12, this.line22, this.line2, this.line1);\n }\n\n show() {\n this.visible = true;\n\n return this;\n }\n\n hide() {\n this.visible = false;\n\n return this;\n }\n\n setColor(color: ColorSource) {\n this.line1.setColor(color).update();\n this.line2.setColor(color).update();\n\n return this;\n }\n\n setAngle(value: number) {\n if (this.angle === value) {\n return this;\n }\n\n this.angle = value;\n this.rotation = value;\n\n return this;\n }\n\n setPosition(pos: Position) {\n this.x = pos.x;\n this.y = pos.y;\n\n return this;\n }\n}\n\nexport class PIXIPendingConnector<Node extends GraphNodeInterface> extends PIXIConnector<Node['id']> {\n start: PortConnectionPoint<Node>;\n finish?: PortConnectionPoint<Node>;\n viable: ConnectionViability;\n\n readonly #line: PIXILine;\n readonly #cross: Cross;\n\n constructor(start: PortConnectionPoint<Node>) {\n super(start.pos.x, start.pos.y);\n this.start = start;\n this.viable = ConnectionViability.None;\n this.#line = this.addTarget(0, 0);\n this.#cross = new Cross(10, 0xff3333).hide();\n\n this.addChild(this.#cross);\n }\n\n get isRemoving() {\n return this.start.remove || !!this.finish?.remove;\n }\n\n setLine(pos: Position) {\n this.#line.visible = true;\n\n const { x: x1, y: y1 } = this.start.pos;\n const { x: x2, y: y2 } = pos;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const angle = dx ? Math.atan(dy / dx) : 0;\n\n if (this.isRemoving) {\n const mid = { x: x1 + dx / 2, y: y1 + dy / 2 };\n this.#cross.setColor(REMOVABILITY_COLOR[this.viable]).setPosition(mid).setAngle(angle).show();\n\n if (this.viable === ConnectionViability.None) {\n this.#line.visible = false;\n this.#cross.hide();\n }\n } else {\n this.#cross.hide();\n }\n\n this.#line\n .setColor(this.isRemoving ? REMOVABILITY_COLOR[this.viable] : VIABILITY_COLOR[this.viable])\n .moveToPoint(pos);\n }\n\n flail(pos: Position) {\n if (this.finish) {\n return;\n }\n\n this.setLine(pos);\n }\n\n hoverPort(port: PortConnectionPoint<Node>) {\n this.viable = getViablity(this.start, port, this.isRemoving);\n this.finish = this.viable === ConnectionViability.Viable ? port : undefined;\n this.setLine(port.pos);\n }\n\n connect({ point }: PortConnectionPoint<Node>): NodeConnection<Node> | false {\n if (this.finish && isSamePoint(this.finish.point, point)) {\n const {\n start: { remove: removeStart, point: start },\n finish: { remove: removeFinish, point: finish },\n } = this;\n const input = (start.input ? start : finish) as ConnectorPoint<Node> & {\n connector: Connector<Node['id']>;\n };\n const output = start.input ? finish : start;\n\n return {\n connect: !(removeStart || removeFinish),\n output,\n input,\n };\n }\n\n return false;\n }\n}\n","import {\n Container,\n BitmapFont,\n BitmapText,\n IBitmapTextStyle,\n TextStyle,\n ITextStyle,\n IBitmapFontOptions,\n ColorSource,\n} from './pixi';\n\nexport class PIXIText extends Container {\n static makeFont = (id: string, style?: TextStyle | Partial<ITextStyle>, options?: IBitmapFontOptions) =>\n (typeof document !== 'undefined')! &&\n BitmapFont.from(id, style, {\n chars: [\n ['a', 'z'],\n ['A', 'Z'],\n ['а', 'я'],\n ['А', 'Я'],\n ['0', '9'],\n '!@#$%^&*?()~{}[]<>\\\\/|_+-=.,\\n:;\\'\"` ',\n '←↑→↓',\n ],\n ...options,\n });\n #text: BitmapText;\n\n static factory = (id: string, style?: TextStyle | Partial<ITextStyle>, options?: IBitmapFontOptions) => {\n this.makeFont(id, style, options);\n\n return (text: any, textStyle?: Partial<Omit<IBitmapTextStyle, 'fontName'>>) =>\n new this(text, {\n ...textStyle,\n fontName: id,\n });\n };\n\n public constructor(text: any, style?: Partial<IBitmapTextStyle>) {\n super();\n\n this.#text = this.addChild(new BitmapText(String(text), style));\n }\n\n set text(text: any) {\n this.#text.text = String(text);\n }\n\n get text() {\n return this.#text.text;\n }\n\n set tint(color: ColorSource) {\n this.#text.tint = color;\n }\n}\n","import { DisposableEventSource } from '@ankhzet/gcl';\nimport type { IEventHandler } from '@ankhzet/eventual';\nimport type { ConnectorPoint, GraphNodeInterface } from '../interfaces';\nimport type { FederatedPointerEvent} from './pixi';\nimport { Graphics } from './pixi';\nimport { PORT_SIZE } from './PIXINode';\nimport { PIXIText } from './PIXIText';\n\nexport const E_PORT_CLICK = Symbol.for('E_PORT_CLICK');\nexport const E_PORT_HOVER = Symbol.for('E_PORT_HOVER');\n\nexport class PIXIPort<Node extends GraphNodeInterface> extends Graphics {\n protected static port = PIXIText.factory('nodePort', {\n fontFamily: ['Menlo', 'monospace'],\n fontSize: 16,\n lineHeight: 20,\n align: 'center',\n });\n\n readonly #ee = new DisposableEventSource();\n #active: boolean;\n\n public constructor(\n public connectorPoint: ConnectorPoint<Node>,\n private hasBothLanes: boolean\n ) {\n super();\n\n this.#active = !!connectorPoint.nodes.length;\n this.x = connectorPoint.x;\n this.y = connectorPoint.y;\n\n const dir = connectorPoint.input ? 1 : -1;\n const text = this.addChild(\n PIXIPort.port(this.label, {\n fontSize: 8,\n })\n );\n text.y = -4;\n text.x = dir * (8 + PORT_SIZE / 2) - (connectorPoint.input ? 0 : text.width);\n text.eventMode = 'none';\n\n this.lineStyle(1, 0x333333, 1);\n this.beginFill(this.#active ? 0xaaaaaa : 0xffffff);\n this.drawCircle(0, 0, PORT_SIZE / 2);\n this.endFill();\n\n this.eventMode = 'static';\n this.cursor = 'pointer';\n this.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.#ee.dispatchEvent(E_PORT_CLICK, e);\n });\n this.addEventListener('pointerenter', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.#ee.dispatchEvent(E_PORT_HOVER, true);\n });\n this.addEventListener('pointerleave', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.#ee.dispatchEvent(E_PORT_HOVER, false);\n });\n }\n\n public get label() {\n return String(this.connectorPoint.name).slice(0, this.hasBothLanes ? 2 : 8);\n }\n\n public dispose() {\n this.#ee.dispose();\n this.removeFromParent();\n }\n\n public get active() {\n return this.#active;\n }\n\n public setActive(active: boolean) {\n this.#active = active;\n\n this.update();\n }\n\n public update() {\n this.beginFill(this.active ? 0xaaaaaa : 0xffffff);\n this.drawCircle(0, 0, PORT_SIZE / 2);\n this.endFill();\n }\n\n public onClick(handler: IEventHandler<FederatedPointerEvent>) {\n return this.#ee.handleEvent(E_PORT_CLICK, handler);\n }\n\n public onHover(handler: IEventHandler<boolean>) {\n return this.#ee.handleEvent(E_PORT_HOVER, handler);\n }\n}\n","import { DisposableEventSource } from '@ankhzet/gcl';\nimport type { Position } from '../interfaces';\nimport { DisplayObject, Point } from './pixi';\n\ntype Draggable = DisplayObject & {\n _drag_meta?: {\n root: DisplayObject;\n emitter: DisposableEventSource;\n dragging: boolean;\n anchor: Point;\n newPosition: Position;\n lastPosition: Position;\n onDragEnd: (event: any) => void;\n onDragMove: (event: any) => void;\n };\n};\n\nexport const E_MOVE_NODE = Symbol.for('E_MOVE_NODE');\nexport const E_CAPTURE_NODE = Symbol.for('E_CAPTURE_NODE');\n\nconst copyPoint = (event: any, target?: Position): Position => {\n const pos = event.global! as Position;\n\n if (target) {\n target.x = pos.x;\n target.y = pos.y;\n\n return target;\n }\n\n return { x: pos.x, y: pos.y };\n};\n\nconst findRoot = (p: DisplayObject): DisplayObject | undefined => {\n if ((p as any).__drag_root) {\n return p;\n }\n\n return p.parent && findRoot(p.parent);\n};\n\nexport function onDragStart(emitter: DisposableEventSource) {\n return function (this: Draggable, event: any) {\n emitter.dispatchEvent(E_CAPTURE_NODE, true);\n\n if (event.buttons & 2) {\n return;\n }\n\n const meta = (this._drag_meta = {\n root:\n findRoot(this.parent) ||\n (() => {\n throw new Error(`Can't find scene root`);\n })(),\n emitter: emitter,\n dragging: true,\n anchor: this.position.clone(),\n lastPosition: copyPoint(event),\n newPosition: copyPoint(event),\n onDragEnd: onDragEnd(this),\n onDragMove: onDragMove(this),\n });\n\n meta.root.addEventListener('pointerup', meta.onDragEnd, { capture: true, passive: true });\n meta.root.addEventListener('pointerupoutside', meta.onDragEnd, { capture: true, passive: true });\n\n meta.root.addEventListener('pointermove', meta.onDragMove, { capture: true, passive: true });\n };\n}\n\nconst onDragMove = (d: Draggable) => (event: any) => {\n if (!d._drag_meta?.dragging) {\n return;\n }\n\n const { newPosition, lastPosition, anchor, emitter } = d._drag_meta!;\n\n copyPoint(event, newPosition);\n\n newPosition.x -= lastPosition.x;\n newPosition.y -= lastPosition.y;\n\n emitter.dispatchEvent(E_MOVE_NODE, {\n x: anchor.x + newPosition.x,\n y: anchor.y + newPosition.y,\n });\n};\n\nconst onDragEnd = (d: Draggable) => () => {\n if (!d._drag_meta) {\n return;\n }\n\n const { root, emitter, onDragEnd, onDragMove } = d._drag_meta;\n root.removeEventListener('pointerup', onDragEnd);\n root.removeEventListener('pointerupoutside', onDragEnd);\n root.removeEventListener('pointermove', onDragMove);\n\n emitter.dispatchEvent(E_CAPTURE_NODE, false);\n\n delete d._drag_meta;\n};\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource } from '@ankhzet/gcl';\n\nimport type { Connector, ConnectorId, ConnectorPoint, GraphNodeInterface } from '../interfaces';\nimport { type NodeConnection, type Position } from '../interfaces';\nimport { addOffset, connectNodes, isConnectionPoint } from '../utils';\nimport type { Container, FederatedPointerEvent, IPointData, ColorSource } from './pixi';\nimport { Graphics } from './pixi';\nimport { E_PORT_CLICK, E_PORT_HOVER, PIXIPort } from './PIXIPort';\nimport { E_CAPTURE_NODE, E_MOVE_NODE, onDragStart } from './Draggable';\nimport { PIXIConnector } from './PIXIConnector';\nimport { PIXIText } from './PIXIText';\n\nexport const E_NODE_CONTEXT = Symbol.for('E_NODE_CONTEXT');\nexport const E_CONNECTORS_UPDATE = Symbol.for('E_CONNECTORS_UPDATE');\n\nexport const NODE_WIDTH = 64;\nexport const LANE_WIDTH = 16;\nexport const LANE_HEIGHT = 16;\nexport const PORT_SIZE = 8;\n\ntype Getter<ID, R> = (id: ID) => R | undefined;\nexport type PortConnectionPoint<Node extends GraphNodeInterface> = {\n point: ConnectorPoint<Node>;\n pos: Position;\n hover?: boolean;\n remove?: boolean;\n};\n\nexport type RoundRectStyle = {\n stroke: ColorSource;\n fill: ColorSource;\n x?: number;\n y?: number;\n width: number;\n height: number;\n thickness?: number;\n radius?: number;\n};\n\nexport class PIXINode<Node extends GraphNodeInterface<any, any, Container>> extends DisposableEventSource {\n protected static label = PIXIText.factory('nodeLabel', {\n fontSize: 24,\n align: 'center',\n fill: '#efefef',\n dropShadow: true,\n dropShadowDistance: 2,\n });\n\n readonly #label: PIXIText;\n #_shape?: Container;\n #_connectors?: ConnectorPoint<Node>[];\n #drag = onDragStart(this);\n\n public data: Node;\n public find: Getter<Node['id'], PIXINode<Node>>;\n private ports = new Map<Node['id'], PIXIPort<Node>>();\n\n public constructor(data: Node, find: Getter<Node['id'], PIXINode<Node>>) {\n super();\n this.data = data;\n this.find = find;\n this.data.onConnect(this.#connect.bind(this));\n this.#label = PIXINode.label(this.label, {\n fontSize: 11,\n });\n }\n\n public get id() {\n return this.data.id;\n }\n\n public get label() {\n return this.data.title;\n }\n\n public dispose() {\n for (const port of this.ports.values()) {\n port.dispose();\n }\n\n if (this.#_connectors) {\n const remove = this.#_connectors.map(({ port }) => `${this.id}-${port}` as ConnectorId<Node>);\n\n if (remove.length) {\n this.dispatchEvent(E_CONNECTORS_UPDATE, {\n remove,\n });\n }\n }\n\n if (this.#_shape) {\n this.#_shape.removeFromParent();\n this.#_shape = undefined;\n }\n\n super.dispose();\n }\n\n public move(pos: Position): void {\n this.renderable.position.copyFrom(this.data.move(pos));\n this.placeConnectors();\n }\n\n public hitTest({ x, y }: Position): boolean {\n const { x: cx, y: cy } = this.renderable;\n\n if (x < cx || y < cy) {\n return false;\n }\n\n return x - cx <= this.width && y - cy <= this.height;\n }\n\n public get width() {\n return this.data.width;\n }\n\n public get height() {\n return this.data.height + LANE_HEIGHT;\n }\n\n #connect({ connect, input, source: { port: guid }, target }: NodeConnection<Node['id']>) {\n const connector = this.connectors.find((connector) => connector.port === guid && connector.input === input);\n\n if (!connector) {\n return;\n }\n\n connectNodes(connect, connector, target);\n\n const port = this.ports.get(guid);\n\n if (port) {\n port.setActive(!!connector.nodes.length);\n }\n }\n\n public connectedAt<Input extends true | false | undefined>(nodeId: Node['id'], portId: Node['id'], input?: Input): ConnectorPoint<Node, Input> | undefined {\n return this.connectors.find(\n ({ nodes, connector }) => (input !== !connector) && nodes.length && nodes.some(isConnectionPoint(nodeId, portId))\n ) as ConnectorPoint<Node, Input> | undefined;\n }\n\n public get connectors(): ConnectorPoint<Node>[] {\n if (this.#_connectors) {\n return this.#_connectors;\n }\n\n const connectors: ConnectorPoint<Node>[] = [];\n let idx1 = 1;\n let idx2 = 1;\n\n for (const joint of this.data.inputs) {\n const offset = { x: LANE_WIDTH / 2, y: idx1 * LANE_HEIGHT + LANE_HEIGHT / 2 };\n const pos = addOffset(this.data.position, offset);\n connectors.push({\n parent: this.data.id,\n port: joint.port,\n name: joint.name,\n nodes: joint.nodes,\n input: true,\n x: offset.x,\n y: offset.y,\n connector: new PIXIConnector(pos.x, pos.y),\n });\n idx1++;\n }\n\n for (const joint of this.data.outputs) {\n connectors.push({\n parent: this.data.id,\n port: joint.port,\n name: joint.name,\n nodes: joint.nodes,\n input: false,\n x: NODE_WIDTH - LANE_WIDTH / 2,\n y: idx2 * LANE_HEIGHT + LANE_HEIGHT / 2,\n });\n idx2++;\n }\n\n return (this.#_connectors = connectors);\n }\n\n public placeConnectors(recursive = true) {\n const map: Map<ConnectorId<Node>, Connector<Node['id']>> = new Map();\n const remove: ConnectorId<Node>[] = [];\n\n for (const joint of this.connectors) {\n const { connector, nodes, port } = joint;\n const uid = `${this.id}-${port}` as ConnectorId<Node>;\n\n if (connector) {\n connector.move(addOffset(this.renderable, joint));\n\n if (nodes.length) {\n let active = 0;\n\n for (const { node: nodeId, port: portId } of nodes) {\n const target = this.find(nodeId);\n const targetOut = target?.connectedAt(this.id, port);\n\n if (target && targetOut) {\n connector.moveTargetTo(nodeId, portId, addOffset(target.renderable, targetOut));\n active++;\n } else {\n connector.removeTarget(nodeId, portId);\n }\n }\n\n if (active) {\n map.set(uid, connector);\n }\n } else {\n remove.push(uid);\n }\n } else if (recursive && nodes.length) {\n for (const { node: nodeId } of nodes) {\n this.find(nodeId)?.placeConnectors(false);\n }\n }\n }\n\n if (map.size || remove.length) {\n this.dispatchEvent(E_CONNECTORS_UPDATE, {\n add: map.size ? [...map.entries()].map(([uid, connector]) => ({ uid, connector })) : undefined,\n remove: remove.length ? remove : undefined,\n });\n }\n }\n\n public get renderable(): Container {\n if (this.#_shape) {\n return this.#_shape;\n }\n\n const width = this.width;\n const height = this.height;\n const block = this.makeRoundRect({\n width,\n height,\n stroke: 0xdfdfef,\n fill: 0xfdfdfd,\n });\n\n this.#label.y = (LANE_HEIGHT - this.#label.height) / 2;\n this.#label.x = (width - this.#label.width) / 2;\n\n block\n .addChild(this.makeLane({\n x: 0,\n y: 0,\n width,\n height: LANE_HEIGHT,\n fill: 0x7d7d7d,\n }))\n .addChild(this.#label);\n\n const inputs = this.data.inputs.count;\n const outputs = this.data.outputs.count;\n\n if (inputs) {\n block.addChild(this.makeLane({\n x: 0,\n y: LANE_HEIGHT,\n height: height - LANE_HEIGHT,\n }));\n }\n\n if (outputs) {\n block.addChild(this.makeLane({\n x: width - LANE_WIDTH,\n y: LANE_HEIGHT,\n height: height - LANE_HEIGHT,\n }));\n }\n\n const hasBothLanes = !!(inputs && outputs);\n\n for (const connector of this.connectors) {\n block.addChild(this.makePort(connector, hasBothLanes));\n }\n\n const base = this.data.render(block);\n\n base.eventMode = 'static';\n base.addEventListener('pointerdown', (e) => this.handleClick(e));\n base.x = this.data.position.x;\n base.y = this.data.position.y;\n\n return (this.#_shape = base);\n }\n\n public makeRoundRect({ stroke, fill, x = 0, y = 0, width, height, thickness = 1, radius = 4 }: RoundRectStyle) {\n const rect = new Graphics();\n rect.lineStyle(thickness, stroke);\n rect.beginFill(fill);\n rect.drawRoundedRect(0, 0, width, height, radius);\n rect.endFill();\n rect.x = x;\n rect.y = y;\n\n return rect;\n }\n\n public makeLane(style: Partial<RoundRectStyle>) {\n return this.makeRoundRect(Object.assign({\n width: LANE_WIDTH,\n height: LANE_HEIGHT,\n stroke: 0xe0e0e0,\n fill: 0xededed,\n }, style));\n }\n\n public makePort(point: ConnectorPoint<Node>, hasBothLanes: boolean) {\n const { port: id, x, y } = point;\n const port = new PIXIPort(point, hasBothLanes);\n this.ports.set(id, port);\n\n port.onClick((e) => {\n if (e.buttons & 2) {\n return this.dispatchEvent(E_NODE_CONTEXT, { event: e, tag: { type: 'port', id } });\n }\n\n this.dispatchEvent(E_PORT_CLICK, {\n remove: e.ctrlKey || e.metaKey,\n point,\n pos: {\n x: this.renderable.x + x,\n y: this.renderable.y + y,\n },\n } as PortConnectionPoint<Node> & { remove?: boolean });\n });\n port.onHover((hover) =>\n this.dispatchEvent(E_PORT_HOVER, {\n point,\n hover,\n pos: {\n x: this.renderable.x + x,\n y: this.renderable.y + y,\n },\n } as PortConnectionPoint<Node>)\n );\n\n return port;\n }\n\n protected handleClick(e: FederatedPointerEvent) {\n if (e.buttons & 2) {\n e.stopPropagation();\n e.preventDefault();\n this.dispatchEvent(E_NODE_CONTEXT, { event: e, tag: { type: 'node', id: this.data.id } });\n } else {\n this.#drag.call(this.renderable, e);\n }\n }\n\n public onContext(\n handler: IEventHandler<{ event: FederatedPointerEvent; tag: { type: 'node' | 'port'; id: Node['id'] } }>\n ) {\n return this.handleEvent(E_NODE_CONTEXT, handler);\n }\n\n public onPortClick(handler: IEventHandler<PortConnectionPoint<Node> & { remove?: boolean }>) {\n return this.handleEvent(E_PORT_CLICK, handler);\n }\n\n public onPortHover(handler: IEventHandler<PortConnectionPoint<Node>>) {\n return this.handleEvent(E_PORT_HOVER, handler);\n }\n\n public onCapture(handler: IEventHandler<boolean>) {\n return this.handleEvent(E_CAPTURE_NODE, handler);\n }\n\n public onMove(handler: IEventHandler<IPointData>) {\n return this.handleEvent(E_MOVE_NODE, handler);\n }\n\n public onConnectorsUpdate(handler: IEventHandler<{ add?: Array<{ uid: ConnectorId<Node>; connector: Connector<Node['id']> }>; remove?: ConnectorId<Node>[] }>) {\n return this.handleEvent(E_CONNECTORS_UPDATE, handler);\n }\n\n protected update() {\n const map = this.connectors.reduce(\n (acc, c) => ((acc[c.port] = c), acc),\n {} as Record<Node['id'], ConnectorPoint<Node>>\n );\n\n for (const joint of this.data.inputs) {\n const connector = map[joint.port as Node['id']];\n\n if (connector) {\n connector.nodes = joint.nodes;\n }\n }\n\n for (const joint of this.data.outputs) {\n const connector = map[joint.port as Node['id']];\n\n if (connector) {\n connector.nodes = joint.nodes;\n }\n }\n\n this.placeConnectors();\n }\n}\n","import type { Position } from '../interfaces';\nimport { ColorSource, Container, Graphics, Rectangle } from './pixi';\nimport { PIXIText } from './PIXIText';\n\ntype SnapSize = {\n cell: Position;\n count: Position;\n size: { width: number; height: number };\n};\n\nconst identity = { x: 0, y: 0 };\n\nconst equalSnaps = (a: SnapSize, b: SnapSize) =>\n // true &&\n a.cell.x === b.cell.x &&\n a.cell.y === b.cell.y &&\n a.count.x === b.count.x &&\n a.count.y === b.count.y &&\n a.size.width === b.size.width &&\n a.size.height === b.size.height;\n\nconst clamp = (value: number, min: number, max: number) => (value > min ? (value < max ? value : max) : min);\nconst clampEdge = (value: number, offset: number, edge1: number, edge2: number, padding: number) =>\n clamp(value - offset / 2, edge1 + padding, edge2 - offset - padding);\n\nconst nextEven = (value: number) => {\n const result = Math.ceil(value);\n\n return result % 2 ? result + 1 : result;\n};\n\nexport class PIXIGrid extends Graphics {\n static text = PIXIText.factory(\n 'GridBoundary',\n {\n fontSize: 24,\n fill: 0xffffff,\n stroke: 0x000000,\n dropShadow: true,\n dropShadowDistance: 2,\n },\n {\n chars: [['0', '9'], '+-.'],\n }\n );\n\n public cellSize: Position;\n public colors: ColorSource[];\n readonly #multiplier: number;\n readonly #xR: PIXIText;\n readonly #xL: PIXIText;\n readonly #yB: PIXIText;\n readonly #yT: PIXIText;\n #viewport: Rectangle = new Rectangle(0, 0, 0, 0);\n #snap: SnapSize = { cell: identity, count: identity, size: { width: 0, height: 0 } };\n #grid: Container;\n #rullers: Container;\n\n constructor(cellSize: Position, colors: ColorSource[], multiplier = 5) {\n super();\n this.cellSize = cellSize;\n this.colors = colors;\n this.#multiplier = multiplier;\n this.#grid = this.addChild(new Container());\n this.#rullers = this.addChild(new Container());\n this.#xL = PIXIGrid.text('', { fontSize: 12 });\n this.#xR = PIXIGrid.text('', { fontSize: 12 });\n this.#yT = PIXIGrid.text('', { fontSize: 12 });\n this.#yB = PIXIGrid.text('', { fontSize: 12 });\n }\n\n get lods(): number {\n return this.colors.length;\n }\n\n protected snapSize({ width, height }: { width: number; height: number }, lod: number) {\n const { x, y } = this.cellSize;\n const max = lod ? Math.pow(2, lod - 1) * this.#multiplier : 1;\n const ox = max * x;\n const oy = max * y;\n const dx = nextEven(width / ox);\n const dy = nextEven(height / oy);\n\n return {\n cell: {\n x: ox,\n y: oy,\n },\n count: {\n x: dx,\n y: dy,\n },\n size: {\n width: ox * dx,\n height: oy * dy,\n },\n };\n }\n\n private toMaxSnap(viewport: Rectangle) {\n return this.snapSize(viewport, this.lods - 1);\n }\n\n public viewport(viewport: Rectangle) {\n this.makeRullers(viewport);\n\n const snapOld = this.toMaxSnap(this.#viewport);\n const snapNew = this.toMaxSnap(viewport);\n\n this.#grid.x = (viewport.left + viewport.width) % snapNew.cell.x;\n this.#grid.y = (viewport.top + viewport.height) % snapNew.cell.y;\n\n if (equalSnaps(snapOld, snapNew)) {\n return;\n }\n\n this.#viewport.copyFrom(viewport);\n this.#snap = snapNew;\n this.update();\n }\n\n protected makeRullers(viewport: Rectangle) {\n this.#rullers.removeChildren();\n const shape = this.#rullers.addChild(new Graphics());\n const { left, top, width, height } = viewport;\n\n const stroke = 2;\n const halfStroke = stroke / 2;\n const rightmost = left + width;\n const topmost = top + height;\n const x = clamp(rightmost, halfStroke, width - halfStroke);\n const y = clamp(topmost, halfStroke, height - halfStroke);\n\n shape.lineStyle(stroke, 0xff0000, 1);\n shape.moveTo(0, y);\n shape.lineTo(width, y);\n shape.moveTo(x, 0);\n shape.lineTo(x, height);\n\n this.#rullers.addChild(this.#xL, this.#xR, this.#yT, this.#yB);\n\n this.#xL.text = ~~(-(width + left) / this.cellSize.x);\n this.#yT.text = ~~(-(height + top) / this.cellSize.y);\n this.#xR.text = ~~(-left / this.cellSize.x);\n this.#yB.text = ~~(-top / this.cellSize.y);\n\n const th = this.#xL.height;\n const lw = this.#xL.width;\n const rw = this.#xR.width;\n const tw = this.#yT.width;\n const bw = this.#yB.width;\n const ly = clampEdge(y, th, 0, height, stroke);\n const lx1 = clampEdge(x, tw, lw + 5, width - rw - 5, stroke);\n const lx2 = clampEdge(x, bw, lw + 5, width - rw - 5, stroke);\n\n this.#xL.x = stroke;\n this.#xL.y = ly;\n\n this.#xR.x = width - rw - stroke;\n this.#xR.y = ly;\n\n this.#yT.x = lx1;\n this.#yT.y = stroke;\n\n this.#yB.x = lx2;\n this.#yB.y = height - th - stroke;\n }\n\n protected makeLOD(lod: number) {\n const color = this.colors[lod];\n const {\n cell: { x: ox, y: oy },\n count: { x: dx, y: dy },\n size: { width, height },\n } = this.snapSize(this.#snap.size, lod);\n\n const shape = new Graphics();\n\n shape.lineStyle(0.25 * (lod + 1), color, 1);\n\n for (let i = 0; i < dx; i++) {\n shape.moveTo(ox * i, 0);\n shape.lineTo(ox * i, height);\n }\n\n for (let i = 0; i < dy; i++) {\n shape.moveTo(0, oy * i);\n shape.lineTo(width, oy * i);\n }\n\n return shape;\n }\n\n protected makeGrid() {\n const shape = new Container();\n\n for (const lod of this.colors.keys()) {\n shape.addChild(this.makeLOD(lod));\n }\n\n return shape;\n }\n\n update() {\n const { width, height } = this.#snap.size;\n this.#grid.removeChildren();\n\n for (let x = -1; x <= 1; x++) {\n for (let y = -1; y <= 1; y++) {\n const c = this.makeGrid();\n c.x = x * width;\n c.y = y * height;\n this.#grid.addChild(c);\n }\n }\n }\n}\n","import type { IMenuItem } from '../interfaces';\nimport { Container, Graphics } from './pixi';\nimport { PIXIText } from './PIXIText';\n\nconst ITEM_HEIGHT = 24;\nconst ITEM_H_PADDING = 12;\n\nexport class PIXIMenuItem extends Container {\n public static label = PIXIText.factory('menuItem', {\n fontSize: 24,\n align: 'center',\n fill: 0xffffff,\n });\n\n readonly #bg: Graphics;\n readonly #label: PIXIText;\n readonly #item: IMenuItem<any>;\n readonly #group: boolean;\n\n #width: number = 0;\n #height: number = ITEM_HEIGHT;\n #hover: boolean = false;\n #separator: boolean = false;\n #disabled: boolean = false;\n\n public index: number;\n\n public constructor(index: number, item: IMenuItem<any>, onSelect: () => void) {\n super();\n this.index = index;\n this.#item = item;\n this.#separator = !!item.separator;\n this.#group = !!item.group;\n this.#disabled = !!item.disabled || this.#group;\n\n this.#bg = this.addChild(new Graphics());\n this.#label = this.addChild(\n PIXIMenuItem.label(this.label, {\n fontSize: 12,\n })\n );\n\n this.eventMode = 'static';\n this.addEventListener('pointerdown', (e) => {\n if (this.#disabled) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n onSelect();\n });\n }\n\n public resize(width: number) {\n this.#width = width;\n this.update();\n }\n\n public get separator() {\n return this.#separator;\n }\n\n public set separator(value: boolean) {\n if (this.#separator === value) {\n return;\n }\n\n this.#separator = value;\n this.update();\n }\n\n public get hover() {\n return this.#hover;\n }\n\n public set hover(value: boolean) {\n value = value && !this.#disabled;\n\n if (this.#hover === value) {\n return;\n }\n\n this.#hover = value;\n this.update();\n }\n\n public get label() {\n return this.#item.label;\n }\n\n public get labelWidth() {\n return this.#label.width + ITEM_H_PADDING * 2;\n }\n\n public get width() {\n return this.#width;\n }\n\n public get height() {\n return this.#separator ? 2 : this.#height;\n }\n\n public get disabled() {\n return this.#disabled;\n }\n\n public set disabled(value: boolean) {\n if (this.#disabled !== value) {\n return;\n }\n\n this.#disabled = value;\n this.update();\n }\n\n public update() {\n const width = this.width;\n const height = this.height;\n const block = this.#bg;\n\n if (this.separator) {\n block.lineStyle(1, 0x666, 1);\n block.moveTo(ITEM_H_PADDING, 1);\n block.lineTo(width - ITEM_H_PADDING, 1);\n } else if (this.#group) {\n block.lineStyle(0, 0x000000, 1);\n block.beginFill(0x333333);\n block.drawRect(-1, 1, width + 2, height - 2);\n block.endFill();\n } else if (this.hover) {\n block.lineStyle(0, 0x000000, 1);\n block.beginFill(0x444444);\n block.drawRoundedRect(0, 0, width, height, 4);\n block.endFill();\n } else {\n block.clear();\n }\n\n this.#label.text = this.#item.label;\n this.#label.x = ITEM_H_PADDING;\n this.#label.y = (height - this.#label.height) / 2;\n this.#label.alpha = this.#disabled && !this.#group ? 0.3 : 1;\n this.#label.tint = this.#group || this.hover ? 0xffffff : 0x000000;\n }\n}\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource } from '@ankhzet/gcl';\nimport type { IMenu, IMenuItem } from '../interfaces';\nimport { Container, Graphics, Point } from './pixi';\nimport { PIXIMenuItem } from './PIXIMenuItem';\n\nexport const E_ITEM_SELECT = Symbol.for('E_ITEM_SELECT');\nexport const E_CLOSE_MENU = Symbol.for('E_CLOSE_MENU');\n\nconst dummyLocal = new Point();\n\nexport class PIXIMenu extends Container {\n readonly #bg: Graphics;\n readonly #container: Container;\n readonly #mask: Graphics;\n readonly #items: PIXIMenuItem[];\n readonly #ee: DisposableEventSource;\n #hoverIndex = -1;\n\n public constructor(menu: IMenu<any>) {\n super();\n\n this.#ee = new DisposableEventSource();\n\n this.#mask = this.addChild(new Graphics());\n this.#bg = this.addChild(new Graphics());\n this.#container = this.addChild(new Container());\n this.#items = menu.items.map((item, index) =>\n this.#container.addChild(new PIXIMenuItem(index, item, () => this.handleSelect(item)))\n );\n\n this.#container.mask = this.#mask;\n\n this.eventMode = 'static';\n this.addEventListener('pointermove', (e) => {\n this.hoverIndex = this.getItemAtY(e.getLocalPosition(this, dummyLocal).y);\n });\n this.addEventListener('pointerleave', () => {\n this.hoverIndex = -1;\n });\n\n this.update();\n }\n\n public getItemAtY(y: number) {\n if (y >= 0) {\n for (const item of this.#items) {\n y -= item.height;\n\n if (y <= 2) {\n return item.index;\n }\n }\n }\n\n return -1;\n }\n\n public get hoverIndex() {\n return this.#hoverIndex;\n }\n\n public set hoverIndex(value: number) {\n if (this.#hoverIndex === value) {\n return;\n }\n\n this.changeHover(this.#hoverIndex, false);\n this.changeHover(value, true);\n this.#hoverIndex = value;\n }\n\n protected changeHover(index: number, hover: boolean) {\n const item = index >= 0 && this.#items[index];\n\n if (item) {\n item.hover = hover;\n }\n }\n\n protected handleSelect(item: IMenuItem<any>) {\n this.#ee.dispatchEvent(E_ITEM_SELECT, item);\n }\n\n public close() {\n this.visible = false;\n this.#ee.dispatchEvent(E_CLOSE_MENU);\n }\n\n public onSelect(handler: IEventHandler<IMenuItem>) {\n return this.#ee.handleEvent(E_ITEM_SELECT, handler);\n }\n\n public onClose(handler: IEventHandler) {\n return this.#ee.handleEvent(E_CLOSE_MENU, handler);\n }\n\n public get width() {\n return Math.max(...this.#items.map((item) => item.labelWidth));\n }\n\n public get height() {\n return this.#items.reduce((acc, item) => acc + item.height, 0);\n }\n\n public update() {\n const width = this.width;\n const height = this.height;\n const block = this.#bg;\n\n block.lineStyle(0, 0, 1);\n block.beginFill(0x000000, 0.3);\n block.drawRoundedRect(2, 2, width + 2, height + 2, 4);\n block.endFill();\n\n block.lineStyle(1, 0x333333, 1);\n block.beginFill(0xfdfdfd);\n block.drawRoundedRect(-1, -1, width + 2, height + 2, 4);\n block.endFill();\n\n const mask = this.#mask;\n mask.clear();\n mask.beginFill(0xffffff);\n mask.drawRoundedRect(-1, -1, width + 2, height + 2, 4);\n mask.endFill();\n\n let offset = 0;\n\n for (const item of this.#items) {\n item.y = offset;\n item.resize(width);\n offset += item.height;\n }\n }\n}\n","import { debounce } from '@ankhzet/utils';\nimport type {\n Connector,\n ConnectorId,\n GraphNodeInterface,\n HitTestResult,\n IMenuProvider,\n Position,\n Renderer,\n RendererConfig,\n RendererGUI,\n RendererOptions,\n} from '../interfaces';\nimport { addOffset } from '../utils';\nimport type { FederatedPointerEvent, IRenderer } from './pixi';\nimport { autoDetectRenderer, Container, Rectangle, Ticker } from './pixi';\nimport { type PIXIConnector } from './PIXIConnector';\nimport { type NodeConnection, PIXIPendingConnector } from './PIXIPendingConnector';\nimport { PIXINode } from './PIXINode';\nimport { PIXIGrid } from './PIXIGrid';\nimport { PIXIMenu } from './PIXIMenu';\n\nexport class PIXIRenderer<Node extends GraphNodeInterface> implements Renderer<Node> {\n private readonly ticker: Ticker;\n private readonly nodes = new Map<Node['id'], PIXINode<Node>>();\n private readonly connectors = new Map<ConnectorId<Node>, PIXIConnector<Node['id']>>();\n private _pending: PIXIPendingConnector<Node> | null = null;\n private _renderer: IRenderer | null = null;\n\n public menu?: PIXIMenu | null;\n\n public gui: RendererGUI<any>[];\n public world: Container;\n public root: Container;\n public overlay: Container;\n public grid: PIXIGrid;\n public capturing?: Node;\n public options: RendererOptions = {\n viewport: {\n width: 1,\n height: 1,\n resolution: window.devicePixelRatio,\n backgroundColor: 0x242424,\n antialias: true,\n transparent: false,\n },\n };\n readonly #throttle = debounce(() => this.ticker.speed = 0.05, 1000);\n readonly #find = (id: Node['id']) => this.nodes.get(id);\n\n public constructor({ maxFPS, grid, gui = [] }: RendererConfig) {\n this.ticker = new Ticker();\n this.world = new Container();\n this.root = new Container();\n this.overlay = new Container();\n this.grid = new PIXIGrid(grid.cellSize, grid.colors);\n this.world.sortableChildren = true;\n this.ticker.maxFPS = maxFPS;\n (this.world as any).__drag_root = true;\n this.gui = gui;\n\n this.root.addChild(this.grid);\n this.root.addChild(this.world);\n this.root.addChild(this.overlay);\n this.root.addChild(...gui);\n this.ticker.add(this.render.bind(this));\n\n this.world.eventMode = 'static';\n this.world.hitArea = { contains: () => true };\n this.world.addEventListener('pointermove', (e) => {\n this.handlePointerMove(this.fromGlobal(e.global));\n });\n this.world.addEventListener('pointerdown', (e) => {\n this.handlePointerDown(this.fromGlobal(e.global), e);\n });\n\n this.fullSpeed();\n }\n\n public fullSpeed() {\n this.ticker.speed = 1;\n this.#throttle();\n };\n\n public get renderer(): IRenderer {\n if (!this._renderer) {\n const { viewport } = this.options;\n\n this._renderer = autoDetectRenderer({\n width: viewport.width,\n height: viewport.height,\n antialias: viewport.antialias,\n backgroundColor: viewport.backgroundColor,\n backgroundAlpha: viewport.transparent ? 0.0 : 1.0,\n resolution: viewport.resolution,\n autoDensity: true,\n });\n this.ticker.start();\n }\n\n return this._renderer!;\n }\n\n public set renderer(value: IRenderer | null) {\n if (this._renderer === value) {\n return;\n }\n\n if (this._renderer) {\n this.ticker.stop();\n this._renderer.destroy(true);\n }\n\n this._renderer = value;\n\n if (value) {\n this.ticker.start();\n }\n }\n\n public get width() {\n return this.renderer.width / this.options.viewport.resolution;\n }\n\n public get height() {\n return this.renderer.height / this.options.viewport.resolution;\n }\n\n public get center(): Position {\n const { width, height } = this;\n\n return {\n x: width / 2,\n y: height / 2,\n };\n }\n\n public get translation(): Position {\n const { x: cx, y: cy } = this.center;\n const { x, y } = this.world.transform.position;\n\n return {\n x: ~~(x - cx),\n y: ~~(y - cy),\n };\n }\n\n public fromGlobal(pos: Position): Position {\n return addOffset(pos, this.world.transform.position, -1);\n }\n\n public fromLocal(pos: Position): Position {\n return addOffset(addOffset(pos, this.world.transform.position, -2), this.center);\n }\n\n public offsetPos(pos: Position, dir: number = 1): Position {\n return addOffset(pos, this.center, dir);\n }\n\n public translate(pos: Position): void {\n this.world.transform.position.copyFrom(this.offsetPos(pos));\n this.overlay.transform.position.copyFrom(this.offsetPos(pos));\n\n this.updateViewport();\n }\n\n public closeMenu() {\n this.menu?.close();\n }\n\n public showMenu(provider: IMenuProvider<any>, tag: any, pos: Position) {\n this.closeMenu();\n\n const descriptor = provider.getMenu(tag, pos);\n\n if (descriptor) {\n const menu = this.overlay.addChild(Object.assign(new PIXIMenu(descriptor), pos));\n\n menu.onSelect((item) => {\n if (false !== provider.handleMenu(item.data)) {\n this.closeMenu();\n }\n });\n\n menu.onClose(() => {\n if (this.menu === menu) {\n this.menu = null;\n }\n\n menu.removeFromParent();\n });\n\n return (this.menu = menu);\n }\n }\n\n public addNode(node: Node): void {\n if (this.#find(node.id)) {\n return;\n }\n\n const wrapped = new PIXINode(node, this.#find);\n\n wrapped.onMove((pos) => {\n if (this._pending) {\n return;\n }\n\n this.moveNodeTo(node.id, pos);\n });\n wrapped.onCapture((capture) => {\n if (capture) {\n this.capturing = node;\n\n if (!this._pending) {\n this.moveToForeground(node);\n return;\n }\n } else {\n this.capturing = undefined;\n }\n });\n wrapped.onContext(({ event, tag }) => this.showMenu(node, tag, this.fromGlobal(event.global)));\n wrapped.onPortClick((e) => {\n if (e.remove && !e.point.nodes.length) {\n return;\n }\n\n if (this.pending) {\n const connect = this.pending.connect(e);\n\n if (connect) {\n this.connectNodes(connect);\n this.pending = null;\n }\n\n return;\n }\n\n this.pending = new PIXIPendingConnector(e);\n });\n wrapped.onPortHover((e) => this.pending?.hoverPort(e));\n wrapped.onConnectorsUpdate(({ add, remove }) => {\n if (add) {\n for (const { uid, connector } of add) {\n this.addConnector(uid, connector);\n }\n }\n\n if (remove) {\n for (const uid of remove) {\n this.removeConnector(uid);\n }\n }\n });\n wrapped.onDispose(() => {\n this.nodes.delete(node.id);\n });\n\n this.nodes.set(node.id, wrapped);\n this.world.addChild(wrapped.renderable);\n }\n\n public removeNode(node: Node): void {\n const wrapper = this.nodes.get(node.id);\n\n if (wrapper) {\n wrapper.dispose();\n }\n }\n\n public clear(): void {\n const toRemove = [...this.nodes.values()];\n this.connectors.clear();\n this.nodes.clear();\n this.world.removeChildren();\n\n for (const node of toRemove) {\n node.dispose();\n }\n }\n\n public get pending(): PIXIPendingConnector<Node> | null {\n return this._pending;\n }\n\n public set pending(value: PIXIPendingConnector<Node> | null) {\n if (!value && this._pending) {\n this._pending.removeFromParent();\n }\n\n this._pending = value;\n\n if (value) {\n this.overlay.addChild(value);\n }\n }\n\n public handlePointerMove(pos: Position) {\n this.fullSpeed();\n\n if (this.capturing || !this.pending) {\n return;\n }\n\n this.pending.flail(pos);\n }\n\n public handlePointerDown(pos: Position, e: FederatedPointerEvent) {\n if (this.pending && !e.shiftKey) {\n this.pending = null;\n }\n\n this.closeMenu();\n\n if (e.buttons & 2) {\n for (const gui of this.gui) {\n if (this.showMenu(gui, undefined, pos)) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n }\n\n public connectNodes({\n connect,\n output: { port: outputPort, parent: outputNode },\n input: { port: inputPort, parent: inputNode },\n }: NodeConnection<Node>) {\n const output = this.#find(outputNode)!;\n const input = this.#find(inputNode)!;\n\n // if (connect) {\n // input.data.connect({\n // connect: false,\n // input: true,\n // port: inputPort,\n // });\n // }\n //\n output.data.connect({\n connect,\n input: false,\n port: outputPort,\n nodes: [\n {\n node: input.data,\n port: inputPort,\n },\n ],\n });\n\n input.placeConnectors();\n }\n\n public buildConnectors() {\n for (const node of this.nodes.values()) {\n node.placeConnectors();\n }\n }\n\n public addConnector(guid: ConnectorId<Node>, connector: Connector<Node['id']>) {\n if (this.connectors.has(guid)) {\n return;\n }\n\n const asPixi = connector as PIXIConnector<Node['id']>;\n\n asPixi.zIndex++;\n this.world.addChild(asPixi);\n this.connectors.set(guid, asPixi);\n }\n\n public removeConnector(guid: ConnectorId<Node>) {\n const connector = this.connectors.get(guid);\n\n if (connector) {\n this.connectors.delete(guid);\n this.world.removeChild(connector);\n }\n }\n\n public moveToForeground(node: Node): void {\n const graphics = this.nodes.get(node.id);\n\n if (graphics) {\n this.world.setChildIndex(graphics.renderable, this.world.children.length - 1);\n }\n }\n\n public hitTest({ x, y }: Position): undefined | HitTestResult<Node> {\n const pos = {\n x: x - this.translation.x,\n y: y - this.translation.y,\n };\n\n for (const node of this.nodes.values()) {\n if (node.hitTest(pos)) {\n return {\n node: node.data,\n x: node.renderable.x,\n y: node.renderable.y,\n width: node.width,\n height: node.height,\n };\n }\n }\n }\n\n public getNodePos(node: Node): Position {\n return node.position;\n }\n\n public moveNodeTo(nodeId: Node['id'], pos: Position): void {\n const node = this.nodes.get(nodeId);\n\n if (node) {\n node.move(pos);\n }\n }\n\n public layout(): void {\n this.buildConnectors();\n }\n\n public mount(node: HTMLElement, options: RendererOptions) {\n this.options = options;\n this.renderer = null;\n this.renderer!.resize(options.viewport.width, options.viewport.height);\n this.translate({ x: 0, y: 0 });\n\n node.appendChild(this.renderer.view as unknown as globalThis.Node);\n\n return () => {\n this.unmount();\n };\n }\n\n public unmount() {\n this.renderer = null;\n }\n\n public resize(width: number, height: number) {\n this.renderer.resize(width, height);\n this.updateViewport();\n }\n\n protected updateViewport() {\n const {\n width,\n height,\n translation: { x, y },\n } = this;\n\n if (width && height) {\n this.grid.viewport(new Rectangle(x - width / 2, y - height / 2, width, height));\n }\n }\n\n public render() {\n this.renderer?.render(this.root);\n }\n\n public update() {\n this.ticker.update();\n }\n}\n","import { IMenu, IMenuProvider, Position, RendererGUI } from '../interfaces';\nimport { Container, Text } from './pixi';\nimport { PIXIText } from './PIXIText';\n\nconst DEFAULT_LEGEND = `\nPort:\n LMB - start connecting\n LMB + (Meta | Ctrl) - start disconnecting\nCanvas:\n LMB + Shift - drag while connecting/disconnecting`;\n\nexport class PIXIGUI<M> extends Container implements RendererGUI<M> {\n static text = PIXIText.factory(\n 'GUIText',\n {\n fontSize: 16,\n align: 'left',\n fill: '#efefef',\n dropShadow: true,\n dropShadowDistance: 1,\n },\n {\n chars: [['a', 'z'], ['A', 'Z'], ['0', '9'], ' \\t\\n+-|()/:;.'],\n }\n );\n static makeText = (text: string) => this.text(text, { fontSize: 8 });\n\n readonly #menu: IMenuProvider<M>;\n readonly #mark = new Text('ℹ️', {\n fontSize: 8,\n lineHeight: 14,\n });\n readonly #text = PIXIGUI.makeText('');\n #legend: boolean = false;\n #dynamicText: string = '';\n #legendText: string;\n\n public constructor(menu: IMenuProvider<M>, legendText: string = DEFAULT_LEGEND) {\n super();\n this.#legendText = legendText;\n\n this.addChild(this.#mark);\n this.addChild(this.#text);\n\n this.#mark.eventMode = 'static';\n this.#mark.addEventListener('pointerdown', () => (this.legend = !this.legend));\n\n this.#text.x = 8;\n this.#text.y = 8;\n\n this.#menu = menu;\n }\n\n getMenu(tag: any, pos: Position): IMenu<M> | undefined {\n return this.#menu.getMenu(tag, pos);\n }\n\n handleMenu(data: M): void | false {\n return this.#menu.handleMenu(data);\n }\n\n get legendText(): string {\n return this.#legendText;\n }\n\n set legendText(text: string) {\n this.#legendText = text;\n }\n\n set text(text: string) {\n this.#dynamicText = text;\n this.#text.text = text + (this.#legend ? this.#legendText : '');\n }\n\n get legend() {\n return this.#legend;\n }\n\n set legend(value: boolean) {\n this.#legend = value;\n this.#text.text = this.#dynamicText + (this.#legend ? this.#legendText : '');\n }\n}\n","import { DisplayObject, Container } from './pixi';\n\nexport class PIXIStacked<T extends DisplayObject> extends Container {\n public readonly first: T;\n\n public constructor(first: T, ...rest: DisplayObject[]) {\n super();\n this.first = first;\n\n this.addChild(first, ...rest);\n }\n\n public hotSwap(...children: DisplayObject[]) {\n this.removeChildren();\n this.addChild(this.first, ...children);\n }\n}\n","import { ColorSource, Graphics } from \"./pixi\";\n\nexport type OutlinedOptions = {\n x?: number;\n y?: number;\n width: number;\n height: number;\n radius: number;\n lineSize: number;\n color: ColorSource;\n};\n\nexport class PIXIOutlined extends Graphics {\n readonly #options: OutlinedOptions;\n #active?: boolean;\n\n public constructor(options: OutlinedOptions) {\n super();\n this.#options = options;\n }\n\n public get active() {\n return !!this.#active;\n }\n\n public set active(value: boolean) {\n if (value === !!this.#active) {\n return;\n }\n\n this.#active = value;\n\n this.clear();\n\n if (value) {\n const { lineSize, color, x = 0, y = 0, width, height, radius } = this.#options;\n\n this\n .lineStyle({\n width: lineSize,\n color,\n })\n .drawRoundedRect(x - 2, y - 2, width + 4, height + 4, radius);\n }\n }\n}\n","export * from './pixi';\nexport * from './Batch';\nexport * from './PIXIRectSpinner';\nexport * from './PIXIRenderer';\nexport * from './PIXIGUI';\nexport * from './PIXINode';\nexport * from './PIXIStacked';\nexport * from './PIXIOutlined';\n","import type {\n GraphNodeInterface,\n HitTestResult,\n Renderer,\n Position,\n RendererConfig,\n RendererOptions,\n} from './interfaces';\nimport { Batch, PIXIRenderer } from './render';\n\nexport class GraphAdapter<Node extends GraphNodeInterface> extends Batch implements Iterable<Node> {\n private readonly renderer: Renderer<Node>;\n\n private nodes: Node[] = [];\n\n public constructor(config: RendererConfig) {\n super();\n this.renderer = new PIXIRenderer<Node>(config);\n this.and(() => this.renderer.render());\n }\n\n public [Symbol.iterator]() {\n return this.nodes[Symbol.iterator]();\n }\n\n public clear() {\n this.renderer.clear();\n this.nodes.splice(0);\n }\n\n public update() {\n this.renderer.update();\n }\n\n public moveToForeground(node: Node) {\n this.renderer.moveToForeground(node);\n }\n\n public hitTest(pos: Position): undefined | HitTestResult<Node> {\n return this.renderer.hitTest(pos);\n }\n\n public getNodePos(node: Node): Position {\n return this.renderer.getNodePos(node);\n }\n\n public moveNodeTo(node: Node, pos: Position) {\n node.position = pos;\n }\n\n public addNode(node: Node) {\n const idx = this.nodes.indexOf(node);\n\n if (idx < 0) {\n this.nodes.push(node);\n this.renderer.addNode(node);\n }\n\n return node;\n }\n\n public removeNode(node: Node) {\n const idx = this.nodes.indexOf(node);\n\n if (idx >= 0) {\n this.nodes.splice(idx, 1);\n this.renderer.removeNode(node);\n }\n\n return node;\n }\n\n public get capturing(): Node | undefined {\n return this.renderer.capturing;\n }\n\n public releaseNode() {\n this.renderer.capturing = undefined;\n }\n\n public get translation(): Position {\n return this.renderer.translation;\n }\n\n public translate(pos: Position): void {\n this.renderer.translate(pos);\n }\n\n public resize(width: number, height: number): void {\n this.renderer.resize(width, height);\n }\n\n public fromGlobal(pos: Position): Position {\n return this.renderer.fromGlobal(pos);\n }\n\n public fromLocal(pos: Position): Position {\n return this.renderer.fromLocal(pos);\n }\n\n public mount(element: HTMLElement, options: RendererOptions) {\n return this.renderer.mount(element, options);\n }\n\n public unmount(): void {\n this.renderer.unmount();\n }\n\n public layout(): void {\n this.renderer.layout();\n }\n}\n","import { useLastCallback } from '@ankhzet/ui';\nimport { ChangeEvent, useState, useMemo, useEffect, useLayoutEffect, PropsWithChildren } from 'react';\n\ninterface GroupableItem<ID> {\n id: ID;\n}\n\nexport type ItemsGroup<ID> = {\n value: string | number;\n label: string;\n ids: ID[];\n};\n\nexport type GroupResolver<T extends GroupableItem<any>> = (node: T) => null | undefined | ItemsGroup<T['id']>;\n\nexport interface NodeGroupsProps<T extends GroupableItem<any>> extends PropsWithChildren {\n items: T[];\n resolver: GroupResolver<T>;\n onSelect: (group: ItemsGroup<T['id']>) => void;\n}\n\nfunction makeGroups<T extends GroupableItem<any>>(items: T[], resolver: GroupResolver<T>): ItemsGroup<T['id']>[] {\n const groups: ItemsGroup<T['id']>[] = [];\n\n for (const node of items) {\n const group = resolver(node);\n\n if (group) {\n groups.push(group);\n }\n }\n\n return groups\n .sort((a, b) => a.label.localeCompare(b.label))\n .concat([\n {\n value: 'all',\n ids: items.map(({ id }) => id),\n label: `All nodes (${items.length})`,\n },\n ]);\n}\n\nconst isSameArray = (a: any[], b: any[]) => {\n const items = a.length;\n\n if (items !== b.length) {\n return false;\n }\n\n for (let i = 0; i < items; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n};\n\nconst isValue = (value: any) => {\n const s = String(value);\n\n return (item: { value: any }) => String(item.value) === s;\n};\n\nexport function NodeGroups<Item extends GroupableItem<any>>({\n items,\n resolver,\n onSelect,\n children,\n ...rest\n}: NodeGroupsProps<Item>) {\n const groups = useMemo(() => makeGroups(items, resolver), [items, resolver]);\n const [group, setGroup] = useState<ItemsGroup<Item>>(groups.find(({ value }) => value === 'all')!);\n const currentAsString = String(group.value);\n\n const handleGroup = useLastCallback(({ target: { value } }: ChangeEvent<HTMLSelectElement>) => {\n const found = groups.find(isValue(value));\n\n if (found) {\n setGroup(found);\n }\n });\n\n useEffect(() => void onSelect(group), [group, onSelect]);\n\n useLayoutEffect(() => {\n const found = groups.find(isValue(group.value));\n\n if (found) {\n if (found === group) {\n return;\n }\n\n if (found.label !== group.label || !isSameArray(found.ids, group.ids)) {\n setGroup(found);\n }\n } else {\n setGroup(groups[0]!);\n }\n }, [groups, group]);\n\n return (\n <select\n multiple\n size={groups.length}\n onChange={handleGroup}\n {...rest}\n >\n {children}\n {groups.map(({ value, label }) => (\n <option key={String(value)} value={String(value)} selected={String(value) === currentAsString}>\n {label}\n </option>\n ))}\n </select>\n );\n}\n","import { useMeasure, Styles } from '@ankhzet/ui';\nimport { forwardRef, useEffect, useImperativeHandle } from 'react';\nimport { type DragHandlers, useDraggable } from './useDraggable';\n\ninterface ViewportProps {\n handlers: DragHandlers;\n onResize: (rect: { width: number; height: number }) => void;\n}\n\nexport const Viewport = forwardRef(({ handlers, onResize, ...props }: ViewportProps, ref) => {\n const [rect, measureRef] = useMeasure<HTMLDivElement>();\n const { bind, reset } = useDraggable<HTMLDivElement>(handlers);\n\n useImperativeHandle(ref, () => ({\n reset,\n get element() {\n return bind.ref.current;\n },\n }));\n\n useEffect(() => {\n if (rect) {\n onResize({\n width: ~~rect.width,\n height: ~~rect.height,\n });\n }\n }, [rect, onResize]);\n\n return (\n <div ref={measureRef} style={styles.root}>\n <div style={styles.root} {...bind} {...props} />\n </div>\n );\n});\n\nconst styles = Styles.of({\n root: {\n flex: 1,\n display: 'flex',\n minWidth: 0,\n minHeight: 0,\n },\n});\n","import { useLastCallback } from '@ankhzet/ui';\nimport { type TypeId } from './types';\nimport { type ItemsGroup, NodeGroups } from './graph';\nimport { ManagedGraphNode } from './ManagedGraphNode';\n\nexport interface GraphGroupsProps {\n items: ManagedGraphNode[];\n onSelect: (ids: TypeId[]) => void;\n}\n\nexport const GraphGroups = ({ onSelect, ...props }: GraphGroupsProps) => {\n const handleSelect = useLastCallback((group: ItemsGroup<TypeId>) => onSelect(group.ids));\n\n return (\n <NodeGroups\n resolver={resolver}\n onSelect={handleSelect}\n {...props}\n />\n );\n};\n\nconst resolver = (node: ManagedGraphNode) => {\n if (!node.item.isolator) {\n return;\n }\n\n const ids: TypeId[] = [node.id];\n\n return {\n value: node.id,\n label: node.title,\n ids,\n };\n};\n","import type { TypeId } from './types';\nimport type { GraphListeners } from './LoadNodes';\nimport type { ManagedGraphNode, IItem } from './ManagedGraphNode';\nimport type { ConnectionPoint, Coordinator, NodeConnection, Position, StoreInterface } from './graph';\n\nexport interface GraphHandlers<DTO, Item> {\n onCreate: (data: DTO) => Promise<Item>;\n onEdit: (item: Item) => void;\n onAddPort: (item: Item, input: boolean) => Promise<void>;\n onDisconnectPort: (item: Item, portId: TypeId) => Promise<void>;\n onDeletePort: (item: Item, portId: TypeId) => Promise<void>;\n onDelete: (item: Item) => Promise<void>;\n onMove: (item: Item, pos: Position) => Promise<void>;\n onConnect: (connection: NodeConnection<Item, TypeId>) => Promise<void>;\n onSelect?: (item: Item | null, pos: Position) => void | false;\n onContextMenu?: (item: Item | null, pos: Position) => void | false;\n}\n\nexport const createGraphHandlers = <DTO, Item extends IItem, Node extends ManagedGraphNode<Item>>(\n coordinator: Coordinator,\n nodes: StoreInterface<Node>,\n {\n onEdit,\n onConnect,\n onMove,\n onAddPort,\n onDisconnectPort,\n onDeletePort,\n onDelete,\n onSelect,\n onContextMenu,\n }: Partial<GraphHandlers<DTO, Item>> = {},\n) => {\n const handleAddPort = async (node: Node, input: boolean) => onAddPort?.(node.item, input);\n\n const handleDisconnectPort = async (node: Node, portId: TypeId) => onDisconnectPort?.(\n node.item,\n portId,\n );\n\n const handleDeletePort = async (node: Node, portId: TypeId) => onDeletePort?.(node.item, portId);\n\n const handleDelete = async (node: Node) => onDelete?.(node.item);\n\n const handleMove = async (node: Node, pos: Position) => onMove?.(\n node.item,\n coordinator.toData(pos),\n );\n\n const handleConnect = async ({ connect, input, source, target }: NodeConnection<TypeId>) => {\n if (!onConnect) {\n return;\n }\n\n const sourceNode = nodes.get(source.node)!;\n\n return onConnect({\n connect,\n input,\n source: { node: sourceNode.item, port: source.port },\n target: target\n ?.map(({ node: nodeId, port: portId }): ConnectionPoint<Item, TypeId> | undefined => {\n const node = nodes.get(nodeId);\n\n if (node) {\n return {\n node: node.item,\n port: portId,\n };\n }\n })\n .filter((p?: ConnectionPoint<Item, TypeId>) => !!p),\n });\n };\n\n const handleEdit = (node: Node) => onEdit?.(node.item);\n\n const handleSelect = (node: Node | null, pos: Position): void | false => onSelect?.(\n node?.item || null,\n coordinator.toData(pos),\n );\n\n const handleContextMenu = (node: Node | null, pos: Position): void | false => onContextMenu?.(\n node?.item || null,\n coordinator.toData(pos),\n );\n\n return {\n canvas: {\n onSelectNode: handleSelect,\n onContextMenu: handleContextMenu,\n },\n loader: {\n onEdit: handleEdit,\n onConnect: handleConnect,\n onMove: handleMove,\n onAddPort: handleAddPort,\n onDisconnectPort: handleDisconnectPort,\n onDeletePort: handleDeletePort,\n onDelete: handleDelete,\n } as GraphListeners<Node>,\n };\n};\n","import type { Ref } from 'react';\nimport { useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { useLastCallback } from '@ankhzet/ui';\nimport {\n type IMenuProvider,\n type Coordinator,\n type DragHandlers,\n type GraphNodeInterface,\n type Position,\n GraphAdapter,\n PIXIGUI,\n Viewport,\n} from './graph';\n\nconst ZERO = { x: 0, y: 0 };\n\nexport interface GraphNodeProps<Node extends GraphNodeInterface> {\n innerRef?: Ref<GraphRef<Node>>;\n coordinator: Coordinator;\n nodes: Node[];\n subset?: Node['id'][];\n menu: IMenuProvider<any>;\n onSelectNode: (node: Node | null, pos: Position) => void | false;\n onContextMenu: (node: Node | null, pos: Position) => void | false;\n}\n\nexport type GraphRef<Node extends GraphNodeInterface> = { graph: GraphAdapter<Node>; element?: HTMLDivElement };\n\nexport function GraphCanvas<Node extends GraphNodeInterface<ID, Data, Render>, ID = any, Data = any, Render = any>({\n innerRef,\n nodes,\n subset,\n coordinator,\n menu,\n onSelectNode,\n onContextMenu,\n ...rest\n}: GraphNodeProps<Node>) {\n const cursor = useRef(ZERO);\n const ref = useRef<{ element: HTMLDivElement; reset: (pos: Position) => void }>(null);\n const gui = useMemo(() => new PIXIGUI(menu), [menu]);\n const graph = useMemo(\n () =>\n new GraphAdapter<Node>({\n maxFPS: 120,\n grid: {\n cellSize: coordinator.gridSize,\n colors: [0x222222, 0x333333, 0x666666, 0x999999],\n },\n gui: [gui],\n }),\n [coordinator]\n );\n\n useImperativeHandle(innerRef, () => ({\n graph,\n get element() {\n return ref.current?.element;\n },\n }));\n\n const handleResize = useLastCallback(({ width, height }) => graph.resize(width, height));\n const handleGUI = useLastCallback(() => {\n const { x, y } = coordinator.toData(graph.translation);\n const { x: cx, y: cy } = coordinator.toData(cursor.current!);\n\n gui.text = `Pos: ${-(x - 1)} x ${-(y - 1)}\\nCursor: ${~~(cx - 1)} x ${~~(cy - 1)}`;\n });\n const onPointer = useLastCallback((pos) => {\n cursor.current = graph.fromLocal(pos);\n handleGUI();\n });\n const onUp = useLastCallback((pos) => {\n cursor.current = graph.fromLocal(pos);\n graph.releaseNode();\n handleGUI();\n });\n const onClick = useLastCallback((pos, e?: MouseEvent) => {\n onPointer(pos);\n\n if (graph.capturing && !e?.shiftKey) {\n onSelectNode(null, coordinator.toData(cursor.current));\n }\n\n if (false === onSelectNode(graph.capturing || null, coordinator.toData(cursor.current))) {\n graph.releaseNode();\n\n return false;\n }\n });\n const onDrag = useLastCallback((pos) => {\n if (graph.capturing) {\n return;\n }\n\n graph.translate(pos);\n handleGUI();\n });\n const onContext = useLastCallback((pos: Position) => {\n if (false === onClick(pos)) {\n return false;\n }\n\n if (false === onContextMenu(graph.capturing || null, coordinator.toData(cursor.current))) {\n graph.releaseNode();\n\n return false;\n }\n });\n\n const handlers = useMemo<DragHandlers>(\n () => ({\n get position() {\n return graph.translation;\n },\n onDrag,\n onPointer,\n onClick,\n onUp,\n onContext,\n }),\n [graph]\n );\n\n useEffect(() => {\n const renderer = ref.current;\n\n if (!renderer) {\n return;\n }\n\n const ids = subset || nodes.map(({ id }) => id);\n\n graph.batch(() => {\n for (const node of graph) {\n if (!ids.includes(node.id)) {\n graph.removeNode(node);\n }\n }\n\n for (const node of nodes) {\n if (ids.includes(node.id)) {\n graph.addNode(node);\n graph.moveNodeTo(node, node.position);\n }\n }\n\n graph.layout();\n });\n }, [subset, nodes]);\n\n useLayoutEffect(() => {\n const container = ref.current?.element;\n\n if (!container) {\n return;\n }\n\n return graph.mount(container, {\n viewport: {\n width: container.clientWidth,\n height: container.clientHeight,\n resolution: window.devicePixelRatio,\n backgroundColor: 0x141414,\n antialias: true,\n transparent: false,\n },\n });\n }, [graph]);\n\n return <Viewport ref={ref} handlers={handlers} onResize={handleResize} {...rest} />;\n}\n","import type { TypeId } from './types';\nimport type { NodeConnection, Position, StoreInterface } from './graph';\nimport { ManagedGraphNode } from './ManagedGraphNode';\n\nexport type GraphListeners<N extends ManagedGraphNode<any>> = {\n onEdit: (node: N) => void;\n onConnect: (connection: NodeConnection<TypeId>) => Promise<void>;\n onMove: (node: N, pos: Position) => Promise<void>;\n onAddPort: (node: N, input: boolean) => Promise<void>;\n onDisconnectPort: (node: N, portId: TypeId) => Promise<void>;\n onDeletePort: (node: N, portId: TypeId) => Promise<void>;\n onDelete: (node: N) => Promise<void>;\n};\n\ntype SyncConfig<N extends ManagedGraphNode<any>> = { added: N[]; removed: TypeId[] };\n\nconst connectHandlers = <N extends ManagedGraphNode>(\n node: N,\n { onEdit, onMove, onConnect, onDelete, onAddPort, onDisconnectPort, onDeletePort }: GraphListeners<N>,\n) => {\n node.onConnect(onConnect);\n node.onMove((pos) => onMove(node, pos));\n node.onEditAction(() => onEdit(node));\n node.onDeleteAction(() => onDelete(node));\n node.onAddPortAction((input) => onAddPort(node, input));\n node.onDisconnectPortAction(({ port }) => onDisconnectPort(node, port));\n node.onDeletePortAction(({ port }) => onDeletePort(node, port));\n};\n\nexport const syncNodes = <N extends ManagedGraphNode<any>>(\n nodes: StoreInterface<N>,\n handlers: GraphListeners<N> | undefined,\n { added, removed }: SyncConfig<N>,\n) => {\n if (added.length) {\n const intermediate = added.reduce(\n (acc, node) => ((acc[node.id] = node), acc),\n {} as Record<TypeId, N>,\n );\n const getNode = (id: TypeId) => intermediate[id] || nodes.find((node) => node.id === id);\n\n for (const node of added) {\n const ports = node.item.ports;\n\n if (!ports.length) {\n continue;\n }\n\n const fromId = node.item.id;\n\n for (const { id, to, port, input } of ports) {\n if (!to) {\n continue;\n }\n\n const toNode = getNode(to.id);\n\n if (toNode) {\n const toPort = toNode.getItemPort(({ to, name }) => to?.id === fromId && name === port);\n\n if (toPort) {\n node.connect({\n connect: true,\n input,\n port: id,\n nodes: [\n {\n node: toNode,\n port: toPort.id,\n },\n ],\n });\n }\n }\n }\n }\n\n if (handlers) {\n for (const node of added) {\n connectHandlers(node, handlers);\n }\n }\n\n nodes.add(added);\n }\n\n if (removed.length) {\n for (const item of removed) {\n nodes.remove(item);\n }\n }\n};\n","import type { Coordinator, IMenu, IMenuItem, IMenuProvider, Position } from './graph';\n\nexport const MENU_GROUPS = (): Array<{\n label: string;\n items: Array<IMenuItem<{ title: string; args: Partial<Record<string, string>> }>>;\n}> => [\n {\n label: 'Add node',\n items: [\n {\n label: '+ Call',\n data: {\n title: 'Call',\n args: {\n ports: JSON.stringify({ in: ['input'], out: ['output'] }),\n system: 'You are helpful assistant',\n instructions: 'Summarize following input:\\n{|input|}',\n llm: 'Result:\\n',\n },\n },\n },\n ],\n },\n {\n label: 'Add specific node',\n items: [\n {\n label: '+ Splitter (2)',\n data: {\n title: 'Splitter',\n args: {\n ports: JSON.stringify({ in: ['i'], out: ['o1', 'o2'] }),\n js: 'const value = get($i);\\nset($o1, value);\\nset($o2, value);\\n',\n },\n },\n },\n { label: '', separator: true },\n {\n label: '+ JSON → Ports',\n data: {\n title: 'From JSON',\n args: {\n ports: JSON.stringify({ in: ['json'], out: ['o1', 'o2', 'o3'] }),\n js: 'const value = get($json);\\ntry {\\n set(JSON.parse(value));\\n} catch (e) {\\nset({}); // default\\n}\\n',\n },\n },\n },\n ],\n },\n];\n\nexport interface GraphDTO {\n title: string;\n x: number;\n y: number;\n args?: Partial<Record<string, string>>;\n}\n\nexport const useGraphMenu = <DTO extends GraphDTO>(\n coordinator: Coordinator,\n onCreate?: (data: DTO) => void,\n): IMenuProvider<any> => {\n return {\n getMenu(_tag: any, pos: Position): IMenu<any> {\n const base = { action: 'add', ...coordinator.toData(pos) };\n\n return {\n items: MENU_GROUPS().map(({ label, items }) => [\n { label, group: true } as IMenuItem,\n ...items.map(\n ({ label, data, ...rest }): IMenuItem<GraphDTO & { action: string }> => ({\n label,\n data: data && { ...base, ...data },\n ...rest,\n }),\n ),\n ]).flat(),\n };\n },\n handleMenu({ action, ...payload }: GraphDTO & { action: 'add' }) {\n switch (action) {\n case 'add':\n return void onCreate?.(payload as DTO);\n }\n },\n };\n};\n","import { useRef } from 'react';\nimport { matchId } from '@ankhzet/utils';\nimport { useIsomorphicLayoutEffect } from '@ankhzet/ui';\n\nimport type { ManagedGraphNode, IItem } from './ManagedGraphNode';\n\nexport const useNodeSelection = <Item extends IItem>(nodes: ManagedGraphNode<Item>[], selected?: Item[]) => {\n const ref = useRef<Item[]>([]);\n\n useIsomorphicLayoutEffect(() => {\n const added = selected?.filter((item) => !ref.current.some(matchId(item.id)));\n const removed = ref.current.filter((item) => !selected?.some(matchId(item.id)));\n\n if (removed) {\n for (const { id } of removed) {\n nodes.find(matchId(id))?.setSelected(false);\n }\n }\n\n if (added) {\n for (const { id } of added) {\n nodes.find(matchId(id))?.setSelected(true);\n }\n }\n\n ref.current = selected || [];\n }, [selected, nodes]);\n};\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport type { IMenu, IMenuProvider, NodeJoint, Position, ConnectionPoint, Coordinator } from './graph';\nimport type { TypeId, Identifiable } from './types';\nimport { GraphNode } from './graph';\nimport { Container, RectSpinner, PIXIStacked, PIXIOutlined } from './graph/render';\n\nexport const isChannelName = (name: string) => name.startsWith('channel_');\nexport const getChannelName = (name: string) => (isChannelName(name) ? name.slice(8) : '');\n\nexport interface IItem extends Identifiable, Position {\n isolator: boolean;\n title: string;\n ports: IItemPort<this>[];\n}\n\nexport interface IItemPort<Item> extends Identifiable {\n name: string;\n input: boolean;\n to: Item | null;\n port: string | null;\n}\n\nexport type Resolver<Item> = (id: TypeId) => Item | undefined;\n\nexport type ToTitle<Item> = (item: Item) => string;\n\nexport type MenuAction =\n | { action: MenuActions.ADD_PORT; input: boolean }\n | { action: MenuActions.DISCONNECT_PORT | MenuActions.DELETE_PORT; port?: NodeJoint<TypeId> }\n | { action: MenuActions.EDIT_NODE | MenuActions.DELETE_NODE };\n\nconst translatePort = <Item extends IItem>(find: Resolver<Item>) => ({\n id,\n name,\n input,\n to,\n port: portName,\n}: IItemPort<Item>): NodeJoint<TypeId> => {\n const channel = getChannelName(name);\n\n if (channel) {\n name = `${input ? '> ' : ''}@${channel}${input ? '' : ' >'}`;\n }\n\n const nodes: ConnectionPoint<TypeId>[] = [];\n\n if (to) {\n const node = find(to.id);\n const port = node?.ports.find(({ name }) => name === portName);\n\n if (port) {\n nodes.push({\n node: to.id,\n port: port.id,\n });\n }\n }\n\n return {\n port: id,\n name,\n nodes,\n };\n};\n\nexport enum NodeStatus {\n Idle = 1 << 0,\n Processing = 1 << 1,\n Done = 1 << 2,\n Error = 1 << 3,\n Selected = 1 << 4,\n}\n\nexport type NodeData<Item> = {\n item: Item;\n status: NodeStatus;\n progress: number;\n};\n\nexport enum MenuActions {\n EDIT_NODE = 1,\n ADD_PORT = 2,\n DISCONNECT_PORT = 3,\n DELETE_PORT = 4,\n DELETE_NODE = 5,\n}\n\nexport class ManagedGraphNode<Item extends IItem = IItem>\n extends GraphNode<TypeId, NodeData<Item>, Container>\n implements IMenuProvider<MenuAction>\n{\n #shape?: RectSpinner;\n #outline?: PIXIStacked<PIXIOutlined>;\n\n public constructor({ finder, item, coordinator, toTitle }: {\n finder: Resolver<Item>;\n item: Item;\n coordinator: Coordinator;\n toTitle: ToTitle<Item>;\n }) {\n super({\n coordinator,\n item: item,\n status: NodeStatus.Idle,\n progress: 0,\n id: item.id,\n title: toTitle(item),\n inputs: item.ports.filter(({ input }) => !!input).map(translatePort(finder)),\n outputs: item.ports.filter(({ input }) => !input).map(translatePort(finder)),\n });\n\n this.position = this.coordinator.toGraph(item);\n }\n\n public dispose() {\n super.dispose();\n\n if (this.#outline) {\n this.#outline.destroy({});\n this.#outline = undefined;\n }\n\n if (this.#shape) {\n this.#shape.destroy({});\n this.#shape = undefined;\n }\n }\n\n public getMenu(tag?: { type: 'node' | 'port'; id: TypeId }): IMenu<any> | undefined {\n switch (tag?.type) {\n case 'node':\n return {\n items: [\n { label: this.title, group: true },\n { label: 'Edit', data: { action: MenuActions.EDIT_NODE } },\n { label: '', separator: true },\n { label: 'Add input port', data: { action: MenuActions.ADD_PORT, input: true } },\n { label: 'Add output port', data: { action: MenuActions.ADD_PORT, input: false } },\n { label: '', separator: true },\n { label: 'Delete node', data: { action: MenuActions.DELETE_NODE } },\n ],\n };\n\n case 'port':\n const input = this.inputs.find((joint) => joint.port === tag.id);\n const output = this.outputs.find((joint) => joint.port === tag.id);\n const found = input || output;\n const bound = !!(found && found.nodes.length);\n\n return {\n items: [\n { label: `Port \"${found?.name || '<?>'}\"`, group: true },\n {\n label: 'Disconnect',\n disabled: !bound,\n data: { action: MenuActions.DISCONNECT_PORT, port: found },\n },\n { label: '', separator: true },\n { label: 'Delete', disabled: !found, data: { action: MenuActions.DELETE_PORT, port: found } },\n ],\n };\n }\n }\n\n public handleMenu(data: MenuAction): void | false {\n switch (data?.action) {\n case MenuActions.ADD_PORT:\n return this.dispatchEvent(data?.action, data.input);\n\n case MenuActions.DISCONNECT_PORT:\n case MenuActions.DELETE_PORT:\n return data.port && this.dispatchEvent(data?.action, data.port);\n\n case MenuActions.EDIT_NODE:\n case MenuActions.DELETE_NODE:\n return this.dispatchEvent(data?.action, this.id);\n }\n }\n\n public onAddPortAction(handler: IEventHandler<boolean>) {\n return this.handleEvent(MenuActions.ADD_PORT, handler);\n }\n\n public onDisconnectPortAction(handler: IEventHandler<NodeJoint<TypeId>>) {\n return this.handleEvent(MenuActions.DISCONNECT_PORT, handler);\n }\n\n public onDeletePortAction(handler: IEventHandler<NodeJoint<TypeId>>) {\n return this.handleEvent(MenuActions.DELETE_PORT, handler);\n }\n\n public onEditAction(handler: IEventHandler<TypeId>) {\n return this.handleEvent(MenuActions.EDIT_NODE, handler);\n }\n\n public onDeleteAction(handler: IEventHandler<TypeId>) {\n return this.handleEvent(MenuActions.DELETE_NODE, handler);\n }\n\n public setStatus(status: NodeStatus) {\n this.description.status = status;\n\n if (status !== NodeStatus.Processing) {\n this.setProgress(0);\n }\n }\n\n public setProgress(progress: number) {\n this.description.progress = progress;\n this.#shape?.setActive(this.isInProgress);\n }\n\n public setSelected(value: boolean) {\n if (value === this.isSelected) {\n return;\n }\n\n this.description.status = value ? this.description.status | NodeStatus.Selected : this.description.status ^ NodeStatus.Selected;\n\n if (this.#outline) {\n this.#outline.first.active = value;\n }\n }\n\n public get item(): Item {\n return this.description.item;\n }\n\n public getItemPort(predicate: (port: IItemPort<Item>) => boolean): IItemPort<Item> | undefined {\n return this.item.ports.find(predicate);\n }\n\n public get isSelected() {\n return !!(this.description.status & NodeStatus.Selected);\n }\n\n public get isInProgress() {\n return !!(this.description.status & NodeStatus.Processing) || this.description.progress > 0;\n }\n\n public render(content: Container) {\n const width = ~~content.width - 1;\n const height = ~~content.height - 2;\n\n if (this.#outline) {\n this.#outline.hotSwap(content);\n } else {\n this.#outline = new PIXIStacked(\n new PIXIOutlined({\n width,\n height,\n color: 0x33ffff,\n lineSize: 1,\n radius: 4,\n }),\n content,\n );\n }\n\n this.#outline.first.active = this.isSelected;\n\n if (this.#shape) {\n this.#shape.hotSwap(this.#outline);\n } else {\n this.#shape = new RectSpinner(this.#outline, {\n sizeX: width,\n sizeY: height,\n color: 0x3333ff,\n lineSize: 3,\n radius: 4,\n });\n }\n\n this.#shape.setActive(this.isInProgress);\n\n return this.#shape;\n }\n}\n","import { useMemo, useRef } from 'react';\nimport { useIsomorphicLayoutEffect, usePrevious } from '@ankhzet/ui';\nimport { reaction } from 'mobx';\nimport { useLastCallback, useSyncStore } from '@ankhzet/ui';\nimport type { Coordinator} from './graph';\nimport { isEqualIdentifiables } from './graph';\nimport { ManagedGraphNode, IItem } from './ManagedGraphNode';\nimport { TypeId } from './types';\n\nexport const useNodes = <Item extends IItem>({\n coordinator,\n sync,\n onUpdate,\n store,\n toTitle,\n}: {\n store: { get: () => Item[]; onChange: (cb: () => void) => () => void };\n coordinator: Coordinator;\n sync: (config: { added: ManagedGraphNode<Item>[]; removed: TypeId[] }) => void;\n toTitle: (item: Item) => string;\n onUpdate: () => void;\n}) => {\n const ref = useRef(sync);\n const methods = useMemo(\n () => ({\n subscribe: (cb: () => void) => store.onChange(cb),\n getSnapshot: () => store.get(),\n selector: (items: Item[]) => items.sort((a, b) => a.id.localeCompare(b.id)),\n is: isEqualIdentifiables,\n }),\n [store]\n );\n\n const items = useSyncStore(\n //\n methods.subscribe,\n methods.getSnapshot,\n methods.getSnapshot,\n methods.selector,\n methods.is\n );\n const prev = usePrevious(items);\n const finder = useLastCallback((id: TypeId): Item | undefined => items.find((item) => item.id === id));\n\n ref.current = sync;\n\n useIsomorphicLayoutEffect(() => {\n const factory = (item: Item): ManagedGraphNode<Item> => new ManagedGraphNode<Item>({\n finder,\n item,\n coordinator,\n toTitle,\n });\n\n if (prev) {\n const cache: Record<TypeId, boolean> = prev.reduce(\n (acc: Record<TypeId, boolean>, { id }) => ((acc[id] = true), acc),\n {}\n );\n const added = items.filter((item) => !cache[item.id]).map(factory);\n const removed = Object.keys(cache).filter((id) => !finder(id));\n\n if (added.length || removed.length) {\n void ref.current({ added, removed });\n }\n } else {\n void ref.current({ added: items.map(factory), removed: [] });\n }\n }, [items, toTitle]);\n\n useIsomorphicLayoutEffect(() => reaction(() => items, onUpdate), []);\n};\n","import type { ManagedGraphNode } from './ManagedGraphNode';\nimport type { Coordinator, Position } from './graph';\n\nexport const GRID_SIZE = 16;\nexport const PORT_SIZE = 8;\nexport const LANE_SIZE = 16;\nexport const SPACE_SIZE = 32;\n\nexport class Coordinates implements Coordinator {\n grid: number;\n gridSize: Position;\n sizes: {\n grid: Position;\n port: number;\n lane: number;\n space: number;\n };\n\n public constructor(grid: number) {\n this.grid = grid;\n this.gridSize = { x: grid, y: grid };\n this.sizes = {\n grid: this.gridSize,\n port: PORT_SIZE,\n lane: LANE_SIZE,\n space: SPACE_SIZE,\n };\n }\n\n public snap(value: number) {\n const negatve = value < 0;\n const mul = negatve ? -1 : 1;\n\n return mul * (Math.round((mul * value) / this.grid + 0.5) - 0.5) * this.grid;\n }\n\n public toGraph({ x, y }: Position) {\n return {\n x: (x - 0.5) * this.grid,\n y: (y - 0.5) * this.grid,\n };\n }\n\n public toData({ x, y }: Position) {\n return {\n x: ~~(this.snap(x) / this.grid + 0.5),\n y: ~~(this.snap(y) / this.grid + 0.5),\n };\n }\n}\n\nexport const groupResolver = ({ description: { item } }: ManagedGraphNode) => item.isolator ? item.title : null;\n\nconst re = /^signal_?/;\n\nexport const isBarrier = ({ description }: ManagedGraphNode<any>) => re.test(description.title);\n","import { useLastCallback, handleAsNoop, Styles } from '@ankhzet/ui';\nimport { RefObject, useRef, useMemo, useState, PropsWithChildren, useImperativeHandle } from 'react';\nimport { GraphGroups } from './GraphGroups';\nimport type { ManagedGraphNode, IItem } from './ManagedGraphNode';\nimport { type GraphHandlers, createGraphHandlers } from './createGraphHandlers';\nimport type { GraphAdapter } from './graph';\nimport { Store, useStore } from './graph';\nimport { GraphCanvas } from './GraphCanvas';\nimport { syncNodes } from './LoadNodes';\nimport type { TypeId, Identifiable } from './types';\nimport { useGraphMenu, GraphDTO } from './useGraphMenu';\nimport { useNodeSelection } from './useNodeSelection';\nimport { useNodes } from './useNodes';\nimport { Coordinates, GRID_SIZE } from './utils';\n\nexport type { GraphHandlers };\n\nexport interface IGraph<Item extends IItem> extends Identifiable {\n items: Item[];\n}\n\nexport interface ManagedGraphProps<Graph extends IGraph<Item>, Item extends IItem, DTO> {\n innerRef?: RefObject<{ graph: GraphAdapter<ManagedGraphNode<Item>>; element?: HTMLDivElement }>;\n graph: Graph;\n selected?: Item[];\n className?: string;\n handlers?: Partial<GraphHandlers<DTO, Item>>;\n onExport?: (graph: Graph) => string;\n}\n\nexport const ManagedGraph = <Graph extends IGraph<Item>, Item extends IItem, DTO extends GraphDTO>({\n innerRef,\n graph,\n selected,\n handlers,\n children,\n onExport,\n ...rest\n}: PropsWithChildren<ManagedGraphProps<Graph, Item, DTO>>) => {\n const graphRef = useRef<{ graph: GraphAdapter<ManagedGraphNode<Item>>; element?: HTMLDivElement }>(null);\n const coordinator = useMemo(() => new Coordinates(GRID_SIZE), []);\n const menu = useGraphMenu(coordinator, handlers?.onCreate);\n const [nodes, all] = useStore(() => new Store<ManagedGraphNode<Item>>());\n const [group, setGroup] = useState<TypeId[] | undefined>();\n const { canvas, loader } = createGraphHandlers(coordinator, nodes, handlers);\n\n const handleExport = useLastCallback(() => onExport?.(graph));\n\n useImperativeHandle(innerRef, () => ({\n get graph() {\n return graphRef.current?.graph!;\n },\n get element() {\n return graphRef.current?.element;\n },\n }));\n\n const store = useMemo(() => {\n const items = new Store<Item>(graph.items);\n\n return {\n items,\n get: () => items.all,\n onChange: (cb: () => void) => items.onChange(cb),\n };\n }, [graph.items]);\n\n useNodes({\n store,\n coordinator,\n toTitle: (item) => item.title,\n sync: (config) => syncNodes(nodes, loader, config),\n onUpdate: () => innerRef?.current?.graph.layout(),\n });\n\n useNodeSelection(all, selected);\n\n return (\n <div onContextMenu={handleAsNoop} style={styles.root} {...rest}>\n <div style={styles.selector}>\n {children}\n\n <GraphGroups items={all} onSelect={setGroup} />\n\n <button onClick={() => setGroup(undefined)}>Update</button>\n\n {onExport && (\n <button onClick={handleExport}>Export</button>\n )}\n </div>\n\n <GraphCanvas\n innerRef={graphRef}\n coordinator={coordinator}\n nodes={all}\n subset={group}\n menu={menu}\n {...canvas}\n />\n </div>\n );\n};\n\nconst styles = Styles.of({\n root: {\n flex: 1,\n display: 'flex',\n alignSelf: 'stretch',\n gap: 10,\n },\n selector: {\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["ConnectionPoint","Position","snap","v","grid","Math","round","addOffset","t","s","dir","x","y","isConnectionPoint","node","ID","port","point","isNodePoint","connectNodes","connect","joint","nodes","target","idx","findIndex","has","push","splice","intersect","x1","y1","x2","y2","x3","y3","x4","y4","denominator","ua","ub","ConnectionPoint","NodeJoinRequest","NodeJoint","NodeJoints","connectNodes","isConnectionPoint","isNodePoint","GraphNodeJoints","ID","joints","Map","parentId","constructor","ports","joint","set","port","Symbol","iterator","Iterator","values","connected","result","Array","nodes","length","push","find","predicate","map","mapper","index","R","size","has","nodeId","portId","getPort","hasAtPort","nodePortId","get","some","found","undefined","connect","target","Error","getNodes","ids","Set","node","add","count","IEventHandler","DisposableEventSource","Disposer","ConnectionPoint","Coordinator","GraphNodeDescriptor","GraphNodeInterface","IMenu","NodeConnection","NodeConnectionRequest","NodeJoint","NodeJoints","Position","GraphNodeJoints","E_CONNECT","Symbol","E_MOVE","GraphNode","ID","Data","R","id","description","inputs","outputs","coordinator","pos","x","y","constructor","render","content","getMenu","tag","handleMenu","data","title","width","sizes","lane","space","height","Math","max","count","position","snap","dispatchEvent","isInput","portId","nodeId","nodePortId","hasAtPort","isOutput","isConnected","port","input","to","node","getNodes","connect","nodes","source","target","map","at","output","move","onConnect","handler","handleEvent","onMove","isLike","GraphNodeInterface","Position","GraphBarrier","node","N","NodesGraph","_barriers","Partial","Record","Node","_isBarrier","map","nodes","constructor","isBarrier","Object","fromEntries","id","cached","undefined","getSubGraphs","subset","rest","keys","result","nodeId","pop","sub","getConnectedNodes","idx","indexOf","splice","push","inputs","ids","outputs","target","includes","found","getCenter","mapper","offsets","filter","length","x","y","min","Infinity","max","offset","isLike","GraphNodeInterface","Position","NodesGraph","Layout","Layer","id","Node","Layers","Iterable","idx","LayeredLayout","layers","hash","center","getCenter","node","position","spread","layer","nodes","chain","max","map","height","shift","findLayer","Math","findMax","findLayers","get","inputs","ids","Object","values","dependants","found","other","has","push","filter","remove","put","group","entries","Partial","Record","exclude","indexOf","fromLayer","offset","includes","toLayer","min","dependant","all","candidates","concat","walk","consumer","input","GraphNodeInterface","Position","NodesGraph","Layout","ClusteredLayout","Node","cache","Record","hash","center","getCenter","node","position","splice","rest","pos","put","id","processed","includes","isBarrier","inputs","outputs","align","height","ids","space","length","map","index","result","offset","push","spread","layer","nodes","theory","bucket","x","column","Math","max","y","GraphNodeInterface","Relations","Record","K","Split","roots","joint","leafs","NodesSort","sort","nodes","dependencies","Partial","R","dependants","all","node","r","id","d","inputs","ids","indexOf","push","length","walk","cies","Object","keys","ants","split","layers","newAnts","newCies","dependant","filtered","filter","dependency","unshift","sides","concat","console","log","EdgesSort","sort","dependants","Record","dependencies","layers","leafs","pop","id","mutate","rest","variations","i","length","variation","splice","push","Constructor","GraphNodeInterface","GraphBarrier","Layout","Layouter","isBarrier","Node","klass","nodes","constructor","layout","subset","getSubGraphs","IEventHandler","DisposableEventSource","Disposer","TypeId","StoreInterface","E_CHANGED","Symbol","Store","id","Item","all","map","Record","constructor","clear","old","dispatchEvent","diff","added","find","predicate","node","filter","get","add","nodes","T","iterable","Array","isArray","includes","push","length","concat","remove","ids","trimmed","onChange","handler","handleEvent","useLayoutEffect","useState","useSyncStore","StoreInterface","isEqualIdentifiables","a","id","b","length","every","item","idx","useStore","init","S","store","args","cb","onChange","all","items","const","node","dispose","useState","useLastCallback","useDrag","DragHandler","offset","x","y","ClickHandler","e","MouseEvent","DragHandlers","position","onPointer","onClick","onUp","onDrag","onContext","useDraggable","HTMLElement","handlers","delta","anchor","setAnchor","isDragging","bind","E","pos","move","up","down","context","reset","DisposableEventSource","Batch","counter","constructor","batch","cb","begin","end","dispatchEvent","and","handler","handleEvent","ColorSource","DisplayObject","Graphics","intersect","modifiers","PI2","Math","PI","PIHalf","RectSpinner","sizeX","sizeY","lineSize","color","progress","active","mask","edge","interval","ctx","segments","corners","constructor","child","radius","lineStyle","width","drawRoundedRect","position","set","addChild","halfX","halfY","mX","mY","pX","pY","setActive","value","update","clearInterval","setInterval","destroy","_options","removeFromParent","hotSwap","removeChildren","phase","x","cos","y","sin","out","intersection","winding","i","length","segment","hit","clear","beginFill","moveTo","lineTo","endFill","Line","Point","IPointData","ColorSource","Graphics","ObservablePoint","PIXILine","from","to","angled","color","capped","width","constructor","sx","sy","tx","ty","update","eventMode","moveFromPoint","pos","moved","x","y","copyFrom","moveToPoint","setColor","setWidth","fromX","fromY","toX","toY","dx","dy","halfX","halfY","clear","lineStyle","alpha","moveTo","lineTo","beginFill","drawCircle","endFill","Connector","Position","Graphics","Point","PIXILine","PIXIConnector","ID","from","to","Record","constructor","sx","sy","line","Object","values","addChild","addTarget","node","port","key","has","x","y","moveTargetTo","pos","moveToPoint","removeTarget","removeChild","move","moved","copyFrom","moveFromPoint","Connector","ConnectorPoint","GraphNodeInterface","Position","isConnectionPoint","ColorSource","Graphics","PortConnectionPoint","PIXILine","PIXIConnector","ConnectionViability","None","Viable","Prohbited","VIABILITY_COLOR","REMOVABILITY_COLOR","getViablity","start","finish","removing","point","parent","input","hover","match","finishConnected","nodes","some","port","startConnected","isSamePoint","a","b","NodeConnection","connect","output","Node","connector","Cross","line1","line2","line12","line22","constructor","size","color","bg","half","half2","setWidth","setColor","update","addChild","show","visible","hide","setAngle","value","angle","rotation","setPosition","pos","x","y","PIXIPendingConnector","viable","line","cross","addTarget","isRemoving","remove","setLine","x1","y1","x2","y2","dx","dy","Math","atan","mid","moveToPoint","flail","hoverPort","undefined","removeStart","removeFinish","Container","BitmapFont","BitmapText","IBitmapTextStyle","TextStyle","ITextStyle","IBitmapFontOptions","ColorSource","PIXIText","makeFont","id","style","Partial","options","document","from","chars","text","factory","textStyle","Omit","fontName","constructor","addChild","String","tint","color","DisposableEventSource","IEventHandler","ConnectorPoint","GraphNodeInterface","FederatedPointerEvent","Graphics","PORT_SIZE","PIXIText","E_PORT_CLICK","Symbol","for","E_PORT_HOVER","PIXIPort","port","factory","fontFamily","fontSize","lineHeight","align","ee","active","constructor","connectorPoint","Node","hasBothLanes","nodes","length","x","y","dir","input","text","addChild","label","width","eventMode","lineStyle","beginFill","drawCircle","endFill","cursor","addEventListener","e","preventDefault","stopPropagation","dispatchEvent","String","name","slice","dispose","removeFromParent","setActive","update","onClick","handler","handleEvent","onHover","DisposableEventSource","Position","DisplayObject","Point","Draggable","_drag_meta","root","emitter","dragging","anchor","newPosition","lastPosition","onDragEnd","event","onDragMove","E_MOVE_NODE","Symbol","for","E_CAPTURE_NODE","copyPoint","target","pos","global","x","y","findRoot","p","__drag_root","parent","onDragStart","this","dispatchEvent","buttons","meta","Error","position","clone","addEventListener","capture","passive","d","removeEventListener","IEventHandler","DisposableEventSource","Connector","ConnectorId","ConnectorPoint","GraphNodeInterface","NodeConnection","Position","addOffset","connectNodes","isConnectionPoint","Container","FederatedPointerEvent","IPointData","ColorSource","Graphics","E_PORT_CLICK","E_PORT_HOVER","PIXIPort","E_CAPTURE_NODE","E_MOVE_NODE","onDragStart","PIXIConnector","PIXIText","E_NODE_CONTEXT","Symbol","for","E_CONNECTORS_UPDATE","NODE_WIDTH","LANE_WIDTH","LANE_HEIGHT","PORT_SIZE","Getter","id","ID","R","PortConnectionPoint","point","Node","pos","hover","remove","RoundRectStyle","stroke","fill","x","y","width","height","thickness","radius","PIXINode","label","factory","fontSize","align","dropShadow","dropShadowDistance","_shape","_connectors","drag","data","find","ports","Map","constructor","onConnect","connect","bind","title","dispose","port","values","map","length","dispatchEvent","removeFromParent","undefined","move","renderable","position","copyFrom","placeConnectors","hitTest","cx","cy","#connect","input","source","guid","target","connector","connectors","get","setActive","nodes","connectedAt","nodeId","portId","Input","some","idx1","idx2","joint","inputs","offset","push","parent","name","outputs","recursive","uid","active","node","targetOut","moveTargetTo","removeTarget","set","size","add","entries","block","makeRoundRect","addChild","makeLane","count","hasBothLanes","makePort","base","render","eventMode","addEventListener","e","handleClick","rect","lineStyle","beginFill","drawRoundedRect","endFill","style","Partial","Object","assign","onClick","buttons","event","tag","type","ctrlKey","metaKey","onHover","stopPropagation","preventDefault","call","onContext","handler","handleEvent","onPortClick","onPortHover","onCapture","onMove","onConnectorsUpdate","Array","update","reduce","acc","c","Record","Position","ColorSource","Container","Graphics","Rectangle","PIXIText","SnapSize","cell","count","size","width","height","identity","x","y","equalSnaps","a","b","clamp","value","min","max","clampEdge","offset","edge1","edge2","padding","nextEven","result","Math","ceil","PIXIGrid","text","factory","fontSize","fill","stroke","dropShadow","dropShadowDistance","chars","cellSize","colors","multiplier","xR","xL","yB","yT","viewport","snap","grid","rullers","constructor","addChild","lods","length","snapSize","lod","pow","ox","oy","dx","dy","toMaxSnap","makeRullers","snapOld","snapNew","left","top","copyFrom","update","removeChildren","shape","halfStroke","rightmost","topmost","lineStyle","moveTo","lineTo","th","lw","rw","tw","bw","ly","lx1","lx2","makeLOD","color","i","makeGrid","keys","c","IMenuItem","Container","Graphics","PIXIText","ITEM_HEIGHT","ITEM_H_PADDING","PIXIMenuItem","label","factory","fontSize","align","fill","bg","item","group","width","height","hover","separator","disabled","index","constructor","onSelect","addChild","eventMode","addEventListener","e","stopPropagation","preventDefault","resize","update","value","labelWidth","block","lineStyle","moveTo","lineTo","beginFill","drawRect","endFill","drawRoundedRect","clear","text","x","y","alpha","tint","IEventHandler","DisposableEventSource","IMenu","IMenuItem","Container","Graphics","Point","PIXIMenuItem","E_ITEM_SELECT","Symbol","for","E_CLOSE_MENU","dummyLocal","PIXIMenu","bg","container","mask","items","ee","hoverIndex","constructor","menu","addChild","map","item","index","handleSelect","eventMode","addEventListener","e","getItemAtY","getLocalPosition","y","update","height","value","changeHover","hover","dispatchEvent","close","visible","onSelect","handler","handleEvent","onClose","width","Math","max","labelWidth","reduce","acc","block","lineStyle","beginFill","drawRoundedRect","endFill","clear","offset","resize","debounce","Connector","ConnectorId","GraphNodeInterface","HitTestResult","IMenuProvider","Position","Renderer","RendererConfig","RendererGUI","RendererOptions","addOffset","FederatedPointerEvent","IRenderer","autoDetectRenderer","Container","Rectangle","Ticker","PIXIConnector","NodeConnection","PIXIPendingConnector","PIXINode","PIXIGrid","PIXIMenu","PIXIRenderer","Node","ticker","nodes","Map","connectors","_pending","_renderer","menu","gui","world","root","overlay","grid","capturing","options","viewport","width","height","resolution","window","devicePixelRatio","backgroundColor","antialias","transparent","throttle","speed","find","#find","id","get","constructor","maxFPS","cellSize","colors","sortableChildren","__drag_root","addChild","add","render","bind","eventMode","hitArea","contains","addEventListener","e","handlePointerMove","fromGlobal","global","handlePointerDown","fullSpeed","renderer","backgroundAlpha","autoDensity","start","value","stop","destroy","center","x","y","translation","cx","cy","transform","position","pos","fromLocal","offsetPos","dir","translate","copyFrom","updateViewport","closeMenu","close","showMenu","provider","tag","descriptor","getMenu","Object","assign","onSelect","item","handleMenu","data","onClose","removeFromParent","addNode","node","wrapped","onMove","moveNodeTo","onCapture","capture","moveToForeground","undefined","onContext","event","onPortClick","remove","point","length","pending","connect","connectNodes","onPortHover","hoverPort","onConnectorsUpdate","uid","connector","addConnector","removeConnector","onDispose","delete","set","renderable","removeNode","wrapper","dispose","clear","toRemove","values","removeChildren","flail","shiftKey","buttons","stopPropagation","preventDefault","output","port","outputPort","parent","outputNode","input","inputPort","inputNode","placeConnectors","buildConnectors","guid","has","asPixi","zIndex","removeChild","graphics","setChildIndex","children","hitTest","getNodePos","nodeId","move","layout","mount","HTMLElement","resize","appendChild","view","globalThis","unmount","update","IMenu","IMenuProvider","Position","RendererGUI","Container","Text","PIXIText","DEFAULT_LEGEND","PIXIGUI","M","text","factory","fontSize","align","fill","dropShadow","dropShadowDistance","chars","makeText","menu","mark","lineHeight","legend","dynamicText","legendText","constructor","addChild","eventMode","addEventListener","x","y","getMenu","tag","pos","handleMenu","data","value","DisplayObject","Container","PIXIStacked","first","T","constructor","rest","addChild","hotSwap","children","removeChildren","ColorSource","Graphics","OutlinedOptions","x","y","width","height","radius","lineSize","color","PIXIOutlined","options","active","constructor","value","clear","lineStyle","drawRoundedRect","GraphNodeInterface","HitTestResult","Renderer","Position","RendererConfig","RendererOptions","Batch","PIXIRenderer","GraphAdapter","Iterable","Node","renderer","nodes","constructor","config","and","render","Symbol","iterator","clear","splice","update","moveToForeground","node","hitTest","pos","getNodePos","moveNodeTo","position","addNode","idx","indexOf","push","removeNode","capturing","releaseNode","undefined","translation","translate","resize","width","height","fromGlobal","fromLocal","mount","element","HTMLElement","options","unmount","layout","useLastCallback","ChangeEvent","useState","useMemo","useEffect","useLayoutEffect","PropsWithChildren","GroupableItem","id","ID","ItemsGroup","value","label","ids","GroupResolver","node","T","NodeGroupsProps","items","resolver","onSelect","group","makeGroups","groups","push","sort","a","b","localeCompare","concat","map","length","isSameArray","i","isValue","s","String","item","NodeGroups","observer","children","rest","Item","setGroup","find","currentAsString","handleGroup","target","HTMLSelectElement","found","useMeasure","Styles","useEffect","useImperativeHandle","Ref","Position","DragHandlers","useDraggable","ViewportProps","ref","reset","pos","element","HTMLDivElement","handlers","onResize","rect","width","height","Viewport","observer","props","measureRef","bind","current","styles","root","of","flex","display","minWidth","minHeight","useLastCallback","TypeId","ItemsGroup","NodeGroups","ManagedGraphNode","GraphGroupsProps","items","onSelect","ids","GraphGroups","observer","props","handleSelect","group","resolver","node","item","isolator","id","value","label","title","TypeId","GraphListeners","ManagedGraphNode","IItem","ConnectionPoint","Coordinator","NodeConnection","Position","StoreInterface","GraphHandlers","onCreate","data","DTO","Promise","Item","onEdit","item","onAddPort","input","onDisconnectPort","portId","onDeletePort","onDelete","onMove","pos","onConnect","connection","onSelect","onContextMenu","createGraphHandlers","coordinator","nodes","Node","Partial","handleAddPort","node","handleDisconnectPort","handleDeletePort","handleDelete","handleMove","toData","handleConnect","connect","source","target","sourceNode","get","port","map","nodeId","filter","p","handleEdit","handleSelect","handleContextMenu","canvas","onSelectNode","loader","Ref","useEffect","useImperativeHandle","useLayoutEffect","useMemo","useRef","useLastCallback","IMenuProvider","Coordinator","DragHandlers","GraphNodeInterface","Position","GraphAdapter","PIXIGUI","Viewport","ZERO","x","y","GraphNodeProps","innerRef","GraphRef","Node","coordinator","nodes","subset","menu","onSelectNode","node","pos","onContextMenu","graph","element","HTMLDivElement","GraphCanvas","observer","rest","cursor","ref","reset","gui","maxFPS","grid","cellSize","gridSize","colors","current","handleResize","width","height","resize","handleGUI","toData","translation","cx","cy","text","onPointer","fromLocal","onUp","releaseNode","onClick","e","MouseEvent","capturing","shiftKey","onDrag","translate","onContext","handlers","position","renderer","ids","map","id","batch","includes","removeNode","addNode","moveNodeTo","layout","container","mount","viewport","clientWidth","clientHeight","resolution","window","devicePixelRatio","backgroundColor","antialias","transparent","TypeId","NodeConnection","Position","StoreInterface","ManagedGraphNode","GraphListeners","onEdit","node","N","onConnect","connection","Promise","onMove","pos","onAddPort","input","onDisconnectPort","portId","onDeletePort","onDelete","SyncConfig","added","removed","connectHandlers","onEditAction","onDeleteAction","onAddPortAction","onDisconnectPortAction","port","onDeletePortAction","syncNodes","nodes","handlers","length","intermediate","reduce","acc","id","Record","getNode","find","ports","item","fromId","to","toNode","toPort","getItemPort","name","connect","add","remove","Coordinator","IMenu","IMenuItem","IMenuProvider","Position","MENU_GROUPS","Array","label","items","title","args","Partial","Record","data","ports","JSON","stringify","in","out","system","instructions","llm","js","separator","GraphDTO","x","y","useGraphMenu","coordinator","onCreate","DTO","getMenu","_tag","pos","base","action","toData","map","group","rest","flat","handleMenu","payload","useRef","matchId","useIsomorphicLayoutEffect","ManagedGraphNode","IItem","useNodeSelection","nodes","Item","selected","ref","added","filter","item","current","some","id","removed","find","setSelected","IEventHandler","IMenu","IMenuProvider","NodeJoint","Position","ConnectionPoint","Coordinator","TypeId","Identifiable","GraphNode","Container","RectSpinner","PIXIStacked","PIXIOutlined","isChannelName","name","startsWith","getChannelName","slice","IItem","isolator","title","ports","IItemPort","input","to","Item","port","Resolver","id","ToTitle","item","MenuAction","action","MenuActions","ADD_PORT","DISCONNECT_PORT","DELETE_PORT","EDIT_NODE","DELETE_NODE","translatePort","find","portName","channel","nodes","node","push","NodeStatus","Idle","Processing","Done","Error","Selected","NodeData","status","progress","ManagedGraphNode","shape","outline","constructor","finder","coordinator","toTitle","inputs","filter","map","outputs","position","toGraph","dispose","destroy","undefined","getMenu","tag","type","items","label","group","data","separator","joint","output","found","bound","length","disabled","handleMenu","dispatchEvent","onAddPortAction","handler","handleEvent","onDisconnectPortAction","onDeletePortAction","onEditAction","onDeleteAction","setStatus","description","setProgress","setActive","isInProgress","setSelected","value","isSelected","first","active","getItemPort","predicate","render","content","width","height","hotSwap","color","lineSize","radius","sizeX","sizeY","useMemo","useRef","useIsomorphicLayoutEffect","usePrevious","reaction","useLastCallback","useSyncStore","Coordinator","isEqualIdentifiables","ManagedGraphNode","IItem","TypeId","useNodes","coordinator","sync","onUpdate","store","toTitle","get","Item","onChange","cb","config","added","removed","item","ref","methods","subscribe","getSnapshot","selector","items","sort","a","b","id","localeCompare","is","prev","finder","find","current","factory","cache","Record","reduce","acc","filter","map","Object","keys","length","ManagedGraphNode","Coordinator","Position","GRID_SIZE","PORT_SIZE","LANE_SIZE","SPACE_SIZE","Coordinates","grid","gridSize","sizes","port","lane","space","constructor","x","y","snap","value","negatve","mul","Math","round","toGraph","toData","groupResolver","description","item","isolator","title","re","isBarrier","test","useLastCallback","handleAsNoop","Styles","RefObject","useRef","useMemo","useState","PropsWithChildren","useImperativeHandle","GraphGroups","ManagedGraphNode","IItem","GraphHandlers","createGraphHandlers","GraphAdapter","Store","useStore","GraphCanvas","syncNodes","TypeId","Identifiable","useGraphMenu","GraphDTO","useNodeSelection","useNodes","Coordinates","GRID_SIZE","IGraph","items","Item","ManagedGraphProps","innerRef","graph","element","HTMLDivElement","Graph","selected","className","handlers","Partial","DTO","onExport","ManagedGraph","observer","children","rest","graphRef","coordinator","menu","onCreate","nodes","all","group","setGroup","canvas","loader","handleExport","current","store","get","onChange","cb","toTitle","item","title","sync","config","onUpdate","layout","styles","root","selector","undefined","of","flex","display","alignSelf","gap","flexDirection"],"sources":["../src/graph/utils.ts","../src/graph/nodes/GraphNodeJoints.ts","../src/graph/nodes/GraphNode.ts","../src/graph/nodes/layout/NodesGraph.ts","../src/graph/nodes/layout/LayeredLayout.ts","../src/graph/nodes/layout/ClusteredLayout.ts","../src/graph/nodes/layout/NodesSort.ts","../src/graph/nodes/layout/EdgesSort.ts","../src/graph/nodes/layout/Layouter.ts","../src/graph/Store.ts","../src/graph/useStore.tsx","../src/graph/useDraggable.tsx","../src/graph/render/pixi.ts","../src/graph/render/Batch.ts","../src/graph/render/PIXIRectSpinner.ts","../src/graph/render/PIXILine.ts","../src/graph/render/PIXIConnector.ts","../src/graph/render/PIXIPendingConnector.ts","../src/graph/render/PIXIText.ts","../src/graph/render/PIXIPort.ts","../src/graph/render/Draggable.ts","../src/graph/render/PIXINode.ts","../src/graph/render/PIXIGrid.ts","../src/graph/render/PIXIMenuItem.ts","../src/graph/render/PIXIMenu.ts","../src/graph/render/PIXIRenderer.ts","../src/graph/render/PIXIGUI.ts","../src/graph/render/PIXIStacked.ts","../src/graph/render/PIXIOutlined.ts","../src/graph/render/index.ts","../src/graph/GraphAdapter.ts","../src/graph/NodeGroups.tsx","../src/graph/Viewport.tsx","../src/GraphGroups.tsx","../src/createGraphHandlers.ts","../src/GraphCanvas.tsx","../src/LoadNodes.ts","../src/useGraphMenu.ts","../src/useNodeSelection.ts","../src/ManagedGraphNode.ts","../src/useNodes.tsx","../src/utils.ts","../src/ManagedGraph.tsx"],"sourcesContent":["import type { ConnectionPoint, Position } from './interfaces';\n\nexport const snap = (v: number, grid: number) => {\n if (v > 0) {\n return (Math.round(v / grid + 0.5) - 0.5) * grid;\n }\n\n return -(Math.round(-v / grid + 0.5) - 0.5) * grid;\n};\n\nexport const addOffset = (t: Position, s: Position, dir: number = 1): Position => ({\n x: ~~(t.x + s.x * dir),\n y: ~~(t.y + s.y * dir),\n});\n\nexport const isConnectionPoint = <ID>(node: ID, port: ID) => (point: ConnectionPoint<ID>) => (\n point.node === node && point.port === port\n);\n\nexport const isNodePoint = <ID>(node: ID) => (point: ConnectionPoint<ID>) => (\n point.node === node\n);\n\nexport const connectNodes = <ID>(\n connect: boolean,\n joint: { nodes: ConnectionPoint<ID>[] },\n target?: ConnectionPoint<ID>[]\n) => {\n if (target) {\n for (const point of target) {\n const idx = joint.nodes.findIndex(isConnectionPoint(point.node, point.port));\n const has = idx >= 0;\n\n if (has !== connect) {\n if (connect) {\n joint.nodes.push(point);\n } else {\n joint.nodes.splice(idx, 1);\n }\n }\n }\n } else if (!connect) {\n joint.nodes = [];\n }\n};\n\nexport const intersect = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number\n) => {\n if ((x1 === x2 && y1 === y2) || (x3 === x4 && y3 === y4)) {\n return false;\n }\n\n const denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);\n\n if (denominator === 0) {\n return false;\n }\n\n const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator;\n const ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator;\n\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n return false;\n }\n\n const x = x1 + ua * (x2 - x1);\n const y = y1 + ua * (y2 - y1);\n\n return {\n x,\n y,\n };\n};\n","import { type ConnectionPoint, type NodeJoinRequest, NodeJoint, NodeJoints } from '../interfaces';\nimport { connectNodes, isConnectionPoint, isNodePoint } from '../utils';\n\nexport class GraphNodeJoints<ID> implements NodeJoints<ID> {\n private readonly joints: Map<ID, NodeJoint<ID>> = new Map();\n private readonly parentId: ID;\n\n constructor(parentId: ID, ports: NodeJoint<ID>[]) {\n this.parentId = parentId;\n\n for (const joint of ports) {\n this.joints.set(joint.port, joint);\n }\n }\n\n [Symbol.iterator](): Iterator<NodeJoint<ID>> {\n return this.joints.values();\n }\n\n get connected() {\n const result: Array<NodeJoint<ID>> = [];\n\n for (const joint of this.joints.values()) {\n if (joint.nodes.length) {\n result.push(joint);\n }\n }\n\n return result;\n }\n\n find(predicate: (joint: NodeJoint<ID>) => boolean): NodeJoint<ID> | undefined {\n for (const joint of this.joints.values()) {\n if (predicate(joint)) {\n return joint;\n }\n }\n }\n\n map<R>(mapper: (joint: NodeJoint<ID>, index: number) => R): R[] {\n const result = Array(this.joints.size);\n let index = 0;\n\n for (const joint of this.joints.values()) {\n result[index] = mapper(joint, index);\n index++;\n }\n\n return result;\n }\n\n has(nodeId: ID, portId?: ID): boolean {\n return !!this.getPort(nodeId, portId);\n }\n\n hasAtPort(portId: ID, nodeId: ID, nodePortId: ID): boolean {\n return !!this.joints.get(portId)?.nodes.some(isConnectionPoint(nodeId, nodePortId));\n }\n\n getPort(nodeId: ID, portId?: ID): ID | undefined {\n const found = this.find(\n portId === undefined\n ? (joint) => joint.nodes.some(isNodePoint(nodeId))\n : (joint) => joint.nodes.some(isConnectionPoint(nodeId, portId))\n );\n\n if (found) {\n return found.port;\n }\n }\n\n connect({ port, target, connect }: NodeJoinRequest<ID>): NodeJoint<ID> {\n const joint = this.joints.get(port);\n\n if (!joint) {\n throw new Error(`Node ${this.parentId} does not have joint \"${port}\"`);\n }\n\n connectNodes(connect, joint, target);\n\n return joint;\n }\n\n getNodes(portId: ID): ConnectionPoint<ID>[] | undefined {\n return this.joints.get(portId)?.nodes;\n }\n\n get ids(): ID[] {\n const set = new Set<ID>();\n\n for (const { nodes } of this.joints.values()) {\n for (const { node } of nodes) {\n set.add(node);\n }\n }\n\n return [...set];\n }\n\n get count(): number {\n return this.joints.size;\n }\n}\n","import { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource, Disposer } from '@ankhzet/gcl';\nimport type {\n ConnectionPoint,\n Coordinator,\n GraphNodeDescriptor,\n GraphNodeInterface,\n IMenu,\n NodeConnection,\n NodeConnectionRequest,\n NodeJoint,\n NodeJoints,\n Position,\n} from '../interfaces';\nimport { GraphNodeJoints } from './GraphNodeJoints';\n\nconst E_CONNECT = Symbol('E_CONNECT');\nconst E_MOVE = Symbol('E_MOVE');\n\nexport abstract class GraphNode<ID, Data = {}, R = any>\n extends DisposableEventSource\n implements GraphNodeInterface<ID, Data, R>\n{\n public readonly id: ID;\n public readonly description: GraphNodeDescriptor<Data>;\n public readonly inputs: NodeJoints<ID>;\n public readonly outputs: NodeJoints<ID>;\n public readonly coordinator: Coordinator;\n readonly #pos: Position = { x: 0, y: 0 };\n\n public constructor({\n id,\n coordinator,\n inputs = [],\n outputs = [],\n ...description\n }: GraphNodeDescriptor<Data> & {\n id: ID;\n inputs?: NodeJoint<ID>[];\n outputs?: NodeJoint<ID>[];\n }) {\n super();\n this.id = id;\n this.coordinator = coordinator;\n this.description = description as GraphNodeDescriptor<Data>;\n this.inputs = new GraphNodeJoints(id, inputs);\n this.outputs = new GraphNodeJoints(id, outputs);\n }\n\n abstract render(content: R): R;\n\n abstract getMenu(tag: any, pos: Position): IMenu<any> | undefined;\n abstract handleMenu(data: any): void | false;\n\n get title() {\n return this.description.title;\n }\n\n get width() {\n return this.coordinator.sizes.lane * 2 + this.coordinator.sizes.space;\n }\n\n get height() {\n return this.coordinator.sizes.lane * Math.max(1, this.inputs.count, this.outputs.count);\n }\n\n get position(): Position {\n return this.#pos;\n }\n\n set position({ x, y }: Position) {\n x = this.coordinator.snap(x);\n y = this.coordinator.snap(y);\n\n if (this.#pos.x === x && this.#pos.y === y) {\n return;\n }\n\n this.#pos.x = x;\n this.#pos.y = y;\n\n this.dispatchEvent(E_MOVE, this.#pos);\n }\n\n isInput(portId: ID, nodeId: ID, nodePortId: ID): boolean {\n return this.inputs.hasAtPort(portId, nodeId, nodePortId);\n }\n\n isOutput(portId: ID, nodeId: ID, nodePortId: ID): boolean {\n return this.outputs.hasAtPort(portId, nodeId, nodePortId);\n }\n\n isConnected(port: ID, input: boolean, to: ConnectionPoint<ID>): boolean {\n return input ? this.inputs.hasAtPort(port, to.node, to.port) : this.outputs.hasAtPort(port, to.node, to.port);\n }\n\n getNodes(port: ID, input: boolean) {\n return input ? this.inputs.getNodes(port) : this.outputs.getNodes(port);\n }\n\n connect({ input, connect, port, nodes }: NodeConnectionRequest<ID, GraphNode<ID, Data>>): void {\n const source = { node: this.id, port };\n const target = nodes ? nodes.map(({ node, port }) => ({ node: node.id, port })) : this.getNodes(port, input);\n\n if (input) {\n this.inputs.connect({\n connect,\n port,\n target,\n });\n } else {\n this.outputs.connect({\n connect,\n port,\n target,\n });\n }\n\n if (nodes) {\n const at = [{ node: this, port }];\n\n for (const { node, port: output } of nodes) {\n if (connect !== node.isConnected(output, !input, source)) {\n node.connect({\n connect,\n input: !input,\n port: output,\n nodes: at,\n });\n }\n }\n }\n\n this.dispatchEvent(E_CONNECT, {\n connect,\n input,\n source,\n target,\n } as NodeConnection<ID>);\n }\n\n move(pos: Position): Position {\n this.position = pos;\n\n return this.position;\n }\n\n onConnect(handler: IEventHandler<NodeConnection<ID>>): Disposer {\n return this.handleEvent(E_CONNECT, handler);\n }\n\n onMove(handler: IEventHandler<Position>): Disposer {\n return this.handleEvent(E_MOVE, handler);\n }\n}\n","import { isLike } from '@ankhzet/utils';\nimport { GraphNodeInterface, type Position } from '../../interfaces';\n\nexport type GraphBarrier<N extends GraphNodeInterface> = (node: N) => boolean;\n\nexport class NodesGraph<Node extends GraphNodeInterface> {\n private readonly _barriers: Partial<Record<Node['id'], boolean>> = {};\n private readonly _isBarrier: GraphBarrier<Node>;\n public readonly map: Partial<Record<Node['id'], Node>>;\n public readonly nodes: Node[];\n\n public constructor(nodes: Node[], isBarrier: GraphBarrier<Node>) {\n this.nodes = nodes;\n this.map = Object.fromEntries(nodes.map((node) => [node.id, node]));\n this._isBarrier = isBarrier;\n }\n\n protected isBarrier(id: Node['id']) {\n const cached = this._barriers[id];\n\n if (cached !== undefined) {\n return cached;\n }\n\n return (this._barriers[id] = this._isBarrier(this.map[id]!));\n }\n\n public getSubGraphs(subset?: Node['id'][]) {\n const rest = [...(subset || (Object.keys(this.map) as Node['id'][]))];\n const result: Node['id'][][] = [];\n let nodeId;\n\n while ((nodeId = rest.pop())) {\n if (this.isBarrier(nodeId)) {\n continue;\n }\n\n const node = this.map[nodeId];\n const sub = node && this.getConnectedNodes(node, subset);\n\n if (sub) {\n for (const id of sub) {\n const idx = rest.indexOf(id);\n\n if (idx >= 0) {\n rest.splice(idx, 1);\n }\n }\n\n result.push(sub);\n }\n }\n\n return result;\n }\n\n protected inputs(nodeId: Node['id']) {\n return this.map[nodeId]!.inputs.ids;\n }\n\n protected outputs(nodeId: Node['id']) {\n return this.map[nodeId]!.outputs.ids;\n }\n\n protected getConnectedNodes(node: Node, subset?: Node['id'][], target: Node['id'][] = [node.id]): Node['id'][] {\n for (const ids of [node.inputs.ids, node.outputs.ids]) {\n for (const nodeId of ids) {\n if (target.includes(nodeId) || (subset && !subset.includes(nodeId))) {\n continue;\n }\n\n const found = this.map[nodeId as Node['id']];\n\n if (found) {\n target.push(nodeId);\n\n if (!this.isBarrier(nodeId)) {\n this.getConnectedNodes(found, subset, target);\n }\n }\n }\n }\n\n return target;\n }\n\n protected getCenter(mapper: (node: Node) => Position | undefined) {\n const offsets = this.nodes.map(mapper).filter(isLike<Position>);\n\n if (!offsets.length) {\n return { x: 0, y: 0 };\n }\n\n const min = { x: +Infinity, y: +Infinity };\n const max = { x: -Infinity, y: -Infinity };\n\n for (const { x, y } of offsets) {\n if (x < min.x) min.x = x;\n if (x > max.x) max.x = x;\n if (y < min.y) min.y = y;\n if (y > max.y) max.y = y;\n }\n\n for (const offset of offsets) {\n offset.x -= min.x;\n offset.y -= min.y;\n }\n\n return {\n x: (max.x - min.x) / 2,\n y: (max.y - min.y) / 2,\n };\n }\n}\n","import { isLike } from '@ankhzet/utils';\nimport { GraphNodeInterface, type Position } from '../../interfaces';\nimport { NodesGraph } from './NodesGraph';\nimport type { Layout } from './Layout';\n\nexport interface Layer<Node extends GraphNodeInterface> {\n [id: string]: Node;\n}\n\nexport interface Layers<Node extends GraphNodeInterface> extends Iterable<Layer<Node>> {\n [idx: number]: Layer<Node>;\n}\n\nexport class LayeredLayout<Node extends GraphNodeInterface> extends NodesGraph<Node> implements Layout<Node> {\n public layers: Layers<Node> = [];\n private hash: Position | null = null;\n\n public get center(): Position {\n if (!this.hash) {\n this.hash = this.getCenter((node) => node.position);\n }\n\n return this.hash;\n }\n\n public spread(layer: number, nodes: Node['id'][]): number {\n const chain: Node[] = [];\n let max = 0;\n\n for (const id of nodes) {\n const node = this.map[id]!;\n\n const height = this.shift(node, this.findLayer(node), layer, chain);\n\n max = Math.max(max, height);\n }\n\n return max;\n }\n\n public findMax(node: Node): number {\n const layers = this.findLayers(this.get(node.inputs.ids));\n let max = 0;\n\n for (const idx of Object.values(layers)) {\n const layer = +(idx as number);\n\n if (layer > max) {\n max = layer;\n }\n }\n\n return max || 0;\n }\n\n public dependants({ id }: Node): Node[] {\n let found = [];\n\n for (const other of this.nodes) {\n if ((other.id !== id) && other.inputs.has(id)) {\n found.push(other);\n }\n }\n\n return found;\n }\n\n public get(ids: Node['id'][]): Node[] {\n return ids.map((id) => this.map[id]).filter(isLike<Node>);\n }\n\n public remove(node: Node, layer: number) {\n return this.layers[layer] ? delete this.layers[layer][node.id as string] : false;\n }\n\n public put(node: Node, layer: number) {\n const group = this.layers[layer] || (this.layers[layer] = {});\n\n group[node.id as string] = node;\n }\n\n public findLayer(node: Node): number {\n for (const [idx, layer] of Object.entries(this.layers)) {\n if (layer[node.id]) {\n return +idx;\n }\n }\n\n return 0;\n }\n\n public findLayers(nodes: Node[]): Partial<Record<string, number>> {\n const found: Partial<Record<string, number>> = {};\n\n for (const idx in this.layers) {\n const layer = this.layers[idx]!;\n const exclude: Node[] = [];\n\n for (let node of nodes) {\n if (layer[node.id as string]) {\n found[node.id as string] = +idx;\n\n exclude.push(node);\n }\n }\n\n nodes = nodes.filter((node) => exclude.indexOf(node) < 0);\n }\n\n return found;\n }\n\n public shift(node: Node, fromLayer: number, offset: number, chain: Node[] = []) {\n if (chain.includes(node)) {\n return 0;\n }\n\n chain.push(node);\n\n const toLayer = fromLayer + offset;\n const dependants = this.dependants(node);\n let max = toLayer;\n let min = toLayer;\n\n if (fromLayer) {\n this.remove(node, fromLayer);\n }\n\n this.put(node, toLayer);\n\n for (const dependant of dependants) {\n const layer = this.findLayer(dependant);\n const offset = toLayer - layer + 1;\n\n min = Math.min(min, layer + offset);\n max = Math.max(max, layer + offset);\n\n if (layer && offset > 0) {\n this.shift(dependant, layer, offset, chain);\n }\n }\n\n return max - min + 1;\n }\n\n private all(nodes: Node[]): Node[] {\n const candidates = nodes.concat([]);\n\n this.walk(nodes, (node: Node) => {\n candidates.push(node);\n\n candidates.concat(this.all(this.get(node.inputs.ids)));\n });\n\n return candidates;\n }\n\n private walk(nodes: Node[], consumer: (node: Node) => boolean | void) {\n for (const node of nodes) {\n for (const id of node.inputs.ids) {\n const input = this.map[id as Node['id']];\n\n if (input && false === consumer(input)) {\n break;\n }\n }\n }\n }\n}\n","import { GraphNodeInterface, type Position } from '../../interfaces';\nimport { NodesGraph } from './NodesGraph';\nimport type { Layout } from './Layout';\n\nexport class ClusteredLayout<Node extends GraphNodeInterface>\n extends NodesGraph<Node>\n implements Layout<Node>\n{\n private cache: Record<string, Position> = {};\n private hash: Position | null = null;\n\n public get center(): Position {\n if (!this.hash) {\n this.hash = this.getCenter((node) => node.position);\n }\n\n return this.hash;\n }\n\n private splice(\n rest: Node['id'][],\n pos: number,\n put: (id: Node['id'], pos: number) => void,\n processed: Node['id'][] = [],\n ) {\n for (const id of rest) {\n if (processed.includes(id)) {\n continue;\n }\n\n put(id, pos);\n\n if (!this.isBarrier(id)) {\n this.splice(this.inputs(id), pos - 1, put, processed);\n this.splice(this.outputs(id), pos + 1, put, processed);\n }\n }\n }\n\n private align(height: number, ids: Node['id'][]): [Node['id'], number][] {\n const space = height - ids.length;\n\n if (space <= 0) {\n return ids.map((id, index) => [id, index]);\n }\n\n const result: [Node['id'], number][] = [];\n let offset = ~~(space / 2);\n\n for (const id of ids) {\n result.push([id, offset++]);\n }\n\n return result;\n }\n\n public spread(layer: number, nodes: Node['id'][]): number {\n const theory: Node['id'][][] = [];\n const processed: Node['id'][] = [];\n const put = (id: Node['id'], pos: number) => {\n const bucket = theory[pos];\n\n if (bucket) {\n bucket.push(id);\n } else {\n theory[pos] = [id];\n }\n\n processed.push(id);\n };\n\n this.splice(nodes, nodes.length, put, processed);\n\n const result: Node['id'][][] = [];\n let height = 1;\n let x = 0;\n\n for (const column of theory) {\n if (!column) {\n continue;\n }\n\n height = Math.max(height, column.length);\n result.push(column);\n }\n\n for (const column of result) {\n for (const [id, y] of this.align(height, column)) {\n this.cache[id as string] = { x, y: layer + y };\n }\n\n x++;\n }\n\n this.hash = null;\n\n return height;\n }\n}\n","import { GraphNodeInterface } from '../../interfaces';\n\ntype Relations<K extends string | number> = Record<K, K[]>;\n\ntype Split<R extends Relations<K>, K extends string | number> = {\n roots: K[];\n joint: K[];\n leafs: K[];\n};\n\nexport class NodesSort<R extends Relations<K>, K extends string> {\n public sort(nodes: GraphNodeInterface<K, any>[]) {\n const dependencies: Partial<R> = {};\n const dependants: Partial<R> = {};\n const all = [];\n\n for (let node of nodes) {\n const r: K[] = [];\n const id = node.id as K;\n\n for (const d of nodes) {\n if (d.inputs.ids.indexOf(id) >= 0) {\n r.push(d.id as K);\n }\n }\n\n all.push(id);\n\n if (r.length) {\n // r on id\n dependants[id] = r as R[K];\n }\n\n if (node.inputs.ids.length) {\n // id on dep\n dependencies[id] = node.inputs.ids as R[K];\n }\n }\n\n return this.walk(all, dependants, dependencies);\n }\n\n private walk(all: K[], dependants: Partial<R>, dependencies: Partial<R>): string[][] {\n const cies = Object.keys(dependants) as K[]; // (cies)-->(y)\n const ants = Object.keys(dependencies) as K[]; // (x)-->(ants)\n\n const { roots, joint, leafs } = this.split(all, ants, cies);\n const layers: string[][] = [];\n\n if (joint.length === all.length) {\n return [joint];\n }\n\n switch (joint.length) {\n case 0:\n break;\n\n case 1:\n case 2:\n layers.push(joint);\n break;\n\n default:\n const newAnts: Partial<R> = {};\n const newCies: Partial<R> = {};\n\n for (const id of cies) {\n const dependant = dependants[id];\n\n if (!dependant || joint.indexOf(id) < 0) {\n continue;\n }\n\n const filtered = dependant.filter((id) => joint.indexOf(id) >= 0);\n\n if (filtered.length) {\n newAnts[id] = filtered as R[K];\n }\n }\n\n for (const id of ants) {\n const dependency = dependencies[id];\n\n if (!dependency || joint.indexOf(id) < 0) {\n continue;\n }\n\n const filtered = dependency.filter((id) => joint.indexOf(id) >= 0);\n\n if (filtered.length) {\n newCies[id] = filtered as R[K];\n }\n }\n\n if (Object.keys(newAnts).length && Object.keys(newCies).length) {\n layers.push(...this.walk(joint, newAnts, newCies));\n } else {\n layers.push(joint);\n }\n }\n\n layers.unshift(roots);\n layers.push(leafs);\n\n return layers;\n }\n\n private split(all: K[], dependants: K[], dependencies: K[]): Split<R, K> {\n let leafs = dependencies.filter((id) => dependants.indexOf(id) < 0); // (x)->(y)->(leafs)\n let roots = dependants.filter((id) => dependencies.indexOf(id) < 0); // (roots)->(x)->(y)\n let sides = leafs.concat(roots);\n let joint = all.filter((id) => sides.indexOf(id) < 0); // (roots)->(joint)->(leafs)\n\n if (joint.length > 1) {\n console.log('left', all, { dependants, dependencies }, { roots, leafs, joint });\n }\n\n return {\n roots,\n joint,\n leafs,\n };\n }\n}\n","export class EdgesSort {\n public sort(dependants: Record<string, string[]>, dependencies: Record<string, string[]>, layers: string[][]) {\n const leafs = layers.pop()!;\n\n // @ts-ignore\n for (let id of leafs) {\n }\n }\n\n // @ts-ignore\n private mutate(id: string, rest: string[]): string[][] {\n const variations: string[][] = [];\n\n for (let i = 0; i < rest.length; i++) {\n const variation: string[] = [...rest];\n\n variation.splice(i, 0, id);\n variations.push(variation);\n }\n\n return variations;\n }\n}\n","import type { Constructor } from '@ankhzet/utils';\nimport type { GraphNodeInterface } from '../../interfaces';\nimport type { GraphBarrier } from './NodesGraph';\nimport type { Layout } from './Layout';\n\nexport class Layouter<Node extends GraphNodeInterface<any, any>> {\n private readonly isBarrier: GraphBarrier<Node>;\n private readonly klass: Constructor<Layout<Node>, [nodes: Node[], isBarrier: GraphBarrier<Node>]>;\n\n public constructor(\n klass: Constructor<Layout<Node>, [nodes: Node[], isBarrier: GraphBarrier<Node>]>,\n isBarrier: GraphBarrier<Node>,\n ) {\n this.klass = klass;\n this.isBarrier = isBarrier;\n }\n\n public layout(nodes: Node[], subset?: Node['id'][]): Layout<Node> {\n const layout = new this.klass(nodes, this.isBarrier);\n //\n // const sub = layout.getSubGraphs(subset);\n // let offset = 0;\n //\n // for (const ids of sub) {\n // offset += layout.spread(offset, ids);\n // }\n\n return layout;\n }\n\n public getSubGraphs(nodes: Node[]) {\n return new this.klass(nodes, this.isBarrier).getSubGraphs();\n }\n}\n","import { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource, Disposer } from '@ankhzet/gcl';\nimport { TypeId } from '../types';\nimport { StoreInterface } from './interfaces';\n\nconst E_CHANGED = Symbol('changed');\n\nexport class Store<Item extends { id: TypeId }> extends DisposableEventSource implements StoreInterface<Item> {\n all: Item[];\n map: Record<TypeId, Item> = {};\n\n public constructor(all: Item[] = []) {\n super();\n this.all = all;\n }\n\n clear(): void {\n const old = this.all;\n this.all = [];\n this.map = {};\n\n this.dispatchEvent(E_CHANGED, {\n diff: old,\n added: false,\n });\n }\n\n find(predicate: (node: Item) => boolean): Item | undefined {\n return this.all.find(predicate);\n }\n\n filter(predicate: (node: Item) => boolean): Item[] {\n return this.all.filter(predicate);\n }\n\n get(id: Item['id']): Item | undefined {\n return this.map[id];\n }\n\n add<T extends Item | Item[]>(nodes: T): T {\n const iterable: Item[] = Array.isArray(nodes) ? nodes : [nodes as Item];\n const added = [];\n\n for (const node of iterable) {\n if (!this.all.includes(node)) {\n added.push(node);\n this.map[node.id] = node;\n }\n }\n\n if (added.length) {\n this.all = this.all.concat(added);\n this.dispatchEvent(E_CHANGED);\n }\n\n return nodes;\n }\n\n remove(ids: Item['id'] | Item['id'][]): this {\n if (!Array.isArray(ids)) {\n ids = [ids];\n }\n\n const trimmed = this.all.filter((node) => !ids.includes(node.id));\n\n if (trimmed.length !== this.all.length) {\n for (const id of ids) {\n delete this.map[id];\n }\n\n this.all = trimmed;\n this.dispatchEvent(E_CHANGED);\n }\n\n return this;\n }\n\n onChange(handler: IEventHandler): Disposer {\n return this.handleEvent(E_CHANGED, handler);\n }\n}\n","import { useLayoutEffect, useState } from 'react';\nimport { useSyncStore } from '@ankhzet/ui';\nimport type { StoreInterface } from './interfaces';\n\nexport const isEqualIdentifiables = (a: { id: any }[], b: { id: any }[]) => {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((item, idx) => item.id === b[idx]?.id);\n};\n\nexport function useStore<S extends StoreInterface<any>>(init: () => S): [S, S['all']] {\n const [[store, args]] = useState(() => {\n const store = init();\n\n return [\n store,\n [\n (cb: () => void) => store.onChange(cb),\n () => store.all,\n () => store.all,\n (items: S['all']) => items,\n isEqualIdentifiables,\n ],\n ] as const;\n });\n\n useLayoutEffect(\n () => () => {\n for (const node of store.all) {\n node.dispose();\n }\n },\n []\n );\n\n return [store, useSyncStore(...args)];\n}\n","import { useState } from 'react';\nimport { useLastCallback, useDrag } from '@ankhzet/ui';\n\nexport type DragHandler = (offset: { x: number; y: number }) => void;\nexport type ClickHandler = (offset: { x: number; y: number }, e: MouseEvent) => void;\nexport type DragHandlers = {\n position: { x: number; y: number };\n onPointer: DragHandler;\n onClick: ClickHandler;\n onUp: DragHandler;\n onDrag: DragHandler;\n onContext: DragHandler;\n};\n\nexport const useDraggable = <E extends HTMLElement>(handlers: DragHandlers) => {\n const delta = handlers.position;\n const [anchor, setAnchor] = useState(() => ({ x: delta.x, y: delta.y }));\n const { isDragging, bind } = useDrag<E>(({ isDragging, offset, pos, move, up, down, context, e }) => {\n const { x, y } = handlers.position;\n\n if (up) {\n setAnchor({ x, y });\n handlers.onUp({\n x: anchor.x + pos.x,\n y: anchor.y + pos.y,\n });\n } else if (move) {\n if (isDragging) {\n handlers.onDrag({\n x: anchor.x + offset.x,\n y: anchor.y + offset.y,\n });\n } else {\n handlers.onPointer({\n x: x + pos.x,\n y: y + pos.y,\n });\n }\n } else if (down) {\n if (context) {\n handlers.onContext({\n x: anchor.x + pos.x,\n y: anchor.y + pos.y,\n });\n } else {\n handlers.onClick({\n x: anchor.x + pos.x,\n y: anchor.y + pos.y,\n }, e!);\n }\n }\n });\n\n const reset = useLastCallback((pos: { x: number; y: number }) => {\n handlers.onDrag(pos);\n setAnchor(pos);\n });\n\n return {\n isDragging,\n bind,\n anchor,\n reset,\n };\n};\n","export * from '@pixi/core';\nexport * from '@pixi/display';\nexport * from '@pixi/sprite';\nexport * from '@pixi/graphics';\nexport * from '@pixi/text';\nexport * from '@pixi/text-bitmap';\nexport * from '@pixi/events';\n","import { DisposableEventSource } from '@ankhzet/gcl';\n\nexport class Batch extends DisposableEventSource {\n private counter: number;\n\n public constructor() {\n super();\n this.counter = 0;\n }\n\n public batch(cb: () => void) {\n try {\n this.begin();\n\n cb();\n } finally {\n this.end();\n }\n }\n\n public begin() {\n this.counter++;\n }\n\n public end() {\n if (--this.counter <= 0) {\n this.counter = 0;\n this.dispatchEvent('.', this);\n }\n }\n\n and(handler: (batch: this) => void) {\n return this.handleEvent('.', handler);\n }\n}\n","import type { ColorSource, DisplayObject} from './pixi';\nimport { Graphics } from './pixi';\nimport { intersect } from '../utils';\n\nconst modifiers = [\n [0, -1],\n [-1, 0],\n [0, 1],\n [1, 0],\n];\nconst PI2 = Math.PI * 2;\nconst PIHalf = Math.PI / 2;\n\nexport class RectSpinner extends Graphics {\n public readonly sizeX: number;\n public readonly sizeY: number;\n public readonly lineSize: number;\n public readonly color: ColorSource;\n public progress: number;\n public active: boolean = false;\n readonly #mask: Graphics;\n readonly #edge: Graphics;\n #interval?: number;\n #ctx: { segments: [number, number, number, number][]; corners: number[] };\n\n public constructor(child: DisplayObject, {\n lineSize,\n sizeX,\n sizeY,\n radius,\n color,\n }: {\n lineSize: number;\n sizeX: number;\n sizeY: number;\n radius: number;\n color: ColorSource;\n }) {\n super();\n this.lineSize = lineSize;\n this.color = color;\n this.sizeX = sizeX;\n this.sizeY = sizeY;\n\n this.#edge = new Graphics()\n .lineStyle({\n width: lineSize,\n color,\n })\n .drawRoundedRect(0, 0, sizeX, sizeY, radius);\n\n this.#mask = new Graphics();\n this.#mask.position.set(sizeX / 2, sizeY / 2);\n this.#edge.mask = this.#mask;\n\n this.addChild(child);\n this.addChild(this.#edge);\n this.addChild(this.#mask);\n\n this.progress = 0;\n\n const halfX = this.sizeX / 2;\n const halfY = this.sizeY / 2;\n const mX = -halfX + this.lineSize;\n const mY = -halfY + this.lineSize;\n const pX = +halfX - this.lineSize;\n const pY = +halfY - this.lineSize;\n\n const segments: [number, number, number, number][] = [\n [mX, mY, pX, mY], // top segment\n [mX, mY, mX, pY], // left\n [mX, pY, pX, pY], // bottom\n [pX, mY, pX, pY], // right\n ];\n\n const corners = [\n +halfX + this.lineSize,\n -halfY - this.lineSize, // Top right\n +halfX + this.lineSize,\n +halfY + this.lineSize, // Bottom right\n -halfX - this.lineSize,\n +halfY + this.lineSize, // Bottom left\n -halfX - this.lineSize,\n -halfY - this.lineSize, // Top left,\n ];\n\n this.#ctx = {\n segments,\n corners,\n };\n }\n\n public setActive(value: boolean) {\n if (value === this.active) {\n return;\n }\n\n this.update(0);\n\n if (this.#interval) {\n clearInterval(this.#interval);\n this.#interval = 0;\n }\n\n this.active = value;\n\n if (value) {\n this.#interval = setInterval(() => this.update(this.progress + 0.005), 10) as any;\n }\n }\n\n public destroy(_options: any) {\n super.destroy(_options);\n this.removeFromParent();\n clearInterval(this.#interval);\n }\n\n public hotSwap(child: DisplayObject) {\n this.removeChildren();\n this.addChild(child);\n this.addChild(this.#edge);\n this.addChild(this.#mask);\n }\n\n public update(progress: number) {\n this.progress = progress;\n const phase = (progress * PI2) % PI2;\n\n const x = Math.cos(phase - PIHalf) * this.sizeX * 2;\n const y = Math.sin(phase - PIHalf) * this.sizeY * 2;\n\n let out: number[] | undefined;\n\n let intersection = null;\n let winding = 0;\n\n for (let i = 0; i < this.#ctx.segments.length; i++) {\n const segment = this.#ctx.segments[i]!;\n const hit = intersect(0, 0, x, y, segment[0], segment[1], segment[2], segment[3]);\n\n if (hit) {\n intersection = hit;\n\n if (i === 0) {\n winding = hit.x > 0 ? 0 : 4;\n } else {\n winding = 4 - i;\n }\n\n out = modifiers[i]!;\n\n break;\n }\n }\n\n if (!(intersection && out)) {\n return;\n }\n\n this.#mask\n .clear()\n .beginFill()\n .moveTo(0, 0)\n .moveTo(0, -(this.sizeX / 2) - this.lineSize);\n\n for (let i = 0; i < winding; i++) {\n this.#mask.lineTo(this.#ctx.corners[i * 2]!, this.#ctx.corners[i * 2 + 1]!);\n }\n\n this.#mask\n .lineTo(intersection.x + out[0]! * this.lineSize * 2, intersection.y + out[1]! * this.lineSize * 2)\n .lineTo(intersection.x, intersection.y)\n .lineTo(0, 0)\n .endFill();\n }\n}\n","import type { Line } from '../interfaces';\nimport type { Point, IPointData, ColorSource } from './pixi';\nimport { Graphics, ObservablePoint } from './pixi';\n\nexport class PIXILine extends Graphics implements Line {\n public from: Point;\n public to: Point;\n\n public angled = false;\n public color: ColorSource = 0x555555;\n readonly #capped: number;\n #width: number = 2;\n\n public constructor(sx: number, sy: number, tx: number, ty: number, capped: number = 2) {\n super();\n this.#capped = capped;\n this.from = new ObservablePoint(() => this.update(), 0, sx, sy);\n this.to = new ObservablePoint(() => this.update(), 0, tx, ty);\n this.eventMode = 'none';\n }\n\n public moveFromPoint(pos: IPointData): boolean {\n const moved = (this.from.x !== pos.x) || (this.from.y !== pos.y);\n\n if (moved) {\n this.from.copyFrom(pos);\n }\n\n return moved;\n }\n\n public moveToPoint(pos: IPointData): boolean {\n const moved = (this.to.x !== pos.x) || (this.to.y !== pos.y);\n\n if (moved) {\n this.to.copyFrom(pos);\n }\n\n return moved;\n }\n\n public setColor(color: ColorSource) {\n this.color = color;\n\n return this;\n }\n\n public setWidth(width: number) {\n this.#width = width;\n\n return this;\n }\n\n public update() {\n const { x: fromX, y: fromY } = this.from;\n const { x: toX, y: toY } = this.to;\n const dx = toX - fromX;\n const dy = toY - fromY;\n const halfX = dx / 2;\n const halfY = dy / 2;\n\n this.clear();\n this.lineStyle(this.#width, this.color, this.alpha);\n this.x = toX - halfX;\n this.y = toY - halfY;\n\n if (this.angled) {\n this.moveTo(-halfX, -halfY);\n this.lineTo(0, -halfY);\n this.lineTo(0, halfY);\n this.lineTo(halfX, halfY);\n } else {\n this.moveTo(-halfX, -halfY);\n this.lineTo(halfX, halfY);\n }\n\n if (this.#capped) {\n this.beginFill(this.color, this.alpha);\n this.drawCircle(-halfX, -halfY, this.#capped / 2);\n this.drawCircle(halfX, halfY, this.#capped / 2);\n this.endFill();\n }\n\n return this;\n }\n}\n","import type { Connector, Position } from '../interfaces';\nimport { Graphics, Point } from './pixi';\nimport { PIXILine } from './PIXILine';\n\nexport class PIXIConnector<ID> extends Graphics implements Connector<ID> {\n public from: Point;\n public to: Record<string, PIXILine>;\n\n public constructor(sx: number, sy: number) {\n super();\n this.from = new Point(sx, sy);\n this.to = {};\n\n for (const line of Object.values(this.to)) {\n this.addChild(line);\n }\n }\n\n public addTarget(node: ID, port: ID): PIXILine {\n const key = `${node}-${port}`;\n const has = this.to[key];\n\n if (has) {\n return has;\n }\n\n return (\n this.to[key] = this.addChild(new PIXILine(this.from.x, this.from.y, 0, 0))\n );\n }\n\n public moveTargetTo(node: ID, port: ID, pos: Position): boolean {\n return this.addTarget(node, port).moveToPoint(pos);\n }\n\n public removeTarget(node: ID, port: ID): void {\n const key = `${node}-${port}`;\n const has = this.to[key];\n\n if (has) {\n delete this.to[key];\n this.removeChild(has);\n }\n }\n\n public move(pos: Position): boolean {\n const moved = (this.from.x !== pos.x) || (this.from.y !== pos.y);\n\n if (moved) {\n this.from.copyFrom(pos);\n\n for (const line of Object.values(this.to)) {\n line.moveFromPoint(pos);\n }\n }\n\n return moved;\n }\n}\n","import { type Connector, ConnectorPoint, type GraphNodeInterface, type Position } from '../interfaces';\nimport { isConnectionPoint } from '../utils';\nimport { ColorSource, Graphics } from './pixi';\nimport type { PortConnectionPoint } from './PIXINode';\nimport { PIXILine } from './PIXILine';\nimport { PIXIConnector } from './PIXIConnector';\n\nenum ConnectionViability {\n None,\n Viable,\n Prohbited,\n}\n\nconst VIABILITY_COLOR = {\n [ConnectionViability.None]: 0x666666,\n [ConnectionViability.Prohbited]: 0xff6666,\n [ConnectionViability.Viable]: 0x66ff66,\n};\n\nconst REMOVABILITY_COLOR = {\n [ConnectionViability.None]: 0x666666,\n [ConnectionViability.Prohbited]: 0xaa6666,\n [ConnectionViability.Viable]: 0xff3333,\n};\n\nconst getViablity = (start: PortConnectionPoint<any>, finish: PortConnectionPoint<any>, removing: boolean) => {\n const {\n point: { parent, input },\n } = start;\n\n if (finish.hover) {\n const match =\n parent === finish.point.parent || input === finish.point.input\n ? ConnectionViability.Prohbited\n : ConnectionViability.Viable;\n\n if (match && removing) {\n const finishConnected = start.point.nodes.some(isConnectionPoint(finish.point.parent, finish.point.port));\n const startConnected = finish.point.nodes.some(isConnectionPoint(start.point.parent, start.point.port));\n\n if (finishConnected && startConnected) {\n return ConnectionViability.Viable;\n }\n\n return ConnectionViability.None;\n }\n\n return match;\n }\n\n return ConnectionViability.None;\n};\n\nconst isSamePoint = (a: ConnectorPoint<any>, b: ConnectorPoint<any>) => {\n return a.parent === b.parent && a.port === b.port;\n};\n\nexport type NodeConnection<Node extends GraphNodeInterface> = {\n connect: boolean;\n output: ConnectorPoint<Node>;\n input: ConnectorPoint<Node> & {\n connector: Connector<Node['id']>;\n };\n};\n\nclass Cross extends Graphics {\n line1: PIXILine;\n line2: PIXILine;\n line12: PIXILine;\n line22: PIXILine;\n\n constructor(size: number, color: ColorSource = 0x000000, bg: ColorSource = 0x111111) {\n super();\n const half = size / 2;\n const half2 = size / 2 + 2;\n this.line12 = new PIXILine(-half2, -half2, half2, half2, 0).setWidth(6).setColor(bg).update();\n this.line22 = new PIXILine(half2, -half2, -half2, half2, 0).setWidth(6).setColor(bg).update();\n this.line1 = new PIXILine(-half, -half, half, half, 0);\n this.line2 = new PIXILine(half, -half, -half, half, 0);\n this.setColor(color);\n this.addChild(this.line12, this.line22, this.line2, this.line1);\n }\n\n show() {\n this.visible = true;\n\n return this;\n }\n\n hide() {\n this.visible = false;\n\n return this;\n }\n\n setColor(color: ColorSource) {\n this.line1.setColor(color).update();\n this.line2.setColor(color).update();\n\n return this;\n }\n\n setAngle(value: number) {\n if (this.angle === value) {\n return this;\n }\n\n this.angle = value;\n this.rotation = value;\n\n return this;\n }\n\n setPosition(pos: Position) {\n this.x = pos.x;\n this.y = pos.y;\n\n return this;\n }\n}\n\nexport class PIXIPendingConnector<Node extends GraphNodeInterface> extends PIXIConnector<Node['id']> {\n start: PortConnectionPoint<Node>;\n finish?: PortConnectionPoint<Node>;\n viable: ConnectionViability;\n\n readonly #line: PIXILine;\n readonly #cross: Cross;\n\n constructor(start: PortConnectionPoint<Node>) {\n super(start.pos.x, start.pos.y);\n this.start = start;\n this.viable = ConnectionViability.None;\n this.#line = this.addTarget(0, 0);\n this.#cross = new Cross(10, 0xff3333).hide();\n\n this.addChild(this.#cross);\n }\n\n get isRemoving() {\n return this.start.remove || !!this.finish?.remove;\n }\n\n setLine(pos: Position) {\n this.#line.visible = true;\n\n const { x: x1, y: y1 } = this.start.pos;\n const { x: x2, y: y2 } = pos;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const angle = dx ? Math.atan(dy / dx) : 0;\n\n if (this.isRemoving) {\n const mid = { x: x1 + dx / 2, y: y1 + dy / 2 };\n this.#cross.setColor(REMOVABILITY_COLOR[this.viable]).setPosition(mid).setAngle(angle).show();\n\n if (this.viable === ConnectionViability.None) {\n this.#line.visible = false;\n this.#cross.hide();\n }\n } else {\n this.#cross.hide();\n }\n\n this.#line\n .setColor(this.isRemoving ? REMOVABILITY_COLOR[this.viable] : VIABILITY_COLOR[this.viable])\n .moveToPoint(pos);\n }\n\n flail(pos: Position) {\n if (this.finish) {\n return;\n }\n\n this.setLine(pos);\n }\n\n hoverPort(port: PortConnectionPoint<Node>) {\n this.viable = getViablity(this.start, port, this.isRemoving);\n this.finish = this.viable === ConnectionViability.Viable ? port : undefined;\n this.setLine(port.pos);\n }\n\n connect({ point }: PortConnectionPoint<Node>): NodeConnection<Node> | false {\n if (this.finish && isSamePoint(this.finish.point, point)) {\n const {\n start: { remove: removeStart, point: start },\n finish: { remove: removeFinish, point: finish },\n } = this;\n const input = (start.input ? start : finish) as ConnectorPoint<Node> & {\n connector: Connector<Node['id']>;\n };\n const output = start.input ? finish : start;\n\n return {\n connect: !(removeStart || removeFinish),\n output,\n input,\n };\n }\n\n return false;\n }\n}\n","import {\n Container,\n BitmapFont,\n BitmapText,\n IBitmapTextStyle,\n TextStyle,\n ITextStyle,\n IBitmapFontOptions,\n ColorSource,\n} from './pixi';\n\nexport class PIXIText extends Container {\n static makeFont = (id: string, style?: TextStyle | Partial<ITextStyle>, options?: IBitmapFontOptions) =>\n (typeof document !== 'undefined')! &&\n BitmapFont.from(id, style, {\n chars: [\n ['a', 'z'],\n ['A', 'Z'],\n ['а', 'я'],\n ['А', 'Я'],\n ['0', '9'],\n '!@#$%^&*?()~{}[]<>\\\\/|_+-=.,\\n:;\\'\"` ',\n '←↑→↓',\n ],\n ...options,\n });\n #text: BitmapText;\n\n static factory = (id: string, style?: TextStyle | Partial<ITextStyle>, options?: IBitmapFontOptions) => {\n this.makeFont(id, style, options);\n\n return (text: any, textStyle?: Partial<Omit<IBitmapTextStyle, 'fontName'>>) =>\n new this(text, {\n ...textStyle,\n fontName: id,\n });\n };\n\n public constructor(text: any, style?: Partial<IBitmapTextStyle>) {\n super();\n\n this.#text = this.addChild(new BitmapText(String(text), style));\n }\n\n set text(text: any) {\n this.#text.text = String(text);\n }\n\n get text() {\n return this.#text.text;\n }\n\n set tint(color: ColorSource) {\n this.#text.tint = color;\n }\n}\n","import { DisposableEventSource } from '@ankhzet/gcl';\nimport type { IEventHandler } from '@ankhzet/eventual';\nimport type { ConnectorPoint, GraphNodeInterface } from '../interfaces';\nimport type { FederatedPointerEvent} from './pixi';\nimport { Graphics } from './pixi';\nimport { PORT_SIZE } from './PIXINode';\nimport { PIXIText } from './PIXIText';\n\nexport const E_PORT_CLICK = Symbol.for('E_PORT_CLICK');\nexport const E_PORT_HOVER = Symbol.for('E_PORT_HOVER');\n\nexport class PIXIPort<Node extends GraphNodeInterface> extends Graphics {\n protected static port = PIXIText.factory('nodePort', {\n fontFamily: ['Menlo', 'monospace'],\n fontSize: 16,\n lineHeight: 20,\n align: 'center',\n });\n\n readonly #ee = new DisposableEventSource();\n #active: boolean;\n\n public constructor(\n public connectorPoint: ConnectorPoint<Node>,\n private hasBothLanes: boolean\n ) {\n super();\n\n this.#active = !!connectorPoint.nodes.length;\n this.x = connectorPoint.x;\n this.y = connectorPoint.y;\n\n const dir = connectorPoint.input ? 1 : -1;\n const text = this.addChild(\n PIXIPort.port(this.label, {\n fontSize: 8,\n })\n );\n text.y = -4;\n text.x = dir * (8 + PORT_SIZE / 2) - (connectorPoint.input ? 0 : text.width);\n text.eventMode = 'none';\n\n this.lineStyle(1, 0x333333, 1);\n this.beginFill(this.#active ? 0xaaaaaa : 0xffffff);\n this.drawCircle(0, 0, PORT_SIZE / 2);\n this.endFill();\n\n this.eventMode = 'static';\n this.cursor = 'pointer';\n this.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.#ee.dispatchEvent(E_PORT_CLICK, e);\n });\n this.addEventListener('pointerenter', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.#ee.dispatchEvent(E_PORT_HOVER, true);\n });\n this.addEventListener('pointerleave', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.#ee.dispatchEvent(E_PORT_HOVER, false);\n });\n }\n\n public get label() {\n return String(this.connectorPoint.name).slice(0, this.hasBothLanes ? 2 : 8);\n }\n\n public dispose() {\n this.#ee.dispose();\n this.removeFromParent();\n }\n\n public get active() {\n return this.#active;\n }\n\n public setActive(active: boolean) {\n this.#active = active;\n\n this.update();\n }\n\n public update() {\n this.beginFill(this.active ? 0xaaaaaa : 0xffffff);\n this.drawCircle(0, 0, PORT_SIZE / 2);\n this.endFill();\n }\n\n public onClick(handler: IEventHandler<FederatedPointerEvent>) {\n return this.#ee.handleEvent(E_PORT_CLICK, handler);\n }\n\n public onHover(handler: IEventHandler<boolean>) {\n return this.#ee.handleEvent(E_PORT_HOVER, handler);\n }\n}\n","import { DisposableEventSource } from '@ankhzet/gcl';\nimport type { Position } from '../interfaces';\nimport { DisplayObject, Point } from './pixi';\n\ntype Draggable = DisplayObject & {\n _drag_meta?: {\n root: DisplayObject;\n emitter: DisposableEventSource;\n dragging: boolean;\n anchor: Point;\n newPosition: Position;\n lastPosition: Position;\n onDragEnd: (event: any) => void;\n onDragMove: (event: any) => void;\n };\n};\n\nexport const E_MOVE_NODE = Symbol.for('E_MOVE_NODE');\nexport const E_CAPTURE_NODE = Symbol.for('E_CAPTURE_NODE');\n\nconst copyPoint = (event: any, target?: Position): Position => {\n const pos = event.global! as Position;\n\n if (target) {\n target.x = pos.x;\n target.y = pos.y;\n\n return target;\n }\n\n return { x: pos.x, y: pos.y };\n};\n\nconst findRoot = (p: DisplayObject): DisplayObject | undefined => {\n if ((p as any).__drag_root) {\n return p;\n }\n\n return p.parent && findRoot(p.parent);\n};\n\nexport function onDragStart(emitter: DisposableEventSource) {\n return function (this: Draggable, event: any) {\n emitter.dispatchEvent(E_CAPTURE_NODE, true);\n\n if (event.buttons & 2) {\n return;\n }\n\n const meta = (this._drag_meta = {\n root:\n findRoot(this.parent) ||\n (() => {\n throw new Error(`Can't find scene root`);\n })(),\n emitter: emitter,\n dragging: true,\n anchor: this.position.clone(),\n lastPosition: copyPoint(event),\n newPosition: copyPoint(event),\n onDragEnd: onDragEnd(this),\n onDragMove: onDragMove(this),\n });\n\n meta.root.addEventListener('pointerup', meta.onDragEnd, { capture: true, passive: true });\n meta.root.addEventListener('pointerupoutside', meta.onDragEnd, { capture: true, passive: true });\n\n meta.root.addEventListener('pointermove', meta.onDragMove, { capture: true, passive: true });\n };\n}\n\nconst onDragMove = (d: Draggable) => (event: any) => {\n if (!d._drag_meta?.dragging) {\n return;\n }\n\n const { newPosition, lastPosition, anchor, emitter } = d._drag_meta!;\n\n copyPoint(event, newPosition);\n\n newPosition.x -= lastPosition.x;\n newPosition.y -= lastPosition.y;\n\n emitter.dispatchEvent(E_MOVE_NODE, {\n x: anchor.x + newPosition.x,\n y: anchor.y + newPosition.y,\n });\n};\n\nconst onDragEnd = (d: Draggable) => () => {\n if (!d._drag_meta) {\n return;\n }\n\n const { root, emitter, onDragEnd, onDragMove } = d._drag_meta;\n root.removeEventListener('pointerup', onDragEnd);\n root.removeEventListener('pointerupoutside', onDragEnd);\n root.removeEventListener('pointermove', onDragMove);\n\n emitter.dispatchEvent(E_CAPTURE_NODE, false);\n\n delete d._drag_meta;\n};\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource } from '@ankhzet/gcl';\n\nimport type { Connector, ConnectorId, ConnectorPoint, GraphNodeInterface } from '../interfaces';\nimport { type NodeConnection, type Position } from '../interfaces';\nimport { addOffset, connectNodes, isConnectionPoint } from '../utils';\nimport type { Container, FederatedPointerEvent, IPointData, ColorSource } from './pixi';\nimport { Graphics } from './pixi';\nimport { E_PORT_CLICK, E_PORT_HOVER, PIXIPort } from './PIXIPort';\nimport { E_CAPTURE_NODE, E_MOVE_NODE, onDragStart } from './Draggable';\nimport { PIXIConnector } from './PIXIConnector';\nimport { PIXIText } from './PIXIText';\n\nexport const E_NODE_CONTEXT = Symbol.for('E_NODE_CONTEXT');\nexport const E_CONNECTORS_UPDATE = Symbol.for('E_CONNECTORS_UPDATE');\n\nexport const NODE_WIDTH = 64;\nexport const LANE_WIDTH = 16;\nexport const LANE_HEIGHT = 16;\nexport const PORT_SIZE = 8;\n\ntype Getter<ID, R> = (id: ID) => R | undefined;\nexport type PortConnectionPoint<Node extends GraphNodeInterface> = {\n point: ConnectorPoint<Node>;\n pos: Position;\n hover?: boolean;\n remove?: boolean;\n};\n\nexport type RoundRectStyle = {\n stroke: ColorSource;\n fill: ColorSource;\n x?: number;\n y?: number;\n width: number;\n height: number;\n thickness?: number;\n radius?: number;\n};\n\nexport class PIXINode<Node extends GraphNodeInterface<any, any, Container>> extends DisposableEventSource {\n protected static label = PIXIText.factory('nodeLabel', {\n fontSize: 24,\n align: 'center',\n fill: '#efefef',\n dropShadow: true,\n dropShadowDistance: 2,\n });\n\n readonly #label: PIXIText;\n #_shape?: Container;\n #_connectors?: ConnectorPoint<Node>[];\n #drag = onDragStart(this);\n\n public data: Node;\n public find: Getter<Node['id'], PIXINode<Node>>;\n private ports = new Map<Node['id'], PIXIPort<Node>>();\n\n public constructor(data: Node, find: Getter<Node['id'], PIXINode<Node>>) {\n super();\n this.data = data;\n this.find = find;\n this.data.onConnect(this.#connect.bind(this));\n this.#label = PIXINode.label(this.label, {\n fontSize: 11,\n });\n }\n\n public get id() {\n return this.data.id;\n }\n\n public get label() {\n return this.data.title;\n }\n\n public dispose() {\n for (const port of this.ports.values()) {\n port.dispose();\n }\n\n if (this.#_connectors) {\n const remove = this.#_connectors.map(({ port }) => `${this.id}-${port}` as ConnectorId<Node>);\n\n if (remove.length) {\n this.dispatchEvent(E_CONNECTORS_UPDATE, {\n remove,\n });\n }\n }\n\n if (this.#_shape) {\n this.#_shape.removeFromParent();\n this.#_shape = undefined;\n }\n\n super.dispose();\n }\n\n public move(pos: Position): void {\n this.renderable.position.copyFrom(this.data.move(pos));\n this.placeConnectors();\n }\n\n public hitTest({ x, y }: Position): boolean {\n const { x: cx, y: cy } = this.renderable;\n\n if (x < cx || y < cy) {\n return false;\n }\n\n return x - cx <= this.width && y - cy <= this.height;\n }\n\n public get width() {\n return this.data.width;\n }\n\n public get height() {\n return this.data.height + LANE_HEIGHT;\n }\n\n #connect({ connect, input, source: { port: guid }, target }: NodeConnection<Node['id']>) {\n const connector = this.connectors.find((connector) => connector.port === guid && connector.input === input);\n\n if (!connector) {\n return;\n }\n\n connectNodes(connect, connector, target);\n\n const port = this.ports.get(guid);\n\n if (port) {\n port.setActive(!!connector.nodes.length);\n }\n }\n\n public connectedAt<Input extends true | false | undefined>(nodeId: Node['id'], portId: Node['id'], input?: Input): ConnectorPoint<Node, Input> | undefined {\n return this.connectors.find(\n ({ nodes, connector }) => (input !== !connector) && nodes.length && nodes.some(isConnectionPoint(nodeId, portId))\n ) as ConnectorPoint<Node, Input> | undefined;\n }\n\n public get connectors(): ConnectorPoint<Node>[] {\n if (this.#_connectors) {\n return this.#_connectors;\n }\n\n const connectors: ConnectorPoint<Node>[] = [];\n let idx1 = 1;\n let idx2 = 1;\n\n for (const joint of this.data.inputs) {\n const offset = { x: LANE_WIDTH / 2, y: idx1 * LANE_HEIGHT + LANE_HEIGHT / 2 };\n const pos = addOffset(this.data.position, offset);\n connectors.push({\n parent: this.data.id,\n port: joint.port,\n name: joint.name,\n nodes: joint.nodes,\n input: true,\n x: offset.x,\n y: offset.y,\n connector: new PIXIConnector(pos.x, pos.y),\n });\n idx1++;\n }\n\n for (const joint of this.data.outputs) {\n connectors.push({\n parent: this.data.id,\n port: joint.port,\n name: joint.name,\n nodes: joint.nodes,\n input: false,\n x: NODE_WIDTH - LANE_WIDTH / 2,\n y: idx2 * LANE_HEIGHT + LANE_HEIGHT / 2,\n });\n idx2++;\n }\n\n return (this.#_connectors = connectors);\n }\n\n public placeConnectors(recursive = true) {\n const map: Map<ConnectorId<Node>, Connector<Node['id']>> = new Map();\n const remove: ConnectorId<Node>[] = [];\n\n for (const joint of this.connectors) {\n const { connector, nodes, port } = joint;\n const uid = `${this.id}-${port}` as ConnectorId<Node>;\n\n if (connector) {\n connector.move(addOffset(this.renderable, joint));\n\n if (nodes.length) {\n let active = 0;\n\n for (const { node: nodeId, port: portId } of nodes) {\n const target = this.find(nodeId);\n const targetOut = target?.connectedAt(this.id, port);\n\n if (target && targetOut) {\n connector.moveTargetTo(nodeId, portId, addOffset(target.renderable, targetOut));\n active++;\n } else {\n connector.removeTarget(nodeId, portId);\n }\n }\n\n if (active) {\n map.set(uid, connector);\n }\n } else {\n remove.push(uid);\n }\n } else if (recursive && nodes.length) {\n for (const { node: nodeId } of nodes) {\n this.find(nodeId)?.placeConnectors(false);\n }\n }\n }\n\n if (map.size || remove.length) {\n this.dispatchEvent(E_CONNECTORS_UPDATE, {\n add: map.size ? [...map.entries()].map(([uid, connector]) => ({ uid, connector })) : undefined,\n remove: remove.length ? remove : undefined,\n });\n }\n }\n\n public get renderable(): Container {\n if (this.#_shape) {\n return this.#_shape;\n }\n\n const width = this.width;\n const height = this.height;\n const block = this.makeRoundRect({\n width,\n height,\n stroke: 0xdfdfef,\n fill: 0xfdfdfd,\n });\n\n this.#label.y = (LANE_HEIGHT - this.#label.height) / 2;\n this.#label.x = (width - this.#label.width) / 2;\n\n block\n .addChild(this.makeLane({\n x: 0,\n y: 0,\n width,\n height: LANE_HEIGHT,\n fill: 0x7d7d7d,\n }))\n .addChild(this.#label);\n\n const inputs = this.data.inputs.count;\n const outputs = this.data.outputs.count;\n\n if (inputs) {\n block.addChild(this.makeLane({\n x: 0,\n y: LANE_HEIGHT,\n height: height - LANE_HEIGHT,\n }));\n }\n\n if (outputs) {\n block.addChild(this.makeLane({\n x: width - LANE_WIDTH,\n y: LANE_HEIGHT,\n height: height - LANE_HEIGHT,\n }));\n }\n\n const hasBothLanes = !!(inputs && outputs);\n\n for (const connector of this.connectors) {\n block.addChild(this.makePort(connector, hasBothLanes));\n }\n\n const base = this.data.render(block);\n\n base.eventMode = 'static';\n base.addEventListener('pointerdown', (e) => this.handleClick(e));\n base.x = this.data.position.x;\n base.y = this.data.position.y;\n\n return (this.#_shape = base);\n }\n\n public makeRoundRect({ stroke, fill, x = 0, y = 0, width, height, thickness = 1, radius = 4 }: RoundRectStyle) {\n const rect = new Graphics();\n rect.lineStyle(thickness, stroke);\n rect.beginFill(fill);\n rect.drawRoundedRect(0, 0, width, height, radius);\n rect.endFill();\n rect.x = x;\n rect.y = y;\n\n return rect;\n }\n\n public makeLane(style: Partial<RoundRectStyle>) {\n return this.makeRoundRect(Object.assign({\n width: LANE_WIDTH,\n height: LANE_HEIGHT,\n stroke: 0xe0e0e0,\n fill: 0xededed,\n }, style));\n }\n\n public makePort(point: ConnectorPoint<Node>, hasBothLanes: boolean) {\n const { port: id, x, y } = point;\n const port = new PIXIPort(point, hasBothLanes);\n this.ports.set(id, port);\n\n port.onClick((e) => {\n if (e.buttons & 2) {\n return this.dispatchEvent(E_NODE_CONTEXT, { event: e, tag: { type: 'port', id } });\n }\n\n this.dispatchEvent(E_PORT_CLICK, {\n remove: e.ctrlKey || e.metaKey,\n point,\n pos: {\n x: this.renderable.x + x,\n y: this.renderable.y + y,\n },\n } as PortConnectionPoint<Node> & { remove?: boolean });\n });\n port.onHover((hover) =>\n this.dispatchEvent(E_PORT_HOVER, {\n point,\n hover,\n pos: {\n x: this.renderable.x + x,\n y: this.renderable.y + y,\n },\n } as PortConnectionPoint<Node>)\n );\n\n return port;\n }\n\n protected handleClick(e: FederatedPointerEvent) {\n if (e.buttons & 2) {\n e.stopPropagation();\n e.preventDefault();\n this.dispatchEvent(E_NODE_CONTEXT, { event: e, tag: { type: 'node', id: this.data.id } });\n } else {\n this.#drag.call(this.renderable, e);\n }\n }\n\n public onContext(\n handler: IEventHandler<{ event: FederatedPointerEvent; tag: { type: 'node' | 'port'; id: Node['id'] } }>\n ) {\n return this.handleEvent(E_NODE_CONTEXT, handler);\n }\n\n public onPortClick(handler: IEventHandler<PortConnectionPoint<Node> & { remove?: boolean }>) {\n return this.handleEvent(E_PORT_CLICK, handler);\n }\n\n public onPortHover(handler: IEventHandler<PortConnectionPoint<Node>>) {\n return this.handleEvent(E_PORT_HOVER, handler);\n }\n\n public onCapture(handler: IEventHandler<boolean>) {\n return this.handleEvent(E_CAPTURE_NODE, handler);\n }\n\n public onMove(handler: IEventHandler<IPointData>) {\n return this.handleEvent(E_MOVE_NODE, handler);\n }\n\n public onConnectorsUpdate(handler: IEventHandler<{ add?: Array<{ uid: ConnectorId<Node>; connector: Connector<Node['id']> }>; remove?: ConnectorId<Node>[] }>) {\n return this.handleEvent(E_CONNECTORS_UPDATE, handler);\n }\n\n protected update() {\n const map = this.connectors.reduce(\n (acc, c) => ((acc[c.port] = c), acc),\n {} as Record<Node['id'], ConnectorPoint<Node>>\n );\n\n for (const joint of this.data.inputs) {\n const connector = map[joint.port as Node['id']];\n\n if (connector) {\n connector.nodes = joint.nodes;\n }\n }\n\n for (const joint of this.data.outputs) {\n const connector = map[joint.port as Node['id']];\n\n if (connector) {\n connector.nodes = joint.nodes;\n }\n }\n\n this.placeConnectors();\n }\n}\n","import type { Position } from '../interfaces';\nimport { ColorSource, Container, Graphics, Rectangle } from './pixi';\nimport { PIXIText } from './PIXIText';\n\ntype SnapSize = {\n cell: Position;\n count: Position;\n size: { width: number; height: number };\n};\n\nconst identity = { x: 0, y: 0 };\n\nconst equalSnaps = (a: SnapSize, b: SnapSize) =>\n // true &&\n a.cell.x === b.cell.x &&\n a.cell.y === b.cell.y &&\n a.count.x === b.count.x &&\n a.count.y === b.count.y &&\n a.size.width === b.size.width &&\n a.size.height === b.size.height;\n\nconst clamp = (value: number, min: number, max: number) => (value > min ? (value < max ? value : max) : min);\nconst clampEdge = (value: number, offset: number, edge1: number, edge2: number, padding: number) =>\n clamp(value - offset / 2, edge1 + padding, edge2 - offset - padding);\n\nconst nextEven = (value: number) => {\n const result = Math.ceil(value);\n\n return result % 2 ? result + 1 : result;\n};\n\nexport class PIXIGrid extends Graphics {\n static text = PIXIText.factory(\n 'GridBoundary',\n {\n fontSize: 24,\n fill: 0xffffff,\n stroke: 0x000000,\n dropShadow: true,\n dropShadowDistance: 2,\n },\n {\n chars: [['0', '9'], '+-.'],\n }\n );\n\n public cellSize: Position;\n public colors: ColorSource[];\n readonly #multiplier: number;\n readonly #xR: PIXIText;\n readonly #xL: PIXIText;\n readonly #yB: PIXIText;\n readonly #yT: PIXIText;\n #viewport: Rectangle = new Rectangle(0, 0, 0, 0);\n #snap: SnapSize = { cell: identity, count: identity, size: { width: 0, height: 0 } };\n #grid: Container;\n #rullers: Container;\n\n constructor(cellSize: Position, colors: ColorSource[], multiplier = 5) {\n super();\n this.cellSize = cellSize;\n this.colors = colors;\n this.#multiplier = multiplier;\n this.#grid = this.addChild(new Container());\n this.#rullers = this.addChild(new Container());\n this.#xL = PIXIGrid.text('', { fontSize: 12 });\n this.#xR = PIXIGrid.text('', { fontSize: 12 });\n this.#yT = PIXIGrid.text('', { fontSize: 12 });\n this.#yB = PIXIGrid.text('', { fontSize: 12 });\n }\n\n get lods(): number {\n return this.colors.length;\n }\n\n protected snapSize({ width, height }: { width: number; height: number }, lod: number) {\n const { x, y } = this.cellSize;\n const max = lod ? Math.pow(2, lod - 1) * this.#multiplier : 1;\n const ox = max * x;\n const oy = max * y;\n const dx = nextEven(width / ox);\n const dy = nextEven(height / oy);\n\n return {\n cell: {\n x: ox,\n y: oy,\n },\n count: {\n x: dx,\n y: dy,\n },\n size: {\n width: ox * dx,\n height: oy * dy,\n },\n };\n }\n\n private toMaxSnap(viewport: Rectangle) {\n return this.snapSize(viewport, this.lods - 1);\n }\n\n public viewport(viewport: Rectangle) {\n this.makeRullers(viewport);\n\n const snapOld = this.toMaxSnap(this.#viewport);\n const snapNew = this.toMaxSnap(viewport);\n\n this.#grid.x = (viewport.left + viewport.width) % snapNew.cell.x;\n this.#grid.y = (viewport.top + viewport.height) % snapNew.cell.y;\n\n if (equalSnaps(snapOld, snapNew)) {\n return;\n }\n\n this.#viewport.copyFrom(viewport);\n this.#snap = snapNew;\n this.update();\n }\n\n protected makeRullers(viewport: Rectangle) {\n this.#rullers.removeChildren();\n const shape = this.#rullers.addChild(new Graphics());\n const { left, top, width, height } = viewport;\n\n const stroke = 2;\n const halfStroke = stroke / 2;\n const rightmost = left + width;\n const topmost = top + height;\n const x = clamp(rightmost, halfStroke, width - halfStroke);\n const y = clamp(topmost, halfStroke, height - halfStroke);\n\n shape.lineStyle(stroke, 0xff0000, 1);\n shape.moveTo(0, y);\n shape.lineTo(width, y);\n shape.moveTo(x, 0);\n shape.lineTo(x, height);\n\n this.#rullers.addChild(this.#xL, this.#xR, this.#yT, this.#yB);\n\n this.#xL.text = ~~(-(width + left) / this.cellSize.x);\n this.#yT.text = ~~(-(height + top) / this.cellSize.y);\n this.#xR.text = ~~(-left / this.cellSize.x);\n this.#yB.text = ~~(-top / this.cellSize.y);\n\n const th = this.#xL.height;\n const lw = this.#xL.width;\n const rw = this.#xR.width;\n const tw = this.#yT.width;\n const bw = this.#yB.width;\n const ly = clampEdge(y, th, 0, height, stroke);\n const lx1 = clampEdge(x, tw, lw + 5, width - rw - 5, stroke);\n const lx2 = clampEdge(x, bw, lw + 5, width - rw - 5, stroke);\n\n this.#xL.x = stroke;\n this.#xL.y = ly;\n\n this.#xR.x = width - rw - stroke;\n this.#xR.y = ly;\n\n this.#yT.x = lx1;\n this.#yT.y = stroke;\n\n this.#yB.x = lx2;\n this.#yB.y = height - th - stroke;\n }\n\n protected makeLOD(lod: number) {\n const color = this.colors[lod];\n const {\n cell: { x: ox, y: oy },\n count: { x: dx, y: dy },\n size: { width, height },\n } = this.snapSize(this.#snap.size, lod);\n\n const shape = new Graphics();\n\n shape.lineStyle(0.25 * (lod + 1), color, 1);\n\n for (let i = 0; i < dx; i++) {\n shape.moveTo(ox * i, 0);\n shape.lineTo(ox * i, height);\n }\n\n for (let i = 0; i < dy; i++) {\n shape.moveTo(0, oy * i);\n shape.lineTo(width, oy * i);\n }\n\n return shape;\n }\n\n protected makeGrid() {\n const shape = new Container();\n\n for (const lod of this.colors.keys()) {\n shape.addChild(this.makeLOD(lod));\n }\n\n return shape;\n }\n\n update() {\n const { width, height } = this.#snap.size;\n this.#grid.removeChildren();\n\n for (let x = -1; x <= 1; x++) {\n for (let y = -1; y <= 1; y++) {\n const c = this.makeGrid();\n c.x = x * width;\n c.y = y * height;\n this.#grid.addChild(c);\n }\n }\n }\n}\n","import type { IMenuItem } from '../interfaces';\nimport { Container, Graphics } from './pixi';\nimport { PIXIText } from './PIXIText';\n\nconst ITEM_HEIGHT = 24;\nconst ITEM_H_PADDING = 12;\n\nexport class PIXIMenuItem extends Container {\n public static label = PIXIText.factory('menuItem', {\n fontSize: 24,\n align: 'center',\n fill: 0xffffff,\n });\n\n readonly #bg: Graphics;\n readonly #label: PIXIText;\n readonly #item: IMenuItem<any>;\n readonly #group: boolean;\n\n #width: number = 0;\n #height: number = ITEM_HEIGHT;\n #hover: boolean = false;\n #separator: boolean = false;\n #disabled: boolean = false;\n\n public index: number;\n\n public constructor(index: number, item: IMenuItem<any>, onSelect: () => void) {\n super();\n this.index = index;\n this.#item = item;\n this.#separator = !!item.separator;\n this.#group = !!item.group;\n this.#disabled = !!item.disabled || this.#group;\n\n this.#bg = this.addChild(new Graphics());\n this.#label = this.addChild(\n PIXIMenuItem.label(this.label, {\n fontSize: 12,\n })\n );\n\n this.eventMode = 'static';\n this.addEventListener('pointerdown', (e) => {\n if (this.#disabled) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n onSelect();\n });\n }\n\n public resize(width: number) {\n this.#width = width;\n this.update();\n }\n\n public get separator() {\n return this.#separator;\n }\n\n public set separator(value: boolean) {\n if (this.#separator === value) {\n return;\n }\n\n this.#separator = value;\n this.update();\n }\n\n public get hover() {\n return this.#hover;\n }\n\n public set hover(value: boolean) {\n value = value && !this.#disabled;\n\n if (this.#hover === value) {\n return;\n }\n\n this.#hover = value;\n this.update();\n }\n\n public get label() {\n return this.#item.label;\n }\n\n public get labelWidth() {\n return this.#label.width + ITEM_H_PADDING * 2;\n }\n\n public get width() {\n return this.#width;\n }\n\n public get height() {\n return this.#separator ? 2 : this.#height;\n }\n\n public get disabled() {\n return this.#disabled;\n }\n\n public set disabled(value: boolean) {\n if (this.#disabled !== value) {\n return;\n }\n\n this.#disabled = value;\n this.update();\n }\n\n public update() {\n const width = this.width;\n const height = this.height;\n const block = this.#bg;\n\n if (this.separator) {\n block.lineStyle(1, 0x666, 1);\n block.moveTo(ITEM_H_PADDING, 1);\n block.lineTo(width - ITEM_H_PADDING, 1);\n } else if (this.#group) {\n block.lineStyle(0, 0x000000, 1);\n block.beginFill(0x333333);\n block.drawRect(-1, 1, width + 2, height - 2);\n block.endFill();\n } else if (this.hover) {\n block.lineStyle(0, 0x000000, 1);\n block.beginFill(0x444444);\n block.drawRoundedRect(0, 0, width, height, 4);\n block.endFill();\n } else {\n block.clear();\n }\n\n this.#label.text = this.#item.label;\n this.#label.x = ITEM_H_PADDING;\n this.#label.y = (height - this.#label.height) / 2;\n this.#label.alpha = this.#disabled && !this.#group ? 0.3 : 1;\n this.#label.tint = this.#group || this.hover ? 0xffffff : 0x000000;\n }\n}\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport { DisposableEventSource } from '@ankhzet/gcl';\nimport type { IMenu, IMenuItem } from '../interfaces';\nimport { Container, Graphics, Point } from './pixi';\nimport { PIXIMenuItem } from './PIXIMenuItem';\n\nexport const E_ITEM_SELECT = Symbol.for('E_ITEM_SELECT');\nexport const E_CLOSE_MENU = Symbol.for('E_CLOSE_MENU');\n\nconst dummyLocal = new Point();\n\nexport class PIXIMenu extends Container {\n readonly #bg: Graphics;\n readonly #container: Container;\n readonly #mask: Graphics;\n readonly #items: PIXIMenuItem[];\n readonly #ee: DisposableEventSource;\n #hoverIndex = -1;\n\n public constructor(menu: IMenu<any>) {\n super();\n\n this.#ee = new DisposableEventSource();\n\n this.#mask = this.addChild(new Graphics());\n this.#bg = this.addChild(new Graphics());\n this.#container = this.addChild(new Container());\n this.#items = menu.items.map((item, index) =>\n this.#container.addChild(new PIXIMenuItem(index, item, () => this.handleSelect(item)))\n );\n\n this.#container.mask = this.#mask;\n\n this.eventMode = 'static';\n this.addEventListener('pointermove', (e) => {\n this.hoverIndex = this.getItemAtY(e.getLocalPosition(this, dummyLocal).y);\n });\n this.addEventListener('pointerleave', () => {\n this.hoverIndex = -1;\n });\n\n this.update();\n }\n\n public getItemAtY(y: number) {\n if (y >= 0) {\n for (const item of this.#items) {\n y -= item.height;\n\n if (y <= 2) {\n return item.index;\n }\n }\n }\n\n return -1;\n }\n\n public get hoverIndex() {\n return this.#hoverIndex;\n }\n\n public set hoverIndex(value: number) {\n if (this.#hoverIndex === value) {\n return;\n }\n\n this.changeHover(this.#hoverIndex, false);\n this.changeHover(value, true);\n this.#hoverIndex = value;\n }\n\n protected changeHover(index: number, hover: boolean) {\n const item = index >= 0 && this.#items[index];\n\n if (item) {\n item.hover = hover;\n }\n }\n\n protected handleSelect(item: IMenuItem<any>) {\n this.#ee.dispatchEvent(E_ITEM_SELECT, item);\n }\n\n public close() {\n this.visible = false;\n this.#ee.dispatchEvent(E_CLOSE_MENU);\n }\n\n public onSelect(handler: IEventHandler<IMenuItem>) {\n return this.#ee.handleEvent(E_ITEM_SELECT, handler);\n }\n\n public onClose(handler: IEventHandler) {\n return this.#ee.handleEvent(E_CLOSE_MENU, handler);\n }\n\n public get width() {\n return Math.max(...this.#items.map((item) => item.labelWidth));\n }\n\n public get height() {\n return this.#items.reduce((acc, item) => acc + item.height, 0);\n }\n\n public update() {\n const width = this.width;\n const height = this.height;\n const block = this.#bg;\n\n block.lineStyle(0, 0, 1);\n block.beginFill(0x000000, 0.3);\n block.drawRoundedRect(2, 2, width + 2, height + 2, 4);\n block.endFill();\n\n block.lineStyle(1, 0x333333, 1);\n block.beginFill(0xfdfdfd);\n block.drawRoundedRect(-1, -1, width + 2, height + 2, 4);\n block.endFill();\n\n const mask = this.#mask;\n mask.clear();\n mask.beginFill(0xffffff);\n mask.drawRoundedRect(-1, -1, width + 2, height + 2, 4);\n mask.endFill();\n\n let offset = 0;\n\n for (const item of this.#items) {\n item.y = offset;\n item.resize(width);\n offset += item.height;\n }\n }\n}\n","import { debounce } from '@ankhzet/utils';\nimport type {\n Connector,\n ConnectorId,\n GraphNodeInterface,\n HitTestResult,\n IMenuProvider,\n Position,\n Renderer,\n RendererConfig,\n RendererGUI,\n RendererOptions,\n} from '../interfaces';\nimport { addOffset } from '../utils';\nimport type { FederatedPointerEvent, IRenderer } from './pixi';\nimport { autoDetectRenderer, Container, Rectangle, Ticker } from './pixi';\nimport { type PIXIConnector } from './PIXIConnector';\nimport { type NodeConnection, PIXIPendingConnector } from './PIXIPendingConnector';\nimport { PIXINode } from './PIXINode';\nimport { PIXIGrid } from './PIXIGrid';\nimport { PIXIMenu } from './PIXIMenu';\n\nexport class PIXIRenderer<Node extends GraphNodeInterface> implements Renderer<Node> {\n private readonly ticker: Ticker;\n private readonly nodes = new Map<Node['id'], PIXINode<Node>>();\n private readonly connectors = new Map<ConnectorId<Node>, PIXIConnector<Node['id']>>();\n private _pending: PIXIPendingConnector<Node> | null = null;\n private _renderer: IRenderer | null = null;\n\n public menu?: PIXIMenu | null;\n\n public gui: RendererGUI<any>[];\n public world: Container;\n public root: Container;\n public overlay: Container;\n public grid: PIXIGrid;\n public capturing?: Node;\n public options: RendererOptions = {\n viewport: {\n width: 1,\n height: 1,\n resolution: window.devicePixelRatio,\n backgroundColor: 0x242424,\n antialias: true,\n transparent: false,\n },\n };\n readonly #throttle = debounce(() => this.ticker.speed = 0.05, 1000);\n readonly #find = (id: Node['id']) => this.nodes.get(id);\n\n public constructor({ maxFPS, grid, gui = [] }: RendererConfig) {\n this.ticker = new Ticker();\n this.world = new Container();\n this.root = new Container();\n this.overlay = new Container();\n this.grid = new PIXIGrid(grid.cellSize, grid.colors);\n this.world.sortableChildren = true;\n this.ticker.maxFPS = maxFPS;\n (this.world as any).__drag_root = true;\n this.gui = gui;\n\n this.root.addChild(this.grid);\n this.root.addChild(this.world);\n this.root.addChild(this.overlay);\n this.root.addChild(...gui);\n this.ticker.add(this.render.bind(this));\n\n this.world.eventMode = 'static';\n this.world.hitArea = { contains: () => true };\n this.world.addEventListener('pointermove', (e) => {\n this.handlePointerMove(this.fromGlobal(e.global));\n });\n this.world.addEventListener('pointerdown', (e) => {\n this.handlePointerDown(this.fromGlobal(e.global), e);\n });\n\n this.fullSpeed();\n }\n\n public fullSpeed() {\n this.ticker.speed = 1;\n this.#throttle();\n };\n\n public get renderer(): IRenderer {\n if (!this._renderer) {\n const { viewport } = this.options;\n\n this._renderer = autoDetectRenderer({\n width: viewport.width,\n height: viewport.height,\n antialias: viewport.antialias,\n backgroundColor: viewport.backgroundColor,\n backgroundAlpha: viewport.transparent ? 0.0 : 1.0,\n resolution: viewport.resolution,\n autoDensity: true,\n });\n this.ticker.start();\n }\n\n return this._renderer!;\n }\n\n public set renderer(value: IRenderer | null) {\n if (this._renderer === value) {\n return;\n }\n\n if (this._renderer) {\n this.ticker.stop();\n this._renderer.destroy(true);\n }\n\n this._renderer = value;\n\n if (value) {\n this.ticker.start();\n }\n }\n\n public get width() {\n return this.renderer.width / this.options.viewport.resolution;\n }\n\n public get height() {\n return this.renderer.height / this.options.viewport.resolution;\n }\n\n public get center(): Position {\n const { width, height } = this;\n\n return {\n x: width / 2,\n y: height / 2,\n };\n }\n\n public get translation(): Position {\n const { x: cx, y: cy } = this.center;\n const { x, y } = this.world.transform.position;\n\n return {\n x: ~~(x - cx),\n y: ~~(y - cy),\n };\n }\n\n public fromGlobal(pos: Position): Position {\n return addOffset(pos, this.world.transform.position, -1);\n }\n\n public fromLocal(pos: Position): Position {\n return addOffset(addOffset(pos, this.world.transform.position, -2), this.center);\n }\n\n public offsetPos(pos: Position, dir: number = 1): Position {\n return addOffset(pos, this.center, dir);\n }\n\n public translate(pos: Position): void {\n this.world.transform.position.copyFrom(this.offsetPos(pos));\n this.overlay.transform.position.copyFrom(this.offsetPos(pos));\n\n this.updateViewport();\n }\n\n public closeMenu() {\n this.menu?.close();\n }\n\n public showMenu(provider: IMenuProvider<any>, tag: any, pos: Position) {\n this.closeMenu();\n\n const descriptor = provider.getMenu(tag, pos);\n\n if (descriptor) {\n const menu = this.overlay.addChild(Object.assign(new PIXIMenu(descriptor), pos));\n\n menu.onSelect((item) => {\n if (false !== provider.handleMenu(item.data)) {\n this.closeMenu();\n }\n });\n\n menu.onClose(() => {\n if (this.menu === menu) {\n this.menu = null;\n }\n\n menu.removeFromParent();\n });\n\n return (this.menu = menu);\n }\n }\n\n public addNode(node: Node): void {\n if (this.#find(node.id)) {\n return;\n }\n\n const wrapped = new PIXINode(node, this.#find);\n\n wrapped.onMove((pos) => {\n if (this._pending) {\n return;\n }\n\n this.moveNodeTo(node.id, pos);\n });\n wrapped.onCapture((capture) => {\n if (capture) {\n this.capturing = node;\n\n if (!this._pending) {\n this.moveToForeground(node);\n return;\n }\n } else {\n this.capturing = undefined;\n }\n });\n wrapped.onContext(({ event, tag }) => this.showMenu(node, tag, this.fromGlobal(event.global)));\n wrapped.onPortClick((e) => {\n if (e.remove && !e.point.nodes.length) {\n return;\n }\n\n if (this.pending) {\n const connect = this.pending.connect(e);\n\n if (connect) {\n this.connectNodes(connect);\n this.pending = null;\n }\n\n return;\n }\n\n this.pending = new PIXIPendingConnector(e);\n });\n wrapped.onPortHover((e) => this.pending?.hoverPort(e));\n wrapped.onConnectorsUpdate(({ add, remove }) => {\n if (add) {\n for (const { uid, connector } of add) {\n this.addConnector(uid, connector);\n }\n }\n\n if (remove) {\n for (const uid of remove) {\n this.removeConnector(uid);\n }\n }\n });\n wrapped.onDispose(() => {\n this.nodes.delete(node.id);\n });\n\n this.nodes.set(node.id, wrapped);\n this.world.addChild(wrapped.renderable);\n }\n\n public removeNode(node: Node): void {\n const wrapper = this.nodes.get(node.id);\n\n if (wrapper) {\n wrapper.dispose();\n }\n }\n\n public clear(): void {\n const toRemove = [...this.nodes.values()];\n this.connectors.clear();\n this.nodes.clear();\n this.world.removeChildren();\n\n for (const node of toRemove) {\n node.dispose();\n }\n }\n\n public get pending(): PIXIPendingConnector<Node> | null {\n return this._pending;\n }\n\n public set pending(value: PIXIPendingConnector<Node> | null) {\n if (!value && this._pending) {\n this._pending.removeFromParent();\n }\n\n this._pending = value;\n\n if (value) {\n this.overlay.addChild(value);\n }\n }\n\n public handlePointerMove(pos: Position) {\n this.fullSpeed();\n\n if (this.capturing || !this.pending) {\n return;\n }\n\n this.pending.flail(pos);\n }\n\n public handlePointerDown(pos: Position, e: FederatedPointerEvent) {\n if (this.pending && !e.shiftKey) {\n this.pending = null;\n }\n\n this.closeMenu();\n\n if (e.buttons & 2) {\n for (const gui of this.gui) {\n if (this.showMenu(gui, undefined, pos)) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n }\n\n public connectNodes({\n connect,\n output: { port: outputPort, parent: outputNode },\n input: { port: inputPort, parent: inputNode },\n }: NodeConnection<Node>) {\n const output = this.#find(outputNode)!;\n const input = this.#find(inputNode)!;\n\n // if (connect) {\n // input.data.connect({\n // connect: false,\n // input: true,\n // port: inputPort,\n // });\n // }\n //\n output.data.connect({\n connect,\n input: false,\n port: outputPort,\n nodes: [\n {\n node: input.data,\n port: inputPort,\n },\n ],\n });\n\n input.placeConnectors();\n }\n\n public buildConnectors() {\n for (const node of this.nodes.values()) {\n node.placeConnectors();\n }\n }\n\n public addConnector(guid: ConnectorId<Node>, connector: Connector<Node['id']>) {\n if (this.connectors.has(guid)) {\n return;\n }\n\n const asPixi = connector as PIXIConnector<Node['id']>;\n\n asPixi.zIndex++;\n this.world.addChild(asPixi);\n this.connectors.set(guid, asPixi);\n }\n\n public removeConnector(guid: ConnectorId<Node>) {\n const connector = this.connectors.get(guid);\n\n if (connector) {\n this.connectors.delete(guid);\n this.world.removeChild(connector);\n }\n }\n\n public moveToForeground(node: Node): void {\n const graphics = this.nodes.get(node.id);\n\n if (graphics) {\n this.world.setChildIndex(graphics.renderable, this.world.children.length - 1);\n }\n }\n\n public hitTest({ x, y }: Position): undefined | HitTestResult<Node> {\n const pos = {\n x: x - this.translation.x,\n y: y - this.translation.y,\n };\n\n for (const node of this.nodes.values()) {\n if (node.hitTest(pos)) {\n return {\n node: node.data,\n x: node.renderable.x,\n y: node.renderable.y,\n width: node.width,\n height: node.height,\n };\n }\n }\n }\n\n public getNodePos(node: Node): Position {\n return node.position;\n }\n\n public moveNodeTo(nodeId: Node['id'], pos: Position): void {\n const node = this.nodes.get(nodeId);\n\n if (node) {\n node.move(pos);\n }\n }\n\n public layout(): void {\n this.buildConnectors();\n }\n\n public mount(node: HTMLElement, options: RendererOptions) {\n this.options = options;\n this.renderer = null;\n this.renderer!.resize(options.viewport.width, options.viewport.height);\n this.translate({ x: 0, y: 0 });\n\n node.appendChild(this.renderer.view as unknown as globalThis.Node);\n\n return () => {\n this.unmount();\n };\n }\n\n public unmount() {\n this.renderer = null;\n }\n\n public resize(width: number, height: number) {\n this.renderer.resize(width, height);\n this.updateViewport();\n }\n\n protected updateViewport() {\n const {\n width,\n height,\n translation: { x, y },\n } = this;\n\n if (width && height) {\n this.grid.viewport(new Rectangle(x - width / 2, y - height / 2, width, height));\n }\n }\n\n public render() {\n this.renderer?.render(this.root);\n }\n\n public update() {\n this.ticker.update();\n }\n}\n","import { IMenu, IMenuProvider, Position, RendererGUI } from '../interfaces';\nimport { Container, Text } from './pixi';\nimport { PIXIText } from './PIXIText';\n\nconst DEFAULT_LEGEND = `\nPort:\n LMB - start connecting\n LMB + (Meta | Ctrl) - start disconnecting\nCanvas:\n LMB + Shift - drag while connecting/disconnecting`;\n\nexport class PIXIGUI<M> extends Container implements RendererGUI<M> {\n static text = PIXIText.factory(\n 'GUIText',\n {\n fontSize: 16,\n align: 'left',\n fill: '#efefef',\n dropShadow: true,\n dropShadowDistance: 1,\n },\n {\n chars: [['a', 'z'], ['A', 'Z'], ['0', '9'], ' \\t\\n+-|()/:;.'],\n }\n );\n static makeText = (text: string) => this.text(text, { fontSize: 8 });\n\n readonly #menu: IMenuProvider<M>;\n readonly #mark = new Text('ℹ️', {\n fontSize: 8,\n lineHeight: 14,\n });\n readonly #text = PIXIGUI.makeText('');\n #legend: boolean = false;\n #dynamicText: string = '';\n #legendText: string;\n\n public constructor(menu: IMenuProvider<M>, legendText: string = DEFAULT_LEGEND) {\n super();\n this.#legendText = legendText;\n\n this.addChild(this.#mark);\n this.addChild(this.#text);\n\n this.#mark.eventMode = 'static';\n this.#mark.addEventListener('pointerdown', () => (this.legend = !this.legend));\n\n this.#text.x = 8;\n this.#text.y = 8;\n\n this.#menu = menu;\n }\n\n getMenu(tag: any, pos: Position): IMenu<M> | undefined {\n return this.#menu.getMenu(tag, pos);\n }\n\n handleMenu(data: M): void | false {\n return this.#menu.handleMenu(data);\n }\n\n get legendText(): string {\n return this.#legendText;\n }\n\n set legendText(text: string) {\n this.#legendText = text;\n }\n\n set text(text: string) {\n this.#dynamicText = text;\n this.#text.text = text + (this.#legend ? this.#legendText : '');\n }\n\n get legend() {\n return this.#legend;\n }\n\n set legend(value: boolean) {\n this.#legend = value;\n this.#text.text = this.#dynamicText + (this.#legend ? this.#legendText : '');\n }\n}\n","import { DisplayObject, Container } from './pixi';\n\nexport class PIXIStacked<T extends DisplayObject> extends Container {\n public readonly first: T;\n\n public constructor(first: T, ...rest: DisplayObject[]) {\n super();\n this.first = first;\n\n this.addChild(first, ...rest);\n }\n\n public hotSwap(...children: DisplayObject[]) {\n this.removeChildren();\n this.addChild(this.first, ...children);\n }\n}\n","import { ColorSource, Graphics } from \"./pixi\";\n\nexport type OutlinedOptions = {\n x?: number;\n y?: number;\n width: number;\n height: number;\n radius: number;\n lineSize: number;\n color: ColorSource;\n};\n\nexport class PIXIOutlined extends Graphics {\n readonly #options: OutlinedOptions;\n #active?: boolean;\n\n public constructor(options: OutlinedOptions) {\n super();\n this.#options = options;\n }\n\n public get active() {\n return !!this.#active;\n }\n\n public set active(value: boolean) {\n if (value === !!this.#active) {\n return;\n }\n\n this.#active = value;\n\n this.clear();\n\n if (value) {\n const { lineSize, color, x = 0, y = 0, width, height, radius } = this.#options;\n\n this\n .lineStyle({\n width: lineSize,\n color,\n })\n .drawRoundedRect(x - 2, y - 2, width + 4, height + 4, radius);\n }\n }\n}\n","export * from './pixi';\nexport * from './Batch';\nexport * from './PIXIRectSpinner';\nexport * from './PIXIRenderer';\nexport * from './PIXIGUI';\nexport * from './PIXINode';\nexport * from './PIXIStacked';\nexport * from './PIXIOutlined';\n","import type {\n GraphNodeInterface,\n HitTestResult,\n Renderer,\n Position,\n RendererConfig,\n RendererOptions,\n} from './interfaces';\nimport { Batch, PIXIRenderer } from './render';\n\nexport class GraphAdapter<Node extends GraphNodeInterface> extends Batch implements Iterable<Node> {\n private readonly renderer: Renderer<Node>;\n\n private nodes: Node[] = [];\n\n public constructor(config: RendererConfig) {\n super();\n this.renderer = new PIXIRenderer<Node>(config);\n this.and(() => this.renderer.render());\n }\n\n public [Symbol.iterator]() {\n return this.nodes[Symbol.iterator]();\n }\n\n public clear() {\n this.renderer.clear();\n this.nodes.splice(0);\n }\n\n public update() {\n this.renderer.update();\n }\n\n public moveToForeground(node: Node) {\n this.renderer.moveToForeground(node);\n }\n\n public hitTest(pos: Position): undefined | HitTestResult<Node> {\n return this.renderer.hitTest(pos);\n }\n\n public getNodePos(node: Node): Position {\n return this.renderer.getNodePos(node);\n }\n\n public moveNodeTo(node: Node, pos: Position) {\n node.position = pos;\n }\n\n public addNode(node: Node) {\n const idx = this.nodes.indexOf(node);\n\n if (idx < 0) {\n this.nodes.push(node);\n this.renderer.addNode(node);\n }\n\n return node;\n }\n\n public removeNode(node: Node) {\n const idx = this.nodes.indexOf(node);\n\n if (idx >= 0) {\n this.nodes.splice(idx, 1);\n this.renderer.removeNode(node);\n }\n\n return node;\n }\n\n public get capturing(): Node | undefined {\n return this.renderer.capturing;\n }\n\n public releaseNode() {\n this.renderer.capturing = undefined;\n }\n\n public get translation(): Position {\n return this.renderer.translation;\n }\n\n public translate(pos: Position): void {\n this.renderer.translate(pos);\n }\n\n public resize(width: number, height: number): void {\n this.renderer.resize(width, height);\n }\n\n public fromGlobal(pos: Position): Position {\n return this.renderer.fromGlobal(pos);\n }\n\n public fromLocal(pos: Position): Position {\n return this.renderer.fromLocal(pos);\n }\n\n public mount(element: HTMLElement, options: RendererOptions) {\n return this.renderer.mount(element, options);\n }\n\n public unmount(): void {\n this.renderer.unmount();\n }\n\n public layout(): void {\n this.renderer.layout();\n }\n}\n","import { useLastCallback } from '@ankhzet/ui';\nimport { ChangeEvent, useState, useMemo, useEffect, useLayoutEffect, PropsWithChildren } from 'react';\n\ninterface GroupableItem<ID> {\n id: ID;\n}\n\nexport type ItemsGroup<ID> = {\n value: string | number;\n label: string;\n ids: ID[];\n};\n\nexport type GroupResolver<T extends GroupableItem<any>> = (node: T) => null | undefined | ItemsGroup<T['id']>;\n\nexport interface NodeGroupsProps<T extends GroupableItem<any>> extends PropsWithChildren {\n items: T[];\n resolver: GroupResolver<T>;\n onSelect: (group: ItemsGroup<T['id']>) => void;\n}\n\nfunction makeGroups<T extends GroupableItem<any>>(items: T[], resolver: GroupResolver<T>): ItemsGroup<T['id']>[] {\n const groups: ItemsGroup<T['id']>[] = [];\n\n for (const node of items) {\n const group = resolver(node);\n\n if (group) {\n groups.push(group);\n }\n }\n\n return groups\n .sort((a, b) => a.label.localeCompare(b.label))\n .concat([\n {\n value: 'all',\n ids: items.map(({ id }) => id),\n label: `All nodes (${items.length})`,\n },\n ]);\n}\n\nconst isSameArray = (a: any[], b: any[]) => {\n const items = a.length;\n\n if (items !== b.length) {\n return false;\n }\n\n for (let i = 0; i < items; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n};\n\nconst isValue = (value: any) => {\n const s = String(value);\n\n return (item: { value: any }) => String(item.value) === s;\n};\n\nexport function NodeGroups<Item extends GroupableItem<any>>({\n items,\n resolver,\n onSelect,\n children,\n ...rest\n}: NodeGroupsProps<Item>) {\n const groups = useMemo(() => makeGroups(items, resolver), [items, resolver]);\n const [group, setGroup] = useState<ItemsGroup<Item>>(groups.find(({ value }) => value === 'all')!);\n const currentAsString = String(group.value);\n\n const handleGroup = useLastCallback(({ target: { value } }: ChangeEvent<HTMLSelectElement>) => {\n const found = groups.find(isValue(value));\n\n if (found) {\n setGroup(found);\n }\n });\n\n useEffect(() => void onSelect(group), [group, onSelect]);\n\n useLayoutEffect(() => {\n const found = groups.find(isValue(group.value));\n\n if (found) {\n if (found === group) {\n return;\n }\n\n if (found.label !== group.label || !isSameArray(found.ids, group.ids)) {\n setGroup(found);\n }\n } else {\n setGroup(groups[0]!);\n }\n }, [groups, group]);\n\n return (\n <select\n multiple\n size={groups.length}\n onChange={handleGroup}\n {...rest}\n >\n {children}\n {groups.map(({ value, label }) => (\n <option key={String(value)} value={String(value)} selected={String(value) === currentAsString}>\n {label}\n </option>\n ))}\n </select>\n );\n}\n","import { useMeasure, Styles } from '@ankhzet/ui';\nimport { useEffect, useImperativeHandle, Ref } from 'react';\nimport { type Position } from './interfaces';\nimport { type DragHandlers, useDraggable } from './useDraggable';\n\ninterface ViewportProps {\n ref?: Ref<{ reset: (pos: Position) => void; element: HTMLDivElement | null }>;\n handlers: DragHandlers;\n onResize: (rect: { width: number; height: number }) => void;\n}\n\nexport const Viewport = ({ ref, handlers, onResize, ...props }: ViewportProps) => {\n const [rect, measureRef] = useMeasure<HTMLDivElement>();\n const { bind, reset } = useDraggable<HTMLDivElement>(handlers);\n\n useImperativeHandle(ref, () => ({\n reset,\n get element() {\n return bind.ref.current;\n },\n }));\n\n useEffect(() => {\n rect && onResize({\n width: ~~rect.width,\n height: ~~rect.height,\n });\n }, [rect, onResize]);\n\n return (\n <div ref={measureRef} style={styles.root}>\n <div style={styles.root} {...bind} {...props} />\n </div>\n );\n};\n\nconst styles = Styles.of({\n root: {\n flex: 1,\n display: 'flex',\n minWidth: 0,\n minHeight: 0,\n },\n});\n","import { useLastCallback } from '@ankhzet/ui';\nimport { type TypeId } from './types';\nimport { type ItemsGroup, NodeGroups } from './graph';\nimport { ManagedGraphNode } from './ManagedGraphNode';\n\nexport interface GraphGroupsProps {\n items: ManagedGraphNode[];\n onSelect: (ids: TypeId[]) => void;\n}\n\nexport const GraphGroups = ({ onSelect, ...props }: GraphGroupsProps) => {\n const handleSelect = useLastCallback((group: ItemsGroup<TypeId>) => onSelect(group.ids));\n\n return (\n <NodeGroups\n resolver={resolver}\n onSelect={handleSelect}\n {...props}\n />\n );\n};\n\nconst resolver = (node: ManagedGraphNode) => {\n if (!node.item.isolator) {\n return;\n }\n\n const ids: TypeId[] = [node.id];\n\n return {\n value: node.id,\n label: node.title,\n ids,\n };\n};\n","import type { TypeId } from './types';\nimport type { GraphListeners } from './LoadNodes';\nimport type { ManagedGraphNode, IItem } from './ManagedGraphNode';\nimport type { ConnectionPoint, Coordinator, NodeConnection, Position, StoreInterface } from './graph';\n\nexport interface GraphHandlers<DTO, Item> {\n onCreate: (data: DTO) => Promise<Item>;\n onEdit: (item: Item) => void;\n onAddPort: (item: Item, input: boolean) => Promise<void>;\n onDisconnectPort: (item: Item, portId: TypeId) => Promise<void>;\n onDeletePort: (item: Item, portId: TypeId) => Promise<void>;\n onDelete: (item: Item) => Promise<void>;\n onMove: (item: Item, pos: Position) => Promise<void>;\n onConnect: (connection: NodeConnection<Item, TypeId>) => Promise<void>;\n onSelect?: (item: Item | null, pos: Position) => void | false;\n onContextMenu?: (item: Item | null, pos: Position) => void | false;\n}\n\nexport const createGraphHandlers = <DTO, Item extends IItem, Node extends ManagedGraphNode<Item>>(\n coordinator: Coordinator,\n nodes: StoreInterface<Node>,\n {\n onEdit,\n onConnect,\n onMove,\n onAddPort,\n onDisconnectPort,\n onDeletePort,\n onDelete,\n onSelect,\n onContextMenu,\n }: Partial<GraphHandlers<DTO, Item>> = {},\n) => {\n const handleAddPort = async (node: Node, input: boolean) => onAddPort?.(node.item, input);\n\n const handleDisconnectPort = async (node: Node, portId: TypeId) => onDisconnectPort?.(\n node.item,\n portId,\n );\n\n const handleDeletePort = async (node: Node, portId: TypeId) => onDeletePort?.(node.item, portId);\n\n const handleDelete = async (node: Node) => onDelete?.(node.item);\n\n const handleMove = async (node: Node, pos: Position) => onMove?.(\n node.item,\n coordinator.toData(pos),\n );\n\n const handleConnect = async ({ connect, input, source, target }: NodeConnection<TypeId>) => {\n if (!onConnect) {\n return;\n }\n\n const sourceNode = nodes.get(source.node)!;\n\n return onConnect({\n connect,\n input,\n source: { node: sourceNode.item, port: source.port },\n target: target\n ?.map(({ node: nodeId, port: portId }): ConnectionPoint<Item, TypeId> | undefined => {\n const node = nodes.get(nodeId);\n\n if (node) {\n return {\n node: node.item,\n port: portId,\n };\n }\n })\n .filter((p?: ConnectionPoint<Item, TypeId>) => !!p),\n });\n };\n\n const handleEdit = (node: Node) => onEdit?.(node.item);\n\n const handleSelect = (node: Node | null, pos: Position): void | false => onSelect?.(\n node?.item || null,\n coordinator.toData(pos),\n );\n\n const handleContextMenu = (node: Node | null, pos: Position): void | false => onContextMenu?.(\n node?.item || null,\n coordinator.toData(pos),\n );\n\n return {\n canvas: {\n onSelectNode: handleSelect,\n onContextMenu: handleContextMenu,\n },\n loader: {\n onEdit: handleEdit,\n onConnect: handleConnect,\n onMove: handleMove,\n onAddPort: handleAddPort,\n onDisconnectPort: handleDisconnectPort,\n onDeletePort: handleDeletePort,\n onDelete: handleDelete,\n } as GraphListeners<Node>,\n };\n};\n","import type { Ref } from 'react';\nimport { useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { useLastCallback } from '@ankhzet/ui';\nimport {\n type IMenuProvider,\n type Coordinator,\n type DragHandlers,\n type GraphNodeInterface,\n type Position,\n GraphAdapter,\n PIXIGUI,\n Viewport,\n} from './graph';\n\nconst ZERO = { x: 0, y: 0 };\n\nexport interface GraphNodeProps<Node extends GraphNodeInterface> {\n innerRef?: Ref<GraphRef<Node>>;\n coordinator: Coordinator;\n nodes: Node[];\n subset?: Node['id'][];\n menu: IMenuProvider<any>;\n onSelectNode: (node: Node | null, pos: Position) => void | false;\n onContextMenu: (node: Node | null, pos: Position) => void | false;\n}\n\nexport type GraphRef<Node extends GraphNodeInterface> = { graph: GraphAdapter<Node>; element?: HTMLDivElement };\n\nexport function GraphCanvas<Node extends GraphNodeInterface<ID, Data, Render>, ID = any, Data = any, Render = any>({\n innerRef,\n nodes,\n subset,\n coordinator,\n menu,\n onSelectNode,\n onContextMenu,\n ...rest\n}: GraphNodeProps<Node>) {\n const cursor = useRef(ZERO);\n const ref = useRef<{ element: HTMLDivElement; reset: (pos: Position) => void }>(null);\n const gui = useMemo(() => new PIXIGUI(menu), [menu]);\n const graph = useMemo(\n () =>\n new GraphAdapter<Node>({\n maxFPS: 120,\n grid: {\n cellSize: coordinator.gridSize,\n colors: [0x222222, 0x333333, 0x666666, 0x999999],\n },\n gui: [gui],\n }),\n [coordinator]\n );\n\n useImperativeHandle(innerRef, () => ({\n graph,\n get element() {\n return ref.current?.element;\n },\n }));\n\n const handleResize = useLastCallback(({ width, height }) => graph.resize(width, height));\n const handleGUI = useLastCallback(() => {\n const { x, y } = coordinator.toData(graph.translation);\n const { x: cx, y: cy } = coordinator.toData(cursor.current!);\n\n gui.text = `Pos: ${-(x - 1)} x ${-(y - 1)}\\nCursor: ${~~(cx - 1)} x ${~~(cy - 1)}`;\n });\n const onPointer = useLastCallback((pos) => {\n cursor.current = graph.fromLocal(pos);\n handleGUI();\n });\n const onUp = useLastCallback((pos) => {\n cursor.current = graph.fromLocal(pos);\n graph.releaseNode();\n handleGUI();\n });\n const onClick = useLastCallback((pos, e?: MouseEvent) => {\n onPointer(pos);\n\n if (graph.capturing && !e?.shiftKey) {\n onSelectNode(null, coordinator.toData(cursor.current));\n }\n\n if (false === onSelectNode(graph.capturing || null, coordinator.toData(cursor.current))) {\n graph.releaseNode();\n\n return false;\n }\n });\n const onDrag = useLastCallback((pos) => {\n if (graph.capturing) {\n return;\n }\n\n graph.translate(pos);\n handleGUI();\n });\n const onContext = useLastCallback((pos: Position) => {\n if (false === onClick(pos)) {\n return false;\n }\n\n if (false === onContextMenu(graph.capturing || null, coordinator.toData(cursor.current))) {\n graph.releaseNode();\n\n return false;\n }\n });\n\n const handlers = useMemo<DragHandlers>(\n () => ({\n get position() {\n return graph.translation;\n },\n onDrag,\n onPointer,\n onClick,\n onUp,\n onContext,\n }),\n [graph]\n );\n\n useEffect(() => {\n const renderer = ref.current;\n\n if (!renderer) {\n return;\n }\n\n const ids = subset || nodes.map(({ id }) => id);\n\n graph.batch(() => {\n for (const node of graph) {\n if (!ids.includes(node.id)) {\n graph.removeNode(node);\n }\n }\n\n for (const node of nodes) {\n if (ids.includes(node.id)) {\n graph.addNode(node);\n graph.moveNodeTo(node, node.position);\n }\n }\n\n graph.layout();\n });\n }, [subset, nodes]);\n\n useLayoutEffect(() => {\n const container = ref.current?.element;\n\n if (!container) {\n return;\n }\n\n return graph.mount(container, {\n viewport: {\n width: container.clientWidth,\n height: container.clientHeight,\n resolution: window.devicePixelRatio,\n backgroundColor: 0x141414,\n antialias: true,\n transparent: false,\n },\n });\n }, [graph]);\n\n return <Viewport ref={ref} handlers={handlers} onResize={handleResize} {...rest} />;\n}\n","import type { TypeId } from './types';\nimport type { NodeConnection, Position, StoreInterface } from './graph';\nimport { ManagedGraphNode } from './ManagedGraphNode';\n\nexport type GraphListeners<N extends ManagedGraphNode<any>> = {\n onEdit: (node: N) => void;\n onConnect: (connection: NodeConnection<TypeId>) => Promise<void>;\n onMove: (node: N, pos: Position) => Promise<void>;\n onAddPort: (node: N, input: boolean) => Promise<void>;\n onDisconnectPort: (node: N, portId: TypeId) => Promise<void>;\n onDeletePort: (node: N, portId: TypeId) => Promise<void>;\n onDelete: (node: N) => Promise<void>;\n};\n\ntype SyncConfig<N extends ManagedGraphNode<any>> = { added: N[]; removed: TypeId[] };\n\nconst connectHandlers = <N extends ManagedGraphNode>(\n node: N,\n { onEdit, onMove, onConnect, onDelete, onAddPort, onDisconnectPort, onDeletePort }: GraphListeners<N>,\n) => {\n node.onConnect(onConnect);\n node.onMove((pos) => onMove(node, pos));\n node.onEditAction(() => onEdit(node));\n node.onDeleteAction(() => onDelete(node));\n node.onAddPortAction((input) => onAddPort(node, input));\n node.onDisconnectPortAction(({ port }) => onDisconnectPort(node, port));\n node.onDeletePortAction(({ port }) => onDeletePort(node, port));\n};\n\nexport const syncNodes = <N extends ManagedGraphNode<any>>(\n nodes: StoreInterface<N>,\n handlers: GraphListeners<N> | undefined,\n { added, removed }: SyncConfig<N>,\n) => {\n if (added.length) {\n const intermediate = added.reduce(\n (acc, node) => ((acc[node.id] = node), acc),\n {} as Record<TypeId, N>,\n );\n const getNode = (id: TypeId) => intermediate[id] || nodes.find((node) => node.id === id);\n\n for (const node of added) {\n const ports = node.item.ports;\n\n if (!ports.length) {\n continue;\n }\n\n const fromId = node.item.id;\n\n for (const { id, to, port, input } of ports) {\n if (!to) {\n continue;\n }\n\n const toNode = getNode(to.id);\n\n if (toNode) {\n const toPort = toNode.getItemPort(({ to, name }) => to?.id === fromId && name === port);\n\n if (toPort) {\n node.connect({\n connect: true,\n input,\n port: id,\n nodes: [\n {\n node: toNode,\n port: toPort.id,\n },\n ],\n });\n }\n }\n }\n }\n\n if (handlers) {\n for (const node of added) {\n connectHandlers(node, handlers);\n }\n }\n\n nodes.add(added);\n }\n\n if (removed.length) {\n for (const item of removed) {\n nodes.remove(item);\n }\n }\n};\n","import type { Coordinator, IMenu, IMenuItem, IMenuProvider, Position } from './graph';\n\nexport const MENU_GROUPS = (): Array<{\n label: string;\n items: Array<IMenuItem<{ title: string; args: Partial<Record<string, string>> }>>;\n}> => [\n {\n label: 'Add node',\n items: [\n {\n label: '+ Call',\n data: {\n title: 'Call',\n args: {\n ports: JSON.stringify({ in: ['input'], out: ['output'] }),\n system: 'You are helpful assistant',\n instructions: 'Summarize following input:\\n{|input|}',\n llm: 'Result:\\n',\n },\n },\n },\n ],\n },\n {\n label: 'Add specific node',\n items: [\n {\n label: '+ Splitter (2)',\n data: {\n title: 'Splitter',\n args: {\n ports: JSON.stringify({ in: ['i'], out: ['o1', 'o2'] }),\n js: 'const value = get($i);\\nset($o1, value);\\nset($o2, value);\\n',\n },\n },\n },\n { label: '', separator: true },\n {\n label: '+ JSON → Ports',\n data: {\n title: 'From JSON',\n args: {\n ports: JSON.stringify({ in: ['json'], out: ['o1', 'o2', 'o3'] }),\n js: 'const value = get($json);\\ntry {\\n set(JSON.parse(value));\\n} catch (e) {\\nset({}); // default\\n}\\n',\n },\n },\n },\n ],\n },\n];\n\nexport interface GraphDTO {\n title: string;\n x: number;\n y: number;\n args?: Partial<Record<string, string>>;\n}\n\nexport const useGraphMenu = <DTO extends GraphDTO>(\n coordinator: Coordinator,\n onCreate?: (data: DTO) => void,\n): IMenuProvider<any> => {\n return {\n getMenu(_tag: any, pos: Position): IMenu<any> {\n const base = { action: 'add', ...coordinator.toData(pos) };\n\n return {\n items: MENU_GROUPS().map(({ label, items }) => [\n { label, group: true } as IMenuItem,\n ...items.map(\n ({ label, data, ...rest }): IMenuItem<GraphDTO & { action: string }> => ({\n label,\n data: data && { ...base, ...data },\n ...rest,\n }),\n ),\n ]).flat(),\n };\n },\n handleMenu({ action, ...payload }: GraphDTO & { action: 'add' }) {\n switch (action) {\n case 'add':\n return void onCreate?.(payload as DTO);\n }\n },\n };\n};\n","import { useRef } from 'react';\nimport { matchId } from '@ankhzet/utils';\nimport { useIsomorphicLayoutEffect } from '@ankhzet/ui';\n\nimport type { ManagedGraphNode, IItem } from './ManagedGraphNode';\n\nexport const useNodeSelection = <Item extends IItem>(nodes: ManagedGraphNode<Item>[], selected?: Item[]) => {\n const ref = useRef<Item[]>([]);\n\n useIsomorphicLayoutEffect(() => {\n const added = selected?.filter((item) => !ref.current.some(matchId(item.id)));\n const removed = ref.current.filter((item) => !selected?.some(matchId(item.id)));\n\n if (removed) {\n for (const { id } of removed) {\n nodes.find(matchId(id))?.setSelected(false);\n }\n }\n\n if (added) {\n for (const { id } of added) {\n nodes.find(matchId(id))?.setSelected(true);\n }\n }\n\n ref.current = selected || [];\n }, [selected, nodes]);\n};\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport type { IMenu, IMenuProvider, NodeJoint, Position, ConnectionPoint, Coordinator } from './graph';\nimport type { TypeId, Identifiable } from './types';\nimport { GraphNode } from './graph';\nimport { Container, RectSpinner, PIXIStacked, PIXIOutlined } from './graph/render';\n\nexport const isChannelName = (name: string) => name.startsWith('channel_');\nexport const getChannelName = (name: string) => (isChannelName(name) ? name.slice(8) : '');\n\nexport interface IItem extends Identifiable, Position {\n isolator: boolean;\n title: string;\n ports: IItemPort<this>[];\n}\n\nexport interface IItemPort<Item> extends Identifiable {\n name: string;\n input: boolean;\n to: Item | null;\n port: string | null;\n}\n\nexport type Resolver<Item> = (id: TypeId) => Item | undefined;\n\nexport type ToTitle<Item> = (item: Item) => string;\n\nexport type MenuAction =\n | { action: MenuActions.ADD_PORT; input: boolean }\n | { action: MenuActions.DISCONNECT_PORT | MenuActions.DELETE_PORT; port?: NodeJoint<TypeId> }\n | { action: MenuActions.EDIT_NODE | MenuActions.DELETE_NODE };\n\nconst translatePort = <Item extends IItem>(find: Resolver<Item>) => ({\n id,\n name,\n input,\n to,\n port: portName,\n}: IItemPort<Item>): NodeJoint<TypeId> => {\n const channel = getChannelName(name);\n\n if (channel) {\n name = `${input ? '> ' : ''}@${channel}${input ? '' : ' >'}`;\n }\n\n const nodes: ConnectionPoint<TypeId>[] = [];\n\n if (to) {\n const node = find(to.id);\n const port = node?.ports.find(({ name }) => name === portName);\n\n if (port) {\n nodes.push({\n node: to.id,\n port: port.id,\n });\n }\n }\n\n return {\n port: id,\n name,\n nodes,\n };\n};\n\nexport enum NodeStatus {\n Idle = 1 << 0,\n Processing = 1 << 1,\n Done = 1 << 2,\n Error = 1 << 3,\n Selected = 1 << 4,\n}\n\nexport type NodeData<Item> = {\n item: Item;\n status: NodeStatus;\n progress: number;\n};\n\nexport enum MenuActions {\n EDIT_NODE = 1,\n ADD_PORT = 2,\n DISCONNECT_PORT = 3,\n DELETE_PORT = 4,\n DELETE_NODE = 5,\n}\n\nexport class ManagedGraphNode<Item extends IItem = IItem>\n extends GraphNode<TypeId, NodeData<Item>, Container>\n implements IMenuProvider<MenuAction>\n{\n #shape?: RectSpinner;\n #outline?: PIXIStacked<PIXIOutlined>;\n\n public constructor({ finder, item, coordinator, toTitle }: {\n finder: Resolver<Item>;\n item: Item;\n coordinator: Coordinator;\n toTitle: ToTitle<Item>;\n }) {\n super({\n coordinator,\n item: item,\n status: NodeStatus.Idle,\n progress: 0,\n id: item.id,\n title: toTitle(item),\n inputs: item.ports.filter(({ input }) => !!input).map(translatePort(finder)),\n outputs: item.ports.filter(({ input }) => !input).map(translatePort(finder)),\n });\n\n this.position = this.coordinator.toGraph(item);\n }\n\n public dispose() {\n super.dispose();\n\n if (this.#outline) {\n this.#outline.destroy({});\n this.#outline = undefined;\n }\n\n if (this.#shape) {\n this.#shape.destroy({});\n this.#shape = undefined;\n }\n }\n\n public getMenu(tag?: { type: 'node' | 'port'; id: TypeId }): IMenu<any> | undefined {\n switch (tag?.type) {\n case 'node':\n return {\n items: [\n { label: this.title, group: true },\n { label: 'Edit', data: { action: MenuActions.EDIT_NODE } },\n { label: '', separator: true },\n { label: 'Add input port', data: { action: MenuActions.ADD_PORT, input: true } },\n { label: 'Add output port', data: { action: MenuActions.ADD_PORT, input: false } },\n { label: '', separator: true },\n { label: 'Delete node', data: { action: MenuActions.DELETE_NODE } },\n ],\n };\n\n case 'port':\n const input = this.inputs.find((joint) => joint.port === tag.id);\n const output = this.outputs.find((joint) => joint.port === tag.id);\n const found = input || output;\n const bound = !!(found && found.nodes.length);\n\n return {\n items: [\n { label: `Port \"${found?.name || '<?>'}\"`, group: true },\n {\n label: 'Disconnect',\n disabled: !bound,\n data: { action: MenuActions.DISCONNECT_PORT, port: found },\n },\n { label: '', separator: true },\n { label: 'Delete', disabled: !found, data: { action: MenuActions.DELETE_PORT, port: found } },\n ],\n };\n }\n }\n\n public handleMenu(data: MenuAction): void | false {\n switch (data?.action) {\n case MenuActions.ADD_PORT:\n return this.dispatchEvent(data?.action, data.input);\n\n case MenuActions.DISCONNECT_PORT:\n case MenuActions.DELETE_PORT:\n return data.port && this.dispatchEvent(data?.action, data.port);\n\n case MenuActions.EDIT_NODE:\n case MenuActions.DELETE_NODE:\n return this.dispatchEvent(data?.action, this.id);\n }\n }\n\n public onAddPortAction(handler: IEventHandler<boolean>) {\n return this.handleEvent(MenuActions.ADD_PORT, handler);\n }\n\n public onDisconnectPortAction(handler: IEventHandler<NodeJoint<TypeId>>) {\n return this.handleEvent(MenuActions.DISCONNECT_PORT, handler);\n }\n\n public onDeletePortAction(handler: IEventHandler<NodeJoint<TypeId>>) {\n return this.handleEvent(MenuActions.DELETE_PORT, handler);\n }\n\n public onEditAction(handler: IEventHandler<TypeId>) {\n return this.handleEvent(MenuActions.EDIT_NODE, handler);\n }\n\n public onDeleteAction(handler: IEventHandler<TypeId>) {\n return this.handleEvent(MenuActions.DELETE_NODE, handler);\n }\n\n public setStatus(status: NodeStatus) {\n this.description.status = status;\n\n if (status !== NodeStatus.Processing) {\n this.setProgress(0);\n }\n }\n\n public setProgress(progress: number) {\n this.description.progress = progress;\n this.#shape?.setActive(this.isInProgress);\n }\n\n public setSelected(value: boolean) {\n if (value === this.isSelected) {\n return;\n }\n\n this.description.status = value ? this.description.status | NodeStatus.Selected : this.description.status ^ NodeStatus.Selected;\n\n if (this.#outline) {\n this.#outline.first.active = value;\n }\n }\n\n public get item(): Item {\n return this.description.item;\n }\n\n public getItemPort(predicate: (port: IItemPort<Item>) => boolean): IItemPort<Item> | undefined {\n return this.item.ports.find(predicate);\n }\n\n public get isSelected() {\n return !!(this.description.status & NodeStatus.Selected);\n }\n\n public get isInProgress() {\n return !!(this.description.status & NodeStatus.Processing) || this.description.progress > 0;\n }\n\n public render(content: Container) {\n const width = ~~content.width - 1;\n const height = ~~content.height - 2;\n\n if (this.#outline) {\n this.#outline.hotSwap(content);\n } else {\n this.#outline = new PIXIStacked(\n new PIXIOutlined({\n width,\n height,\n color: 0x33ffff,\n lineSize: 1,\n radius: 4,\n }),\n content,\n );\n }\n\n this.#outline.first.active = this.isSelected;\n\n if (this.#shape) {\n this.#shape.hotSwap(this.#outline);\n } else {\n this.#shape = new RectSpinner(this.#outline, {\n sizeX: width,\n sizeY: height,\n color: 0x3333ff,\n lineSize: 3,\n radius: 4,\n });\n }\n\n this.#shape.setActive(this.isInProgress);\n\n return this.#shape;\n }\n}\n","import { useMemo, useRef } from 'react';\nimport { useIsomorphicLayoutEffect, usePrevious } from '@ankhzet/ui';\nimport { reaction } from 'mobx';\nimport { useLastCallback, useSyncStore } from '@ankhzet/ui';\nimport type { Coordinator} from './graph';\nimport { isEqualIdentifiables } from './graph';\nimport { ManagedGraphNode, IItem } from './ManagedGraphNode';\nimport { TypeId } from './types';\n\nexport const useNodes = <Item extends IItem>({\n coordinator,\n sync,\n onUpdate,\n store,\n toTitle,\n}: {\n store: { get: () => Item[]; onChange: (cb: () => void) => () => void };\n coordinator: Coordinator;\n sync: (config: { added: ManagedGraphNode<Item>[]; removed: TypeId[] }) => void;\n toTitle: (item: Item) => string;\n onUpdate: () => void;\n}) => {\n const ref = useRef(sync);\n const methods = useMemo(\n () => ({\n subscribe: (cb: () => void) => store.onChange(cb),\n getSnapshot: () => store.get(),\n selector: (items: Item[]) => items.sort((a, b) => a.id.localeCompare(b.id)),\n is: isEqualIdentifiables,\n }),\n [store]\n );\n\n const items = useSyncStore(\n //\n methods.subscribe,\n methods.getSnapshot,\n methods.getSnapshot,\n methods.selector,\n methods.is\n );\n const prev = usePrevious(items);\n const finder = useLastCallback((id: TypeId): Item | undefined => items.find((item) => item.id === id));\n\n ref.current = sync;\n\n useIsomorphicLayoutEffect(() => {\n const factory = (item: Item): ManagedGraphNode<Item> => new ManagedGraphNode<Item>({\n finder,\n item,\n coordinator,\n toTitle,\n });\n\n if (prev) {\n const cache: Record<TypeId, boolean> = prev.reduce(\n (acc: Record<TypeId, boolean>, { id }) => ((acc[id] = true), acc),\n {}\n );\n const added = items.filter((item) => !cache[item.id]).map(factory);\n const removed = Object.keys(cache).filter((id) => !finder(id));\n\n if (added.length || removed.length) {\n void ref.current({ added, removed });\n }\n } else {\n void ref.current({ added: items.map(factory), removed: [] });\n }\n }, [items, toTitle]);\n\n useIsomorphicLayoutEffect(() => reaction(() => items, onUpdate), []);\n};\n","import type { ManagedGraphNode } from './ManagedGraphNode';\nimport type { Coordinator, Position } from './graph';\n\nexport const GRID_SIZE = 16;\nexport const PORT_SIZE = 8;\nexport const LANE_SIZE = 16;\nexport const SPACE_SIZE = 32;\n\nexport class Coordinates implements Coordinator {\n grid: number;\n gridSize: Position;\n sizes: {\n grid: Position;\n port: number;\n lane: number;\n space: number;\n };\n\n public constructor(grid: number) {\n this.grid = grid;\n this.gridSize = { x: grid, y: grid };\n this.sizes = {\n grid: this.gridSize,\n port: PORT_SIZE,\n lane: LANE_SIZE,\n space: SPACE_SIZE,\n };\n }\n\n public snap(value: number) {\n const negatve = value < 0;\n const mul = negatve ? -1 : 1;\n\n return mul * (Math.round((mul * value) / this.grid + 0.5) - 0.5) * this.grid;\n }\n\n public toGraph({ x, y }: Position) {\n return {\n x: (x - 0.5) * this.grid,\n y: (y - 0.5) * this.grid,\n };\n }\n\n public toData({ x, y }: Position) {\n return {\n x: ~~(this.snap(x) / this.grid + 0.5),\n y: ~~(this.snap(y) / this.grid + 0.5),\n };\n }\n}\n\nexport const groupResolver = ({ description: { item } }: ManagedGraphNode) => item.isolator ? item.title : null;\n\nconst re = /^signal_?/;\n\nexport const isBarrier = ({ description }: ManagedGraphNode<any>) => re.test(description.title);\n","import { useLastCallback, handleAsNoop, Styles } from '@ankhzet/ui';\nimport { RefObject, useRef, useMemo, useState, PropsWithChildren, useImperativeHandle } from 'react';\nimport { GraphGroups } from './GraphGroups';\nimport type { ManagedGraphNode, IItem } from './ManagedGraphNode';\nimport { type GraphHandlers, createGraphHandlers } from './createGraphHandlers';\nimport type { GraphAdapter } from './graph';\nimport { Store, useStore } from './graph';\nimport { GraphCanvas } from './GraphCanvas';\nimport { syncNodes } from './LoadNodes';\nimport type { TypeId, Identifiable } from './types';\nimport { useGraphMenu, GraphDTO } from './useGraphMenu';\nimport { useNodeSelection } from './useNodeSelection';\nimport { useNodes } from './useNodes';\nimport { Coordinates, GRID_SIZE } from './utils';\n\nexport type { GraphHandlers };\n\nexport interface IGraph<Item extends IItem> extends Identifiable {\n items: Item[];\n}\n\nexport interface ManagedGraphProps<Graph extends IGraph<Item>, Item extends IItem, DTO> {\n innerRef?: RefObject<{ graph: GraphAdapter<ManagedGraphNode<Item>>; element?: HTMLDivElement }>;\n graph: Graph;\n selected?: Item[];\n className?: string;\n handlers?: Partial<GraphHandlers<DTO, Item>>;\n onExport?: (graph: Graph) => string;\n}\n\nexport const ManagedGraph = <Graph extends IGraph<Item>, Item extends IItem, DTO extends GraphDTO>({\n innerRef,\n graph,\n selected,\n handlers,\n children,\n onExport,\n ...rest\n}: PropsWithChildren<ManagedGraphProps<Graph, Item, DTO>>) => {\n const graphRef = useRef<{ graph: GraphAdapter<ManagedGraphNode<Item>>; element?: HTMLDivElement }>(null);\n const coordinator = useMemo(() => new Coordinates(GRID_SIZE), []);\n const menu = useGraphMenu(coordinator, handlers?.onCreate);\n const [nodes, all] = useStore(() => new Store<ManagedGraphNode<Item>>());\n const [group, setGroup] = useState<TypeId[] | undefined>();\n const { canvas, loader } = createGraphHandlers(coordinator, nodes, handlers);\n\n const handleExport = useLastCallback(() => onExport?.(graph));\n\n useImperativeHandle(innerRef, () => ({\n get graph() {\n return graphRef.current?.graph!;\n },\n get element() {\n return graphRef.current?.element;\n },\n }));\n\n const store = useMemo(() => {\n const items = new Store<Item>(graph.items);\n\n return {\n items,\n get: () => items.all,\n onChange: (cb: () => void) => items.onChange(cb),\n };\n }, [graph.items]);\n\n useNodes({\n store,\n coordinator,\n toTitle: (item) => item.title,\n sync: (config) => syncNodes(nodes, loader, config),\n onUpdate: () => innerRef?.current?.graph.layout(),\n });\n\n useNodeSelection(all, selected);\n\n return (\n <div onContextMenu={handleAsNoop} style={styles.root} {...rest}>\n <div style={styles.selector}>\n {children}\n\n <GraphGroups items={all} onSelect={setGroup} />\n\n <button onClick={() => setGroup(undefined)}>Update</button>\n\n {onExport && (\n <button onClick={handleExport}>Export</button>\n )}\n </div>\n\n <GraphCanvas\n innerRef={graphRef}\n coordinator={coordinator}\n nodes={all}\n subset={group}\n menu={menu}\n {...canvas}\n />\n </div>\n );\n};\n\nconst styles = Styles.of({\n root: {\n flex: 1,\n display: 'flex',\n alignSelf: 'stretch',\n gap: 10,\n },\n selector: {\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n },\n});\n"],"mappings":"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"}
|