@pauloricca/spagbol 0.0.0-stage → 0.1.0

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.
Files changed (154) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +330 -2
  3. package/dist/controls.css +122 -0
  4. package/dist/core/controller.d.ts +89 -0
  5. package/dist/core/controller.d.ts.map +1 -0
  6. package/dist/core/controller.js +732 -0
  7. package/dist/core/controller.js.map +1 -0
  8. package/dist/core/graph.d.ts +30 -0
  9. package/dist/core/graph.d.ts.map +1 -0
  10. package/dist/core/graph.js +318 -0
  11. package/dist/core/graph.js.map +1 -0
  12. package/dist/core/grouping.d.ts +10 -0
  13. package/dist/core/grouping.d.ts.map +1 -0
  14. package/dist/core/grouping.js +130 -0
  15. package/dist/core/grouping.js.map +1 -0
  16. package/dist/core/groups.d.ts +40 -0
  17. package/dist/core/groups.d.ts.map +1 -0
  18. package/dist/core/groups.js +164 -0
  19. package/dist/core/groups.js.map +1 -0
  20. package/dist/core/index.d.ts +8 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/core/index.js +8 -0
  23. package/dist/core/index.js.map +1 -0
  24. package/dist/core/model.d.ts +182 -0
  25. package/dist/core/model.d.ts.map +1 -0
  26. package/dist/core/model.js +149 -0
  27. package/dist/core/model.js.map +1 -0
  28. package/dist/core/observations.d.ts +10 -0
  29. package/dist/core/observations.d.ts.map +1 -0
  30. package/dist/core/observations.js +36 -0
  31. package/dist/core/observations.js.map +1 -0
  32. package/dist/core/serialization.d.ts +9 -0
  33. package/dist/core/serialization.d.ts.map +1 -0
  34. package/dist/core/serialization.js +148 -0
  35. package/dist/core/serialization.js.map +1 -0
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +4 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/link-controls.css +123 -0
  41. package/dist/react/Controls.d.ts +18 -0
  42. package/dist/react/Controls.d.ts.map +1 -0
  43. package/dist/react/Controls.js +301 -0
  44. package/dist/react/Controls.js.map +1 -0
  45. package/dist/react/SpagbolCanvas.d.ts +38 -0
  46. package/dist/react/SpagbolCanvas.d.ts.map +1 -0
  47. package/dist/react/SpagbolCanvas.js +1210 -0
  48. package/dist/react/SpagbolCanvas.js.map +1 -0
  49. package/dist/react/SpagbolCanvasControls.d.ts +36 -0
  50. package/dist/react/SpagbolCanvasControls.d.ts.map +1 -0
  51. package/dist/react/SpagbolCanvasControls.js +113 -0
  52. package/dist/react/SpagbolCanvasControls.js.map +1 -0
  53. package/dist/react/SpagbolCanvasFlow.d.ts +14 -0
  54. package/dist/react/SpagbolCanvasFlow.d.ts.map +1 -0
  55. package/dist/react/SpagbolCanvasFlow.js +6 -0
  56. package/dist/react/SpagbolCanvasFlow.js.map +1 -0
  57. package/dist/react/SpagbolCanvasLinkControls.d.ts +16 -0
  58. package/dist/react/SpagbolCanvasLinkControls.d.ts.map +1 -0
  59. package/dist/react/SpagbolCanvasLinkControls.js +7 -0
  60. package/dist/react/SpagbolCanvasLinkControls.js.map +1 -0
  61. package/dist/react/SpagbolCanvasMenu.d.ts +12 -0
  62. package/dist/react/SpagbolCanvasMenu.d.ts.map +1 -0
  63. package/dist/react/SpagbolCanvasMenu.js +65 -0
  64. package/dist/react/SpagbolCanvasMenu.js.map +1 -0
  65. package/dist/react/SpagbolControlNumber.d.ts +25 -0
  66. package/dist/react/SpagbolControlNumber.d.ts.map +1 -0
  67. package/dist/react/SpagbolControlNumber.js +209 -0
  68. package/dist/react/SpagbolControlNumber.js.map +1 -0
  69. package/dist/react/SpagbolControlNumberLink.d.ts +6 -0
  70. package/dist/react/SpagbolControlNumberLink.d.ts.map +1 -0
  71. package/dist/react/SpagbolControlNumberLink.js +159 -0
  72. package/dist/react/SpagbolControlNumberLink.js.map +1 -0
  73. package/dist/react/SpagbolControlZoom.d.ts +11 -0
  74. package/dist/react/SpagbolControlZoom.d.ts.map +1 -0
  75. package/dist/react/SpagbolControlZoom.js +24 -0
  76. package/dist/react/SpagbolControlZoom.js.map +1 -0
  77. package/dist/react/SpagbolNodeFrame.d.ts +35 -0
  78. package/dist/react/SpagbolNodeFrame.d.ts.map +1 -0
  79. package/dist/react/SpagbolNodeFrame.js +169 -0
  80. package/dist/react/SpagbolNodeFrame.js.map +1 -0
  81. package/dist/react/SpagbolNodeFrameTypePicker.d.ts +9 -0
  82. package/dist/react/SpagbolNodeFrameTypePicker.d.ts.map +1 -0
  83. package/dist/react/SpagbolNodeFrameTypePicker.js +68 -0
  84. package/dist/react/SpagbolNodeFrameTypePicker.js.map +1 -0
  85. package/dist/react/SpagbolNodeGroupPort.d.ts +15 -0
  86. package/dist/react/SpagbolNodeGroupPort.d.ts.map +1 -0
  87. package/dist/react/SpagbolNodeGroupPort.js +62 -0
  88. package/dist/react/SpagbolNodeGroupPort.js.map +1 -0
  89. package/dist/react/SpagbolNodeGroupPortAdd.d.ts +5 -0
  90. package/dist/react/SpagbolNodeGroupPortAdd.d.ts.map +1 -0
  91. package/dist/react/SpagbolNodeGroupPortAdd.js +27 -0
  92. package/dist/react/SpagbolNodeGroupPortAdd.js.map +1 -0
  93. package/dist/react/context.d.ts +84 -0
  94. package/dist/react/context.d.ts.map +1 -0
  95. package/dist/react/context.js +43 -0
  96. package/dist/react/context.js.map +1 -0
  97. package/dist/react/duplicateDrag.d.ts +19 -0
  98. package/dist/react/duplicateDrag.d.ts.map +1 -0
  99. package/dist/react/duplicateDrag.js +71 -0
  100. package/dist/react/duplicateDrag.js.map +1 -0
  101. package/dist/react/flowPresentation.d.ts +11 -0
  102. package/dist/react/flowPresentation.d.ts.map +1 -0
  103. package/dist/react/flowPresentation.js +50 -0
  104. package/dist/react/flowPresentation.js.map +1 -0
  105. package/dist/react/geometry.d.ts +13 -0
  106. package/dist/react/geometry.d.ts.map +1 -0
  107. package/dist/react/geometry.js +43 -0
  108. package/dist/react/geometry.js.map +1 -0
  109. package/dist/react/index.d.ts +11 -0
  110. package/dist/react/index.d.ts.map +1 -0
  111. package/dist/react/index.js +11 -0
  112. package/dist/react/index.js.map +1 -0
  113. package/dist/react/portState.d.ts +10 -0
  114. package/dist/react/portState.d.ts.map +1 -0
  115. package/dist/react/portState.js +35 -0
  116. package/dist/react/portState.js.map +1 -0
  117. package/dist/react/viewport.d.ts +24 -0
  118. package/dist/react/viewport.d.ts.map +1 -0
  119. package/dist/react/viewport.js +55 -0
  120. package/dist/react/viewport.js.map +1 -0
  121. package/dist/styles.css +748 -0
  122. package/package.json +58 -4
  123. package/src/core/controller.ts +844 -0
  124. package/src/core/graph.ts +451 -0
  125. package/src/core/grouping.ts +159 -0
  126. package/src/core/groups.ts +125 -0
  127. package/src/core/index.ts +7 -0
  128. package/src/core/model.ts +304 -0
  129. package/src/core/observations.ts +31 -0
  130. package/src/core/serialization.ts +184 -0
  131. package/src/index.ts +9 -0
  132. package/src/react/Controls.tsx +355 -0
  133. package/src/react/SpagbolCanvas.tsx +1859 -0
  134. package/src/react/SpagbolCanvasControls.tsx +255 -0
  135. package/src/react/SpagbolCanvasFlow.tsx +38 -0
  136. package/src/react/SpagbolCanvasLinkControls.tsx +21 -0
  137. package/src/react/SpagbolCanvasMenu.tsx +121 -0
  138. package/src/react/SpagbolControlNumber.tsx +297 -0
  139. package/src/react/SpagbolControlNumberLink.tsx +209 -0
  140. package/src/react/SpagbolControlZoom.tsx +102 -0
  141. package/src/react/SpagbolNodeFrame.tsx +329 -0
  142. package/src/react/SpagbolNodeFrameTypePicker.tsx +51 -0
  143. package/src/react/SpagbolNodeGroupPort.tsx +111 -0
  144. package/src/react/SpagbolNodeGroupPortAdd.tsx +48 -0
  145. package/src/react/context.tsx +146 -0
  146. package/src/react/controls.css +122 -0
  147. package/src/react/duplicateDrag.ts +97 -0
  148. package/src/react/flowPresentation.ts +56 -0
  149. package/src/react/geometry.ts +53 -0
  150. package/src/react/index.ts +61 -0
  151. package/src/react/link-controls.css +123 -0
  152. package/src/react/portState.ts +24 -0
  153. package/src/react/styles.css +748 -0
  154. package/src/react/viewport.ts +90 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpagbolCanvas.js","sourceRoot":"","sources":["../../src/react/SpagbolCanvas.tsx"],"names":[],"mappings":"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","sourcesContent":["import { createPortal } from \"react-dom\";\nimport { SpagbolCanvasLinkControls } from \"./SpagbolCanvasLinkControls.js\";\nimport { SpagbolCanvasFlow } from \"./SpagbolCanvasFlow.js\";\nimport {\n BaseEdge,\n ConnectionLineType,\n EdgeLabelRenderer,\n Handle,\n Position,\n ReactFlow,\n ReactFlowProvider,\n SelectionMode,\n ViewportPortal,\n useReactFlow,\n useStore,\n useStoreApi,\n useUpdateNodeInternals,\n useNodeId,\n useNodesInitialized,\n useViewport,\n type Connection,\n type Edge,\n type EdgeProps,\n type Node,\n type NodeProps,\n type NodeChange,\n type EdgeChange,\n type OnConnectStartParams,\n type Viewport,\n type ReactFlowInstance,\n} from \"@xyflow/react\";\nimport {\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type PointerEvent,\n type ReactNode,\n} from \"react\";\nimport {\n areaMembers,\n groupPanelLayout,\n spagbolGroupKinds,\n copyFragment,\n createId,\n portsFor,\n readFragment,\n type Diagnostic,\n type GraphArea,\n type GraphEditor,\n type GraphLink,\n type GraphNode,\n type LinkTarget,\n type Point,\n} from \"../core/index.js\";\nimport {\n GraphContext,\n useEditorSnapshot,\n useEditorSelector,\n useSpagbol,\n type SpagbolCanvasSlots,\n type SpagbolCanvasFeatures,\n type SpagbolTheme,\n type SpagbolNodeView,\n} from \"./context.js\";\nimport { SpagbolNodeFrame, SpagbolNodePanel, useNodeViewProps } from \"./SpagbolNodeFrame.js\";\nimport { SpagbolControlNumber } from \"./SpagbolControlNumber.js\";\nimport {\n SpagbolCanvasControls,\n type SpagbolCanvasControlsOptions,\n} from \"./SpagbolCanvasControls.js\";\nimport {\n rememberMeasurements,\n reuseFlowPresentations,\n stationaryReconnectEdge,\n} from \"./flowPresentation.js\";\nimport {\n duplicateDragPresentation,\n type DuplicateDrag,\n} from \"./duplicateDrag.js\";\nimport {\n translateExtentForVisibleContent,\n clampViewportToTranslateExtent,\n infiniteCanvasExtent,\n} from \"./viewport.js\";\nimport {\n anchorFlowId,\n areaFlowId,\n linkPath,\n nodeFlowId,\n parseHandle,\n sourceHandle,\n targetHandle,\n} from \"./geometry.js\";\n\ninterface FlowData extends Record<string, unknown> {\n node?: GraphNode;\n area?: GraphArea;\n linkId?: string;\n projected?: boolean;\n stationaryOriginal?: boolean;\n}\ntype FlowNode = Node<FlowData, \"spagbolNode\" | \"spagbolArea\" | \"spagbolAnchor\">;\ninterface LinkData extends Record<string, unknown> {\n link: GraphLink;\n emphasized?: boolean;\n dimmed?: boolean;\n feedback?: boolean;\n control?: boolean;\n virtual?: boolean;\n disabled?: boolean;\n preview?: boolean;\n}\ntype FlowLink = Edge<LinkData, \"spagbolLink\">;\nexport interface SpagbolLinkPresentation {\n feedback?: boolean;\n control?: boolean;\n virtual?: boolean;\n}\nexport interface SpagbolCanvasProps extends SpagbolCanvasSlots {\n editor: GraphEditor;\n views?: Readonly<Record<string, SpagbolNodeView>>;\n /** Limit creation/type conversion without discarding existing unsupported nodes. */\n nodeKinds?: readonly string[];\n /** Domain conversion, e.g. capturing an asset before replacing a DSP node. */\n onChangeNodeKind?(id: string, kind: string): void | Promise<void>;\n features?: SpagbolCanvasFeatures;\n diagnostics?: readonly Diagnostic[];\n linkPresentation?: Readonly<Record<string, SpagbolLinkPresentation>>;\n /** Read-only domain relationships, never stored, copied or selected. */\n virtualLinks?: readonly GraphLink[];\n className?: string;\n style?: SpagbolTheme;\n defaultViewport?: Viewport;\n onViewportChange?(viewport: Viewport): void;\n onInit?(instance: ReactFlowInstance): void;\n /** Teia-style content bounds by default; optional margin in screen proportions. */\n panBounds?: false | { emptyScreenRatio?: number };\n onRenderTarget?(key: string, element: HTMLElement | null): void;\n toolbar?: boolean | ReactNode;\n controls?: SpagbolCanvasControlsOptions | false;\n ariaLabel?: string;\n}\nconst emptyViews: Readonly<Record<string, SpagbolNodeView>> = Object.freeze({});\nconst emptyPresentations: Readonly<Record<string, SpagbolLinkPresentation>> =\n Object.freeze({});\nconst defaultFeatures: SpagbolCanvasFeatures = { compact: true, nestedGraphs: true, panels: true, areas: true, linkProperties: true };\n\nexport function SpagbolCanvas(props: SpagbolCanvasProps) {\n const margin =\n props.panBounds === false ? undefined : props.panBounds?.emptyScreenRatio;\n if (margin !== undefined && (!Number.isFinite(margin) || margin < 0))\n throw new Error(\n \"Pan margin must be a finite, nonnegative screen proportion.\",\n );\n const features = useMemo(() => ({ ...defaultFeatures, ...props.features }), [props.features]);\n if (features.panels && !features.nestedGraphs)\n throw new Error(\"Projected panels require the nestedGraphs feature.\");\n return (\n <ReactFlowProvider>\n <SpagbolCanvasInner {...props} features={features} />\n </ReactFlowProvider>\n );\n}\nconst SpagbolNodeRenderer = memo(function SpagbolNodeRenderer({ data, selected }: NodeProps<FlowNode>) {\n const node = data.node!;\n const { views, features, editor } = useSpagbol();\n const updateInternals = useUpdateNodeInternals();\n const flowId = useNodeId();\n const portKey = portsFor(node, editor.nodes)\n .map((port) => `${port.direction}:${port.id}`)\n .join(\"|\");\n useEffect(() => {\n if (data.projected || !flowId) return;\n const frame = requestAnimationFrame(() => updateInternals(flowId));\n return () => cancelAnimationFrame(frame);\n }, [flowId, portKey, data.projected, updateInternals]);\n const baseProps = useNodeViewProps(node, selected, data.projected === true);\n const props = {\n ...baseProps,\n readOnly: baseProps.readOnly || data.stationaryOriginal === true,\n };\n const view = views[node.kind];\n const Renderer = data.projected ? view?.projected : view?.render;\n const Body = view?.body;\n const content = Renderer ? (\n <Renderer {...props} />\n ) : (\n <SpagbolNodeFrame {...props}>\n {features.panels && node.graph && groupPanelLayout(node) ? (\n <SpagbolNodePanel group={node} />\n ) : null}\n {Body ? <Body {...props} /> : null}\n </SpagbolNodeFrame>\n );\n return data.stationaryOriginal ? (\n <div className=\"spagbol-canvas-duplicate-origin\" inert>\n {content}\n </div>\n ) : (\n content\n );\n}, (previous, next) => previous.selected === next.selected && previous.data.node === next.data.node && previous.data.projected === next.data.projected && previous.data.stationaryOriginal === next.data.stationaryOriginal);\nconst SpagbolCanvasLinkAnchor = memo(function SpagbolCanvasLinkAnchor({ data }: NodeProps<FlowNode>) {\n const { editor, connecting } = useSpagbol();\n return (\n <div className=\"spagbol-canvas-link-anchor\">\n {(editor.policy.linkProperties ?? []).map((property) => (\n <Handle\n key={property}\n id={`property:${property}`}\n type=\"target\"\n position={Position.Left}\n className=\"spagbol-property-port\"\n isConnectable={editor.editing && connecting}\n style={{ opacity: 0 }}\n aria-label={`Link ${property}`}\n />\n ))}\n </div>\n );\n}, (before, after) => before.data.linkId === after.data.linkId);\nfunction SpagbolCanvasArea({ data, selected }: NodeProps<FlowNode>) {\n const area = data.area!;\n const { editor, zoom, areaDuplicate } = useSpagbol();\n const [titleEditing, setTitleEditing] = useState(false);\n const [titleDraft, setTitleDraft] = useState(area.title);\n const drag = useRef<{\n pointer: number;\n start: Point;\n position: Point;\n size: { width: number; height: number };\n resize: boolean;\n duplicate: boolean;\n offset: Point;\n moved: boolean;\n title: boolean;\n } | null>(null);\n function start(event: PointerEvent<HTMLElement>, resize = false) {\n if (!editor.editing || event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n editor.select({ areaIds: [area.id] });\n editor.beginGesture(resize ? \"Resize area\" : event.altKey ? \"Duplicate area\" : \"Move area\");\n if (!resize && event.altKey) areaDuplicate?.(area.id, \"start\", { x: 0, y: 0 }, event.metaKey || event.ctrlKey || event.shiftKey);\n drag.current = {\n pointer: event.pointerId,\n start: { x: event.clientX, y: event.clientY },\n position: { ...area.position },\n size: { ...area.size },\n resize,\n duplicate: !resize && event.altKey, offset: { x: 0, y: 0 }, moved: false, title: !!(event.target as HTMLElement).closest(\".spagbol-canvas-area-title\"),\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n }\n function move(event: PointerEvent<HTMLElement>) {\n const current = drag.current;\n if (!current || current.pointer !== event.pointerId) return;\n event.stopPropagation();\n const x = (event.clientX - current.start.x) / zoom,\n y = (event.clientY - current.start.y) / zoom;\n current.offset = { x, y };\n current.moved ||= Math.abs(x) + Math.abs(y) > 3 / zoom;\n if (current.duplicate) { areaDuplicate?.(area.id, \"move\", { x, y }); return; }\n if (current.resize) {\n const members = areaMembers(editor.graph, area.id);\n const minWidth = area.locked\n ? Math.max(\n 140,\n ...editor.graph.nodes\n .filter((node) => members.nodeIds.has(node.id))\n .map(\n (node) =>\n node.position.x - area.position.x + (node.size?.width ?? 220),\n ),\n )\n : 140;\n const minHeight = area.locked\n ? Math.max(\n 80,\n ...editor.graph.nodes\n .filter((node) => members.nodeIds.has(node.id))\n .map(\n (node) =>\n node.position.y -\n area.position.y +\n (node.size?.height ?? 120),\n ),\n )\n : 80;\n editor.updateArea(area.id, {\n size: {\n width: Math.max(minWidth, current.size.width + x),\n height: Math.max(minHeight, current.size.height + y),\n },\n });\n } else\n editor.moveArea(area.id, {\n x: current.position.x + x,\n y: current.position.y + y,\n });\n }\n function end(event: PointerEvent<HTMLElement>, cancel = false) {\n const current = drag.current;\n if (current?.pointer !== event.pointerId) return;\n drag.current = null;\n if (event.currentTarget.hasPointerCapture(event.pointerId))\n event.currentTarget.releasePointerCapture(event.pointerId);\n if (current.duplicate) areaDuplicate?.(area.id, cancel || !current.moved ? 'cancel' : 'end', current.offset);\n else {\n if (cancel) editor.cancelGesture(); else editor.commitGesture();\n if (!cancel && !current.moved && current.title) { setTitleDraft(area.title); setTitleEditing(true); }\n }\n }\n const pointerHandlers = {\n onPointerMove: move,\n onPointerUp: (event: PointerEvent<HTMLElement>) => end(event),\n onPointerCancel: (event: PointerEvent<HTMLElement>) => end(event, true),\n onLostPointerCapture: (event: PointerEvent<HTMLElement>) =>\n end(event, true),\n };\n return (\n <div\n inert={data.stationaryOriginal === true}\n className={`spagbol-canvas-area${selected ? \" spagbol-canvas-area-selected\" : \"\"}${area.collapsed ? \" spagbol-canvas-area-collapsed\" : \"\"}`}\n style={{\n width: area.size.width,\n height: area.collapsed\n ? 34 + (area.controlHeight ?? 0)\n : area.size.height,\n }}\n >\n <div\n className=\"spagbol-canvas-area-header nodrag nopan\"\n onPointerDown={(event) => start(event)}\n {...pointerHandlers}\n >\n {titleEditing ? <input autoFocus className=\"spagbol-canvas-area-title-input nodrag nopan\" aria-label=\"Area title\" value={titleDraft} onFocus={event => event.currentTarget.select()} onChange={event => setTitleDraft(event.currentTarget.value)} onPointerDown={event => event.stopPropagation()} onBlur={() => { editor.updateArea(area.id, { title: titleDraft.trim() || 'Area' }); setTitleEditing(false); }} onKeyDown={event => { event.stopPropagation(); if (event.key === 'Enter') event.currentTarget.blur(); if (event.key === 'Escape') { setTitleDraft(area.title); setTitleEditing(false); } }} /> : <span className=\"spagbol-canvas-area-title\" onDoubleClick={event => { event.stopPropagation(); if (editor.editing) { setTitleDraft(area.title); setTitleEditing(true); } }}>{area.title}</span>}\n <div\n className=\"spagbol-canvas-area-actions\"\n onPointerDown={(event) => event.stopPropagation()}\n >\n <button\n title={area.locked ? \"Unlock membership\" : \"Lock membership\"}\n aria-label={area.locked ? \"Unlock membership\" : \"Lock membership\"}\n disabled={!editor.editing}\n onClick={() => editor.lockArea(area.id, !area.locked)}\n >\n {area.locked ? \"●\" : \"○\"}\n </button>\n <button\n title={area.collapsed ? \"Expand area\" : \"Collapse area\"}\n aria-label={area.collapsed ? \"Expand area\" : \"Collapse area\"}\n disabled={!editor.editing}\n onClick={() =>\n editor.updateArea(area.id, { collapsed: !area.collapsed })\n }\n >\n {area.collapsed ? \"+\" : \"−\"}\n </button>\n </div>\n </div>\n {!area.collapsed && area.controlHeight ? (\n <div\n className=\"spagbol-canvas-area-divider\"\n style={{ top: 34 + area.controlHeight }}\n />\n ) : null}\n {!area.collapsed && editor.editing && (\n <button\n className=\"spagbol-canvas-area-resize nodrag nopan\"\n aria-label=\"Resize area\"\n onPointerDown={(event) => start(event, true)}\n {...pointerHandlers}\n />\n )}\n <Handle\n id=\"collapsed:in\"\n type=\"target\"\n position={Position.Left}\n isConnectable={false}\n className=\"spagbol-canvas-area-pin\"\n style={{ top: 17 }}\n />\n <Handle\n id=\"collapsed:out\"\n type=\"source\"\n position={Position.Right}\n isConnectable={false}\n className=\"spagbol-canvas-area-pin\"\n style={{ top: 17 }}\n />\n </div>\n );\n}\n\nconst SpagbolCanvasLink = memo(function SpagbolCanvasLink(props: EdgeProps<FlowLink>) {\n const { editor, diagnostics, linkOverlay, connecting } = useSpagbol();\n const flow = useReactFlow();\n const viewport = useViewport();\n const [controlsVisible, setControlsVisible] = useState(false);\n const selection = useEditorSelector(editor, snapshot => snapshot.selection);\n const showControls = props.selected && selection.linkIds.length === 1 && editor.editing && !connecting && !props.data?.virtual;\n useEffect(() => {\n if (!showControls) { setControlsVisible(false); return; }\n const timer = window.setTimeout(() => setControlsVisible(true), 260);\n return () => window.clearTimeout(timer);\n }, [showControls]);\n const link = props.data!.link;\n const [path, x, y] = linkPath(\n { x: props.sourceX, y: props.sourceY },\n { x: props.targetX, y: props.targetY },\n props.data?.feedback,\n link.target.type === \"port\" && link.source.nodeId === link.target.nodeId,\n );\n const mode = editor.modes.get(link.mode);\n const errors = diagnostics.filter((item) => item.linkId === link.id);\n const selected = props.selected;\n const className = `spagbol-canvas-link${selected || props.data?.emphasized ? \" spagbol-canvas-link-emphasized\" : \"\"}${props.data?.dimmed ? \" spagbol-canvas-link-dimmed\" : \"\"}${props.data?.disabled ? \" spagbol-canvas-link-disabled\" : \"\"}${props.data?.control ? \" spagbol-canvas-link-control\" : \"\"}${props.data?.virtual ? \" spagbol-canvas-link-virtual\" : \"\"}${errors.length ? \" spagbol-canvas-link-error\" : \"\"}`;\n return (\n <>\n <path\n d={path}\n className=\"spagbol-canvas-link-underlay\"\n fill=\"none\"\n style={{ strokeWidth: selected || props.data?.emphasized ? 7 : 5 }}\n />\n <BaseEdge\n id={props.id}\n path={path}\n interactionWidth={\n link.source.nodeId ===\n (link.target.type === \"port\" ? link.target.nodeId : null)\n ? 38\n : 22\n }\n className={`${className}${props.data?.preview ? \" spagbol-canvas-link-preview\" : \"\"}`}\n style={{ stroke: mode?.color ?? \"var(--spagbol-muted)\" }}\n />\n <path\n d={path}\n className=\"spagbol-canvas-link-hit\"\n data-spagbol-link={link.id}\n fill=\"none\"\n pointerEvents=\"none\"\n />\n {showControls && controlsVisible && linkOverlay && createPortal(\n <SpagbolCanvasLinkControls\n style={{ left: flow.flowToScreenPosition({ x, y }).x, top: flow.flowToScreenPosition({ x, y: !(props.data?.feedback || props.source === props.target) && Math.hypot(props.targetX - props.sourceX, props.targetY - props.sourceY) < 144 ? y - 52 : y }).y, transform: `translate(-50%, -50%) scale(${viewport.zoom})` }}\n weight={link.weight} mode={link.mode} enabled={link.enabled !== false}\n modes={editor.modes.list().filter(mode => !editor.policy.modes || editor.policy.modes.includes(mode.id))}\n onWeightChange={weight => editor.updateLink(link.id, { weight })}\n onModeChange={mode => editor.updateLink(link.id, { mode })}\n onEnabledChange={enabled => editor.updateLink(link.id, { enabled })}\n />, linkOverlay)}\n {errors.length > 0 && (\n <EdgeLabelRenderer>\n <div\n className=\"spagbol-canvas-link-diagnostic\"\n role=\"status\"\n style={{\n transform: `translate(-50%, -50%) translate(${x}px,${y + 18}px)`,\n }}\n title={errors.map((error) => error.message).join(\"\\n\")}\n >\n !\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n}, (before, after) => {\n if (before.id !== after.id || before.selected !== after.selected || before.source !== after.source || before.target !== after.target || before.sourceX !== after.sourceX || before.sourceY !== after.sourceY || before.targetX !== after.targetX || before.targetY !== after.targetY) return false;\n const keys = Object.keys(before.data ?? {});\n return keys.length === Object.keys(after.data ?? {}).length && keys.every(key => before.data?.[key] === after.data?.[key]);\n});\nconst nodeTypes = {\n spagbolNode: SpagbolNodeRenderer,\n spagbolArea: SpagbolCanvasArea,\n spagbolAnchor: SpagbolCanvasLinkAnchor,\n};\nconst edgeTypes = { spagbolLink: SpagbolCanvasLink };\n\ninterface Picker {\n point: Point;\n screen: Point;\n linkId?: string;\n origin?: { nodeId: string; portId: string; direction: \"input\" | \"output\" };\n}\nfunction SpagbolCanvasInner({\n editor,\n views = emptyViews,\n features = defaultFeatures,\n linkPresentation = emptyPresentations,\n ...props\n}: SpagbolCanvasProps) {\n const snapshot = useEditorSnapshot(editor);\n const graph = editor.graph;\n const root = useRef<HTMLDivElement>(null);\n const [linkOverlay, setLinkOverlay] = useState<HTMLDivElement | null>(null);\n const instanceId = useId();\n const flow = useReactFlow<FlowNode, FlowLink>();\n const flowStore = useStoreApi();\n const nodesInitialized = useNodesInitialized();\n const flowNodes = useStore((state) => state.nodes);\n // Measurements are canvas state, not saved graph data. Retaining them keeps\n // React Flow from hiding/reinitializing every node on each drag preview frame.\n const measuredSizes = useRef(\n new Map<string, { width: number; height: number }>(),\n );\n const [measurementRevision, setMeasurementRevision] = useState(0);\n const [zoom, setZoom] = useState(props.defaultViewport?.zoom ?? 1);\n const [settledViewport, setSettledViewport] = useState<Viewport>(\n props.defaultViewport ?? { x: 0, y: 0, zoom: 1 },\n );\n const [editorSize, setEditorSize] = useState({ width: 0, height: 0 });\n const viewportMoving = useRef(false);\n useEffect(() => {\n const element = root.current;\n if (!element) return;\n const update = () => {\n const bounds = element.getBoundingClientRect();\n setEditorSize((previous) =>\n previous.width === bounds.width && previous.height === bounds.height\n ? previous\n : { width: bounds.width, height: bounds.height },\n );\n };\n update();\n const observer = new ResizeObserver(update);\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n const [connecting, setConnecting] = useState(false);\n const [revealedNodeId, setRevealedNodeId] = useState<string | null>(null);\n const [activeMode, setActiveMode] = useState(\n editor.policy.modes?.[0] ?? editor.modes.list()[0]?.id ?? \"set\",\n );\n const [picker, setPicker] = useState<Picker | null>(null);\n const [search, setSearch] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [drawing, setDrawing] = useState<{\n start: Point;\n end: Point;\n pointer: number;\n } | null>(null);\n const connection = useRef<OnConnectStartParams | null>(null);\n const connectionDone = useRef(false);\n const reconnecting = useRef<string | null>(null);\n const reconnectDuplicate = useRef(false);\n const [reconnectOriginal, setReconnectOriginal] = useState<FlowLink | null>(\n null,\n );\n const duplicate = useRef<DuplicateDrag | null>(null);\n const [duplicatePreview, setDuplicatePreview] =\n useState<DuplicateDrag | null>(null);\n const cancelledDuplicate = useRef(false);\n useEffect(() => {\n if (!snapshot.gesture && duplicate.current) {\n cancelledDuplicate.current = true;\n duplicate.current = null;\n setDuplicatePreview(null);\n }\n }, [snapshot.gesture]);\n const duplicatePresentation = useMemo(\n () =>\n duplicatePreview\n ? duplicateDragPresentation(graph, duplicatePreview)\n : null,\n [graph, duplicatePreview],\n );\n const baseRenderGraph = duplicatePresentation?.graph ?? graph;\n const renderGraph = useMemo(() => props.virtualLinks?.length ? { ...baseRenderGraph, links: [...baseRenderGraph.links, ...props.virtualLinks] } : baseRenderGraph, [baseRenderGraph, props.virtualLinks]);\n const targets = useRef(new Map<string, HTMLElement>());\n const coreDiagnostics = useMemo(() => editor.diagnostics(), [editor, snapshot.document]);\n const diagnosticKey = JSON.stringify([coreDiagnostics, props.diagnostics ?? []]);\n const diagnostics = useMemo(\n () =>\n [...coreDiagnostics, ...(props.diagnostics ?? [])].filter(\n (item) =>\n item.path.length === snapshot.path.length &&\n item.path.every((id, index) => id === snapshot.path[index]),\n ),\n [diagnosticKey, snapshot.path],\n );\n const registerTarget = useCallback(\n (key: string, element: HTMLElement | null) => {\n if (element) targets.current.set(key, element);\n else targets.current.delete(key);\n props.onRenderTarget?.(key, element);\n },\n [props.onRenderTarget],\n );\n useEffect(\n () => () => {\n for (const key of targets.current.keys())\n props.onRenderTarget?.(key, null);\n targets.current.clear();\n },\n [props.onRenderTarget],\n );\n useEffect(() => {\n setPicker(null);\n setError(null);\n }, [snapshot.path.join(\"/\")]);\n const areaDuplicate = useCallback((id: string, phase: 'start' | 'move' | 'end' | 'cancel', offset: Point, external = false) => {\n if (phase === 'start') {\n const area = editor.graph.areas.find(area => area.id === id);\n if (!area) return;\n cancelledDuplicate.current = false;\n const fragment = copyFragment(editor.graph, [], [id]);\n duplicate.current = { namespace: createId('preview'), fragment, nodeId: '', origin: area.position, positions: new Map(fragment.nodes.map(node => [node.id, node.position])), areaPositions: new Map(fragment.areas.map(area => [area.id, area.position])), external };\n setDuplicatePreview(duplicate.current);\n return;\n }\n const current = duplicate.current;\n if (!current) return;\n if (phase === 'move') {\n duplicate.current = { ...current,\n positions: new Map(current.fragment.nodes.map(node => [node.id, { x: node.position.x + offset.x, y: node.position.y + offset.y }])),\n areaPositions: new Map(current.fragment.areas.map(area => [area.id, { x: area.position.x + offset.x, y: area.position.y + offset.y }])),\n };\n setDuplicatePreview(duplicate.current);\n return;\n }\n duplicate.current = null; setDuplicatePreview(null);\n if (phase === 'cancel') editor.cancelGesture();\n else { editor.paste(current.fragment, offset, current.external); editor.commitGesture(); }\n }, [editor]);\n const context = useMemo(\n () => ({\n editor,\n views,\n nodeKinds: props.nodeKinds,\n changeNodeKind: props.onChangeNodeKind,\n features,\n diagnostics,\n zoom,\n connecting,\n instanceId,\n areaDuplicate,\n registerTarget,\n linkOverlay,\n }),\n [\n editor,\n views,\n features,\n diagnostics,\n zoom,\n connecting,\n instanceId,\n registerTarget,\n linkOverlay,\n areaDuplicate,\n props.nodeKinds,\n props.onChangeNodeKind,\n ],\n );\n const attempt = useCallback((action: () => void) => {\n try {\n action();\n setError(null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n }, []);\n\n const collapsed = useMemo(() => {\n const nodes = new Map<string, GraphArea>(),\n projected = new Set<string>(),\n hiddenAreas = new Set<string>();\n if (features.areas)\n for (const area of renderGraph.areas.filter((area) => area.collapsed)) {\n const members = areaMembers(renderGraph, area.id);\n for (const id of members.nodeIds) {\n const node = renderGraph.nodes.find((node) => node.id === id);\n if (\n node &&\n (area.controlHeight ?? 0) > 0 &&\n node.position.y >= area.position.y + 34 &&\n node.position.y < area.position.y + 34 + (area.controlHeight ?? 0)\n )\n projected.add(id);\n else nodes.set(id, area);\n }\n for (const id of members.areaIds) hiddenAreas.add(id);\n }\n return { nodes, projected, hiddenAreas };\n }, [renderGraph, features.areas]);\n const modelNodes: FlowNode[] = useMemo(\n () => [\n ...(features.areas\n ? renderGraph.areas.map(\n (area): FlowNode => ({\n id: areaFlowId(area.id),\n type: \"spagbolArea\",\n position: area.position,\n selected: snapshot.selection.areaIds.includes(area.id),\n hidden: collapsed.hiddenAreas.has(area.id),\n draggable: false,\n selectable: false,\n connectable: false,\n deletable: false,\n zIndex: -1,\n data: { area, stationaryOriginal: duplicatePresentation?.originalAreas.has(area.id) },\n measured: measuredSizes.current.get(areaFlowId(area.id)),\n style: {\n width: area.size.width,\n height: area.collapsed\n ? 34 + (area.controlHeight ?? 0)\n : area.size.height,\n },\n }),\n )\n : []),\n ...renderGraph.nodes.map(\n (node): FlowNode => ({\n id: nodeFlowId(node.id),\n type: \"spagbolNode\",\n position: node.position,\n selected: snapshot.selection.nodeIds.includes(node.id),\n hidden: collapsed.nodes.has(node.id),\n draggable:\n editor.editing && views[node.kind]?.draggable !== false &&\n !collapsed.projected.has(node.id) &&\n !duplicatePresentation?.originalNodes.has(node.id),\n selectable:\n editor.editing && views[node.kind]?.selectable !== false &&\n !collapsed.projected.has(node.id) &&\n !duplicatePresentation?.originalNodes.has(node.id),\n connectable:\n editor.editing &&\n !collapsed.projected.has(node.id) &&\n !duplicatePresentation?.originalNodes.has(node.id),\n focusable: !duplicatePresentation?.originalNodes.has(node.id),\n deletable: false,\n dragHandle: \".spagbol-canvas-drag-handle\",\n data: {\n node: duplicatePresentation?.originalNodes.get(node.id) ?? node,\n projected: collapsed.projected.has(node.id),\n stationaryOriginal: duplicatePresentation?.originalNodes.has(\n node.id,\n ),\n },\n measured:\n measuredSizes.current.get(nodeFlowId(node.id)) ??\n (duplicatePresentation?.originalNodes.has(node.id)\n ? measuredSizes.current.get(\n nodeFlowId(\n duplicatePresentation.originalNodes.get(node.id)!.id,\n ),\n )\n : undefined),\n className: duplicatePresentation?.previewNodeIds.has(node.id)\n ? \"spagbol-canvas-duplicate-preview\"\n : undefined,\n style: {\n width: views[node.kind]?.autoWidth && !node.size?.width ? \"max-content\" : (node.size?.width ?? Math.max(220, (groupPanelLayout(node)?.size.width ?? 0) + 2)) * (node.scale ?? 1),\n ...(node.size?.height ? { height: node.size.height * (node.scale ?? 1) } : {}),\n },\n zIndex: connecting && revealedNodeId === node.id ? 5 : snapshot.selection.nodeIds.includes(node.id) ? 3 : 1,\n }),\n ),\n ],\n [\n renderGraph,\n duplicatePresentation,\n snapshot.selection,\n snapshot.mode,\n editor,\n features.areas,\n collapsed,\n measurementRevision,\n connecting,\n revealedNodeId,\n ],\n );\n // React Flow publishes handle measurements. Only measured geometry participates\n // in anchor derivation, so updating invisible anchors cannot form a render loop.\n const measurementKey = flowNodes\n .filter(\n (node) => node.id.startsWith(\"node:\") || node.id.startsWith(\"area:\"),\n )\n .map((node) => {\n const internal = flow.getInternalNode(node.id);\n return JSON.stringify([\n node.id,\n node.position,\n node.measured,\n internal?.internals.handleBounds,\n ]);\n })\n .join(\"|\");\n const panExtent = useMemo(() => {\n if (props.panBounds === false) return infiniteCanvasExtent;\n // Use saved content, not temporary duplication nodes or invisible link anchors.\n const items = graph.nodes.map((node) => {\n const internal = flow.getInternalNode(nodeFlowId(node.id));\n return {\n position: node.position,\n hidden: collapsed.nodes.has(node.id),\n size: {\n width: internal?.measured?.width ?? node.size?.width ?? 220,\n height: internal?.measured?.height ?? node.size?.height ?? 96,\n },\n };\n });\n if (features.areas)\n items.push(\n ...graph.areas.map((area) => ({\n position: area.position,\n hidden: collapsed.hiddenAreas.has(area.id),\n size: {\n width: area.size.width,\n height: area.collapsed\n ? 34 + (area.controlHeight ?? 0)\n : area.size.height,\n },\n })),\n );\n return translateExtentForVisibleContent(\n items,\n settledViewport,\n editorSize,\n props.panBounds?.emptyScreenRatio ?? 0.7,\n );\n }, [\n graph,\n features.areas,\n collapsed,\n flow,\n measurementKey,\n settledViewport.zoom,\n editorSize,\n props.panBounds,\n ]);\n useEffect(() => {\n if (\n props.panBounds === false ||\n !flow.viewportInitialized ||\n !nodesInitialized ||\n viewportMoving.current ||\n snapshot.gesture\n )\n return;\n const current = flow.getViewport();\n const clamped = clampViewportToTranslateExtent(\n current,\n panExtent,\n editorSize,\n );\n if (\n Math.abs(current.x - clamped.x) < 0.0001 &&\n Math.abs(current.y - clamped.y) < 0.0001 &&\n current.zoom === clamped.zoom\n )\n return;\n setSettledViewport((previous) =>\n previous.x === clamped.x &&\n previous.y === clamped.y &&\n previous.zoom === clamped.zoom\n ? previous\n : clamped,\n );\n void flow.setViewport(clamped);\n }, [\n panExtent,\n editorSize,\n flow,\n settledViewport,\n nodesInitialized,\n snapshot.gesture,\n props.panBounds,\n ]);\n const anchors: FlowNode[] = useMemo(() => {\n if (!features.linkProperties || snapshot.mode !== \"edit\") return [];\n function endpoint(\n point: { nodeId: string; portId: string },\n direction: \"input\" | \"output\",\n ): Point {\n const area = collapsed.nodes.get(point.nodeId);\n if (area)\n return {\n x: area.position.x + (direction === \"output\" ? area.size.width : 0),\n y: area.position.y + 17,\n };\n const internal = flow.getInternalNode(nodeFlowId(point.nodeId));\n const handle = internal?.internals.handleBounds?.[\n direction === \"output\" ? \"source\" : \"target\"\n ]?.find(\n (handle) =>\n handle.id ===\n (direction === \"output\"\n ? sourceHandle(point.portId)\n : targetHandle(point.portId)),\n );\n if (internal && handle)\n return {\n x:\n internal.internals.positionAbsolute.x + handle.x + handle.width / 2,\n y:\n internal.internals.positionAbsolute.y +\n handle.y +\n handle.height / 2,\n };\n const node = renderGraph.nodes.find((node) => node.id === point.nodeId);\n return {\n x:\n (node?.position.x ?? 0) +\n (direction === \"output\" ? (node?.size?.width ?? 220) : 0),\n y: (node?.position.y ?? 0) + 56,\n };\n }\n const cache = new Map<string, Point>();\n function midpoint(link: GraphLink, visited = new Set<string>()): Point {\n const cached = cache.get(link.id);\n if (cached) return cached;\n if (visited.has(link.id)) return { x: 0, y: 0 };\n const next = new Set([...visited, link.id]);\n // Keep the target reference narrowed across callback boundaries.\n const reference =\n link.target.type === \"link\" ? link.target.linkId : undefined;\n const parent = reference\n ? renderGraph.links.find((candidate) => candidate.id === reference)\n : undefined;\n const destination =\n link.target.type === \"port\"\n ? endpoint(link.target, \"input\")\n : parent\n ? midpoint(parent, next)\n : { x: 0, y: 0 };\n const [, x, y] = linkPath(\n endpoint(link.source, \"output\"),\n destination,\n linkPresentation[\n duplicatePresentation?.previewLinks.get(link.id) ?? link.id\n ]?.feedback,\n link.target.type === \"port\" &&\n link.source.nodeId === link.target.nodeId,\n );\n const result = { x, y };\n cache.set(link.id, result);\n return result;\n }\n const targeted = new Set(renderGraph.links.flatMap(link => link.target.type === 'link' ? [link.target.linkId] : []));\n return renderGraph.links.filter(link => connecting || targeted.has(link.id)).map((link) => ({\n id: anchorFlowId(link.id),\n type: \"spagbolAnchor\",\n position: midpoint(link),\n data: { linkId: link.id },\n measured: { width: 1, height: 1 },\n draggable: false,\n selectable: false,\n deletable: false,\n focusable: false,\n zIndex: 4,\n style: { width: 1, height: 1 },\n }));\n }, [\n renderGraph,\n duplicatePresentation,\n features.linkProperties,\n connecting,\n snapshot.mode,\n collapsed,\n linkPresentation,\n measurementKey,\n flow,\n ]);\n const nodePresentations = useRef<FlowNode[]>([]);\n const displayNodes = useMemo(\n () => { const result = reuseFlowPresentations(nodePresentations.current, [...modelNodes, ...anchors]); nodePresentations.current = result; return result; },\n [modelNodes, anchors],\n );\n const graphLinks: FlowLink[] = useMemo(\n () =>\n snapshot.mode === \"controls\"\n ? []\n : renderGraph.links.flatMap((link): FlowLink[] => {\n if (link.target.type === \"link\" && !features.linkProperties)\n return [];\n const sourceArea = collapsed.nodes.get(link.source.nodeId);\n const targetArea =\n link.target.type === \"port\"\n ? collapsed.nodes.get(link.target.nodeId)\n : undefined;\n if (sourceArea && sourceArea.id === targetArea?.id) return [];\n const sourceNode = renderGraph.nodes.find(\n (node) => node.id === link.source.nodeId,\n );\n const targetNodeId =\n link.target.type === \"port\" ? link.target.nodeId : undefined;\n const targetNode = renderGraph.nodes.find(\n (node) => node.id === targetNodeId,\n );\n const preview =\n duplicatePresentation?.previewLinks.has(link.id) ?? false;\n const presentation = props.virtualLinks?.some(item => item.id === link.id) ? { virtual: true } :\n linkPresentation[\n duplicatePresentation?.previewLinks.get(link.id) ?? link.id\n ];\n const related =\n snapshot.selection.nodeIds.includes(link.source.nodeId) ||\n (!!targetNodeId &&\n snapshot.selection.nodeIds.includes(targetNodeId));\n const selected =\n !duplicatePreview && snapshot.selection.linkIds.includes(link.id);\n return [\n {\n id: link.id,\n type: \"spagbolLink\",\n source: sourceArea\n ? areaFlowId(sourceArea.id)\n : nodeFlowId(link.source.nodeId),\n sourceHandle: sourceArea\n ? \"collapsed:out\"\n : sourceHandle(link.source.portId),\n target: targetArea\n ? areaFlowId(targetArea.id)\n : link.target.type === \"port\"\n ? nodeFlowId(link.target.nodeId)\n : anchorFlowId(link.target.linkId),\n targetHandle: targetArea\n ? \"collapsed:in\"\n : link.target.type === \"port\"\n ? targetHandle(link.target.portId)\n : `property:${link.target.property}`,\n selected,\n reconnectable:\n selected &&\n editor.editing &&\n !presentation?.virtual &&\n !sourceArea &&\n !targetArea,\n selectable:\n editor.editing && !presentation?.virtual && !duplicatePreview,\n deletable: false,\n zIndex: selected ? 10 : 0,\n data: {\n link,\n preview,\n ...presentation,\n emphasized: related || preview,\n dimmed:\n !duplicatePreview &&\n (snapshot.selection.nodeIds.length > 0 ||\n snapshot.selection.linkIds.length > 0) &&\n !selected &&\n !related,\n disabled:\n link.enabled === false ||\n sourceNode?.enabled === false ||\n targetNode?.enabled === false,\n },\n },\n ];\n }),\n [\n renderGraph,\n duplicatePresentation,\n duplicatePreview,\n snapshot.mode,\n snapshot.selection,\n features.linkProperties,\n collapsed,\n linkPresentation,\n editor,\n ],\n );\n const rawDisplayLinks = useMemo(\n () =>\n reconnectOriginal && snapshot.mode === \"edit\"\n ? [...graphLinks, reconnectOriginal]\n : graphLinks,\n [graphLinks, reconnectOriginal, snapshot.mode],\n );\n\n const linkPresentations = useRef<FlowLink[]>([]);\n const displayLinks = useMemo(() => {\n const result = reuseFlowPresentations(linkPresentations.current, rawDisplayLinks);\n linkPresentations.current = result; return result;\n }, [rawDisplayLinks]);\n\n function modelConnection(\n value: Pick<Connection, \"source\" | \"target\"> & {\n sourceHandle?: string | null;\n targetHandle?: string | null;\n },\n ): { source: GraphLink[\"source\"]; target: LinkTarget } | undefined {\n const source = parseHandle(value.sourceHandle),\n target = parseHandle(value.targetHandle);\n if (\n !source ||\n source.direction !== \"output\" ||\n !value.source.startsWith(\"node:\")\n )\n return;\n if (\n value.target.startsWith(\"anchor:\") &&\n value.targetHandle?.startsWith(\"property:\")\n )\n return {\n source: { nodeId: value.source.slice(5), portId: source.id },\n target: {\n type: \"link\",\n linkId: value.target.slice(7),\n property: value.targetHandle.slice(9),\n },\n };\n if (\n !target ||\n target.direction !== \"input\" ||\n !value.target.startsWith(\"node:\")\n )\n return;\n return {\n source: { nodeId: value.source.slice(5), portId: source.id },\n target: {\n type: \"port\",\n nodeId: value.target.slice(5),\n portId: target.id,\n },\n };\n }\n function onNodesChange(changes: NodeChange<FlowNode>[]) {\n const remeasured = rememberMeasurements(measuredSizes.current, changes);\n if (remeasured) setMeasurementRevision((value) => value + 1);\n const selected = new Set(editor.getSnapshot().selection.nodeIds);\n let selectionChanged = false;\n for (const change of changes)\n if (\n change.type === \"select\" &&\n change.id.startsWith(\"node:\") &&\n graph.nodes.some((node) => nodeFlowId(node.id) === change.id)\n ) {\n const id = change.id.slice(5);\n if (change.selected) selected.add(id);\n else selected.delete(id);\n selectionChanged = true;\n }\n if (selectionChanged)\n editor.select({\n nodeIds: [...selected],\n linkIds: editor.getSnapshot().selection.linkIds,\n });\n const positions = changes.filter(\n (change) =>\n change.type === \"position\" &&\n change.position &&\n change.id.startsWith(\"node:\"),\n );\n if (positions.length && duplicate.current) {\n const next = {\n ...duplicate.current,\n positions: new Map(duplicate.current.positions),\n };\n let changed = false;\n for (const change of positions)\n if (\n change.type === \"position\" &&\n change.position &&\n next.positions.has(change.id.slice(5))\n ) {\n const previous = next.positions.get(change.id.slice(5));\n if (\n previous?.x !== change.position.x ||\n previous?.y !== change.position.y\n ) {\n next.positions.set(change.id.slice(5), { ...change.position });\n changed = true;\n }\n }\n if (!changed) return;\n duplicate.current = next;\n setDuplicatePreview(next);\n return;\n }\n if (cancelledDuplicate.current) return;\n if (positions.length)\n editor.edit(\"Move nodes\", \"layout\", (graph) => {\n for (const change of positions)\n if (change.type === \"position\" && change.position) {\n const node = graph.nodes.find(\n (node) => nodeFlowId(node.id) === change.id,\n );\n if (node) node.position = { ...change.position };\n }\n });\n }\n function onEdgesChange(changes: EdgeChange<FlowLink>[]) {\n const selected = new Set(editor.getSnapshot().selection.linkIds);\n let changed = false;\n for (const change of changes)\n if (change.type === \"select\") {\n if (change.selected) selected.add(change.id);\n else selected.delete(change.id);\n changed = true;\n }\n if (changed)\n editor.select({\n nodeIds: editor.getSnapshot().selection.nodeIds,\n linkIds: [...selected],\n });\n }\n function openPicker(client: Point, extra: Partial<Picker> = {}) {\n if (!editor.editing) return;\n const bounds = root.current?.getBoundingClientRect();\n setSearch(\"\");\n setPicker({\n point: flow.screenToFlowPosition(client),\n screen: {\n x: Math.min(\n client.x - (bounds?.left ?? 0),\n Math.max(8, (bounds?.width ?? 400) - 260),\n ),\n y: Math.min(\n client.y - (bounds?.top ?? 0),\n Math.max(8, (bounds?.height ?? 500) - 320),\n ),\n },\n ...extra,\n });\n }\n function chooseNode(kind: string) {\n if (!picker) return;\n attempt(() => {\n if (kind === 'spagbol.area') { editor.addArea(picker.point); setPicker(null); return; }\n const definition = editor.nodes.get(kind)!;\n if (picker.linkId) {\n const prototype = editor.nodes.create(kind, picker.point);\n const ports = portsFor(prototype, editor.nodes),\n input = ports.find(\n (port) => port.direction === \"input\" && port.connectable !== false,\n ),\n output = ports.find(\n (port) => port.direction === \"output\" && port.connectable !== false,\n );\n if (!input || !output)\n throw new Error(\n \"Choose a node with an input and an output to insert it into a link.\",\n );\n editor.insertNode(\n picker.linkId,\n kind,\n picker.point,\n input.id,\n output.id,\n );\n } else {\n editor.beginGesture(\n picker.origin ? \"Create connected node\" : \"Create node\",\n );\n try {\n const id = editor.addNode(kind, picker.point)!;\n if (picker.origin) {\n const node = editor.graph.nodes.find((node) => node.id === id)!;\n const opposite =\n picker.origin.direction === \"output\" ? \"input\" : \"output\";\n const port = definition\n .ports(node)\n .find(\n (port) =>\n port.direction === opposite && port.connectable !== false,\n );\n if (!port)\n throw new Error(`This node has no connectable ${opposite}.`);\n if (opposite === \"input\")\n editor.connect(\n { nodeId: picker.origin.nodeId, portId: picker.origin.portId },\n { type: \"port\", nodeId: id, portId: port.id },\n activeMode,\n );\n else\n editor.connect(\n { nodeId: id, portId: port.id },\n {\n type: \"port\",\n nodeId: picker.origin.nodeId,\n portId: picker.origin.portId,\n },\n activeMode,\n );\n }\n editor.commitGesture();\n } catch (cause) {\n editor.cancelGesture();\n throw cause;\n }\n }\n setPicker(null);\n });\n }\n function linkAt(\n point: Point,\n source: GraphLink[\"source\"],\n mode: string,\n replacingId?: string,\n ): string | undefined {\n if (\n !features.linkProperties ||\n !(editor.policy.linkProperties ?? []).includes(\"weight\")\n )\n return;\n let best: { id: string; distance: number } | undefined;\n for (const path of root.current?.querySelectorAll<SVGPathElement>(\n \"[data-spagbol-link]\",\n ) ?? []) {\n const id = path.dataset.spagbolLink;\n if (\n !id ||\n editor.canConnect(\n source,\n { type: \"link\", linkId: id, property: \"weight\" },\n mode,\n replacingId,\n )\n )\n continue;\n const matrix = path.getScreenCTM();\n if (!matrix) continue;\n const local = new DOMPoint(point.x, point.y).matrixTransform(\n matrix.inverse(),\n );\n const length = path.getTotalLength();\n let distance = Infinity;\n for (let i = 0; i <= 48; i++) {\n const p = path.getPointAtLength((length * i) / 48);\n distance = Math.min(\n distance,\n Math.hypot(p.x - local.x, p.y - local.y) * zoom,\n );\n }\n if (distance < 14 && (!best || distance < best.distance))\n best = { id, distance };\n }\n return best?.id;\n }\n async function paste() {\n let fragment: ReturnType<typeof readFragment> | undefined;\n try {\n const text = await navigator.clipboard?.readText();\n if (text) fragment = readFragment(text);\n } catch {\n /* Fall back to this controller's clipboard. */\n }\n attempt(() => editor.paste(fragment));\n }\n function keyDown(event: KeyboardEvent<HTMLDivElement>) {\n const target = event.target as HTMLElement;\n if (\n target.closest(\n 'input,textarea,select,[contenteditable=\"true\"],[role=\"spinbutton\"]',\n )\n )\n return;\n const command = event.metaKey || event.ctrlKey,\n key = event.key.toLowerCase();\n if (key === \"escape\") {\n if (duplicate.current) cancelledDuplicate.current = true;\n duplicate.current = null;\n setDuplicatePreview(null);\n editor.cancelGesture();\n flowStore.getState().cancelConnection();\n setPicker(null);\n setDrawing(null);\n setConnecting(false);\n connection.current = null;\n connectionDone.current = true;\n setReconnectOriginal(null);\n return;\n }\n if (command && key === \"z\") {\n event.preventDefault();\n event.shiftKey ? editor.redo() : editor.undo();\n return;\n }\n if (command && key === \"y\") {\n event.preventDefault();\n editor.redo();\n return;\n }\n if (!editor.editing) return;\n if (command && key === \"c\") {\n event.preventDefault();\n const fragment = editor.copy();\n void navigator.clipboard\n ?.writeText(JSON.stringify(fragment))\n .catch(() => undefined);\n return;\n }\n if (command && key === \"v\") {\n event.preventDefault();\n void paste();\n return;\n }\n if (command && key === \"d\") {\n event.preventDefault();\n attempt(() => editor.duplicate());\n return;\n }\n if (command && key === \"a\") {\n event.preventDefault();\n editor.select({ nodeIds: graph.nodes.filter(node => views[node.kind]?.selectable !== false).map((node) => node.id) });\n return;\n }\n if (command && key === \"0\") {\n event.preventDefault();\n void flow.zoomTo(1);\n return;\n }\n if (key === \"delete\" || key === \"backspace\") {\n event.preventDefault();\n editor.deleteSelection(command);\n return;\n }\n if (!command && key === \"x\") {\n editor.edit(\"Toggle enabled\", \"values\", (graph) => {\n const nodes = graph.nodes.filter((node) =>\n snapshot.selection.nodeIds.includes(node.id),\n );\n if (nodes.length) {\n const enabled = nodes.every((node) => node.enabled === false);\n for (const node of nodes) node.enabled = enabled;\n } else {\n const links = graph.links.filter((link) =>\n snapshot.selection.linkIds.includes(link.id),\n );\n const enabled = links.every((link) => link.enabled === false);\n for (const link of links) link.enabled = enabled;\n }\n });\n return;\n }\n const mode = editor.modes\n .list()\n .find(\n (mode) =>\n mode.shortcut === key &&\n (!editor.policy.modes || editor.policy.modes.includes(mode.id)),\n );\n if (mode && !command) {\n setActiveMode(mode.id);\n if (!connecting)\n editor.edit(\"Change link mode\", \"values\", (graph) => {\n for (const link of graph.links)\n if (snapshot.selection.linkIds.includes(link.id))\n link.mode = mode.id;\n });\n }\n }\n function pointFromEvent(event: MouseEvent | TouchEvent): Point | undefined {\n if (\"clientX\" in event) return { x: event.clientX, y: event.clientY };\n const touch = event.changedTouches[0];\n return touch ? { x: touch.clientX, y: touch.clientY } : undefined;\n }\n const availableNodes = [...editor.nodes.list().filter(definition => !props.nodeKinds || props.nodeKinds.includes(definition.kind)), ...(features.areas && !picker?.origin && !picker?.linkId ? [{ kind: 'spagbol.area', label: 'Area', createData: () => ({}), ports: () => [] } as import('../core/index.js').NodeDefinition] : [])]\n .filter(definition => snapshot.path.length > 0 || ![spagbolGroupKinds.inputs, spagbolGroupKinds.outputs].includes(definition.kind as typeof spagbolGroupKinds.inputs))\n .filter((definition) =>\n `${definition.label} ${definition.category ?? \"\"} ${definition.keywords?.join(\" \") ?? \"\"}`\n .toLowerCase()\n .includes(search.toLowerCase()),\n );\n\n return (\n <GraphContext.Provider value={context}>\n <div\n ref={root}\n className={`spagbol-canvas ${props.className ?? \"\"}`}\n style={\n {\n ...props.style,\n \"--spagbol-title-scale\": zoom < 0.3 ? 1.75 : zoom < 0.5 ? 1.3 : 1,\n \"--spagbol-canvas-height\": `${editorSize.height}px`,\n } as CSSProperties\n }\n tabIndex={0}\n aria-label={props.ariaLabel ?? \"Graph editor\"}\n onKeyDown={keyDown}\n onDoubleClick={(event) => {\n if (\n (event.target as HTMLElement).classList.contains(\"react-flow__pane\")\n ) {\n event.preventDefault();\n openPicker({ x: event.clientX, y: event.clientY });\n }\n }}\n onPointerDownCapture={(event) => {\n const pane = (event.target as HTMLElement).classList.contains(\n \"react-flow__pane\",\n );\n if (pane) root.current?.focus({ preventScroll: true });\n if (\n pane &&\n features.areas &&\n editor.editing &&\n (event.metaKey || event.ctrlKey) &&\n event.button === 0\n ) {\n event.preventDefault();\n event.stopPropagation();\n const point = flow.screenToFlowPosition({\n x: event.clientX,\n y: event.clientY,\n });\n setDrawing({ start: point, end: point, pointer: event.pointerId });\n event.currentTarget.setPointerCapture(event.pointerId);\n }\n }}\n onPointerMove={(event) => {\n if (drawing?.pointer === event.pointerId)\n setDrawing({\n ...drawing,\n end: flow.screenToFlowPosition({\n x: event.clientX,\n y: event.clientY,\n }),\n });\n }}\n onPointerUp={(event) => {\n if (drawing?.pointer !== event.pointerId) return;\n const position = {\n x: Math.min(drawing.start.x, drawing.end.x),\n y: Math.min(drawing.start.y, drawing.end.y),\n },\n size = {\n width: Math.abs(drawing.start.x - drawing.end.x),\n height: Math.abs(drawing.start.y - drawing.end.y),\n };\n if (size.width >= 40 && size.height >= 40)\n editor.addArea(position, size);\n setDrawing(null);\n if (event.currentTarget.hasPointerCapture(event.pointerId))\n event.currentTarget.releasePointerCapture(event.pointerId);\n }}\n onPointerCancel={() => {\n if (duplicate.current) cancelledDuplicate.current = true;\n duplicate.current = null;\n setDuplicatePreview(null);\n setDrawing(null);\n editor.cancelGesture();\n }}\n >\n {props.background && (\n <div className=\"spagbol-canvas-background\">{props.background}</div>\n )}\n <SpagbolCanvasFlow<FlowNode, FlowLink>\n nodes={displayNodes}\n onlyRenderVisibleElements\n edges={displayLinks}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeMouseEnter={(_, node) => { if (connecting && node.data.node?.compact && !node.data.stationaryOriginal) setRevealedNodeId(node.data.node.id); }}\n onNodeMouseLeave={(_, node) => setRevealedNodeId(id => id === node.data.node?.id ? null : id)}\n onNodeDoubleClick={(event, flowNode) => {\n const node = flowNode.data.node;\n if (node?.graph && features.nestedGraphs && !(event.target as HTMLElement).closest('.spagbol-node-frame-header')) { event.preventDefault(); editor.enter(node.id); }\n }}\n onPaneClick={() => {\n editor.select({});\n setPicker(null);\n }}\n onNodeDragStart={(event, node) => {\n if (!node.data.node) return;\n cancelledDuplicate.current = false;\n editor.beginGesture(\n event.altKey ? \"Duplicate nodes\" : \"Move nodes\",\n );\n if (event.altKey) {\n const selection = editor.getSnapshot().selection;\n const ids = selection.nodeIds.includes(node.data.node.id)\n ? selection.nodeIds\n : [node.data.node.id];\n duplicate.current = {\n namespace: createId(\"duplicate-preview\"),\n fragment: copyFragment(graph, ids),\n origin: { ...node.position },\n nodeId: node.data.node.id,\n positions: new Map(\n graph.nodes\n .filter((node) => ids.includes(node.id))\n .map((node) => [node.id, { ...node.position }]),\n ),\n external: event.ctrlKey || event.metaKey || event.shiftKey,\n };\n setDuplicatePreview(duplicate.current);\n }\n }}\n onNodeDragStop={(_event, node) => {\n const current = duplicate.current;\n duplicate.current = null;\n setDuplicatePreview(null);\n if (cancelledDuplicate.current) {\n cancelledDuplicate.current = false;\n editor.cancelGesture();\n editor.select(editor.getSnapshot().selection);\n return;\n }\n if (current) {\n const position =\n current.positions.get(current.nodeId) ?? node.position;\n const delta = {\n x: position.x - current.origin.x,\n y: position.y - current.origin.y,\n };\n try {\n editor.paste(current.fragment, delta, current.external);\n } catch (cause) {\n editor.cancelGesture();\n setError(\n cause instanceof Error ? cause.message : String(cause),\n );\n return;\n }\n }\n editor.commitGesture();\n }}\n onConnectStart={(_event, params) => {\n setRevealedNodeId(params.nodeId?.startsWith(\"node:\") ? params.nodeId.slice(5) : null);\n connection.current = params;\n connectionDone.current = false;\n setConnecting(true);\n }}\n onConnect={(value) => {\n connectionDone.current = true;\n const next = modelConnection(value);\n if (next)\n attempt(() => {\n editor.connect(next.source, next.target, activeMode);\n });\n }}\n onConnectEnd={(event, state) => {\n const origin = connection.current;\n connection.current = null;\n setConnecting(false);\n if (\n connectionDone.current ||\n reconnecting.current ||\n !origin ||\n state.toHandle\n )\n return;\n const point = pointFromEvent(event),\n port = parseHandle(origin.handleId);\n if (!point || !port || !origin.nodeId?.startsWith(\"node:\")) return;\n const source = { nodeId: origin.nodeId.slice(5), portId: port.id };\n const hit =\n port.direction === \"output\"\n ? linkAt(point, source, activeMode)\n : undefined;\n if (hit)\n attempt(() => {\n editor.connect(\n source,\n { type: \"link\", linkId: hit, property: \"weight\" },\n activeMode,\n );\n });\n else if (\"metaKey\" in event && (event.metaKey || event.ctrlKey))\n openPicker(point, {\n origin: { ...source, direction: port.direction },\n });\n }}\n reconnectRadius={12}\n onReconnectStart={(event, edge) => {\n reconnecting.current = edge.id;\n reconnectDuplicate.current =\n event.ctrlKey || event.metaKey || event.altKey;\n setReconnectOriginal(\n reconnectDuplicate.current ? stationaryReconnectEdge(edge) : null,\n );\n connectionDone.current = false;\n setConnecting(true);\n }}\n onReconnect={(edge, value) => {\n connectionDone.current = true;\n const next = modelConnection(value);\n if (next)\n attempt(() => {\n editor.reconnect(\n edge.id,\n next.source,\n next.target,\n reconnectDuplicate.current,\n );\n });\n }}\n onReconnectEnd={(event, edge, handleType, state) => {\n if (\n !connectionDone.current &&\n !state.toHandle &&\n handleType === \"source\"\n ) {\n const point = pointFromEvent(event),\n link = edge.data?.link;\n if (point && link) {\n const hit = linkAt(point, link.source, link.mode, edge.id);\n if (hit)\n attempt(() => {\n editor.reconnect(\n edge.id,\n link.source,\n { type: \"link\", linkId: hit, property: \"weight\" },\n event.ctrlKey || event.metaKey || event.altKey,\n );\n });\n }\n }\n reconnecting.current = null;\n setReconnectOriginal(null);\n setConnecting(false);\n }}\n isValidConnection={(value) => {\n const next = modelConnection(value);\n const old =\n reconnecting.current &&\n graph.links.find((link) => link.id === reconnecting.current);\n return (\n !!next &&\n !editor.canConnect(\n next.source,\n next.target,\n old ? old.mode : activeMode,\n reconnecting.current ?? undefined,\n )\n );\n }}\n onEdgeDoubleClick={(event, edge) => {\n event.preventDefault();\n if (edge.data?.virtual) return;\n openPicker(\n { x: event.clientX, y: event.clientY },\n { linkId: edge.id },\n );\n }}\n connectionLineType={ConnectionLineType.Bezier}\n connectionLineStyle={{\n stroke: editor.modes.get(activeMode)?.color,\n strokeWidth: 2,\n }}\n defaultViewport={props.defaultViewport}\n onInit={instance => props.onInit?.(instance as unknown as ReactFlowInstance)}\n onMoveStart={() => {\n viewportMoving.current = true;\n }}\n onMove={(_, viewport) => setZoom(viewport.zoom)}\n onMoveEnd={(_, viewport) => {\n viewportMoving.current = false;\n setSettledViewport(viewport);\n props.onViewportChange?.(viewport);\n }}\n translateExtent={panExtent}\n fitView={!props.defaultViewport}\n fitViewOptions={{ padding: 0.18 }}\n minZoom={0.05}\n maxZoom={3}\n panOnScroll\n selectionOnDrag\n selectionMode={SelectionMode.Partial}\n panOnDrag={[1, 2]}\n zoomOnScroll={false}\n zoomOnPinch\n zoomOnDoubleClick={false}\n deleteKeyCode={null}\n multiSelectionKeyCode={[\"Meta\", \"Shift\"]}\n nodesDraggable={editor.editing}\n nodesConnectable={editor.editing}\n elementsSelectable={editor.editing}\n autoPanOnConnect\n autoPanOnNodeDrag\n proOptions={{ hideAttribution: true }}\n >\n {drawing && (\n <ViewportPortal>\n <div\n className=\"spagbol-canvas-area-draft\"\n style={{\n transform: `translate(${Math.min(drawing.start.x, drawing.end.x)}px, ${Math.min(drawing.start.y, drawing.end.y)}px)`,\n width: Math.abs(drawing.start.x - drawing.end.x),\n height: Math.abs(drawing.start.y - drawing.end.y),\n }}\n />\n </ViewportPortal>\n )}\n </SpagbolCanvasFlow>\n <div ref={setLinkOverlay} className=\"spagbol-canvas-link-overlay\" />\n {(props.toolbar ?? true) === true ? (\n props.controls === false ? null : (\n <SpagbolCanvasControls {...props.controls} />\n )\n ) : (\n props.toolbar\n )}\n {picker && (\n <div\n className=\"spagbol-canvas-picker nodrag nopan\"\n role=\"dialog\"\n aria-label=\"Add node\"\n style={{ left: picker.screen.x, top: picker.screen.y }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <div className=\"spagbol-canvas-picker-heading\">\n {picker.linkId ? \"insert a node\" : \"add a node\"}\n <button\n aria-label=\"Cancel node creation\"\n onClick={() => setPicker(null)}\n >\n ×\n </button>\n </div>\n <input\n autoFocus\n aria-label=\"Search node types\"\n placeholder=\"Search nodes…\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Escape\") setPicker(null);\n if (event.key === \"Enter\" && availableNodes[0])\n chooseNode(availableNodes[0].kind);\n }}\n />\n <div className=\"spagbol-canvas-picker-list\">\n {availableNodes.map((definition) => (\n <button\n key={definition.kind}\n onClick={() => chooseNode(definition.kind)}\n >\n <span>{definition.label}</span>\n <small>{definition.category}</small>\n </button>\n ))}\n {!availableNodes.length && <p>No matching nodes.</p>}\n </div>\n </div>\n )}\n {error && (\n <div className=\"spagbol-canvas-error\" role=\"alert\">\n {error}\n <button aria-label=\"Dismiss error\" onClick={() => setError(null)}>\n ×\n </button>\n </div>\n )}\n {props.overlay && (\n <div className=\"spagbol-canvas-overlay\">{props.overlay}</div>\n )}\n </div>\n </GraphContext.Provider>\n );\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { type ReactNode } from "react";
2
+ export interface SpagbolCanvasAction {
3
+ id: string;
4
+ label: ReactNode;
5
+ ariaLabel?: string;
6
+ title?: string;
7
+ disabled?: boolean;
8
+ checked?: boolean;
9
+ onSelect(): void | Promise<void>;
10
+ }
11
+ export interface SpagbolCanvasMenuSeparator {
12
+ id: string;
13
+ separator: true;
14
+ }
15
+ export type SpagbolCanvasMenuItem = SpagbolCanvasAction | SpagbolCanvasMenuSeparator;
16
+ export interface SpagbolCanvasControlsOptions {
17
+ /** Host actions beside the menu; history buttons follow these by default. */
18
+ buttons?: readonly SpagbolCanvasAction[];
19
+ menuItems?: readonly SpagbolCanvasMenuItem[];
20
+ menuLabel?: string;
21
+ leading?: ReactNode;
22
+ zoomExtra?: ReactNode;
23
+ showZoom?: boolean;
24
+ showHistory?: boolean;
25
+ showLayoutLock?: boolean;
26
+ showBreadcrumbs?: boolean;
27
+ onActionError?(error: unknown, action: SpagbolCanvasAction): void;
28
+ }
29
+ /** Standard zoom stack and percentage/reset button, independent of app actions. */
30
+ export declare function SpagbolCanvasControlsZoom({ extra }: {
31
+ extra?: ReactNode;
32
+ }): import("react").JSX.Element;
33
+ /** Teia/visual-visual corner menu. Domain actions stay in the consumer. */
34
+ export declare function SpagbolCanvasActions(options: SpagbolCanvasControlsOptions): import("react").JSX.Element;
35
+ export declare function SpagbolCanvasControls(options: SpagbolCanvasControlsOptions): import("react").JSX.Element;
36
+ //# sourceMappingURL=SpagbolCanvasControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpagbolCanvasControls.d.ts","sourceRoot":"","sources":["../../src/react/SpagbolCanvasControls.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKzD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AACD,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;CACjB;AACD,MAAM,MAAM,qBAAqB,GAC7B,mBAAmB,GACnB,0BAA0B,CAAC;AAC/B,MAAM,WAAW,4BAA4B;IAC3C,6EAA6E;IAC7E,OAAO,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,SAAS,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACnE;AAKD,mFAAmF;AACnF,wBAAgB,yBAAyB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,+BAUzE;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,4BAA4B,+BA+JzE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,+BAuC1E"}
@@ -0,0 +1,113 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useReactFlow } from "@xyflow/react";
3
+ import { isGroupBoundary } from "../core/index.js";
4
+ import { useRef, useState } from "react";
5
+ import { SpagbolControlZoom } from "./SpagbolControlZoom.js";
6
+ import { SpagbolCanvasMenu } from "./SpagbolCanvasMenu.js";
7
+ import { useEditorSnapshot, useSpagbol } from "./context.js";
8
+ const labelFor = (action) => action.ariaLabel ??
9
+ (typeof action.label === "string" ? action.label : action.id);
10
+ /** Standard zoom stack and percentage/reset button, independent of app actions. */
11
+ export function SpagbolCanvasControlsZoom({ extra }) {
12
+ const { zoom } = useSpagbol();
13
+ return (_jsx(SpagbolControlZoom, { className: "spagbol-canvas-controls-zoom", zoom: zoom, extra: extra, layout: "corner" }));
14
+ }
15
+ /** Teia/visual-visual corner menu. Domain actions stay in the consumer. */
16
+ export function SpagbolCanvasActions(options) {
17
+ const flow = useReactFlow();
18
+ const scale = (factor) => editor.scaleSelection(factor, new Map(flow.getNodes().filter(node => node.id.startsWith("node:")).map(node => [node.id.slice(5), { width: node.measured?.width ?? node.width ?? 180, height: node.measured?.height ?? node.height ?? 100 }])));
19
+ const { editor } = useSpagbol();
20
+ const snapshot = useEditorSnapshot(editor);
21
+ const [busy, setBusy] = useState(new Set());
22
+ const busyRef = useRef(new Set());
23
+ const [error, setError] = useState(null);
24
+ const buttons = [
25
+ ...(snapshot.path.length
26
+ ? [
27
+ {
28
+ id: "spagbol:exit",
29
+ label: "EXIT",
30
+ ariaLabel: "Exit nested graph",
31
+ onSelect: () => editor.exit(),
32
+ },
33
+ ]
34
+ : []),
35
+ ...(options.buttons ?? []),
36
+ ...(options.showHistory === false
37
+ ? []
38
+ : [
39
+ {
40
+ id: "spagbol:undo",
41
+ label: "UNDO",
42
+ ariaLabel: "Undo",
43
+ title: "Undo (Cmd/Ctrl+Z)",
44
+ disabled: !snapshot.canUndo || !editor.editing,
45
+ onSelect: () => editor.undo(),
46
+ },
47
+ {
48
+ id: "spagbol:redo",
49
+ label: "REDO",
50
+ ariaLabel: "Redo",
51
+ title: "Redo (Cmd/Ctrl+Shift+Z)",
52
+ disabled: !snapshot.canRedo || !editor.editing,
53
+ onSelect: () => editor.redo(),
54
+ },
55
+ ]),
56
+ ];
57
+ const members = editor.graph.nodes.filter(node => snapshot.selection.nodeIds.includes(node.id) && !isGroupBoundary(node));
58
+ const exposed = editor.graph.data?.exposedNodeIds;
59
+ const exposureChecked = members.length > 0 && Array.isArray(exposed) && members.every(node => exposed.includes(node.id));
60
+ const items = [
61
+ { id: 'spagbol:group', label: 'GROUP TO SUBPATCH', ariaLabel: 'Group to subpatch', disabled: !editor.editing || !members.length, onSelect: () => { editor.groupSelection(); } },
62
+ { id: 'spagbol:scale-up', label: 'SCALE UP SELECTION', disabled: !editor.editing || !snapshot.selection.nodeIds.length, onSelect: () => scale(2) },
63
+ { id: 'spagbol:scale-down', label: 'SCALE DOWN SELECTION', disabled: !editor.editing || !snapshot.selection.nodeIds.length, onSelect: () => scale(0.5) },
64
+ ...(options.menuItems ?? []),
65
+ ...(options.showLayoutLock === false
66
+ ? []
67
+ : [
68
+ {
69
+ id: "spagbol:lock",
70
+ label: "LOCK UI",
71
+ ariaLabel: snapshot.mode === "edit" ? "Lock UI" : "Unlock UI",
72
+ checked: snapshot.mode !== "edit",
73
+ disabled: snapshot.mode === "readonly",
74
+ onSelect: () => editor.setMode(editor.editing ? "controls" : "edit"),
75
+ },
76
+ ]),
77
+ ];
78
+ const hasMenu = items.some((item) => !("separator" in item));
79
+ async function invoke(action, fromMenu) {
80
+ if (action.disabled || busyRef.current.has(action.id))
81
+ return;
82
+ busyRef.current.add(action.id);
83
+ setBusy(new Set(busyRef.current));
84
+ setError(null);
85
+ try {
86
+ await action.onSelect();
87
+ }
88
+ catch (cause) {
89
+ setError(cause instanceof Error ? cause.message : String(cause));
90
+ options.onActionError?.(cause, action);
91
+ }
92
+ finally {
93
+ busyRef.current.delete(action.id);
94
+ setBusy(new Set(busyRef.current));
95
+ }
96
+ }
97
+ function actionButton(action, fromMenu = false) {
98
+ return (_jsxs("button", { type: "button", role: fromMenu
99
+ ? action.checked === undefined
100
+ ? "menuitem"
101
+ : "menuitemcheckbox"
102
+ : undefined, "aria-label": labelFor(action), title: action.title ?? labelFor(action), disabled: action.disabled || busy.has(action.id), "aria-busy": busy.has(action.id) || undefined, "aria-checked": fromMenu ? action.checked : undefined, "aria-pressed": fromMenu ? undefined : action.checked, onClick: () => {
103
+ void invoke(action, fromMenu);
104
+ }, children: [action.checked !== undefined && fromMenu ? (_jsx("span", { className: "spagbol-canvas-menu-check", "aria-hidden": "true", children: action.checked ? "✓" : "" })) : null, action.label] }, action.id));
105
+ }
106
+ return (_jsxs("div", { className: "spagbol-canvas-actions nodrag nopan", role: "group", "aria-label": "Canvas actions", onPointerDown: (event) => event.stopPropagation(), onDoubleClick: (event) => event.stopPropagation(), onKeyDown: (event) => event.stopPropagation(), children: [options.leading && (_jsx("div", { className: "spagbol-canvas-actions-leading", children: options.leading })), buttons.map((action) => actionButton(action)), hasMenu && (_jsx(SpagbolCanvasMenu, { label: _jsxs(_Fragment, { children: [options.menuLabel ?? "MORE", " ", _jsx("span", { "aria-hidden": "true", children: "\u02C6" })] }), children: items.map((item) => "separator" in item ? (_jsx("div", { role: "separator", className: "spagbol-canvas-menu-separator" }, item.id)) : (actionButton(item, true))) })), error && (_jsxs("div", { className: "spagbol-canvas-actions-error", role: "alert", children: [error, _jsx("button", { type: "button", "aria-label": "Dismiss action error", onClick: () => setError(null), children: "\u00D7" })] }))] }));
107
+ }
108
+ export function SpagbolCanvasControls(options) {
109
+ const { editor } = useSpagbol();
110
+ const snapshot = useEditorSnapshot(editor);
111
+ return (_jsxs(_Fragment, { children: [options.showBreadcrumbs !== false && snapshot.path.length > 0 && (_jsxs("nav", { className: "spagbol-canvas-breadcrumbs nodrag nopan", "aria-label": "Graph navigation", onPointerDown: (event) => event.stopPropagation(), onKeyDown: (event) => event.stopPropagation(), children: [_jsx("button", { type: "button", onClick: () => editor.navigate([]), children: "ROOT" }), snapshot.path.map((id, index) => (_jsx("button", { type: "button", "aria-current": index === snapshot.path.length - 1 ? "page" : undefined, onClick: () => editor.navigate(snapshot.path.slice(0, index + 1)), children: id }, `${index}:${id}`)))] })), _jsxs("div", { className: `spagbol-canvas-controls${options.showZoom === false ? " spagbol-canvas-controls-no-zoom" : ""}`, children: [options.showZoom !== false && (_jsx(SpagbolCanvasControlsZoom, { extra: options.zoomExtra })), _jsx(SpagbolCanvasActions, { ...options })] })] }));
112
+ }
113
+ //# sourceMappingURL=SpagbolCanvasControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpagbolCanvasControls.js","sourceRoot":"","sources":["../../src/react/SpagbolCanvasControls.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useReactFlow } from \"@xyflow/react\";\nimport { isGroupBoundary } from \"../core/index.js\";\nimport { useRef, useState, type ReactNode } from \"react\";\nimport { SpagbolControlZoom } from \"./SpagbolControlZoom.js\";\nimport { SpagbolCanvasMenu } from \"./SpagbolCanvasMenu.js\";\nimport { useEditorSnapshot, useSpagbol } from \"./context.js\";\n\nexport interface SpagbolCanvasAction {\n id: string;\n label: ReactNode;\n ariaLabel?: string;\n title?: string;\n disabled?: boolean;\n checked?: boolean;\n onSelect(): void | Promise<void>;\n}\nexport interface SpagbolCanvasMenuSeparator {\n id: string;\n separator: true;\n}\nexport type SpagbolCanvasMenuItem =\n | SpagbolCanvasAction\n | SpagbolCanvasMenuSeparator;\nexport interface SpagbolCanvasControlsOptions {\n /** Host actions beside the menu; history buttons follow these by default. */\n buttons?: readonly SpagbolCanvasAction[];\n menuItems?: readonly SpagbolCanvasMenuItem[];\n menuLabel?: string;\n leading?: ReactNode;\n zoomExtra?: ReactNode;\n showZoom?: boolean;\n showHistory?: boolean;\n showLayoutLock?: boolean;\n showBreadcrumbs?: boolean;\n onActionError?(error: unknown, action: SpagbolCanvasAction): void;\n}\nconst labelFor = (action: SpagbolCanvasAction) =>\n action.ariaLabel ??\n (typeof action.label === \"string\" ? action.label : action.id);\n\n/** Standard zoom stack and percentage/reset button, independent of app actions. */\nexport function SpagbolCanvasControlsZoom({ extra }: { extra?: ReactNode }) {\n const { zoom } = useSpagbol();\n return (\n <SpagbolControlZoom\n className=\"spagbol-canvas-controls-zoom\"\n zoom={zoom}\n extra={extra}\n layout=\"corner\"\n />\n );\n}\n\n/** Teia/visual-visual corner menu. Domain actions stay in the consumer. */\nexport function SpagbolCanvasActions(options: SpagbolCanvasControlsOptions) {\n const flow = useReactFlow();\n const scale = (factor: number) => editor.scaleSelection(factor, new Map(flow.getNodes().filter(node => node.id.startsWith(\"node:\")).map(node => [node.id.slice(5), { width: node.measured?.width ?? node.width ?? 180, height: node.measured?.height ?? node.height ?? 100 }])));\n const { editor } = useSpagbol();\n const snapshot = useEditorSnapshot(editor);\n const [busy, setBusy] = useState<ReadonlySet<string>>(new Set());\n const busyRef = useRef(new Set<string>());\n const [error, setError] = useState<string | null>(null);\n const buttons: SpagbolCanvasAction[] = [\n ...(snapshot.path.length\n ? [\n {\n id: \"spagbol:exit\",\n label: \"EXIT\",\n ariaLabel: \"Exit nested graph\",\n onSelect: () => editor.exit(),\n },\n ]\n : []),\n ...(options.buttons ?? []),\n ...(options.showHistory === false\n ? []\n : [\n {\n id: \"spagbol:undo\",\n label: \"UNDO\",\n ariaLabel: \"Undo\",\n title: \"Undo (Cmd/Ctrl+Z)\",\n disabled: !snapshot.canUndo || !editor.editing,\n onSelect: () => editor.undo(),\n },\n {\n id: \"spagbol:redo\",\n label: \"REDO\",\n ariaLabel: \"Redo\",\n title: \"Redo (Cmd/Ctrl+Shift+Z)\",\n disabled: !snapshot.canRedo || !editor.editing,\n onSelect: () => editor.redo(),\n },\n ]),\n ];\n const members = editor.graph.nodes.filter(node => snapshot.selection.nodeIds.includes(node.id) && !isGroupBoundary(node));\n const exposed = editor.graph.data?.exposedNodeIds;\n const exposureChecked = members.length > 0 && Array.isArray(exposed) && members.every(node => exposed.includes(node.id));\n const items: SpagbolCanvasMenuItem[] = [\n { id: 'spagbol:group', label: 'GROUP TO SUBPATCH', ariaLabel: 'Group to subpatch', disabled: !editor.editing || !members.length, onSelect: () => { editor.groupSelection(); } },\n\n { id: 'spagbol:scale-up', label: 'SCALE UP SELECTION', disabled: !editor.editing || !snapshot.selection.nodeIds.length, onSelect: () => scale(2) },\n { id: 'spagbol:scale-down', label: 'SCALE DOWN SELECTION', disabled: !editor.editing || !snapshot.selection.nodeIds.length, onSelect: () => scale(0.5) },\n ...(options.menuItems ?? []),\n ...(options.showLayoutLock === false\n ? []\n : [\n {\n id: \"spagbol:lock\",\n label: \"LOCK UI\",\n ariaLabel: snapshot.mode === \"edit\" ? \"Lock UI\" : \"Unlock UI\",\n checked: snapshot.mode !== \"edit\",\n disabled: snapshot.mode === \"readonly\",\n onSelect: () =>\n editor.setMode(editor.editing ? \"controls\" : \"edit\"),\n },\n ]),\n ];\n const hasMenu = items.some((item) => !(\"separator\" in item));\n async function invoke(action: SpagbolCanvasAction, fromMenu: boolean) {\n if (action.disabled || busyRef.current.has(action.id)) return;\n busyRef.current.add(action.id);\n setBusy(new Set(busyRef.current));\n setError(null);\n try {\n await action.onSelect();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n options.onActionError?.(cause, action);\n } finally {\n busyRef.current.delete(action.id);\n setBusy(new Set(busyRef.current));\n }\n }\n function actionButton(action: SpagbolCanvasAction, fromMenu = false) {\n return (\n <button\n key={action.id}\n type=\"button\"\n role={\n fromMenu\n ? action.checked === undefined\n ? \"menuitem\"\n : \"menuitemcheckbox\"\n : undefined\n }\n aria-label={labelFor(action)}\n title={action.title ?? labelFor(action)}\n disabled={action.disabled || busy.has(action.id)}\n aria-busy={busy.has(action.id) || undefined}\n aria-checked={fromMenu ? action.checked : undefined}\n aria-pressed={fromMenu ? undefined : action.checked}\n onClick={() => {\n void invoke(action, fromMenu);\n }}\n >\n {action.checked !== undefined && fromMenu ? (\n <span className=\"spagbol-canvas-menu-check\" aria-hidden=\"true\">\n {action.checked ? \"✓\" : \"\"}\n </span>\n ) : null}\n {action.label}\n </button>\n );\n }\n return (\n <div\n className=\"spagbol-canvas-actions nodrag nopan\"\n role=\"group\"\n aria-label=\"Canvas actions\"\n onPointerDown={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n {options.leading && (\n <div className=\"spagbol-canvas-actions-leading\">{options.leading}</div>\n )}\n {buttons.map((action) => actionButton(action))}\n {hasMenu && (\n <SpagbolCanvasMenu\n label={\n <>\n {options.menuLabel ?? \"MORE\"} <span aria-hidden=\"true\">ˆ</span>\n </>\n }\n >\n {items.map((item) =>\n \"separator\" in item ? (\n <div\n key={item.id}\n role=\"separator\"\n className=\"spagbol-canvas-menu-separator\"\n />\n ) : (\n actionButton(item, true)\n ),\n )}\n </SpagbolCanvasMenu>\n )}\n {error && (\n <div className=\"spagbol-canvas-actions-error\" role=\"alert\">\n {error}\n <button\n type=\"button\"\n aria-label=\"Dismiss action error\"\n onClick={() => setError(null)}\n >\n ×\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport function SpagbolCanvasControls(options: SpagbolCanvasControlsOptions) {\n const { editor } = useSpagbol();\n const snapshot = useEditorSnapshot(editor);\n return (\n <>\n {options.showBreadcrumbs !== false && snapshot.path.length > 0 && (\n <nav\n className=\"spagbol-canvas-breadcrumbs nodrag nopan\"\n aria-label=\"Graph navigation\"\n onPointerDown={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n <button type=\"button\" onClick={() => editor.navigate([])}>\n ROOT\n </button>\n {snapshot.path.map((id, index) => (\n <button\n key={`${index}:${id}`}\n type=\"button\"\n aria-current={\n index === snapshot.path.length - 1 ? \"page\" : undefined\n }\n onClick={() => editor.navigate(snapshot.path.slice(0, index + 1))}\n >\n {id}\n </button>\n ))}\n </nav>\n )}\n <div\n className={`spagbol-canvas-controls${options.showZoom === false ? \" spagbol-canvas-controls-no-zoom\" : \"\"}`}\n >\n {options.showZoom !== false && (\n <SpagbolCanvasControlsZoom extra={options.zoomExtra} />\n )}\n <SpagbolCanvasActions {...options} />\n </div>\n </>\n );\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { type Node, type Edge, type ReactFlowProps } from "@xyflow/react";
2
+ /** Controlled integration boundary for hosts with an existing graph controller.
3
+ * Node/edge payloads and all edit callbacks belong to the host. Use inside a
4
+ * ReactFlowProvider so specialised host nodes retain access to the flow store.
5
+ */
6
+ export type SpagbolCanvasFlowProps<N extends Node = Node, E extends Edge = Edge> = ReactFlowProps<N, E> & {
7
+ grid?: false | {
8
+ color?: string;
9
+ gap?: number;
10
+ size?: number;
11
+ };
12
+ };
13
+ export declare function SpagbolCanvasFlow<N extends Node = Node, E extends Edge = Edge>({ grid, children, className, ...props }: SpagbolCanvasFlowProps<N, E>): import("react").JSX.Element;
14
+ //# sourceMappingURL=SpagbolCanvasFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpagbolCanvasFlow.d.ts","sourceRoot":"","sources":["../../src/react/SpagbolCanvasFlow.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,IAAI,EACT,KAAK,IAAI,EACT,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,IAAI,GAAG,IAAI,EACrB,CAAC,SAAS,IAAI,GAAG,IAAI,IACnB,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IACzB,IAAI,CAAC,EAAE,KAAK,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE,CAAC;AACF,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,IAAI,GAAG,IAAI,EACrB,CAAC,SAAS,IAAI,GAAG,IAAI,EACrB,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,+BAgBtE"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Background, ReactFlow, } from "@xyflow/react";
3
+ export function SpagbolCanvasFlow({ grid, children, className, ...props }) {
4
+ return (_jsxs(ReactFlow, { ...props, className: `spagbol-canvas-flow ${className ?? ""}`, children: [children, grid !== false && (_jsx(Background, { color: grid?.color ?? "var(--spagbol-grid, rgba(255,255,255,0.08))", gap: grid?.gap ?? 28, size: grid?.size ?? 1 }))] }));
5
+ }
6
+ //# sourceMappingURL=SpagbolCanvasFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpagbolCanvasFlow.js","sourceRoot":"","sources":["../../src/react/SpagbolCanvasFlow.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,SAAS,GAIV,MAAM,eAAe,CAAC;AAYvB,MAAM,UAAU,iBAAiB,CAG/B,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAgC;IACrE,OAAO,CACL,MAAC,SAAS,OACJ,KAAK,EACT,SAAS,EAAE,uBAAuB,SAAS,IAAI,EAAE,EAAE,aAElD,QAAQ,EACR,IAAI,KAAK,KAAK,IAAI,CACjB,KAAC,UAAU,IACT,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,6CAA6C,EACnE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EACpB,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,GACrB,CACH,IACS,CACb,CAAC;AACJ,CAAC","sourcesContent":["import {\n Background,\n ReactFlow,\n type Node,\n type Edge,\n type ReactFlowProps,\n} from \"@xyflow/react\";\n\n/** Controlled integration boundary for hosts with an existing graph controller.\n * Node/edge payloads and all edit callbacks belong to the host. Use inside a\n * ReactFlowProvider so specialised host nodes retain access to the flow store.\n */\nexport type SpagbolCanvasFlowProps<\n N extends Node = Node,\n E extends Edge = Edge,\n> = ReactFlowProps<N, E> & {\n grid?: false | { color?: string; gap?: number; size?: number };\n};\nexport function SpagbolCanvasFlow<\n N extends Node = Node,\n E extends Edge = Edge,\n>({ grid, children, className, ...props }: SpagbolCanvasFlowProps<N, E>) {\n return (\n <ReactFlow<N, E>\n {...props}\n className={`spagbol-canvas-flow ${className ?? \"\"}`}\n >\n {children}\n {grid !== false && (\n <Background\n color={grid?.color ?? \"var(--spagbol-grid, rgba(255,255,255,0.08))\"}\n gap={grid?.gap ?? 28}\n size={grid?.size ?? 1}\n />\n )}\n </ReactFlow>\n );\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { CSSProperties } from 'react';
2
+ export interface SpagbolCanvasLinkControlsProps {
3
+ weight: number;
4
+ mode: string;
5
+ enabled: boolean;
6
+ style?: CSSProperties;
7
+ modes?: readonly {
8
+ id: string;
9
+ label: string;
10
+ }[];
11
+ onWeightChange(value: number): void;
12
+ onModeChange(mode: string): void;
13
+ onEnabledChange(enabled: boolean): void;
14
+ }
15
+ export declare function SpagbolCanvasLinkControls({ weight, mode, enabled, style, modes, onWeightChange, onModeChange, onEnabledChange }: SpagbolCanvasLinkControlsProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=SpagbolCanvasLinkControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpagbolCanvasLinkControls.d.ts","sourceRoot":"","sources":["../../src/react/SpagbolCanvasLinkControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtE,KAAK,CAAC,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzC;AACD,wBAAgB,yBAAyB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAyB,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,8BAA8B,+BAUnL"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { standardLinkModes } from '../core/index.js';
3
+ import { SpagbolControlNumberLink } from './SpagbolControlNumberLink.js';
4
+ export function SpagbolCanvasLinkControls({ weight, mode, enabled, style, modes = standardLinkModes, onWeightChange, onModeChange, onEnabledChange }) {
5
+ return _jsxs("div", { className: "spagbol-canvas-link-controls nodrag nopan", style: style, onPointerDown: event => event.stopPropagation(), onDoubleClick: event => event.stopPropagation(), children: [_jsxs("div", { className: "spagbol-canvas-link-controls-value-row", children: [_jsx(SpagbolControlNumberLink, { value: weight, onChange: onWeightChange }), _jsx("button", { className: `spagbol-canvas-link-controls-enabled nodrag nopan${enabled ? ' spagbol-canvas-link-controls-enabled-active' : ''}`, type: "button", onClick: event => { event.stopPropagation(); onEnabledChange(!enabled); }, onPointerDown: event => event.stopPropagation(), onMouseDown: event => event.stopPropagation(), onDoubleClick: event => event.stopPropagation(), "aria-label": enabled ? 'Disable link' : 'Enable link', "aria-pressed": enabled, title: enabled ? 'Disable link' : 'Enable link' })] }), _jsx("select", { className: "spagbol-canvas-link-controls-mode nodrag nopan", value: mode, onChange: event => { onModeChange(event.target.value); event.currentTarget.blur(); }, onPointerDown: event => event.stopPropagation(), onMouseDown: event => event.stopPropagation(), onDoubleClick: event => event.stopPropagation(), "aria-label": "Link mode", title: "Link mode", children: modes.map(item => _jsx("option", { value: item.id, children: item.label }, item.id)) })] });
6
+ }
7
+ //# sourceMappingURL=SpagbolCanvasLinkControls.js.map