@barefootjs/xyflow 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 (58) hide show
  1. package/README.md +117 -0
  2. package/dist/classes.d.ts +31 -0
  3. package/dist/classes.d.ts.map +1 -0
  4. package/dist/compat.d.ts +67 -0
  5. package/dist/compat.d.ts.map +1 -0
  6. package/dist/connection.d.ts +20 -0
  7. package/dist/connection.d.ts.map +1 -0
  8. package/dist/constants.d.ts +4 -0
  9. package/dist/constants.d.ts.map +1 -0
  10. package/dist/context.d.ts +7 -0
  11. package/dist/context.d.ts.map +1 -0
  12. package/dist/edge-path.d.ts +14 -0
  13. package/dist/edge-path.d.ts.map +1 -0
  14. package/dist/flow-subsystems.d.ts +28 -0
  15. package/dist/flow-subsystems.d.ts.map +1 -0
  16. package/dist/hooks.d.ts +34 -0
  17. package/dist/hooks.d.ts.map +1 -0
  18. package/dist/index.d.ts +19 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +6572 -0
  21. package/dist/node-resizer.d.ts +52 -0
  22. package/dist/node-resizer.d.ts.map +1 -0
  23. package/dist/node-type-dispatch.d.ts +34 -0
  24. package/dist/node-type-dispatch.d.ts.map +1 -0
  25. package/dist/selection.d.ts +32 -0
  26. package/dist/selection.d.ts.map +1 -0
  27. package/dist/store.d.ts +8 -0
  28. package/dist/store.d.ts.map +1 -0
  29. package/dist/types.d.ts +214 -0
  30. package/dist/types.d.ts.map +1 -0
  31. package/dist/utils.d.ts +6 -0
  32. package/dist/utils.d.ts.map +1 -0
  33. package/dist/xyflow.browser.min.js +95 -0
  34. package/dist/xyflow.browser.min.js.map +129 -0
  35. package/package.json +58 -0
  36. package/src/__tests__/clamp-drag-position.test.ts +111 -0
  37. package/src/__tests__/compat.test.ts +157 -0
  38. package/src/__tests__/host-element-store.test.ts +33 -0
  39. package/src/__tests__/jsx-smoke.test.ts +33 -0
  40. package/src/__tests__/jsx-smoke.tsx +23 -0
  41. package/src/__tests__/node-type-dispatch.test.ts +104 -0
  42. package/src/__tests__/store.test.ts +399 -0
  43. package/src/__tests__/tsconfig.json +23 -0
  44. package/src/classes.ts +41 -0
  45. package/src/compat.ts +237 -0
  46. package/src/connection.ts +459 -0
  47. package/src/constants.ts +8 -0
  48. package/src/context.ts +8 -0
  49. package/src/edge-path.ts +89 -0
  50. package/src/flow-subsystems.ts +506 -0
  51. package/src/hooks.ts +72 -0
  52. package/src/index.ts +134 -0
  53. package/src/node-resizer.ts +276 -0
  54. package/src/node-type-dispatch.ts +46 -0
  55. package/src/selection.ts +407 -0
  56. package/src/store.ts +526 -0
  57. package/src/types.ts +329 -0
  58. package/src/utils.ts +13 -0
@@ -0,0 +1,129 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/store.ts", "../../../node_modules/.bun/d3-dispatch@3.0.1/node_modules/d3-dispatch/src/dispatch.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/namespaces.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/namespace.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/creator.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selector.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/select.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/array.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selectorAll.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/selectAll.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/matcher.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/selectChild.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/selectChildren.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/filter.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/sparse.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/enter.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/constant.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/data.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/exit.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/join.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/merge.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/order.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/sort.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/call.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/nodes.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/node.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/size.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/empty.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/each.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/attr.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/window.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/style.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/property.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/classed.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/text.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/html.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/raise.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/lower.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/append.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/insert.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/remove.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/clone.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/datum.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/on.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/dispatch.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/iterator.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/selection/index.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/select.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/sourceEvent.js", "../../../node_modules/.bun/d3-selection@3.0.0/node_modules/d3-selection/src/pointer.js", "../../../node_modules/.bun/d3-drag@3.0.0/node_modules/d3-drag/src/noevent.js", "../../../node_modules/.bun/d3-drag@3.0.0/node_modules/d3-drag/src/nodrag.js", "../../../node_modules/.bun/d3-drag@3.0.0/node_modules/d3-drag/src/constant.js", "../../../node_modules/.bun/d3-drag@3.0.0/node_modules/d3-drag/src/event.js", "../../../node_modules/.bun/d3-drag@3.0.0/node_modules/d3-drag/src/drag.js", "../../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/define.js", "../../../node_modules/.bun/d3-color@3.1.0/node_modules/d3-color/src/color.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basis.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/basisClosed.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/constant.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/color.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/numberArray.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/array.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/date.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/number.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/object.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/value.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/decompose.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/parse.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/index.js", "../../../node_modules/.bun/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/zoom.js", "../../../node_modules/.bun/d3-timer@3.0.1/node_modules/d3-timer/src/timer.js", "../../../node_modules/.bun/d3-timer@3.0.1/node_modules/d3-timer/src/timeout.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/schedule.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/interrupt.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/selection/interrupt.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/tween.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/interpolate.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/attr.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/attrTween.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/delay.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/duration.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/ease.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/easeVarying.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/filter.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/merge.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/on.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/remove.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/select.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/selectAll.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/selection.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/style.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/styleTween.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/text.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/textTween.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/transition.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/end.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/transition/index.js", "../../../node_modules/.bun/d3-ease@3.0.1/node_modules/d3-ease/src/cubic.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/selection/transition.js", "../../../node_modules/.bun/d3-transition@3.0.1+ddb27bb92657a88b/node_modules/d3-transition/src/selection/index.js", "../../../node_modules/.bun/d3-zoom@3.0.0/node_modules/d3-zoom/src/constant.js", "../../../node_modules/.bun/d3-zoom@3.0.0/node_modules/d3-zoom/src/event.js", "../../../node_modules/.bun/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js", "../../../node_modules/.bun/d3-zoom@3.0.0/node_modules/d3-zoom/src/noevent.js", "../../../node_modules/.bun/d3-zoom@3.0.0/node_modules/d3-zoom/src/zoom.js", "../../../node_modules/.bun/@xyflow+system@0.0.76/node_modules/@xyflow/system/dist/esm/index.js", "../src/constants.ts", "../src/context.ts", "../src/hooks.ts", "../src/edge-path.ts", "../src/flow-subsystems.ts", "../src/selection.ts", "../src/connection.ts", "../src/node-type-dispatch.ts", "../src/node-resizer.ts", "../src/classes.ts", "../src/compat.ts"],
4
+ "sourcesContent": [
5
+ "import {\n createSignal,\n createEffect,\n createMemo,\n untrack,\n} from '@barefootjs/client'\nimport {\n adoptUserNodes,\n updateAbsolutePositions,\n updateConnectionLookup,\n fitViewport,\n panBy as panByUtil,\n} from '@xyflow/system'\nimport type {\n NodeBase,\n EdgeBase,\n InternalNodeBase,\n Viewport,\n NodeLookup,\n ParentLookup,\n EdgeLookup,\n ConnectionLookup,\n SnapGrid,\n NodeOrigin,\n Transform,\n PanZoomInstance,\n NodeDragItem,\n XYPosition,\n} from '@xyflow/system'\nimport type { FlowStoreOptions, InternalFlowStore, FitViewOptions } from './types'\nimport { INFINITE_EXTENT } from './constants'\n\nconst DEFAULT_VIEWPORT: Viewport = { x: 0, y: 0, zoom: 1 }\n\n/**\n * Create a signal-based reactive store that bridges @xyflow/system\n * with BarefootJS reactivity.\n */\nexport function createFlowStore<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(options: FlowStoreOptions<NodeType, EdgeType> = {}): InternalFlowStore<NodeType, EdgeType> {\n // --- Configuration ---\n const minZoom = options.minZoom ?? 0.5\n const maxZoom = options.maxZoom ?? 2\n const nodeOrigin: NodeOrigin = options.nodeOrigin ?? [0, 0]\n const nodeExtent = options.nodeExtent ?? INFINITE_EXTENT\n const snapToGrid = options.snapToGrid ?? false\n const snapGrid: SnapGrid = options.snapGrid ?? [15, 15]\n const edgesReconnectable = options.edgesReconnectable ?? false\n\n // --- Core state signals ---\n const [nodes, setNodes] = createSignal<NodeType[]>(options.nodes ?? [])\n const [edges, setEdges] = createSignal<EdgeType[]>(options.edges ?? [])\n const [viewport, setViewport] = createSignal<Viewport>(\n options.defaultViewport ?? DEFAULT_VIEWPORT\n )\n const [width, setWidth] = createSignal(0)\n const [height, setHeight] = createSignal(0)\n const [dragging, setDragging] = createSignal(false)\n\n // --- Internal refs ---\n const [panZoom, setPanZoom] = createSignal<PanZoomInstance | null>(null)\n const [domNode, setDomNode] = createSignal<HTMLElement | null>(null)\n\n // --- Lookups ---\n //\n // The outer signals hold the lookup `Map` for iteration-style\n // consumers (edge-path effect, adapters that walk every node). They\n // emit a fresh `Map` reference on each change so barefoot's\n // identity-based dedupe does not suppress notification.\n //\n // The internal map of per-node signals (`nodeSignals`) is what\n // delivers the fine-grained channel: per-node consumers subscribe\n // through `nodeSignal(id)` and only wake up when *that* node's entry\n // changes. This removes the recurring \"read `nodes()` first to wake\n // up the lookup\" workaround at its source (#1270).\n const [nodeLookup, setNodeLookup] = createSignal<NodeLookup<InternalNodeBase<NodeType>>>(\n new Map()\n )\n const [parentLookup, setParentLookup] = createSignal<ParentLookup<InternalNodeBase<NodeType>>>(\n new Map()\n )\n const [edgeLookup, setEdgeLookup] = createSignal<EdgeLookup<EdgeType>>(new Map())\n const [connectionLookup, setConnectionLookup] = createSignal<ConnectionLookup>(new Map())\n\n type NodeSignalSlot = {\n get: () => InternalNodeBase<NodeType> | undefined\n set: (\n value:\n | InternalNodeBase<NodeType>\n | undefined\n | ((prev: InternalNodeBase<NodeType> | undefined) => InternalNodeBase<NodeType> | undefined),\n ) => void\n }\n const nodeSignals = new Map<string, NodeSignalSlot>()\n\n // Slots are retained across remove → re-add so a consumer that\n // called `nodeSignal(id)` before the node was added (or after it was\n // removed) keeps subscribing to the same slot and is notified when\n // the node appears.\n function getOrCreateNodeSlot(id: string): NodeSignalSlot {\n let slot = nodeSignals.get(id)\n if (!slot) {\n const [get, set] = createSignal<InternalNodeBase<NodeType> | undefined>(undefined)\n slot = { get, set: set as NodeSignalSlot['set'] }\n nodeSignals.set(id, slot)\n }\n return slot\n }\n\n function nodeSignal(id: string): InternalNodeBase<NodeType> | undefined {\n return getOrCreateNodeSlot(id).get()\n }\n\n // Lightweight counter for notifying position-dependent subscribers (edges,\n // per-node position effects) without triggering the full adoptUserNodes\n // pipeline. Bumped by the drag handler after mutating nodeLookup in-place.\n const [positionEpoch, setPositionEpoch] = createSignal(0)\n\n // --- Derived state ---\n\n /**\n * Process user nodes through @xyflow/system's adoptUserNodes.\n * This populates nodeLookup/parentLookup and calculates internals.\n * Returns whether all nodes have measured dimensions.\n */\n const nodesInitialized = createMemo(() => {\n const currentNodes = nodes()\n const lookup = untrack(nodeLookup)\n const parents = untrack(parentLookup)\n\n // Preserve measured dimensions from existing internal nodes.\n // adoptUserNodes reads userNode.measured but setNodes callers\n // may not include it. Inject from existing lookup before rebuild.\n for (const userNode of currentNodes) {\n if (userNode.measured?.width) continue\n const existing = lookup.get(userNode.id)\n if (existing?.measured.width) {\n ;(userNode as NodeBase).measured = {\n width: existing.measured.width,\n height: existing.measured.height,\n }\n }\n }\n\n const result = adoptUserNodes(currentNodes, lookup, parents, {\n nodeOrigin,\n nodeExtent,\n checkEquality: false,\n })\n\n updateAbsolutePositions(lookup, parents, {\n nodeOrigin,\n nodeExtent,\n })\n\n // Reconcile the per-node signal cache with the freshly-rebuilt\n // lookup. `adoptUserNodes(..., checkEquality: false)` constructs\n // a new InternalNode wrapper for every entry on every call, so\n // entry identity is **not** a reliable change signal. The\n // underlying `internals.userNode` reference, however, only flips\n // when `setNodes` actually produced a new node identity (callers\n // use `prev.map(n => n.id === target ? { ...n, ... } : n)`), so\n // we gate on that — sibling ids whose user node is unchanged stay\n // silent. Removed ids see `undefined`.\n for (const [id, entry] of lookup) {\n const slot = getOrCreateNodeSlot(id)\n const current = untrack(slot.get)\n if (current?.internals.userNode !== entry.internals.userNode) {\n slot.set(entry)\n }\n }\n for (const [id, slot] of nodeSignals) {\n if (!lookup.has(id) && untrack(slot.get) !== undefined) {\n slot.set(undefined)\n }\n }\n\n // Emit fresh outer Map references so coarse consumers (iterators\n // that walk every node) re-run. `adoptUserNodes` mutates the\n // existing `Map` in place, so re-emitting the same reference\n // would be a no-op under barefoot's Object.is dedupe (#1270).\n setNodeLookup(() => new Map(lookup))\n setParentLookup(() => new Map(parents))\n\n return result.nodesInitialized\n })\n\n // Process edges into lookup when edges change\n createEffect(() => {\n const currentEdges = edges()\n const eLookup = new Map<string, EdgeType>()\n for (const edge of currentEdges) {\n eLookup.set(edge.id, edge)\n }\n setEdgeLookup(() => eLookup)\n\n const connLookup = untrack(connectionLookup)\n updateConnectionLookup(connLookup, eLookup, currentEdges)\n // `updateConnectionLookup` mutates `connLookup` in place; emit a\n // fresh `Map` reference so subscribers actually see the change.\n setConnectionLookup(() => new Map(connLookup))\n })\n\n // --- Selection state ---\n const [multiSelectionActive, setMultiSelectionActive] = createSignal(false)\n\n // --- Interactivity ---\n const [nodesDraggable, setNodesDraggable] = createSignal(options.nodesDraggable ?? true)\n const [nodesConnectable, setNodesConnectable] = createSignal(options.nodesConnectable ?? true)\n const [elementsSelectable, setElementsSelectable] = createSignal(options.elementsSelectable ?? true)\n\n // --- Pan/zoom config (reactive signals for dynamic changes) ---\n const [panOnDrag, setPanOnDrag] = createSignal(options.panOnDrag ?? true)\n const [panOnScroll, setPanOnScroll] = createSignal(options.panOnScroll ?? false)\n const [zoomOnScroll, setZoomOnScroll] = createSignal(options.zoomOnScroll ?? true)\n\n // --- Static config ---\n const deleteKeyCode = options.deleteKeyCode !== undefined ? options.deleteKeyCode : ['Delete', 'Backspace']\n const selectionKeyCode = options.selectionKeyCode !== undefined ? options.selectionKeyCode : 'Shift'\n const connectionLineStyle = options.connectionLineStyle\n const defaultEdgeOptions = options.defaultEdgeOptions\n const elevateNodesOnSelect = options.elevateNodesOnSelect ?? false\n const reconnectRadius = options.reconnectRadius ?? 20\n const zoomOnDoubleClick = options.zoomOnDoubleClick ?? true\n\n /**\n * Update pan/zoom instance configuration.\n * Called by initFlow on setup and reactively when settings change.\n */\n function updatePanZoomConfig() {\n const pz = untrack(panZoom)\n if (!pz) return\n pz.update({\n noWheelClassName: 'nowheel',\n noPanClassName: 'nopan',\n preventScrolling: true,\n panOnScroll: panOnScroll(),\n panOnDrag: panOnDrag(),\n panOnScrollMode: 'free' as any,\n panOnScrollSpeed: 0.5,\n userSelectionActive: false,\n zoomOnPinch: true,\n zoomOnScroll: zoomOnScroll(),\n zoomOnDoubleClick,\n zoomActivationKeyPressed: false,\n lib: 'bf',\n onTransformChange: (transform: Transform) => {\n setViewport({ x: transform[0], y: transform[1], zoom: transform[2] })\n },\n connectionInProgress: false,\n paneClickDistance: 0,\n })\n }\n\n // --- Actions ---\n\n function getTransform(): Transform {\n const vp = untrack(viewport)\n return [vp.x, vp.y, vp.zoom]\n }\n\n /**\n * Bump the position epoch counter to notify position-dependent effects\n * (edges, per-node position) without triggering adoptUserNodes.\n */\n function triggerPositionUpdate(): void {\n setPositionEpoch((n) => n + 1)\n }\n\n /**\n * Update node positions during drag operations.\n * Called by XYDrag with the current drag items.\n */\n function updateNodePositions(\n dragItems: Map<string, NodeDragItem | InternalNodeBase>,\n isDragging = true,\n ) {\n const lookup = untrack(nodeLookup)\n let mutated = false\n\n for (const [id, item] of dragItems) {\n const internalNode = lookup.get(id)\n if (!internalNode) continue\n\n internalNode.internals.positionAbsolute = item.internals\n ? (item as InternalNodeBase).internals.positionAbsolute\n : { x: (item as NodeDragItem).position.x, y: (item as NodeDragItem).position.y }\n\n internalNode.internals.userNode.position = item.position\n internalNode.internals.userNode.dragging = isDragging\n\n // Per-node fine-grained emit: shallow-clone so the entry identity\n // flips (barefoot's Object.is dedupe would otherwise swallow the\n // notification — the mutations above don't change the entry\n // reference). The inner `internals` object stays shared, so\n // consumers reading `.internals.positionAbsolute` still see the\n // updated position.\n const fresh = { ...internalNode } as InternalNodeBase<NodeType>\n lookup.set(id, fresh)\n getOrCreateNodeSlot(id).set(fresh)\n mutated = true\n }\n\n if (mutated) {\n // Coarse emit so iteration-style consumers re-run too. Per-node\n // bridges that switched to `nodeSignal(id)` only wake up for\n // their own id and skip this channel.\n setNodeLookup(() => new Map(lookup))\n }\n // Keep positionEpoch as the dedicated drag-rate channel for\n // existing subscribers (edge-path effect).\n triggerPositionUpdate()\n }\n\n /**\n * Deselect all nodes and edges, or specific ones.\n */\n function unselectNodesAndEdges(params?: {\n nodes?: NodeBase[]\n edges?: EdgeBase[]\n }) {\n const currentNodes = untrack(nodes)\n const currentEdges = untrack(edges)\n\n if (params?.nodes) {\n const idsToDeselect = new Set(params.nodes.map((n) => n.id))\n setNodes(\n currentNodes.map((n) =>\n idsToDeselect.has(n.id) ? { ...n, selected: false } : n,\n ) as NodeType[],\n )\n } else {\n setNodes(\n currentNodes.map((n) =>\n n.selected ? { ...n, selected: false } : n,\n ) as NodeType[],\n )\n }\n\n if (params?.edges) {\n const idsToDeselect = new Set(params.edges.map((e) => e.id))\n setEdges(\n currentEdges.map((e) =>\n idsToDeselect.has(e.id) ? { ...e, selected: false } : e,\n ) as EdgeType[],\n )\n } else {\n setEdges(\n currentEdges.map((e) =>\n e.selected ? { ...e, selected: false } : e,\n ) as EdgeType[],\n )\n }\n }\n\n /**\n * Pan the viewport by a delta amount.\n */\n async function panByDelta(delta: XYPosition): Promise<boolean> {\n return panByUtil({\n delta,\n panZoom: untrack(panZoom),\n transform: getTransform(),\n translateExtent: INFINITE_EXTENT,\n width: untrack(width),\n height: untrack(height),\n })\n }\n\n /**\n * Add a new edge to the store.\n */\n function addEdge(edge: EdgeType) {\n setEdges((prev) => [...prev, edge])\n }\n\n /**\n * Delete nodes and edges from the store.\n */\n function deleteElements(params: {\n nodes?: NodeType[]\n edges?: EdgeType[]\n }) {\n if (params.nodes?.length) {\n const idsToRemove = new Set(params.nodes.map((n) => n.id))\n setNodes((prev) => prev.filter((n) => !idsToRemove.has(n.id)))\n // Also remove connected edges\n setEdges((prev) =>\n prev.filter(\n (e) => !idsToRemove.has(e.source) && !idsToRemove.has(e.target),\n ),\n )\n }\n if (params.edges?.length) {\n const idsToRemove = new Set(params.edges.map((e) => e.id))\n setEdges((prev) => prev.filter((e) => !idsToRemove.has(e.id)))\n }\n }\n\n function fitView(fitViewOptions?: FitViewOptions) {\n const pz = untrack(panZoom)\n if (!pz) return\n\n const lookup = untrack(nodeLookup)\n const w = untrack(width)\n const h = untrack(height)\n\n fitViewport(\n {\n nodes: lookup,\n width: w,\n height: h,\n panZoom: pz,\n minZoom,\n maxZoom,\n },\n { padding: 0.1, ...fitViewOptions }\n )\n }\n\n return {\n // Signal getters\n nodes,\n edges,\n viewport,\n width,\n height,\n dragging,\n nodesInitialized,\n\n // Lookups\n nodeLookup,\n parentLookup,\n edgeLookup,\n connectionLookup,\n nodeSignal,\n\n // Internal refs\n panZoom,\n domNode,\n\n // Setters\n setNodes,\n setEdges,\n setViewport,\n setWidth,\n setHeight,\n\n // Selection state\n multiSelectionActive,\n\n // Interactivity\n nodesDraggable,\n setNodesDraggable,\n nodesConnectable,\n setNodesConnectable,\n elementsSelectable,\n setElementsSelectable,\n panOnDrag,\n setPanOnDrag,\n panOnScroll,\n setPanOnScroll,\n zoomOnScroll,\n setZoomOnScroll,\n\n // Static config\n deleteKeyCode,\n selectionKeyCode,\n connectionLineStyle,\n defaultEdgeOptions,\n elevateNodesOnSelect,\n reconnectRadius,\n\n // Lightweight position change notification (avoids full adoptUserNodes)\n positionEpoch,\n triggerPositionUpdate,\n\n setDragging,\n setPanZoom,\n setDomNode,\n setMultiSelectionActive,\n updatePanZoomConfig,\n\n // Actions\n fitView,\n updateNodePositions,\n unselectNodesAndEdges,\n panByDelta,\n addEdge,\n deleteElements,\n\n // Configuration\n minZoom,\n maxZoom,\n nodeOrigin,\n nodeExtent,\n snapToGrid,\n snapGrid,\n edgesReconnectable,\n\n getTransform,\n\n // Custom types\n nodeTypes: options.nodeTypes,\n edgeTypes: options.edgeTypes,\n\n // Connection callbacks\n onConnect: options.onConnect,\n onConnectStart: options.onConnectStart,\n onConnectEnd: options.onConnectEnd,\n isValidConnection: options.isValidConnection,\n onReconnect: options.onReconnect,\n\n // Lifecycle callbacks\n onInit: options.onInit,\n onNodeDragStart: options.onNodeDragStart,\n onNodeDragStop: options.onNodeDragStop,\n onMoveEnd: options.onMoveEnd,\n onPaneClick: options.onPaneClick,\n onPaneMouseMove: options.onPaneMouseMove,\n onNodesDelete: options.onNodesDelete,\n onEdgesDelete: options.onEdgesDelete,\n }\n}\n",
6
+ "var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n",
7
+ "export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n",
8
+ "import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n",
9
+ "import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n",
10
+ "function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n",
11
+ "import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n",
12
+ "// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n",
13
+ "function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n",
14
+ "import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n",
15
+ "export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n",
16
+ "import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n",
17
+ "import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n",
18
+ "import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n",
19
+ "export default function(update) {\n return new Array(update.length);\n}\n",
20
+ "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n",
21
+ "export default function(x) {\n return function() {\n return x;\n };\n}\n",
22
+ "import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n",
23
+ "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n",
24
+ "export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n",
25
+ "import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n",
26
+ "export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n",
27
+ "import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n",
28
+ "export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n",
29
+ "export default function() {\n return Array.from(this);\n}\n",
30
+ "export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n",
31
+ "export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n",
32
+ "export default function() {\n return !this.node();\n}\n",
33
+ "export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n",
34
+ "import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n",
35
+ "export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n",
36
+ "import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n",
37
+ "function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n",
38
+ "function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n",
39
+ "function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n",
40
+ "function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n",
41
+ "function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n",
42
+ "function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n",
43
+ "import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n",
44
+ "import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n",
45
+ "function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n",
46
+ "function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n",
47
+ "export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n",
48
+ "function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n",
49
+ "import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n",
50
+ "export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n",
51
+ "import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n",
52
+ "import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n",
53
+ "export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n",
54
+ "import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n",
55
+ "// These are typically used in conjunction with noevent to ensure that we can\n// preventDefault on the event.\nexport const nonpassive = {passive: false};\nexport const nonpassivecapture = {capture: true, passive: false};\n\nexport function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n",
56
+ "import {select} from \"d3-selection\";\nimport noevent, {nonpassivecapture} from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, nonpassivecapture);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, nonpassivecapture);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, nonpassivecapture);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n",
57
+ "export default x => () => x;\n",
58
+ "export default function DragEvent(type, {\n sourceEvent,\n subject,\n target,\n identifier,\n active,\n x, y, dx, dy,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n subject: {value: subject, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n identifier: {value: identifier, enumerable: true, configurable: true},\n active: {value: active, enumerable: true, configurable: true},\n x: {value: x, enumerable: true, configurable: true},\n y: {value: y, enumerable: true, configurable: true},\n dx: {value: dx, enumerable: true, configurable: true},\n dy: {value: dy, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n",
59
+ "import {dispatch} from \"d3-dispatch\";\nimport {select, pointer} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag.js\";\nimport noevent, {nonpassive, nonpassivecapture, nopropagation} from \"./noevent.js\";\nimport constant from \"./constant.js\";\nimport DragEvent from \"./event.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(event, d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved, nonpassive)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned(event, d) {\n if (touchending || !filter.call(this, event, d)) return;\n var gesture = beforestart(this, container.call(this, event, d), event, d, \"mouse\");\n if (!gesture) return;\n select(event.view)\n .on(\"mousemove.drag\", mousemoved, nonpassivecapture)\n .on(\"mouseup.drag\", mouseupped, nonpassivecapture);\n nodrag(event.view);\n nopropagation(event);\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\", event);\n }\n\n function mousemoved(event) {\n noevent(event);\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\", event);\n }\n\n function mouseupped(event) {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent(event);\n gestures.mouse(\"end\", event);\n }\n\n function touchstarted(event, d) {\n if (!filter.call(this, event, d)) return;\n var touches = event.changedTouches,\n c = container.call(this, event, d),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {\n nopropagation(event);\n gesture(\"start\", event, touches[i]);\n }\n }\n }\n\n function touchmoved(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent(event);\n gesture(\"drag\", event, touches[i]);\n }\n }\n }\n\n function touchended(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation(event);\n gesture(\"end\", event, touches[i]);\n }\n }\n }\n\n function beforestart(that, container, event, d, identifier, touch) {\n var dispatch = listeners.copy(),\n p = pointer(touch || event, container), dx, dy,\n s;\n\n if ((s = subject.call(that, new DragEvent(\"beforestart\", {\n sourceEvent: event,\n target: drag,\n identifier,\n active,\n x: p[0],\n y: p[1],\n dx: 0,\n dy: 0,\n dispatch\n }), d)) == null) return;\n\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n\n return function gesture(type, event, touch) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[identifier] = gesture, n = active++; break;\n case \"end\": delete gestures[identifier], --active; // falls through\n case \"drag\": p = pointer(touch || event, container), n = active; break;\n }\n dispatch.call(\n type,\n that,\n new DragEvent(type, {\n sourceEvent: event,\n subject: s,\n target: drag,\n identifier,\n active: n,\n x: p[0] + dx,\n y: p[1] + dy,\n dx: p[0] - p0[0],\n dy: p[1] - p0[1],\n dispatch\n }),\n d\n );\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n",
60
+ "export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n",
61
+ "import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n",
62
+ "export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n",
63
+ "import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n",
64
+ "export default x => () => x;\n",
65
+ "import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n",
66
+ "import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n",
67
+ "export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n",
68
+ "import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n",
69
+ "export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n",
70
+ "export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n",
71
+ "import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n",
72
+ "import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n",
73
+ "import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n",
74
+ "var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n",
75
+ "import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n",
76
+ "import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n",
77
+ "var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n",
78
+ "var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n",
79
+ "import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n",
80
+ "import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n",
81
+ "import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n",
82
+ "import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n",
83
+ "import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n",
84
+ "import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n",
85
+ "import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n",
86
+ "import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n",
87
+ "import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n",
88
+ "import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n",
89
+ "import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n",
90
+ "import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n",
91
+ "import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n",
92
+ "import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n",
93
+ "import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n",
94
+ "function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n",
95
+ "import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n",
96
+ "import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n",
97
+ "import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n",
98
+ "import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n",
99
+ "function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n",
100
+ "import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n",
101
+ "function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n",
102
+ "import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n",
103
+ "import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n",
104
+ "import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n",
105
+ "export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n",
106
+ "import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n",
107
+ "import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n",
108
+ "export default x => () => x;\n",
109
+ "export default function ZoomEvent(type, {\n sourceEvent,\n target,\n transform,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n transform: {value: transform, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n",
110
+ "export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n",
111
+ "export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n",
112
+ "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {select, pointer} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction defaultFilter(event) {\n return (!event.ctrlKey || event.type === 'wheel') && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled, {passive: false})\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).event(event).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).event(event).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won’t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n",
113
+ "import { drag } from 'd3-drag';\nimport { select, pointer } from 'd3-selection';\nimport { zoom, zoomIdentity, zoomTransform } from 'd3-zoom';\nimport { interpolateZoom, interpolate } from 'd3-interpolate';\n\nconst errorMessages = {\n error001: () => '[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001',\n error002: () => \"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.\",\n error003: (nodeType) => `Node type \"${nodeType}\" not found. Using fallback type \"default\".`,\n error004: () => 'The React Flow parent container needs a width and a height to render the graph.',\n error005: () => 'Only child nodes can use a parent extent.',\n error006: () => \"Can't create edge. An edge needs a source and a target.\",\n error007: (id) => `The old edge with id=${id} does not exist.`,\n error009: (type) => `Marker type \"${type}\" doesn't exist.`,\n error008: (handleType, { id, sourceHandle, targetHandle }) => `Couldn't create edge for ${handleType} handle id: \"${handleType === 'source' ? sourceHandle : targetHandle}\", edge id: ${id}.`,\n error010: () => 'Handle: No node id found. Make sure to only use a Handle inside a custom Node.',\n error011: (edgeType) => `Edge type \"${edgeType}\" not found. Using fallback type \"default\".`,\n error012: (id) => `Node with id \"${id}\" does not exist, it may have been removed. This can happen when a node is deleted before the \"onNodeClick\" handler is called.`,\n error013: (lib = 'react') => `It seems that you haven't loaded the styles. Please import '@xyflow/${lib}/dist/style.css' or base.css to make sure everything is working properly.`,\n error014: () => 'useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.',\n error015: () => 'It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.',\n};\nconst infiniteExtent = [\n [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],\n [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],\n];\nconst elementSelectionKeys = ['Enter', ' ', 'Escape'];\nconst defaultAriaLabelConfig = {\n 'node.a11yDescription.default': 'Press enter or space to select a node. Press delete to remove it and escape to cancel.',\n 'node.a11yDescription.keyboardDisabled': 'Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.',\n 'node.a11yDescription.ariaLiveMessage': ({ direction, x, y }) => `Moved selected node ${direction}. New position, x: ${x}, y: ${y}`,\n 'edge.a11yDescription.default': 'Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.',\n // Control elements\n 'controls.ariaLabel': 'Control Panel',\n 'controls.zoomIn.ariaLabel': 'Zoom In',\n 'controls.zoomOut.ariaLabel': 'Zoom Out',\n 'controls.fitView.ariaLabel': 'Fit View',\n 'controls.interactive.ariaLabel': 'Toggle Interactivity',\n // Mini map\n 'minimap.ariaLabel': 'Mini Map',\n // Handle\n 'handle.ariaLabel': 'Handle',\n};\n\n/**\n * The `ConnectionMode` is used to set the mode of connection between nodes.\n * The `Strict` mode is the default one and only allows source to target edges.\n * `Loose` mode allows source to source and target to target edges as well.\n *\n * @public\n */\nvar ConnectionMode;\n(function (ConnectionMode) {\n ConnectionMode[\"Strict\"] = \"strict\";\n ConnectionMode[\"Loose\"] = \"loose\";\n})(ConnectionMode || (ConnectionMode = {}));\n/**\n * This enum is used to set the different modes of panning the viewport when the\n * user scrolls. The `Free` mode allows the user to pan in any direction by scrolling\n * with a device like a trackpad. The `Vertical` and `Horizontal` modes restrict\n * scroll panning to only the vertical or horizontal axis, respectively.\n *\n * @public\n */\nvar PanOnScrollMode;\n(function (PanOnScrollMode) {\n PanOnScrollMode[\"Free\"] = \"free\";\n PanOnScrollMode[\"Vertical\"] = \"vertical\";\n PanOnScrollMode[\"Horizontal\"] = \"horizontal\";\n})(PanOnScrollMode || (PanOnScrollMode = {}));\nvar SelectionMode;\n(function (SelectionMode) {\n SelectionMode[\"Partial\"] = \"partial\";\n SelectionMode[\"Full\"] = \"full\";\n})(SelectionMode || (SelectionMode = {}));\nconst initialConnection = {\n inProgress: false,\n isValid: null,\n from: null,\n fromHandle: null,\n fromPosition: null,\n fromNode: null,\n to: null,\n toHandle: null,\n toPosition: null,\n toNode: null,\n pointer: null,\n};\n\n/**\n * If you set the `connectionLineType` prop on your [`<ReactFlow />`](/api-reference/react-flow#connection-connectionLineType)\n *component, it will dictate the style of connection line rendered when creating\n *new edges.\n *\n * @public\n *\n * @remarks If you choose to render a custom connection line component, this value will be\n *passed to your component as part of its [`ConnectionLineComponentProps`](/api-reference/types/connection-line-component-props).\n */\nvar ConnectionLineType;\n(function (ConnectionLineType) {\n ConnectionLineType[\"Bezier\"] = \"default\";\n ConnectionLineType[\"Straight\"] = \"straight\";\n ConnectionLineType[\"Step\"] = \"step\";\n ConnectionLineType[\"SmoothStep\"] = \"smoothstep\";\n ConnectionLineType[\"SimpleBezier\"] = \"simplebezier\";\n})(ConnectionLineType || (ConnectionLineType = {}));\n/**\n * Edges may optionally have a marker on either end. The MarkerType type enumerates\n * the options available to you when configuring a given marker.\n *\n * @public\n */\nvar MarkerType;\n(function (MarkerType) {\n MarkerType[\"Arrow\"] = \"arrow\";\n MarkerType[\"ArrowClosed\"] = \"arrowclosed\";\n})(MarkerType || (MarkerType = {}));\n\n/**\n * While [`PanelPosition`](/api-reference/types/panel-position) can be used to place a\n * component in the corners of a container, the `Position` enum is less precise and used\n * primarily in relation to edges and handles.\n *\n * @public\n */\nvar Position;\n(function (Position) {\n Position[\"Left\"] = \"left\";\n Position[\"Top\"] = \"top\";\n Position[\"Right\"] = \"right\";\n Position[\"Bottom\"] = \"bottom\";\n})(Position || (Position = {}));\nconst oppositePosition = {\n [Position.Left]: Position.Right,\n [Position.Right]: Position.Left,\n [Position.Top]: Position.Bottom,\n [Position.Bottom]: Position.Top,\n};\n\n/**\n * @internal\n */\nfunction areConnectionMapsEqual(a, b) {\n if (!a && !b) {\n return true;\n }\n if (!a || !b || a.size !== b.size) {\n return false;\n }\n if (!a.size && !b.size) {\n return true;\n }\n for (const key of a.keys()) {\n if (!b.has(key)) {\n return false;\n }\n }\n return true;\n}\n/**\n * We call the callback for all connections in a that are not in b\n *\n * @internal\n */\nfunction handleConnectionChange(a, b, cb) {\n if (!cb) {\n return;\n }\n const diff = [];\n a.forEach((connection, key) => {\n if (!b?.has(key)) {\n diff.push(connection);\n }\n });\n if (diff.length) {\n cb(diff);\n }\n}\nfunction getConnectionStatus(isValid) {\n return isValid === null ? null : isValid ? 'valid' : 'invalid';\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Test whether an object is usable as an Edge\n * @public\n * @remarks In TypeScript this is a type guard that will narrow the type of whatever you pass in to Edge if it returns true\n * @param element - The element to test\n * @returns A boolean indicating whether the element is an Edge\n */\nconst isEdgeBase = (element) => 'id' in element && 'source' in element && 'target' in element;\n/**\n * Test whether an object is usable as a Node\n * @public\n * @remarks In TypeScript this is a type guard that will narrow the type of whatever you pass in to Node if it returns true\n * @param element - The element to test\n * @returns A boolean indicating whether the element is an Node\n */\nconst isNodeBase = (element) => 'id' in element && 'position' in element && !('source' in element) && !('target' in element);\nconst isInternalNodeBase = (element) => 'id' in element && 'internals' in element && !('source' in element) && !('target' in element);\n/**\n * This util is used to tell you what nodes, if any, are connected to the given node\n * as the _target_ of an edge.\n * @public\n * @param node - The node to get the connected nodes from.\n * @param nodes - The array of all nodes.\n * @param edges - The array of all edges.\n * @returns An array of nodes that are connected over edges where the source is the given node.\n *\n * @example\n * ```ts\n *import { getOutgoers } from '@xyflow/react';\n *\n *const nodes = [];\n *const edges = [];\n *\n *const outgoers = getOutgoers(\n * { id: '1', position: { x: 0, y: 0 }, data: { label: 'node' } },\n * nodes,\n * edges,\n *);\n *```\n */\nconst getOutgoers = (node, nodes, edges) => {\n if (!node.id) {\n return [];\n }\n const outgoerIds = new Set();\n edges.forEach((edge) => {\n if (edge.source === node.id) {\n outgoerIds.add(edge.target);\n }\n });\n return nodes.filter((n) => outgoerIds.has(n.id));\n};\n/**\n * This util is used to tell you what nodes, if any, are connected to the given node\n * as the _source_ of an edge.\n * @public\n * @param node - The node to get the connected nodes from.\n * @param nodes - The array of all nodes.\n * @param edges - The array of all edges.\n * @returns An array of nodes that are connected over edges where the target is the given node.\n *\n * @example\n * ```ts\n *import { getIncomers } from '@xyflow/react';\n *\n *const nodes = [];\n *const edges = [];\n *\n *const incomers = getIncomers(\n * { id: '1', position: { x: 0, y: 0 }, data: { label: 'node' } },\n * nodes,\n * edges,\n *);\n *```\n */\nconst getIncomers = (node, nodes, edges) => {\n if (!node.id) {\n return [];\n }\n const incomersIds = new Set();\n edges.forEach((edge) => {\n if (edge.target === node.id) {\n incomersIds.add(edge.source);\n }\n });\n return nodes.filter((n) => incomersIds.has(n.id));\n};\nconst getNodePositionWithOrigin = (node, nodeOrigin = [0, 0]) => {\n const { width, height } = getNodeDimensions(node);\n const origin = node.origin ?? nodeOrigin;\n const offsetX = width * origin[0];\n const offsetY = height * origin[1];\n return {\n x: node.position.x - offsetX,\n y: node.position.y - offsetY,\n };\n};\n/**\n * Returns the bounding box that contains all the given nodes in an array. This can\n * be useful when combined with [`getViewportForBounds`](/api-reference/utils/get-viewport-for-bounds)\n * to calculate the correct transform to fit the given nodes in a viewport.\n * @public\n * @remarks Useful when combined with {@link getViewportForBounds} to calculate the correct transform to fit the given nodes in a viewport.\n * @param nodes - Nodes to calculate the bounds for.\n * @returns Bounding box enclosing all nodes.\n *\n * @remarks This function was previously called `getRectOfNodes`\n *\n * @example\n * ```js\n *import { getNodesBounds } from '@xyflow/react';\n *\n *const nodes = [\n * {\n * id: 'a',\n * position: { x: 0, y: 0 },\n * data: { label: 'a' },\n * width: 50,\n * height: 25,\n * },\n * {\n * id: 'b',\n * position: { x: 100, y: 100 },\n * data: { label: 'b' },\n * width: 50,\n * height: 25,\n * },\n *];\n *\n *const bounds = getNodesBounds(nodes);\n *```\n */\nconst getNodesBounds = (nodes, params = { nodeOrigin: [0, 0] }) => {\n if (process.env.NODE_ENV === 'development' && !params.nodeLookup) {\n console.warn('Please use `getNodesBounds` from `useReactFlow`/`useSvelteFlow` hook to ensure correct values for sub flows. If not possible, you have to provide a nodeLookup to support sub flows.');\n }\n if (nodes.length === 0) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n const box = nodes.reduce((currBox, nodeOrId) => {\n const isId = typeof nodeOrId === 'string';\n let currentNode = !params.nodeLookup && !isId ? nodeOrId : undefined;\n if (params.nodeLookup) {\n currentNode = isId\n ? params.nodeLookup.get(nodeOrId)\n : !isInternalNodeBase(nodeOrId)\n ? params.nodeLookup.get(nodeOrId.id)\n : nodeOrId;\n }\n const nodeBox = currentNode ? nodeToBox(currentNode, params.nodeOrigin) : { x: 0, y: 0, x2: 0, y2: 0 };\n return getBoundsOfBoxes(currBox, nodeBox);\n }, { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity });\n return boxToRect(box);\n};\n/**\n * Determines a bounding box that contains all given nodes in an array\n * @internal\n */\nconst getInternalNodesBounds = (nodeLookup, params = {}) => {\n let box = { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity };\n let hasVisibleNodes = false;\n nodeLookup.forEach((node) => {\n if (params.filter === undefined || params.filter(node)) {\n box = getBoundsOfBoxes(box, nodeToBox(node));\n hasVisibleNodes = true;\n }\n });\n return hasVisibleNodes ? boxToRect(box) : { x: 0, y: 0, width: 0, height: 0 };\n};\nconst getNodesInside = (nodes, rect, [tx, ty, tScale] = [0, 0, 1], partially = false, \n// set excludeNonSelectableNodes if you want to pay attention to the nodes \"selectable\" attribute\nexcludeNonSelectableNodes = false) => {\n const paneRect = {\n ...pointToRendererPoint(rect, [tx, ty, tScale]),\n width: rect.width / tScale,\n height: rect.height / tScale,\n };\n const visibleNodes = [];\n for (const node of nodes.values()) {\n const { measured, selectable = true, hidden = false } = node;\n if ((excludeNonSelectableNodes && !selectable) || hidden) {\n continue;\n }\n const width = measured.width ?? node.width ?? node.initialWidth ?? null;\n const height = measured.height ?? node.height ?? node.initialHeight ?? null;\n const overlappingArea = getOverlappingArea(paneRect, nodeToRect(node));\n const area = (width ?? 0) * (height ?? 0);\n const partiallyVisible = partially && overlappingArea > 0;\n const forceInitialRender = !node.internals.handleBounds;\n const isVisible = forceInitialRender || partiallyVisible || overlappingArea >= area;\n if (isVisible || node.dragging) {\n visibleNodes.push(node);\n }\n }\n return visibleNodes;\n};\n/**\n * This utility filters an array of edges, keeping only those where either the source or target\n * node is present in the given array of nodes.\n * @public\n * @param nodes - Nodes you want to get the connected edges for.\n * @param edges - All edges.\n * @returns Array of edges that connect any of the given nodes with each other.\n *\n * @example\n * ```js\n *import { getConnectedEdges } from '@xyflow/react';\n *\n *const nodes = [\n * { id: 'a', position: { x: 0, y: 0 } },\n * { id: 'b', position: { x: 100, y: 0 } },\n *];\n *\n *const edges = [\n * { id: 'a->c', source: 'a', target: 'c' },\n * { id: 'c->d', source: 'c', target: 'd' },\n *];\n *\n *const connectedEdges = getConnectedEdges(nodes, edges);\n * // => [{ id: 'a->c', source: 'a', target: 'c' }]\n *```\n */\nconst getConnectedEdges = (nodes, edges) => {\n const nodeIds = new Set();\n nodes.forEach((node) => {\n nodeIds.add(node.id);\n });\n return edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target));\n};\nfunction getFitViewNodes(nodeLookup, options) {\n const fitViewNodes = new Map();\n const optionNodeIds = options?.nodes ? new Set(options.nodes.map((node) => node.id)) : null;\n nodeLookup.forEach((n) => {\n const isVisible = n.measured.width && n.measured.height && (options?.includeHiddenNodes || !n.hidden);\n if (isVisible && (!optionNodeIds || optionNodeIds.has(n.id))) {\n fitViewNodes.set(n.id, n);\n }\n });\n return fitViewNodes;\n}\nasync function fitViewport({ nodes, width, height, panZoom, minZoom, maxZoom }, options) {\n if (nodes.size === 0) {\n return Promise.resolve(true);\n }\n const nodesToFit = getFitViewNodes(nodes, options);\n const bounds = getInternalNodesBounds(nodesToFit);\n const viewport = getViewportForBounds(bounds, width, height, options?.minZoom ?? minZoom, options?.maxZoom ?? maxZoom, options?.padding ?? 0.1);\n await panZoom.setViewport(viewport, {\n duration: options?.duration,\n ease: options?.ease,\n interpolate: options?.interpolate,\n });\n return Promise.resolve(true);\n}\n/**\n * This function calculates the next position of a node, taking into account the node's extent, parent node, and origin.\n *\n * @internal\n * @returns position, positionAbsolute\n */\nfunction calculateNodePosition({ nodeId, nextPosition, nodeLookup, nodeOrigin = [0, 0], nodeExtent, onError, }) {\n const node = nodeLookup.get(nodeId);\n const parentNode = node.parentId ? nodeLookup.get(node.parentId) : undefined;\n const { x: parentX, y: parentY } = parentNode ? parentNode.internals.positionAbsolute : { x: 0, y: 0 };\n const origin = node.origin ?? nodeOrigin;\n let extent = node.extent || nodeExtent;\n if (node.extent === 'parent' && !node.expandParent) {\n if (!parentNode) {\n onError?.('005', errorMessages['error005']());\n }\n else {\n const parentWidth = parentNode.measured.width;\n const parentHeight = parentNode.measured.height;\n if (parentWidth && parentHeight) {\n extent = [\n [parentX, parentY],\n [parentX + parentWidth, parentY + parentHeight],\n ];\n }\n }\n }\n else if (parentNode && isCoordinateExtent(node.extent)) {\n extent = [\n [node.extent[0][0] + parentX, node.extent[0][1] + parentY],\n [node.extent[1][0] + parentX, node.extent[1][1] + parentY],\n ];\n }\n const positionAbsolute = isCoordinateExtent(extent)\n ? clampPosition(nextPosition, extent, node.measured)\n : nextPosition;\n if (node.measured.width === undefined || node.measured.height === undefined) {\n onError?.('015', errorMessages['error015']());\n }\n return {\n position: {\n x: positionAbsolute.x - parentX + (node.measured.width ?? 0) * origin[0],\n y: positionAbsolute.y - parentY + (node.measured.height ?? 0) * origin[1],\n },\n positionAbsolute,\n };\n}\n/**\n * Pass in nodes & edges to delete, get arrays of nodes and edges that actually can be deleted\n * @internal\n * @param param.nodesToRemove - The nodes to remove\n * @param param.edgesToRemove - The edges to remove\n * @param param.nodes - All nodes\n * @param param.edges - All edges\n * @param param.onBeforeDelete - Callback to check which nodes and edges can be deleted\n * @returns nodes: nodes that can be deleted, edges: edges that can be deleted\n */\nasync function getElementsToRemove({ nodesToRemove = [], edgesToRemove = [], nodes, edges, onBeforeDelete, }) {\n const nodeIds = new Set(nodesToRemove.map((node) => node.id));\n const matchingNodes = [];\n for (const node of nodes) {\n if (node.deletable === false) {\n continue;\n }\n const isIncluded = nodeIds.has(node.id);\n const parentHit = !isIncluded && node.parentId && matchingNodes.find((n) => n.id === node.parentId);\n if (isIncluded || parentHit) {\n matchingNodes.push(node);\n }\n }\n const edgeIds = new Set(edgesToRemove.map((edge) => edge.id));\n const deletableEdges = edges.filter((edge) => edge.deletable !== false);\n const connectedEdges = getConnectedEdges(matchingNodes, deletableEdges);\n const matchingEdges = connectedEdges;\n for (const edge of deletableEdges) {\n const isIncluded = edgeIds.has(edge.id);\n if (isIncluded && !matchingEdges.find((e) => e.id === edge.id)) {\n matchingEdges.push(edge);\n }\n }\n if (!onBeforeDelete) {\n return {\n edges: matchingEdges,\n nodes: matchingNodes,\n };\n }\n const onBeforeDeleteResult = await onBeforeDelete({\n nodes: matchingNodes,\n edges: matchingEdges,\n });\n if (typeof onBeforeDeleteResult === 'boolean') {\n return onBeforeDeleteResult ? { edges: matchingEdges, nodes: matchingNodes } : { edges: [], nodes: [] };\n }\n return onBeforeDeleteResult;\n}\n\nconst clamp = (val, min = 0, max = 1) => Math.min(Math.max(val, min), max);\nconst clampPosition = (position = { x: 0, y: 0 }, extent, dimensions) => ({\n x: clamp(position.x, extent[0][0], extent[1][0] - (dimensions?.width ?? 0)),\n y: clamp(position.y, extent[0][1], extent[1][1] - (dimensions?.height ?? 0)),\n});\nfunction clampPositionToParent(childPosition, childDimensions, parent) {\n const { width: parentWidth, height: parentHeight } = getNodeDimensions(parent);\n const { x: parentX, y: parentY } = parent.internals.positionAbsolute;\n return clampPosition(childPosition, [\n [parentX, parentY],\n [parentX + parentWidth, parentY + parentHeight],\n ], childDimensions);\n}\n/**\n * Calculates the velocity of panning when the mouse is close to the edge of the canvas\n * @internal\n * @param value - One dimensional poition of the mouse (x or y)\n * @param min - Minimal position on canvas before panning starts\n * @param max - Maximal position on canvas before panning starts\n * @returns - A number between 0 and 1 that represents the velocity of panning\n */\nconst calcAutoPanVelocity = (value, min, max) => {\n if (value < min) {\n return clamp(Math.abs(value - min), 1, min) / min;\n }\n else if (value > max) {\n return -clamp(Math.abs(value - max), 1, min) / min;\n }\n return 0;\n};\nconst calcAutoPan = (pos, bounds, speed = 15, distance = 40) => {\n const xMovement = calcAutoPanVelocity(pos.x, distance, bounds.width - distance) * speed;\n const yMovement = calcAutoPanVelocity(pos.y, distance, bounds.height - distance) * speed;\n return [xMovement, yMovement];\n};\nconst getBoundsOfBoxes = (box1, box2) => ({\n x: Math.min(box1.x, box2.x),\n y: Math.min(box1.y, box2.y),\n x2: Math.max(box1.x2, box2.x2),\n y2: Math.max(box1.y2, box2.y2),\n});\nconst rectToBox = ({ x, y, width, height }) => ({\n x,\n y,\n x2: x + width,\n y2: y + height,\n});\nconst boxToRect = ({ x, y, x2, y2 }) => ({\n x,\n y,\n width: x2 - x,\n height: y2 - y,\n});\nconst nodeToRect = (node, nodeOrigin = [0, 0]) => {\n const { x, y } = isInternalNodeBase(node)\n ? node.internals.positionAbsolute\n : getNodePositionWithOrigin(node, nodeOrigin);\n return {\n x,\n y,\n width: node.measured?.width ?? node.width ?? node.initialWidth ?? 0,\n height: node.measured?.height ?? node.height ?? node.initialHeight ?? 0,\n };\n};\nconst nodeToBox = (node, nodeOrigin = [0, 0]) => {\n const { x, y } = isInternalNodeBase(node)\n ? node.internals.positionAbsolute\n : getNodePositionWithOrigin(node, nodeOrigin);\n return {\n x,\n y,\n x2: x + (node.measured?.width ?? node.width ?? node.initialWidth ?? 0),\n y2: y + (node.measured?.height ?? node.height ?? node.initialHeight ?? 0),\n };\n};\nconst getBoundsOfRects = (rect1, rect2) => boxToRect(getBoundsOfBoxes(rectToBox(rect1), rectToBox(rect2)));\nconst getOverlappingArea = (rectA, rectB) => {\n const xOverlap = Math.max(0, Math.min(rectA.x + rectA.width, rectB.x + rectB.width) - Math.max(rectA.x, rectB.x));\n const yOverlap = Math.max(0, Math.min(rectA.y + rectA.height, rectB.y + rectB.height) - Math.max(rectA.y, rectB.y));\n return Math.ceil(xOverlap * yOverlap);\n};\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isRectObject = (obj) => isNumeric(obj.width) && isNumeric(obj.height) && isNumeric(obj.x) && isNumeric(obj.y);\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nconst isNumeric = (n) => !isNaN(n) && isFinite(n);\n// used for a11y key board controls for nodes and edges\nconst devWarn = (id, message) => {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`[React Flow]: ${message} Help: https://reactflow.dev/error#${id}`);\n }\n};\nconst snapPosition = (position, snapGrid = [1, 1]) => {\n return {\n x: snapGrid[0] * Math.round(position.x / snapGrid[0]),\n y: snapGrid[1] * Math.round(position.y / snapGrid[1]),\n };\n};\nconst pointToRendererPoint = ({ x, y }, [tx, ty, tScale], snapToGrid = false, snapGrid = [1, 1]) => {\n const position = {\n x: (x - tx) / tScale,\n y: (y - ty) / tScale,\n };\n return snapToGrid ? snapPosition(position, snapGrid) : position;\n};\nconst rendererPointToPoint = ({ x, y }, [tx, ty, tScale]) => {\n return {\n x: x * tScale + tx,\n y: y * tScale + ty,\n };\n};\n/**\n * Parses a single padding value to a number\n * @internal\n * @param padding - Padding to parse\n * @param viewport - Width or height of the viewport\n * @returns The padding in pixels\n */\nfunction parsePadding(padding, viewport) {\n if (typeof padding === 'number') {\n return Math.floor((viewport - viewport / (1 + padding)) * 0.5);\n }\n if (typeof padding === 'string' && padding.endsWith('px')) {\n const paddingValue = parseFloat(padding);\n if (!Number.isNaN(paddingValue)) {\n return Math.floor(paddingValue);\n }\n }\n if (typeof padding === 'string' && padding.endsWith('%')) {\n const paddingValue = parseFloat(padding);\n if (!Number.isNaN(paddingValue)) {\n return Math.floor(viewport * paddingValue * 0.01);\n }\n }\n console.error(`[React Flow] The padding value \"${padding}\" is invalid. Please provide a number or a string with a valid unit (px or %).`);\n return 0;\n}\n/**\n * Parses the paddings to an object with top, right, bottom, left, x and y paddings\n * @internal\n * @param padding - Padding to parse\n * @param width - Width of the viewport\n * @param height - Height of the viewport\n * @returns An object with the paddings in pixels\n */\nfunction parsePaddings(padding, width, height) {\n if (typeof padding === 'string' || typeof padding === 'number') {\n const paddingY = parsePadding(padding, height);\n const paddingX = parsePadding(padding, width);\n return {\n top: paddingY,\n right: paddingX,\n bottom: paddingY,\n left: paddingX,\n x: paddingX * 2,\n y: paddingY * 2,\n };\n }\n if (typeof padding === 'object') {\n const top = parsePadding(padding.top ?? padding.y ?? 0, height);\n const bottom = parsePadding(padding.bottom ?? padding.y ?? 0, height);\n const left = parsePadding(padding.left ?? padding.x ?? 0, width);\n const right = parsePadding(padding.right ?? padding.x ?? 0, width);\n return { top, right, bottom, left, x: left + right, y: top + bottom };\n }\n return { top: 0, right: 0, bottom: 0, left: 0, x: 0, y: 0 };\n}\n/**\n * Calculates the resulting paddings if the new viewport is applied\n * @internal\n * @param bounds - Bounds to fit inside viewport\n * @param x - X position of the viewport\n * @param y - Y position of the viewport\n * @param zoom - Zoom level of the viewport\n * @param width - Width of the viewport\n * @param height - Height of the viewport\n * @returns An object with the minimum padding required to fit the bounds inside the viewport\n */\nfunction calculateAppliedPaddings(bounds, x, y, zoom, width, height) {\n const { x: left, y: top } = rendererPointToPoint(bounds, [x, y, zoom]);\n const { x: boundRight, y: boundBottom } = rendererPointToPoint({ x: bounds.x + bounds.width, y: bounds.y + bounds.height }, [x, y, zoom]);\n const right = width - boundRight;\n const bottom = height - boundBottom;\n return {\n left: Math.floor(left),\n top: Math.floor(top),\n right: Math.floor(right),\n bottom: Math.floor(bottom),\n };\n}\n/**\n * Returns a viewport that encloses the given bounds with padding.\n * @public\n * @remarks You can determine bounds of nodes with {@link getNodesBounds} and {@link getBoundsOfRects}\n * @param bounds - Bounds to fit inside viewport.\n * @param width - Width of the viewport.\n * @param height - Height of the viewport.\n * @param minZoom - Minimum zoom level of the resulting viewport.\n * @param maxZoom - Maximum zoom level of the resulting viewport.\n * @param padding - Padding around the bounds.\n * @returns A transformed {@link Viewport} that encloses the given bounds which you can pass to e.g. {@link setViewport}.\n * @example\n * const { x, y, zoom } = getViewportForBounds(\n * { x: 0, y: 0, width: 100, height: 100},\n * 1200, 800, 0.5, 2);\n */\nconst getViewportForBounds = (bounds, width, height, minZoom, maxZoom, padding) => {\n // First we resolve all the paddings to actual pixel values\n const p = parsePaddings(padding, width, height);\n const xZoom = (width - p.x) / bounds.width;\n const yZoom = (height - p.y) / bounds.height;\n // We calculate the new x, y, zoom for a centered view\n const zoom = Math.min(xZoom, yZoom);\n const clampedZoom = clamp(zoom, minZoom, maxZoom);\n const boundsCenterX = bounds.x + bounds.width / 2;\n const boundsCenterY = bounds.y + bounds.height / 2;\n const x = width / 2 - boundsCenterX * clampedZoom;\n const y = height / 2 - boundsCenterY * clampedZoom;\n // Then we calculate the minimum padding, to respect asymmetric paddings\n const newPadding = calculateAppliedPaddings(bounds, x, y, clampedZoom, width, height);\n // We only want to have an offset if the newPadding is smaller than the required padding\n const offset = {\n left: Math.min(newPadding.left - p.left, 0),\n top: Math.min(newPadding.top - p.top, 0),\n right: Math.min(newPadding.right - p.right, 0),\n bottom: Math.min(newPadding.bottom - p.bottom, 0),\n };\n return {\n x: x - offset.left + offset.right,\n y: y - offset.top + offset.bottom,\n zoom: clampedZoom,\n };\n};\nconst isMacOs = () => typeof navigator !== 'undefined' && navigator?.userAgent?.indexOf('Mac') >= 0;\nfunction isCoordinateExtent(extent) {\n return extent !== undefined && extent !== null && extent !== 'parent';\n}\nfunction getNodeDimensions(node) {\n return {\n width: node.measured?.width ?? node.width ?? node.initialWidth ?? 0,\n height: node.measured?.height ?? node.height ?? node.initialHeight ?? 0,\n };\n}\nfunction nodeHasDimensions(node) {\n return ((node.measured?.width ?? node.width ?? node.initialWidth) !== undefined &&\n (node.measured?.height ?? node.height ?? node.initialHeight) !== undefined);\n}\n/**\n * Convert child position to absolute position\n *\n * @internal\n * @param position\n * @param parentId\n * @param nodeLookup\n * @param nodeOrigin\n * @returns an internal node with an absolute position\n */\nfunction evaluateAbsolutePosition(position, dimensions = { width: 0, height: 0 }, parentId, nodeLookup, nodeOrigin) {\n const positionAbsolute = { ...position };\n const parent = nodeLookup.get(parentId);\n if (parent) {\n const origin = parent.origin || nodeOrigin;\n positionAbsolute.x += parent.internals.positionAbsolute.x - (dimensions.width ?? 0) * origin[0];\n positionAbsolute.y += parent.internals.positionAbsolute.y - (dimensions.height ?? 0) * origin[1];\n }\n return positionAbsolute;\n}\nfunction areSetsEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Polyfill for Promise.withResolvers until we can use it in all browsers\n * @internal\n */\nfunction withResolvers() {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\nfunction mergeAriaLabelConfig(partial) {\n return { ...defaultAriaLabelConfig, ...(partial || {}) };\n}\n\nfunction getPointerPosition(event, { snapGrid = [0, 0], snapToGrid = false, transform, containerBounds }) {\n const { x, y } = getEventPosition(event);\n const pointerPos = pointToRendererPoint({ x: x - (containerBounds?.left ?? 0), y: y - (containerBounds?.top ?? 0) }, transform);\n const { x: xSnapped, y: ySnapped } = snapToGrid ? snapPosition(pointerPos, snapGrid) : pointerPos;\n // we need the snapped position in order to be able to skip unnecessary drag events\n return {\n xSnapped,\n ySnapped,\n ...pointerPos,\n };\n}\nconst getDimensions = (node) => ({\n width: node.offsetWidth,\n height: node.offsetHeight,\n});\nconst getHostForElement = (element) => element?.getRootNode?.() || window?.document;\nconst inputTags = ['INPUT', 'SELECT', 'TEXTAREA'];\nfunction isInputDOMNode(event) {\n // using composed path for handling shadow dom\n const target = (event.composedPath?.()?.[0] || event.target);\n if (target?.nodeType !== 1 /* Node.ELEMENT_NODE */)\n return false;\n const isInput = inputTags.includes(target.nodeName) || target.hasAttribute('contenteditable');\n // when an input field is focused we don't want to trigger deletion or movement of nodes\n return isInput || !!target.closest('.nokey');\n}\nconst isMouseEvent = (event) => 'clientX' in event;\nconst getEventPosition = (event, bounds) => {\n const isMouse = isMouseEvent(event);\n const evtX = isMouse ? event.clientX : event.touches?.[0].clientX;\n const evtY = isMouse ? event.clientY : event.touches?.[0].clientY;\n return {\n x: evtX - (bounds?.left ?? 0),\n y: evtY - (bounds?.top ?? 0),\n };\n};\n/*\n * The handle bounds are calculated relative to the node element.\n * We store them in the internals object of the node in order to avoid\n * unnecessary recalculations.\n */\nconst getHandleBounds = (type, nodeElement, nodeBounds, zoom, nodeId) => {\n const handles = nodeElement.querySelectorAll(`.${type}`);\n if (!handles || !handles.length) {\n return null;\n }\n return Array.from(handles).map((handle) => {\n const handleBounds = handle.getBoundingClientRect();\n return {\n id: handle.getAttribute('data-handleid'),\n type,\n nodeId,\n position: handle.getAttribute('data-handlepos'),\n x: (handleBounds.left - nodeBounds.left) / zoom,\n y: (handleBounds.top - nodeBounds.top) / zoom,\n ...getDimensions(handle),\n };\n });\n};\n\nfunction getBezierEdgeCenter({ sourceX, sourceY, targetX, targetY, sourceControlX, sourceControlY, targetControlX, targetControlY, }) {\n /*\n * cubic bezier t=0.5 mid point, not the actual mid point, but easy to calculate\n * https://stackoverflow.com/questions/67516101/how-to-find-distance-mid-point-of-bezier-curve\n */\n const centerX = sourceX * 0.125 + sourceControlX * 0.375 + targetControlX * 0.375 + targetX * 0.125;\n const centerY = sourceY * 0.125 + sourceControlY * 0.375 + targetControlY * 0.375 + targetY * 0.125;\n const offsetX = Math.abs(centerX - sourceX);\n const offsetY = Math.abs(centerY - sourceY);\n return [centerX, centerY, offsetX, offsetY];\n}\nfunction calculateControlOffset(distance, curvature) {\n if (distance >= 0) {\n return 0.5 * distance;\n }\n return curvature * 25 * Math.sqrt(-distance);\n}\nfunction getControlWithCurvature({ pos, x1, y1, x2, y2, c }) {\n switch (pos) {\n case Position.Left:\n return [x1 - calculateControlOffset(x1 - x2, c), y1];\n case Position.Right:\n return [x1 + calculateControlOffset(x2 - x1, c), y1];\n case Position.Top:\n return [x1, y1 - calculateControlOffset(y1 - y2, c)];\n case Position.Bottom:\n return [x1, y1 + calculateControlOffset(y2 - y1, c)];\n }\n}\n/**\n * The `getBezierPath` util returns everything you need to render a bezier edge\n *between two nodes.\n * @public\n * @returns A path string you can use in an SVG, the `labelX` and `labelY` position (center of path)\n * and `offsetX`, `offsetY` between source handle and label.\n * - `path`: the path to use in an SVG `<path>` element.\n * - `labelX`: the `x` position you can use to render a label for this edge.\n * - `labelY`: the `y` position you can use to render a label for this edge.\n * - `offsetX`: the absolute difference between the source `x` position and the `x` position of the\n * middle of this path.\n * - `offsetY`: the absolute difference between the source `y` position and the `y` position of the\n * middle of this path.\n * @example\n * ```js\n * const source = { x: 0, y: 20 };\n * const target = { x: 150, y: 100 };\n *\n * const [path, labelX, labelY, offsetX, offsetY] = getBezierPath({\n * sourceX: source.x,\n * sourceY: source.y,\n * sourcePosition: Position.Right,\n * targetX: target.x,\n * targetY: target.y,\n * targetPosition: Position.Left,\n *});\n *```\n *\n * @remarks This function returns a tuple (aka a fixed-size array) to make it easier to\n *work with multiple edge paths at once.\n */\nfunction getBezierPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top, curvature = 0.25, }) {\n const [sourceControlX, sourceControlY] = getControlWithCurvature({\n pos: sourcePosition,\n x1: sourceX,\n y1: sourceY,\n x2: targetX,\n y2: targetY,\n c: curvature,\n });\n const [targetControlX, targetControlY] = getControlWithCurvature({\n pos: targetPosition,\n x1: targetX,\n y1: targetY,\n x2: sourceX,\n y2: sourceY,\n c: curvature,\n });\n const [labelX, labelY, offsetX, offsetY] = getBezierEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourceControlX,\n sourceControlY,\n targetControlX,\n targetControlY,\n });\n return [\n `M${sourceX},${sourceY} C${sourceControlX},${sourceControlY} ${targetControlX},${targetControlY} ${targetX},${targetY}`,\n labelX,\n labelY,\n offsetX,\n offsetY,\n ];\n}\n\n// this is used for straight edges and simple smoothstep edges (LTR, RTL, BTT, TTB)\nfunction getEdgeCenter({ sourceX, sourceY, targetX, targetY, }) {\n const xOffset = Math.abs(targetX - sourceX) / 2;\n const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;\n const yOffset = Math.abs(targetY - sourceY) / 2;\n const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;\n return [centerX, centerY, xOffset, yOffset];\n}\n/**\n * Returns the z-index for an edge based on the node it connects and whether it is selected.\n * By default, edges are rendered below nodes. This behaviour is different for edges that are\n * connected to nodes with a parent, as they are rendered above the parent node.\n */\nfunction getElevatedEdgeZIndex({ sourceNode, targetNode, selected = false, zIndex = 0, elevateOnSelect = false, zIndexMode = 'basic', }) {\n if (zIndexMode === 'manual') {\n return zIndex;\n }\n const edgeZ = elevateOnSelect && selected ? zIndex + 1000 : zIndex;\n const nodeZ = Math.max(sourceNode.parentId || (elevateOnSelect && sourceNode.selected) ? sourceNode.internals.z : 0, targetNode.parentId || (elevateOnSelect && targetNode.selected) ? targetNode.internals.z : 0);\n return edgeZ + nodeZ;\n}\nfunction isEdgeVisible({ sourceNode, targetNode, width, height, transform }) {\n const edgeBox = getBoundsOfBoxes(nodeToBox(sourceNode), nodeToBox(targetNode));\n if (edgeBox.x === edgeBox.x2) {\n edgeBox.x2 += 1;\n }\n if (edgeBox.y === edgeBox.y2) {\n edgeBox.y2 += 1;\n }\n const viewRect = {\n x: -transform[0] / transform[2],\n y: -transform[1] / transform[2],\n width: width / transform[2],\n height: height / transform[2],\n };\n return getOverlappingArea(viewRect, boxToRect(edgeBox)) > 0;\n}\n/**\n * The default edge ID generator function. Generates an ID based on the source, target, and handles.\n * @public\n * @param params - The connection or edge to generate an ID for.\n * @returns The generated edge ID.\n */\nconst getEdgeId = ({ source, sourceHandle, target, targetHandle }) => `xy-edge__${source}${sourceHandle || ''}-${target}${targetHandle || ''}`;\nconst connectionExists = (edge, edges) => {\n return edges.some((el) => el.source === edge.source &&\n el.target === edge.target &&\n (el.sourceHandle === edge.sourceHandle || (!el.sourceHandle && !edge.sourceHandle)) &&\n (el.targetHandle === edge.targetHandle || (!el.targetHandle && !edge.targetHandle)));\n};\n/**\n * This util is a convenience function to add a new Edge to an array of edges. It also performs some validation to make sure you don't add an invalid edge or duplicate an existing one.\n * @public\n * @param edgeParams - Either an `Edge` or a `Connection` you want to add.\n * @param edges - The array of all current edges.\n * @param options - Optional configuration object.\n * @returns A new array of edges with the new edge added.\n *\n * @remarks If an edge with the same `target` and `source` already exists (and the same\n *`targetHandle` and `sourceHandle` if those are set), then this util won't add\n *a new edge even if the `id` property is different.\n *\n */\nconst addEdge = (edgeParams, edges, options = {}) => {\n if (!edgeParams.source || !edgeParams.target) {\n devWarn('006', errorMessages['error006']());\n return edges;\n }\n const edgeIdGenerator = options.getEdgeId || getEdgeId;\n let edge;\n if (isEdgeBase(edgeParams)) {\n edge = { ...edgeParams };\n }\n else {\n edge = {\n ...edgeParams,\n id: edgeIdGenerator(edgeParams),\n };\n }\n if (connectionExists(edge, edges)) {\n return edges;\n }\n if (edge.sourceHandle === null) {\n delete edge.sourceHandle;\n }\n if (edge.targetHandle === null) {\n delete edge.targetHandle;\n }\n return edges.concat(edge);\n};\n/**\n * A handy utility to update an existing [`Edge`](/api-reference/types/edge) with new properties.\n *This searches your edge array for an edge with a matching `id` and updates its\n *properties with the connection you provide.\n * @public\n * @param oldEdge - The edge you want to update.\n * @param newConnection - The new connection you want to update the edge with.\n * @param edges - The array of all current edges.\n * @returns The updated edges array.\n *\n * @example\n * ```js\n *const onReconnect = useCallback(\n * (oldEdge: Edge, newConnection: Connection) => setEdges((els) => reconnectEdge(oldEdge, newConnection, els)),[]);\n *```\n */\nconst reconnectEdge = (oldEdge, newConnection, edges, options = { shouldReplaceId: true }) => {\n const { id: oldEdgeId, ...rest } = oldEdge;\n if (!newConnection.source || !newConnection.target) {\n devWarn('006', errorMessages['error006']());\n return edges;\n }\n const foundEdge = edges.find((e) => e.id === oldEdge.id);\n if (!foundEdge) {\n devWarn('007', errorMessages['error007'](oldEdgeId));\n return edges;\n }\n const edgeIdGenerator = options.getEdgeId || getEdgeId;\n // Remove old edge and create the new edge with parameters of old edge.\n const edge = {\n ...rest,\n id: options.shouldReplaceId ? edgeIdGenerator(newConnection) : oldEdgeId,\n source: newConnection.source,\n target: newConnection.target,\n sourceHandle: newConnection.sourceHandle,\n targetHandle: newConnection.targetHandle,\n };\n return edges.filter((e) => e.id !== oldEdgeId).concat(edge);\n};\n\n/**\n * Calculates the straight line path between two points.\n * @public\n * @returns A path string you can use in an SVG, the `labelX` and `labelY` position (center of path)\n * and `offsetX`, `offsetY` between source handle and label.\n *\n * - `path`: the path to use in an SVG `<path>` element.\n * - `labelX`: the `x` position you can use to render a label for this edge.\n * - `labelY`: the `y` position you can use to render a label for this edge.\n * - `offsetX`: the absolute difference between the source `x` position and the `x` position of the\n * middle of this path.\n * - `offsetY`: the absolute difference between the source `y` position and the `y` position of the\n * middle of this path.\n * @example\n * ```js\n * const source = { x: 0, y: 20 };\n * const target = { x: 150, y: 100 };\n *\n * const [path, labelX, labelY, offsetX, offsetY] = getStraightPath({\n * sourceX: source.x,\n * sourceY: source.y,\n * sourcePosition: Position.Right,\n * targetX: target.x,\n * targetY: target.y,\n * targetPosition: Position.Left,\n * });\n * ```\n * @remarks This function returns a tuple (aka a fixed-size array) to make it easier to work with multiple edge paths at once.\n */\nfunction getStraightPath({ sourceX, sourceY, targetX, targetY, }) {\n const [labelX, labelY, offsetX, offsetY] = getEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY,\n });\n return [`M ${sourceX},${sourceY}L ${targetX},${targetY}`, labelX, labelY, offsetX, offsetY];\n}\n\nconst handleDirections = {\n [Position.Left]: { x: -1, y: 0 },\n [Position.Right]: { x: 1, y: 0 },\n [Position.Top]: { x: 0, y: -1 },\n [Position.Bottom]: { x: 0, y: 1 },\n};\nconst getDirection = ({ source, sourcePosition = Position.Bottom, target, }) => {\n if (sourcePosition === Position.Left || sourcePosition === Position.Right) {\n return source.x < target.x ? { x: 1, y: 0 } : { x: -1, y: 0 };\n }\n return source.y < target.y ? { x: 0, y: 1 } : { x: 0, y: -1 };\n};\nconst distance = (a, b) => Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));\n/*\n * With this function we try to mimic an orthogonal edge routing behaviour\n * It's not as good as a real orthogonal edge routing, but it's faster and good enough as a default for step and smooth step edges\n */\nfunction getPoints({ source, sourcePosition = Position.Bottom, target, targetPosition = Position.Top, center, offset, stepPosition, }) {\n const sourceDir = handleDirections[sourcePosition];\n const targetDir = handleDirections[targetPosition];\n const sourceGapped = { x: source.x + sourceDir.x * offset, y: source.y + sourceDir.y * offset };\n const targetGapped = { x: target.x + targetDir.x * offset, y: target.y + targetDir.y * offset };\n const dir = getDirection({\n source: sourceGapped,\n sourcePosition,\n target: targetGapped,\n });\n const dirAccessor = dir.x !== 0 ? 'x' : 'y';\n const currDir = dir[dirAccessor];\n let points = [];\n let centerX, centerY;\n const sourceGapOffset = { x: 0, y: 0 };\n const targetGapOffset = { x: 0, y: 0 };\n const [, , defaultOffsetX, defaultOffsetY] = getEdgeCenter({\n sourceX: source.x,\n sourceY: source.y,\n targetX: target.x,\n targetY: target.y,\n });\n // opposite handle positions, default case\n if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) {\n if (dirAccessor === 'x') {\n // Primary direction is horizontal, so stepPosition affects X coordinate\n centerX = center.x ?? sourceGapped.x + (targetGapped.x - sourceGapped.x) * stepPosition;\n centerY = center.y ?? (sourceGapped.y + targetGapped.y) / 2;\n }\n else {\n // Primary direction is vertical, so stepPosition affects Y coordinate\n centerX = center.x ?? (sourceGapped.x + targetGapped.x) / 2;\n centerY = center.y ?? sourceGapped.y + (targetGapped.y - sourceGapped.y) * stepPosition;\n }\n /*\n * --->\n * |\n * >---\n */\n const verticalSplit = [\n { x: centerX, y: sourceGapped.y },\n { x: centerX, y: targetGapped.y },\n ];\n /*\n * |\n * ---\n * |\n */\n const horizontalSplit = [\n { x: sourceGapped.x, y: centerY },\n { x: targetGapped.x, y: centerY },\n ];\n if (sourceDir[dirAccessor] === currDir) {\n points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;\n }\n else {\n points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;\n }\n }\n else {\n // sourceTarget means we take x from source and y from target, targetSource is the opposite\n const sourceTarget = [{ x: sourceGapped.x, y: targetGapped.y }];\n const targetSource = [{ x: targetGapped.x, y: sourceGapped.y }];\n // this handles edges with same handle positions\n if (dirAccessor === 'x') {\n points = sourceDir.x === currDir ? targetSource : sourceTarget;\n }\n else {\n points = sourceDir.y === currDir ? sourceTarget : targetSource;\n }\n if (sourcePosition === targetPosition) {\n const diff = Math.abs(source[dirAccessor] - target[dirAccessor]);\n // if an edge goes from right to right for example (sourcePosition === targetPosition) and the distance between source.x and target.x is less than the offset, the added point and the gapped source/target will overlap. This leads to a weird edge path. To avoid this we add a gapOffset to the source/target\n if (diff <= offset) {\n const gapOffset = Math.min(offset - 1, offset - diff);\n if (sourceDir[dirAccessor] === currDir) {\n sourceGapOffset[dirAccessor] = (sourceGapped[dirAccessor] > source[dirAccessor] ? -1 : 1) * gapOffset;\n }\n else {\n targetGapOffset[dirAccessor] = (targetGapped[dirAccessor] > target[dirAccessor] ? -1 : 1) * gapOffset;\n }\n }\n }\n // these are conditions for handling mixed handle positions like Right -> Bottom for example\n if (sourcePosition !== targetPosition) {\n const dirAccessorOpposite = dirAccessor === 'x' ? 'y' : 'x';\n const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessorOpposite];\n const sourceGtTargetOppo = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];\n const sourceLtTargetOppo = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];\n const flipSourceTarget = (sourceDir[dirAccessor] === 1 && ((!isSameDir && sourceGtTargetOppo) || (isSameDir && sourceLtTargetOppo))) ||\n (sourceDir[dirAccessor] !== 1 && ((!isSameDir && sourceLtTargetOppo) || (isSameDir && sourceGtTargetOppo)));\n if (flipSourceTarget) {\n points = dirAccessor === 'x' ? sourceTarget : targetSource;\n }\n }\n const sourceGapPoint = { x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y };\n const targetGapPoint = { x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y };\n const maxXDistance = Math.max(Math.abs(sourceGapPoint.x - points[0].x), Math.abs(targetGapPoint.x - points[0].x));\n const maxYDistance = Math.max(Math.abs(sourceGapPoint.y - points[0].y), Math.abs(targetGapPoint.y - points[0].y));\n // we want to place the label on the longest segment of the edge\n if (maxXDistance >= maxYDistance) {\n centerX = (sourceGapPoint.x + targetGapPoint.x) / 2;\n centerY = points[0].y;\n }\n else {\n centerX = points[0].x;\n centerY = (sourceGapPoint.y + targetGapPoint.y) / 2;\n }\n }\n const gappedSource = { x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y };\n const gappedTarget = { x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y };\n const pathPoints = [\n source,\n // we only want to add the gapped source/target if they are different from the first/last point to avoid duplicates which can cause issues with the bends\n ...(gappedSource.x !== points[0].x || gappedSource.y !== points[0].y ? [gappedSource] : []),\n ...points,\n ...(gappedTarget.x !== points[points.length - 1].x || gappedTarget.y !== points[points.length - 1].y\n ? [gappedTarget]\n : []),\n target,\n ];\n return [pathPoints, centerX, centerY, defaultOffsetX, defaultOffsetY];\n}\nfunction getBend(a, b, c, size) {\n const bendSize = Math.min(distance(a, b) / 2, distance(b, c) / 2, size);\n const { x, y } = b;\n // no bend\n if ((a.x === x && x === c.x) || (a.y === y && y === c.y)) {\n return `L${x} ${y}`;\n }\n // first segment is horizontal\n if (a.y === y) {\n const xDir = a.x < c.x ? -1 : 1;\n const yDir = a.y < c.y ? 1 : -1;\n return `L ${x + bendSize * xDir},${y}Q ${x},${y} ${x},${y + bendSize * yDir}`;\n }\n const xDir = a.x < c.x ? 1 : -1;\n const yDir = a.y < c.y ? -1 : 1;\n return `L ${x},${y + bendSize * yDir}Q ${x},${y} ${x + bendSize * xDir},${y}`;\n}\n/**\n * The `getSmoothStepPath` util returns everything you need to render a stepped path\n * between two nodes. The `borderRadius` property can be used to choose how rounded\n * the corners of those steps are.\n * @public\n * @returns A path string you can use in an SVG, the `labelX` and `labelY` position (center of path)\n * and `offsetX`, `offsetY` between source handle and label.\n *\n * - `path`: the path to use in an SVG `<path>` element.\n * - `labelX`: the `x` position you can use to render a label for this edge.\n * - `labelY`: the `y` position you can use to render a label for this edge.\n * - `offsetX`: the absolute difference between the source `x` position and the `x` position of the\n * middle of this path.\n * - `offsetY`: the absolute difference between the source `y` position and the `y` position of the\n * middle of this path.\n * @example\n * ```js\n * const source = { x: 0, y: 20 };\n * const target = { x: 150, y: 100 };\n *\n * const [path, labelX, labelY, offsetX, offsetY] = getSmoothStepPath({\n * sourceX: source.x,\n * sourceY: source.y,\n * sourcePosition: Position.Right,\n * targetX: target.x,\n * targetY: target.y,\n * targetPosition: Position.Left,\n * });\n * ```\n * @remarks This function returns a tuple (aka a fixed-size array) to make it easier to work with multiple edge paths at once.\n */\nfunction getSmoothStepPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top, borderRadius = 5, centerX, centerY, offset = 20, stepPosition = 0.5, }) {\n const [points, labelX, labelY, offsetX, offsetY] = getPoints({\n source: { x: sourceX, y: sourceY },\n sourcePosition,\n target: { x: targetX, y: targetY },\n targetPosition,\n center: { x: centerX, y: centerY },\n offset,\n stepPosition,\n });\n let path = `M${points[0].x} ${points[0].y}`;\n for (let i = 1; i < points.length - 1; i++) {\n path += getBend(points[i - 1], points[i], points[i + 1], borderRadius);\n }\n path += `L${points[points.length - 1].x} ${points[points.length - 1].y}`;\n return [path, labelX, labelY, offsetX, offsetY];\n}\n\nfunction isNodeInitialized(node) {\n return (node &&\n !!(node.internals.handleBounds || node.handles?.length) &&\n !!(node.measured.width || node.width || node.initialWidth));\n}\nfunction getEdgePosition(params) {\n const { sourceNode, targetNode } = params;\n if (!isNodeInitialized(sourceNode) || !isNodeInitialized(targetNode)) {\n return null;\n }\n const sourceHandleBounds = sourceNode.internals.handleBounds || toHandleBounds(sourceNode.handles);\n const targetHandleBounds = targetNode.internals.handleBounds || toHandleBounds(targetNode.handles);\n const sourceHandle = getHandle$1(sourceHandleBounds?.source ?? [], params.sourceHandle);\n const targetHandle = getHandle$1(\n // when connection type is loose we can define all handles as sources and connect source -> source\n params.connectionMode === ConnectionMode.Strict\n ? targetHandleBounds?.target ?? []\n : (targetHandleBounds?.target ?? []).concat(targetHandleBounds?.source ?? []), params.targetHandle);\n if (!sourceHandle || !targetHandle) {\n params.onError?.('008', errorMessages['error008'](!sourceHandle ? 'source' : 'target', {\n id: params.id,\n sourceHandle: params.sourceHandle,\n targetHandle: params.targetHandle,\n }));\n return null;\n }\n const sourcePosition = sourceHandle?.position || Position.Bottom;\n const targetPosition = targetHandle?.position || Position.Top;\n const source = getHandlePosition(sourceNode, sourceHandle, sourcePosition);\n const target = getHandlePosition(targetNode, targetHandle, targetPosition);\n return {\n sourceX: source.x,\n sourceY: source.y,\n targetX: target.x,\n targetY: target.y,\n sourcePosition,\n targetPosition,\n };\n}\nfunction toHandleBounds(handles) {\n if (!handles) {\n return null;\n }\n const source = [];\n const target = [];\n for (const handle of handles) {\n handle.width = handle.width ?? 1;\n handle.height = handle.height ?? 1;\n if (handle.type === 'source') {\n source.push(handle);\n }\n else if (handle.type === 'target') {\n target.push(handle);\n }\n }\n return {\n source,\n target,\n };\n}\nfunction getHandlePosition(node, handle, fallbackPosition = Position.Left, center = false) {\n const x = (handle?.x ?? 0) + node.internals.positionAbsolute.x;\n const y = (handle?.y ?? 0) + node.internals.positionAbsolute.y;\n const { width, height } = handle ?? getNodeDimensions(node);\n if (center) {\n return { x: x + width / 2, y: y + height / 2 };\n }\n const position = handle?.position ?? fallbackPosition;\n switch (position) {\n case Position.Top:\n return { x: x + width / 2, y };\n case Position.Right:\n return { x: x + width, y: y + height / 2 };\n case Position.Bottom:\n return { x: x + width / 2, y: y + height };\n case Position.Left:\n return { x, y: y + height / 2 };\n }\n}\nfunction getHandle$1(bounds, handleId) {\n if (!bounds) {\n return null;\n }\n // if no handleId is given, we use the first handle, otherwise we check for the id\n return (!handleId ? bounds[0] : bounds.find((d) => d.id === handleId)) || null;\n}\n\nfunction getMarkerId(marker, id) {\n if (!marker) {\n return '';\n }\n if (typeof marker === 'string') {\n return marker;\n }\n const idPrefix = id ? `${id}__` : '';\n return `${idPrefix}${Object.keys(marker)\n .sort()\n .map((key) => `${key}=${marker[key]}`)\n .join('&')}`;\n}\nfunction createMarkerIds(edges, { id, defaultColor, defaultMarkerStart, defaultMarkerEnd, }) {\n const ids = new Set();\n return edges\n .reduce((markers, edge) => {\n [edge.markerStart || defaultMarkerStart, edge.markerEnd || defaultMarkerEnd].forEach((marker) => {\n if (marker && typeof marker === 'object') {\n const markerId = getMarkerId(marker, id);\n if (!ids.has(markerId)) {\n markers.push({ id: markerId, color: marker.color || defaultColor, ...marker });\n ids.add(markerId);\n }\n }\n });\n return markers;\n }, [])\n .sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction getNodeToolbarTransform(nodeRect, viewport, position, offset, align) {\n let alignmentOffset = 0.5;\n if (align === 'start') {\n alignmentOffset = 0;\n }\n else if (align === 'end') {\n alignmentOffset = 1;\n }\n /*\n * position === Position.Top\n * we set the x any y position of the toolbar based on the nodes position\n */\n let pos = [\n (nodeRect.x + nodeRect.width * alignmentOffset) * viewport.zoom + viewport.x,\n nodeRect.y * viewport.zoom + viewport.y - offset,\n ];\n // and than shift it based on the alignment. The shift values are in %.\n let shift = [-100 * alignmentOffset, -100];\n switch (position) {\n case Position.Right:\n pos = [\n (nodeRect.x + nodeRect.width) * viewport.zoom + viewport.x + offset,\n (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y,\n ];\n shift = [0, -100 * alignmentOffset];\n break;\n case Position.Bottom:\n pos[1] = (nodeRect.y + nodeRect.height) * viewport.zoom + viewport.y + offset;\n shift[1] = 0;\n break;\n case Position.Left:\n pos = [\n nodeRect.x * viewport.zoom + viewport.x - offset,\n (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y,\n ];\n shift = [-100, -100 * alignmentOffset];\n break;\n }\n return `translate(${pos[0]}px, ${pos[1]}px) translate(${shift[0]}%, ${shift[1]}%)`;\n}\n\nconst alignXToPercent = {\n left: 0,\n center: 50,\n right: 100,\n};\nconst alignYToPercent = {\n top: 0,\n center: 50,\n bottom: 100,\n};\nfunction getEdgeToolbarTransform(x, y, zoom, alignX = 'center', alignY = 'center') {\n return `translate(${x}px, ${y}px) scale(${1 / zoom}) translate(${-(alignXToPercent[alignX] ?? 50)}%, ${-(alignYToPercent[alignY] ?? 50)}%)`;\n}\n\nconst SELECTED_NODE_Z = 1000;\nconst ROOT_PARENT_Z_INCREMENT = 10;\nconst defaultOptions = {\n nodeOrigin: [0, 0],\n nodeExtent: infiniteExtent,\n elevateNodesOnSelect: true,\n zIndexMode: 'basic',\n defaults: {},\n};\nconst adoptUserNodesDefaultOptions = {\n ...defaultOptions,\n checkEquality: true,\n};\nfunction mergeObjects(base, incoming) {\n const result = { ...base };\n for (const key in incoming) {\n if (incoming[key] !== undefined) {\n // typecast is safe here, because we check for undefined\n result[key] = incoming[key];\n }\n }\n return result;\n}\nfunction updateAbsolutePositions(nodeLookup, parentLookup, options) {\n const _options = mergeObjects(defaultOptions, options);\n for (const node of nodeLookup.values()) {\n if (node.parentId) {\n updateChildNode(node, nodeLookup, parentLookup, _options);\n }\n else {\n const positionWithOrigin = getNodePositionWithOrigin(node, _options.nodeOrigin);\n const extent = isCoordinateExtent(node.extent) ? node.extent : _options.nodeExtent;\n const clampedPosition = clampPosition(positionWithOrigin, extent, getNodeDimensions(node));\n node.internals.positionAbsolute = clampedPosition;\n }\n }\n}\nfunction parseHandles(userNode, internalNode) {\n if (!userNode.handles) {\n return !userNode.measured ? undefined : internalNode?.internals.handleBounds;\n }\n const source = [];\n const target = [];\n for (const handle of userNode.handles) {\n const handleBounds = {\n id: handle.id,\n width: handle.width ?? 1,\n height: handle.height ?? 1,\n nodeId: userNode.id,\n x: handle.x,\n y: handle.y,\n position: handle.position,\n type: handle.type,\n };\n if (handle.type === 'source') {\n source.push(handleBounds);\n }\n else if (handle.type === 'target') {\n target.push(handleBounds);\n }\n }\n return {\n source,\n target,\n };\n}\nfunction isManualZIndexMode(zIndexMode) {\n return zIndexMode === 'manual';\n}\nfunction adoptUserNodes(nodes, nodeLookup, parentLookup, options = {}) {\n const _options = mergeObjects(adoptUserNodesDefaultOptions, options);\n const rootParentIndex = { i: 0 };\n const tmpLookup = new Map(nodeLookup);\n const selectedNodeZ = _options?.elevateNodesOnSelect && !isManualZIndexMode(_options.zIndexMode) ? SELECTED_NODE_Z : 0;\n let nodesInitialized = nodes.length > 0;\n let hasSelectedNodes = false;\n nodeLookup.clear();\n parentLookup.clear();\n for (const userNode of nodes) {\n let internalNode = tmpLookup.get(userNode.id);\n if (_options.checkEquality && userNode === internalNode?.internals.userNode) {\n nodeLookup.set(userNode.id, internalNode);\n }\n else {\n const positionWithOrigin = getNodePositionWithOrigin(userNode, _options.nodeOrigin);\n const extent = isCoordinateExtent(userNode.extent) ? userNode.extent : _options.nodeExtent;\n const clampedPosition = clampPosition(positionWithOrigin, extent, getNodeDimensions(userNode));\n internalNode = {\n ..._options.defaults,\n ...userNode,\n measured: {\n width: userNode.measured?.width,\n height: userNode.measured?.height,\n },\n internals: {\n positionAbsolute: clampedPosition,\n // if user re-initializes the node or removes `measured` for whatever reason, we reset the handleBounds so that the node gets re-measured\n handleBounds: parseHandles(userNode, internalNode),\n z: calculateZ(userNode, selectedNodeZ, _options.zIndexMode),\n userNode,\n },\n };\n nodeLookup.set(userNode.id, internalNode);\n }\n if ((internalNode.measured === undefined ||\n internalNode.measured.width === undefined ||\n internalNode.measured.height === undefined) &&\n !internalNode.hidden) {\n nodesInitialized = false;\n }\n if (userNode.parentId) {\n updateChildNode(internalNode, nodeLookup, parentLookup, options, rootParentIndex);\n }\n hasSelectedNodes ||= userNode.selected ?? false;\n }\n return { nodesInitialized, hasSelectedNodes };\n}\nfunction updateParentLookup(node, parentLookup) {\n if (!node.parentId) {\n return;\n }\n const childNodes = parentLookup.get(node.parentId);\n if (childNodes) {\n childNodes.set(node.id, node);\n }\n else {\n parentLookup.set(node.parentId, new Map([[node.id, node]]));\n }\n}\n/**\n * Updates positionAbsolute and zIndex of a child node and the parentLookup.\n */\nfunction updateChildNode(node, nodeLookup, parentLookup, options, rootParentIndex) {\n const { elevateNodesOnSelect, nodeOrigin, nodeExtent, zIndexMode } = mergeObjects(defaultOptions, options);\n const parentId = node.parentId;\n const parentNode = nodeLookup.get(parentId);\n if (!parentNode) {\n console.warn(`Parent node ${parentId} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);\n return;\n }\n updateParentLookup(node, parentLookup);\n // We just want to set the rootParentIndex for the first child\n if (rootParentIndex &&\n !parentNode.parentId &&\n parentNode.internals.rootParentIndex === undefined &&\n zIndexMode === 'auto') {\n parentNode.internals.rootParentIndex = ++rootParentIndex.i;\n parentNode.internals.z = parentNode.internals.z + rootParentIndex.i * ROOT_PARENT_Z_INCREMENT;\n }\n // But we need to update rootParentIndex.i also when parent has not been updated\n if (rootParentIndex && parentNode.internals.rootParentIndex !== undefined) {\n rootParentIndex.i = parentNode.internals.rootParentIndex;\n }\n const selectedNodeZ = elevateNodesOnSelect && !isManualZIndexMode(zIndexMode) ? SELECTED_NODE_Z : 0;\n const { x, y, z } = calculateChildXYZ(node, parentNode, nodeOrigin, nodeExtent, selectedNodeZ, zIndexMode);\n const { positionAbsolute } = node.internals;\n const positionChanged = x !== positionAbsolute.x || y !== positionAbsolute.y;\n if (positionChanged || z !== node.internals.z) {\n // we create a new object to mark the node as updated\n nodeLookup.set(node.id, {\n ...node,\n internals: {\n ...node.internals,\n positionAbsolute: positionChanged ? { x, y } : positionAbsolute,\n z,\n },\n });\n }\n}\nfunction calculateZ(node, selectedNodeZ, zIndexMode) {\n const zIndex = isNumeric(node.zIndex) ? node.zIndex : 0;\n if (isManualZIndexMode(zIndexMode)) {\n return zIndex;\n }\n return zIndex + (node.selected ? selectedNodeZ : 0);\n}\nfunction calculateChildXYZ(childNode, parentNode, nodeOrigin, nodeExtent, selectedNodeZ, zIndexMode) {\n const { x: parentX, y: parentY } = parentNode.internals.positionAbsolute;\n const childDimensions = getNodeDimensions(childNode);\n const positionWithOrigin = getNodePositionWithOrigin(childNode, nodeOrigin);\n const clampedPosition = isCoordinateExtent(childNode.extent)\n ? clampPosition(positionWithOrigin, childNode.extent, childDimensions)\n : positionWithOrigin;\n let absolutePosition = clampPosition({ x: parentX + clampedPosition.x, y: parentY + clampedPosition.y }, nodeExtent, childDimensions);\n if (childNode.extent === 'parent') {\n absolutePosition = clampPositionToParent(absolutePosition, childDimensions, parentNode);\n }\n const childZ = calculateZ(childNode, selectedNodeZ, zIndexMode);\n const parentZ = parentNode.internals.z ?? 0;\n return {\n x: absolutePosition.x,\n y: absolutePosition.y,\n z: parentZ >= childZ ? parentZ + 1 : childZ,\n };\n}\nfunction handleExpandParent(children, nodeLookup, parentLookup, nodeOrigin = [0, 0]) {\n const changes = [];\n const parentExpansions = new Map();\n // determine the expanded rectangle the child nodes would take for each parent\n for (const child of children) {\n const parent = nodeLookup.get(child.parentId);\n if (!parent) {\n continue;\n }\n const parentRect = parentExpansions.get(child.parentId)?.expandedRect ?? nodeToRect(parent);\n const expandedRect = getBoundsOfRects(parentRect, child.rect);\n parentExpansions.set(child.parentId, { expandedRect, parent });\n }\n if (parentExpansions.size > 0) {\n parentExpansions.forEach(({ expandedRect, parent }, parentId) => {\n // determine the position & dimensions of the parent\n const positionAbsolute = parent.internals.positionAbsolute;\n const dimensions = getNodeDimensions(parent);\n const origin = parent.origin ?? nodeOrigin;\n // determine how much the parent expands in width and position\n const xChange = expandedRect.x < positionAbsolute.x ? Math.round(Math.abs(positionAbsolute.x - expandedRect.x)) : 0;\n const yChange = expandedRect.y < positionAbsolute.y ? Math.round(Math.abs(positionAbsolute.y - expandedRect.y)) : 0;\n const newWidth = Math.max(dimensions.width, Math.round(expandedRect.width));\n const newHeight = Math.max(dimensions.height, Math.round(expandedRect.height));\n const widthChange = (newWidth - dimensions.width) * origin[0];\n const heightChange = (newHeight - dimensions.height) * origin[1];\n // We need to correct the position of the parent node if the origin is not [0,0]\n if (xChange > 0 || yChange > 0 || widthChange || heightChange) {\n changes.push({\n id: parentId,\n type: 'position',\n position: {\n x: parent.position.x - xChange + widthChange,\n y: parent.position.y - yChange + heightChange,\n },\n });\n /*\n * We move all child nodes in the oppsite direction\n * so the x,y changes of the parent do not move the children\n */\n parentLookup.get(parentId)?.forEach((childNode) => {\n if (!children.some((child) => child.id === childNode.id)) {\n changes.push({\n id: childNode.id,\n type: 'position',\n position: {\n x: childNode.position.x + xChange,\n y: childNode.position.y + yChange,\n },\n });\n }\n });\n }\n // We need to correct the dimensions of the parent node if the origin is not [0,0]\n if (dimensions.width < expandedRect.width || dimensions.height < expandedRect.height || xChange || yChange) {\n changes.push({\n id: parentId,\n type: 'dimensions',\n setAttributes: true,\n dimensions: {\n width: newWidth + (xChange ? origin[0] * xChange - widthChange : 0),\n height: newHeight + (yChange ? origin[1] * yChange - heightChange : 0),\n },\n });\n }\n });\n }\n return changes;\n}\nfunction updateNodeInternals(updates, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, zIndexMode) {\n const viewportNode = domNode?.querySelector('.xyflow__viewport');\n let updatedInternals = false;\n if (!viewportNode) {\n return { changes: [], updatedInternals };\n }\n const changes = [];\n const style = window.getComputedStyle(viewportNode);\n const { m22: zoom } = new window.DOMMatrixReadOnly(style.transform);\n // in this array we collect nodes, that might trigger changes (like expanding parent)\n const parentExpandChildren = [];\n for (const update of updates.values()) {\n const node = nodeLookup.get(update.id);\n if (!node) {\n continue;\n }\n if (node.hidden) {\n nodeLookup.set(node.id, {\n ...node,\n internals: {\n ...node.internals,\n handleBounds: undefined,\n },\n });\n updatedInternals = true;\n continue;\n }\n const dimensions = getDimensions(update.nodeElement);\n const dimensionChanged = node.measured.width !== dimensions.width || node.measured.height !== dimensions.height;\n const doUpdate = !!(dimensions.width &&\n dimensions.height &&\n (dimensionChanged || !node.internals.handleBounds || update.force));\n if (doUpdate) {\n const nodeBounds = update.nodeElement.getBoundingClientRect();\n const extent = isCoordinateExtent(node.extent) ? node.extent : nodeExtent;\n let { positionAbsolute } = node.internals;\n if (node.parentId && node.extent === 'parent') {\n positionAbsolute = clampPositionToParent(positionAbsolute, dimensions, nodeLookup.get(node.parentId));\n }\n else if (extent) {\n positionAbsolute = clampPosition(positionAbsolute, extent, dimensions);\n }\n const newNode = {\n ...node,\n measured: dimensions,\n internals: {\n ...node.internals,\n positionAbsolute,\n handleBounds: {\n source: getHandleBounds('source', update.nodeElement, nodeBounds, zoom, node.id),\n target: getHandleBounds('target', update.nodeElement, nodeBounds, zoom, node.id),\n },\n },\n };\n nodeLookup.set(node.id, newNode);\n if (node.parentId) {\n updateChildNode(newNode, nodeLookup, parentLookup, { nodeOrigin, zIndexMode });\n }\n updatedInternals = true;\n if (dimensionChanged) {\n changes.push({\n id: node.id,\n type: 'dimensions',\n dimensions,\n });\n if (node.expandParent && node.parentId) {\n parentExpandChildren.push({\n id: node.id,\n parentId: node.parentId,\n rect: nodeToRect(newNode, nodeOrigin),\n });\n }\n }\n }\n }\n if (parentExpandChildren.length > 0) {\n const parentExpandChanges = handleExpandParent(parentExpandChildren, nodeLookup, parentLookup, nodeOrigin);\n changes.push(...parentExpandChanges);\n }\n return { changes, updatedInternals };\n}\nasync function panBy({ delta, panZoom, transform, translateExtent, width, height, }) {\n if (!panZoom || (!delta.x && !delta.y)) {\n return Promise.resolve(false);\n }\n const nextViewport = await panZoom.setViewportConstrained({\n x: transform[0] + delta.x,\n y: transform[1] + delta.y,\n zoom: transform[2],\n }, [\n [0, 0],\n [width, height],\n ], translateExtent);\n const transformChanged = !!nextViewport &&\n (nextViewport.x !== transform[0] || nextViewport.y !== transform[1] || nextViewport.k !== transform[2]);\n return Promise.resolve(transformChanged);\n}\n/**\n * this function adds the connection to the connectionLookup\n * at the following keys: nodeId-type-handleId, nodeId-type and nodeId\n * @param type type of the connection\n * @param connection connection that should be added to the lookup\n * @param connectionKey at which key the connection should be added\n * @param connectionLookup reference to the connection lookup\n * @param nodeId nodeId of the connection\n * @param handleId handleId of the connection\n */\nfunction addConnectionToLookup(type, connection, connectionKey, connectionLookup, nodeId, handleId) {\n /*\n * We add the connection to the connectionLookup at the following keys\n * 1. nodeId, 2. nodeId-type, 3. nodeId-type-handleId\n * If the key already exists, we add the connection to the existing map\n */\n let key = nodeId;\n const nodeMap = connectionLookup.get(key) || new Map();\n connectionLookup.set(key, nodeMap.set(connectionKey, connection));\n key = `${nodeId}-${type}`;\n const typeMap = connectionLookup.get(key) || new Map();\n connectionLookup.set(key, typeMap.set(connectionKey, connection));\n if (handleId) {\n key = `${nodeId}-${type}-${handleId}`;\n const handleMap = connectionLookup.get(key) || new Map();\n connectionLookup.set(key, handleMap.set(connectionKey, connection));\n }\n}\nfunction updateConnectionLookup(connectionLookup, edgeLookup, edges) {\n connectionLookup.clear();\n edgeLookup.clear();\n for (const edge of edges) {\n const { source: sourceNode, target: targetNode, sourceHandle = null, targetHandle = null } = edge;\n const connection = { edgeId: edge.id, source: sourceNode, target: targetNode, sourceHandle, targetHandle };\n const sourceKey = `${sourceNode}-${sourceHandle}--${targetNode}-${targetHandle}`;\n const targetKey = `${targetNode}-${targetHandle}--${sourceNode}-${sourceHandle}`;\n addConnectionToLookup('source', connection, targetKey, connectionLookup, sourceNode, sourceHandle);\n addConnectionToLookup('target', connection, sourceKey, connectionLookup, targetNode, targetHandle);\n edgeLookup.set(edge.id, edge);\n }\n}\n\nfunction shallowNodeData(a, b) {\n if (a === null || b === null) {\n return false;\n }\n const _a = Array.isArray(a) ? a : [a];\n const _b = Array.isArray(b) ? b : [b];\n if (_a.length !== _b.length) {\n return false;\n }\n for (let i = 0; i < _a.length; i++) {\n if (_a[i].id !== _b[i].id || _a[i].type !== _b[i].type || !Object.is(_a[i].data, _b[i].data)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isParentSelected(node, nodeLookup) {\n if (!node.parentId) {\n return false;\n }\n const parentNode = nodeLookup.get(node.parentId);\n if (!parentNode) {\n return false;\n }\n if (parentNode.selected) {\n return true;\n }\n return isParentSelected(parentNode, nodeLookup);\n}\nfunction hasSelector(target, selector, domNode) {\n let current = target;\n do {\n if (current?.matches?.(selector))\n return true;\n if (current === domNode)\n return false;\n current = current?.parentElement;\n } while (current);\n return false;\n}\n// looks for all selected nodes and created a NodeDragItem for each of them\nfunction getDragItems(nodeLookup, nodesDraggable, mousePos, nodeId) {\n const dragItems = new Map();\n for (const [id, node] of nodeLookup) {\n if ((node.selected || node.id === nodeId) &&\n (!node.parentId || !isParentSelected(node, nodeLookup)) &&\n (node.draggable || (nodesDraggable && typeof node.draggable === 'undefined'))) {\n const internalNode = nodeLookup.get(id);\n if (internalNode) {\n dragItems.set(id, {\n id,\n position: internalNode.position || { x: 0, y: 0 },\n distance: {\n x: mousePos.x - internalNode.internals.positionAbsolute.x,\n y: mousePos.y - internalNode.internals.positionAbsolute.y,\n },\n extent: internalNode.extent,\n parentId: internalNode.parentId,\n origin: internalNode.origin,\n expandParent: internalNode.expandParent,\n internals: {\n positionAbsolute: internalNode.internals.positionAbsolute || { x: 0, y: 0 },\n },\n measured: {\n width: internalNode.measured.width ?? 0,\n height: internalNode.measured.height ?? 0,\n },\n });\n }\n }\n }\n return dragItems;\n}\n/*\n * returns two params:\n * 1. the dragged node (or the first of the list, if we are dragging a node selection)\n * 2. array of selected nodes (for multi selections)\n */\nfunction getEventHandlerParams({ nodeId, dragItems, nodeLookup, dragging = true, }) {\n const nodesFromDragItems = [];\n for (const [id, dragItem] of dragItems) {\n const node = nodeLookup.get(id)?.internals.userNode;\n if (node) {\n nodesFromDragItems.push({\n ...node,\n position: dragItem.position,\n dragging,\n });\n }\n }\n if (!nodeId) {\n return [nodesFromDragItems[0], nodesFromDragItems];\n }\n const node = nodeLookup.get(nodeId)?.internals.userNode;\n return [\n !node\n ? nodesFromDragItems[0]\n : {\n ...node,\n position: dragItems.get(nodeId)?.position || node.position,\n dragging,\n },\n nodesFromDragItems,\n ];\n}\n/**\n * If a selection is being dragged we want to apply the same snap offset to all nodes in the selection.\n * This function calculates the snap offset based on the first node in the selection.\n */\nfunction calculateSnapOffset({ dragItems, snapGrid, x, y, }) {\n const refDragItem = dragItems.values().next().value;\n if (!refDragItem) {\n return null;\n }\n const refPos = {\n x: x - refDragItem.distance.x,\n y: y - refDragItem.distance.y,\n };\n const refPosSnapped = snapPosition(refPos, snapGrid);\n return {\n x: refPosSnapped.x - refPos.x,\n y: refPosSnapped.y - refPos.y,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragStop, }) {\n let lastPos = { x: null, y: null };\n let autoPanId = 0;\n let dragItems = new Map();\n let autoPanStarted = false;\n let mousePosition = { x: 0, y: 0 };\n let containerBounds = null;\n let dragStarted = false;\n let d3Selection = null;\n let abortDrag = false; // prevents unintentional dragging on multitouch\n let nodePositionsChanged = false;\n // we store the last drag event to be able to use it in the update function\n let dragEvent = null;\n // public functions\n function update({ noDragClassName, handleSelector, domNode, isSelectable, nodeId, nodeClickDistance = 0, }) {\n d3Selection = select(domNode);\n function updateNodes({ x, y }) {\n const { nodeLookup, nodeExtent, snapGrid, snapToGrid, nodeOrigin, onNodeDrag, onSelectionDrag, onError, updateNodePositions, } = getStoreItems();\n lastPos = { x, y };\n let hasChange = false;\n const isMultiDrag = dragItems.size > 1;\n const nodesBox = isMultiDrag && nodeExtent ? rectToBox(getInternalNodesBounds(dragItems)) : null;\n const multiDragSnapOffset = isMultiDrag && snapToGrid\n ? calculateSnapOffset({\n dragItems,\n snapGrid,\n x,\n y,\n })\n : null;\n for (const [id, dragItem] of dragItems) {\n /*\n * if the node is not in the nodeLookup anymore, it was probably deleted while dragging\n */\n if (!nodeLookup.has(id)) {\n continue;\n }\n let nextPosition = { x: x - dragItem.distance.x, y: y - dragItem.distance.y };\n if (snapToGrid) {\n nextPosition = multiDragSnapOffset\n ? {\n x: Math.round(nextPosition.x + multiDragSnapOffset.x),\n y: Math.round(nextPosition.y + multiDragSnapOffset.y),\n }\n : snapPosition(nextPosition, snapGrid);\n }\n let adjustedNodeExtent = null;\n if (isMultiDrag && nodeExtent && !dragItem.extent && nodesBox) {\n const { positionAbsolute } = dragItem.internals;\n const x1 = positionAbsolute.x - nodesBox.x + nodeExtent[0][0];\n const x2 = positionAbsolute.x + dragItem.measured.width - nodesBox.x2 + nodeExtent[1][0];\n const y1 = positionAbsolute.y - nodesBox.y + nodeExtent[0][1];\n const y2 = positionAbsolute.y + dragItem.measured.height - nodesBox.y2 + nodeExtent[1][1];\n adjustedNodeExtent = [\n [x1, y1],\n [x2, y2],\n ];\n }\n const { position, positionAbsolute } = calculateNodePosition({\n nodeId: id,\n nextPosition,\n nodeLookup,\n nodeExtent: adjustedNodeExtent ? adjustedNodeExtent : nodeExtent,\n nodeOrigin,\n onError,\n });\n // we want to make sure that we only fire a change event when there is a change\n hasChange = hasChange || dragItem.position.x !== position.x || dragItem.position.y !== position.y;\n dragItem.position = position;\n dragItem.internals.positionAbsolute = positionAbsolute;\n }\n nodePositionsChanged = nodePositionsChanged || hasChange;\n if (!hasChange) {\n return;\n }\n updateNodePositions(dragItems, true);\n if (dragEvent && (onDrag || onNodeDrag || (!nodeId && onSelectionDrag))) {\n const [currentNode, currentNodes] = getEventHandlerParams({\n nodeId,\n dragItems,\n nodeLookup,\n });\n onDrag?.(dragEvent, dragItems, currentNode, currentNodes);\n onNodeDrag?.(dragEvent, currentNode, currentNodes);\n if (!nodeId) {\n onSelectionDrag?.(dragEvent, currentNodes);\n }\n }\n }\n async function autoPan() {\n if (!containerBounds) {\n return;\n }\n const { transform, panBy, autoPanSpeed, autoPanOnNodeDrag } = getStoreItems();\n if (!autoPanOnNodeDrag) {\n autoPanStarted = false;\n cancelAnimationFrame(autoPanId);\n return;\n }\n const [xMovement, yMovement] = calcAutoPan(mousePosition, containerBounds, autoPanSpeed);\n if (xMovement !== 0 || yMovement !== 0) {\n lastPos.x = (lastPos.x ?? 0) - xMovement / transform[2];\n lastPos.y = (lastPos.y ?? 0) - yMovement / transform[2];\n if (await panBy({ x: xMovement, y: yMovement })) {\n updateNodes(lastPos);\n }\n }\n autoPanId = requestAnimationFrame(autoPan);\n }\n function startDrag(event) {\n const { nodeLookup, multiSelectionActive, nodesDraggable, transform, snapGrid, snapToGrid, selectNodesOnDrag, onNodeDragStart, onSelectionDragStart, unselectNodesAndEdges, } = getStoreItems();\n dragStarted = true;\n if ((!selectNodesOnDrag || !isSelectable) && !multiSelectionActive && nodeId) {\n if (!nodeLookup.get(nodeId)?.selected) {\n // we need to reset selected nodes when selectNodesOnDrag=false\n unselectNodesAndEdges();\n }\n }\n if (isSelectable && selectNodesOnDrag && nodeId) {\n onNodeMouseDown?.(nodeId);\n }\n const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid, containerBounds });\n lastPos = pointerPos;\n dragItems = getDragItems(nodeLookup, nodesDraggable, pointerPos, nodeId);\n if (dragItems.size > 0 && (onDragStart || onNodeDragStart || (!nodeId && onSelectionDragStart))) {\n const [currentNode, currentNodes] = getEventHandlerParams({\n nodeId,\n dragItems,\n nodeLookup,\n });\n onDragStart?.(event.sourceEvent, dragItems, currentNode, currentNodes);\n onNodeDragStart?.(event.sourceEvent, currentNode, currentNodes);\n if (!nodeId) {\n onSelectionDragStart?.(event.sourceEvent, currentNodes);\n }\n }\n }\n const d3DragInstance = drag()\n .clickDistance(nodeClickDistance)\n .on('start', (event) => {\n const { domNode, nodeDragThreshold, transform, snapGrid, snapToGrid } = getStoreItems();\n containerBounds = domNode?.getBoundingClientRect() || null;\n abortDrag = false;\n nodePositionsChanged = false;\n dragEvent = event.sourceEvent;\n if (nodeDragThreshold === 0) {\n startDrag(event);\n }\n const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid, containerBounds });\n lastPos = pointerPos;\n mousePosition = getEventPosition(event.sourceEvent, containerBounds);\n })\n .on('drag', (event) => {\n const { autoPanOnNodeDrag, transform, snapGrid, snapToGrid, nodeDragThreshold, nodeLookup } = getStoreItems();\n const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid, containerBounds });\n dragEvent = event.sourceEvent;\n if ((event.sourceEvent.type === 'touchmove' && event.sourceEvent.touches.length > 1) ||\n // if user deletes a node while dragging, we need to abort the drag to prevent errors\n (nodeId && !nodeLookup.has(nodeId))) {\n abortDrag = true;\n }\n if (abortDrag) {\n return;\n }\n if (!autoPanStarted && autoPanOnNodeDrag && dragStarted) {\n autoPanStarted = true;\n autoPan();\n }\n if (!dragStarted) {\n // Calculate distance in client coordinates for consistent drag threshold behavior across zoom levels\n const currentMousePosition = getEventPosition(event.sourceEvent, containerBounds);\n const x = currentMousePosition.x - mousePosition.x;\n const y = currentMousePosition.y - mousePosition.y;\n const distance = Math.sqrt(x * x + y * y);\n if (distance > nodeDragThreshold) {\n startDrag(event);\n }\n }\n // skip events without movement\n if ((lastPos.x !== pointerPos.xSnapped || lastPos.y !== pointerPos.ySnapped) && dragItems && dragStarted) {\n mousePosition = getEventPosition(event.sourceEvent, containerBounds);\n updateNodes(pointerPos);\n }\n })\n .on('end', (event) => {\n if (!dragStarted || abortDrag) {\n return;\n }\n autoPanStarted = false;\n dragStarted = false;\n cancelAnimationFrame(autoPanId);\n if (dragItems.size > 0) {\n const { nodeLookup, updateNodePositions, onNodeDragStop, onSelectionDragStop } = getStoreItems();\n if (nodePositionsChanged) {\n updateNodePositions(dragItems, false);\n nodePositionsChanged = false;\n }\n if (onDragStop || onNodeDragStop || (!nodeId && onSelectionDragStop)) {\n const [currentNode, currentNodes] = getEventHandlerParams({\n nodeId,\n dragItems,\n nodeLookup,\n dragging: false,\n });\n onDragStop?.(event.sourceEvent, dragItems, currentNode, currentNodes);\n onNodeDragStop?.(event.sourceEvent, currentNode, currentNodes);\n if (!nodeId) {\n onSelectionDragStop?.(event.sourceEvent, currentNodes);\n }\n }\n }\n })\n .filter((event) => {\n const target = event.target;\n const isDraggable = !event.button &&\n (!noDragClassName || !hasSelector(target, `.${noDragClassName}`, domNode)) &&\n (!handleSelector || hasSelector(target, handleSelector, domNode));\n return isDraggable;\n });\n d3Selection.call(d3DragInstance);\n }\n function destroy() {\n d3Selection?.on('.drag', null);\n }\n return {\n update,\n destroy,\n };\n}\n\nfunction getNodesWithinDistance(position, nodeLookup, distance) {\n const nodes = [];\n const rect = {\n x: position.x - distance,\n y: position.y - distance,\n width: distance * 2,\n height: distance * 2,\n };\n for (const node of nodeLookup.values()) {\n if (getOverlappingArea(rect, nodeToRect(node)) > 0) {\n nodes.push(node);\n }\n }\n return nodes;\n}\n/*\n * this distance is used for the area around the user pointer\n * while doing a connection for finding the closest nodes\n */\nconst ADDITIONAL_DISTANCE = 250;\nfunction getClosestHandle(position, connectionRadius, nodeLookup, fromHandle) {\n let closestHandles = [];\n let minDistance = Infinity;\n const closeNodes = getNodesWithinDistance(position, nodeLookup, connectionRadius + ADDITIONAL_DISTANCE);\n for (const node of closeNodes) {\n const allHandles = [...(node.internals.handleBounds?.source ?? []), ...(node.internals.handleBounds?.target ?? [])];\n for (const handle of allHandles) {\n // if the handle is the same as the fromHandle we skip it\n if (fromHandle.nodeId === handle.nodeId && fromHandle.type === handle.type && fromHandle.id === handle.id) {\n continue;\n }\n // determine absolute position of the handle\n const { x, y } = getHandlePosition(node, handle, handle.position, true);\n const distance = Math.sqrt(Math.pow(x - position.x, 2) + Math.pow(y - position.y, 2));\n if (distance > connectionRadius) {\n continue;\n }\n if (distance < minDistance) {\n closestHandles = [{ ...handle, x, y }];\n minDistance = distance;\n }\n else if (distance === minDistance) {\n // when multiple handles are on the same distance we collect all of them\n closestHandles.push({ ...handle, x, y });\n }\n }\n }\n if (!closestHandles.length) {\n return null;\n }\n // when multiple handles overlay each other we prefer the opposite handle\n if (closestHandles.length > 1) {\n const oppositeHandleType = fromHandle.type === 'source' ? 'target' : 'source';\n return closestHandles.find((handle) => handle.type === oppositeHandleType) ?? closestHandles[0];\n }\n return closestHandles[0];\n}\nfunction getHandle(nodeId, handleType, handleId, nodeLookup, connectionMode, withAbsolutePosition = false) {\n const node = nodeLookup.get(nodeId);\n if (!node) {\n return null;\n }\n const handles = connectionMode === 'strict'\n ? node.internals.handleBounds?.[handleType]\n : [...(node.internals.handleBounds?.source ?? []), ...(node.internals.handleBounds?.target ?? [])];\n const handle = (handleId ? handles?.find((h) => h.id === handleId) : handles?.[0]) ?? null;\n return handle && withAbsolutePosition\n ? { ...handle, ...getHandlePosition(node, handle, handle.position, true) }\n : handle;\n}\nfunction getHandleType(edgeUpdaterType, handleDomNode) {\n if (edgeUpdaterType) {\n return edgeUpdaterType;\n }\n else if (handleDomNode?.classList.contains('target')) {\n return 'target';\n }\n else if (handleDomNode?.classList.contains('source')) {\n return 'source';\n }\n return null;\n}\nfunction isConnectionValid(isInsideConnectionRadius, isHandleValid) {\n let isValid = null;\n if (isHandleValid) {\n isValid = true;\n }\n else if (isInsideConnectionRadius && !isHandleValid) {\n isValid = false;\n }\n return isValid;\n}\n\nconst alwaysValid = () => true;\nfunction onPointerDown(event, { connectionMode, connectionRadius, handleId, nodeId, edgeUpdaterType, isTarget, domNode, nodeLookup, lib, autoPanOnConnect, flowId, panBy, cancelConnection, onConnectStart, onConnect, onConnectEnd, isValidConnection = alwaysValid, onReconnectEnd, updateConnection, getTransform, getFromHandle, autoPanSpeed, dragThreshold = 1, handleDomNode, }) {\n // when xyflow is used inside a shadow root we can't use document\n const doc = getHostForElement(event.target);\n let autoPanId = 0;\n let closestHandle;\n const { x, y } = getEventPosition(event);\n const handleType = getHandleType(edgeUpdaterType, handleDomNode);\n const containerBounds = domNode?.getBoundingClientRect();\n let connectionStarted = false;\n if (!containerBounds || !handleType) {\n return;\n }\n const fromHandleInternal = getHandle(nodeId, handleType, handleId, nodeLookup, connectionMode);\n if (!fromHandleInternal) {\n return;\n }\n let position = getEventPosition(event, containerBounds);\n let autoPanStarted = false;\n let connection = null;\n let isValid = false;\n let resultHandleDomNode = null;\n // when the user is moving the mouse close to the edge of the canvas while connecting we move the canvas\n function autoPan() {\n if (!autoPanOnConnect || !containerBounds) {\n return;\n }\n const [x, y] = calcAutoPan(position, containerBounds, autoPanSpeed);\n panBy({ x, y });\n autoPanId = requestAnimationFrame(autoPan);\n }\n // Stays the same for all consecutive pointermove events\n const fromHandle = {\n ...fromHandleInternal,\n nodeId,\n type: handleType,\n position: fromHandleInternal.position,\n };\n const fromInternalNode = nodeLookup.get(nodeId);\n const from = getHandlePosition(fromInternalNode, fromHandle, Position.Left, true);\n let previousConnection = {\n inProgress: true,\n isValid: null,\n from,\n fromHandle,\n fromPosition: fromHandle.position,\n fromNode: fromInternalNode,\n to: position,\n toHandle: null,\n toPosition: oppositePosition[fromHandle.position],\n toNode: null,\n pointer: position,\n };\n function startConnection() {\n connectionStarted = true;\n updateConnection(previousConnection);\n onConnectStart?.(event, { nodeId, handleId, handleType });\n }\n if (dragThreshold === 0) {\n startConnection();\n }\n function onPointerMove(event) {\n if (!connectionStarted) {\n const { x: evtX, y: evtY } = getEventPosition(event);\n const dx = evtX - x;\n const dy = evtY - y;\n const nextConnectionStarted = dx * dx + dy * dy > dragThreshold * dragThreshold;\n if (!nextConnectionStarted) {\n return;\n }\n startConnection();\n }\n if (!getFromHandle() || !fromHandle) {\n onPointerUp(event);\n return;\n }\n const transform = getTransform();\n position = getEventPosition(event, containerBounds);\n closestHandle = getClosestHandle(pointToRendererPoint(position, transform, false, [1, 1]), connectionRadius, nodeLookup, fromHandle);\n if (!autoPanStarted) {\n autoPan();\n autoPanStarted = true;\n }\n const result = isValidHandle(event, {\n handle: closestHandle,\n connectionMode,\n fromNodeId: nodeId,\n fromHandleId: handleId,\n fromType: isTarget ? 'target' : 'source',\n isValidConnection,\n doc,\n lib,\n flowId,\n nodeLookup,\n });\n resultHandleDomNode = result.handleDomNode;\n connection = result.connection;\n isValid = isConnectionValid(!!closestHandle, result.isValid);\n const fromInternalNode = nodeLookup.get(nodeId);\n const from = fromInternalNode\n ? getHandlePosition(fromInternalNode, fromHandle, Position.Left, true)\n : previousConnection.from;\n const newConnection = {\n ...previousConnection,\n from,\n isValid,\n to: result.toHandle && isValid\n ? rendererPointToPoint({ x: result.toHandle.x, y: result.toHandle.y }, transform)\n : position,\n toHandle: result.toHandle,\n toPosition: isValid && result.toHandle ? result.toHandle.position : oppositePosition[fromHandle.position],\n toNode: result.toHandle ? nodeLookup.get(result.toHandle.nodeId) : null,\n pointer: position,\n };\n updateConnection(newConnection);\n previousConnection = newConnection;\n }\n function onPointerUp(event) {\n // Prevent multi-touch aborting connection\n if ('touches' in event && event.touches.length > 0) {\n return;\n }\n if (connectionStarted) {\n if ((closestHandle || resultHandleDomNode) && connection && isValid) {\n onConnect?.(connection);\n }\n /*\n * it's important to get a fresh reference from the store here\n * in order to get the latest state of onConnectEnd\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { inProgress, ...connectionState } = previousConnection;\n const finalConnectionState = {\n ...connectionState,\n toPosition: previousConnection.toHandle ? previousConnection.toPosition : null,\n };\n onConnectEnd?.(event, finalConnectionState);\n if (edgeUpdaterType) {\n onReconnectEnd?.(event, finalConnectionState);\n }\n }\n cancelConnection();\n cancelAnimationFrame(autoPanId);\n autoPanStarted = false;\n isValid = false;\n connection = null;\n resultHandleDomNode = null;\n doc.removeEventListener('mousemove', onPointerMove);\n doc.removeEventListener('mouseup', onPointerUp);\n doc.removeEventListener('touchmove', onPointerMove);\n doc.removeEventListener('touchend', onPointerUp);\n }\n doc.addEventListener('mousemove', onPointerMove);\n doc.addEventListener('mouseup', onPointerUp);\n doc.addEventListener('touchmove', onPointerMove);\n doc.addEventListener('touchend', onPointerUp);\n}\n// checks if and returns connection in form of an object { source: 123, target: 312 }\nfunction isValidHandle(event, { handle, connectionMode, fromNodeId, fromHandleId, fromType, doc, lib, flowId, isValidConnection = alwaysValid, nodeLookup, }) {\n const isTarget = fromType === 'target';\n const handleDomNode = handle\n ? doc.querySelector(`.${lib}-flow__handle[data-id=\"${flowId}-${handle?.nodeId}-${handle?.id}-${handle?.type}\"]`)\n : null;\n const { x, y } = getEventPosition(event);\n const handleBelow = doc.elementFromPoint(x, y);\n /*\n * we always want to prioritize the handle below the mouse cursor over the closest distance handle,\n * because it could be that the center of another handle is closer to the mouse pointer than the handle below the cursor\n */\n const handleToCheck = handleBelow?.classList.contains(`${lib}-flow__handle`) ? handleBelow : handleDomNode;\n const result = {\n handleDomNode: handleToCheck,\n isValid: false,\n connection: null,\n toHandle: null,\n };\n if (handleToCheck) {\n const handleType = getHandleType(undefined, handleToCheck);\n const handleNodeId = handleToCheck.getAttribute('data-nodeid');\n const handleId = handleToCheck.getAttribute('data-handleid');\n const connectable = handleToCheck.classList.contains('connectable');\n const connectableEnd = handleToCheck.classList.contains('connectableend');\n if (!handleNodeId || !handleType) {\n return result;\n }\n const connection = {\n source: isTarget ? handleNodeId : fromNodeId,\n sourceHandle: isTarget ? handleId : fromHandleId,\n target: isTarget ? fromNodeId : handleNodeId,\n targetHandle: isTarget ? fromHandleId : handleId,\n };\n result.connection = connection;\n const isConnectable = connectable && connectableEnd;\n // in strict mode we don't allow target to target or source to source connections\n const isValid = isConnectable &&\n (connectionMode === ConnectionMode.Strict\n ? (isTarget && handleType === 'source') || (!isTarget && handleType === 'target')\n : handleNodeId !== fromNodeId || handleId !== fromHandleId);\n result.isValid = isValid && isValidConnection(connection);\n result.toHandle = getHandle(handleNodeId, handleType, handleId, nodeLookup, connectionMode, true);\n }\n return result;\n}\nconst XYHandle = {\n onPointerDown,\n isValid: isValidHandle,\n};\n\nfunction XYMinimap({ domNode, panZoom, getTransform, getViewScale }) {\n const selection = select(domNode);\n function update({ translateExtent, width, height, zoomStep = 1, pannable = true, zoomable = true, inversePan = false, }) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const zoomHandler = (event) => {\n if (event.sourceEvent.type !== 'wheel' || !panZoom) {\n return;\n }\n const transform = getTransform();\n const factor = event.sourceEvent.ctrlKey && isMacOs() ? 10 : 1;\n const pinchDelta = -event.sourceEvent.deltaY *\n (event.sourceEvent.deltaMode === 1 ? 0.05 : event.sourceEvent.deltaMode ? 1 : 0.002) *\n zoomStep;\n const nextZoom = transform[2] * Math.pow(2, pinchDelta * factor);\n panZoom.scaleTo(nextZoom);\n };\n let panStart = [0, 0];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const panStartHandler = (event) => {\n if (event.sourceEvent.type === 'mousedown' || event.sourceEvent.type === 'touchstart') {\n panStart = [\n event.sourceEvent.clientX ?? event.sourceEvent.touches[0].clientX,\n event.sourceEvent.clientY ?? event.sourceEvent.touches[0].clientY,\n ];\n }\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const panHandler = (event) => {\n const transform = getTransform();\n if ((event.sourceEvent.type !== 'mousemove' && event.sourceEvent.type !== 'touchmove') || !panZoom) {\n return;\n }\n const panCurrent = [\n event.sourceEvent.clientX ?? event.sourceEvent.touches[0].clientX,\n event.sourceEvent.clientY ?? event.sourceEvent.touches[0].clientY,\n ];\n const panDelta = [panCurrent[0] - panStart[0], panCurrent[1] - panStart[1]];\n panStart = panCurrent;\n const moveScale = getViewScale() * Math.max(transform[2], Math.log(transform[2])) * (inversePan ? -1 : 1);\n const position = {\n x: transform[0] - panDelta[0] * moveScale,\n y: transform[1] - panDelta[1] * moveScale,\n };\n const extent = [\n [0, 0],\n [width, height],\n ];\n panZoom.setViewportConstrained({\n x: position.x,\n y: position.y,\n zoom: transform[2],\n }, extent, translateExtent);\n };\n const zoomAndPanHandler = zoom()\n .on('start', panStartHandler)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .on('zoom', pannable ? panHandler : null)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .on('zoom.wheel', zoomable ? zoomHandler : null);\n selection.call(zoomAndPanHandler, {});\n }\n function destroy() {\n selection.on('zoom', null);\n }\n return {\n update,\n destroy,\n pointer,\n };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst transformToViewport = (transform) => ({\n x: transform.x,\n y: transform.y,\n zoom: transform.k,\n});\nconst viewportToTransform = ({ x, y, zoom }) => zoomIdentity.translate(x, y).scale(zoom);\nconst isWrappedWithClass = (event, className) => event.target.closest(`.${className}`);\nconst isRightClickPan = (panOnDrag, usedButton) => usedButton === 2 && Array.isArray(panOnDrag) && panOnDrag.includes(2);\n// taken from d3-ease: https://github.com/d3/d3-ease/blob/main/src/cubic.js\nconst defaultEase = (t) => ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\nconst getD3Transition = (selection, duration = 0, ease = defaultEase, onEnd = () => { }) => {\n const hasDuration = typeof duration === 'number' && duration > 0;\n if (!hasDuration) {\n onEnd();\n }\n return hasDuration ? selection.transition().duration(duration).ease(ease).on('end', onEnd) : selection;\n};\nconst wheelDelta = (event) => {\n const factor = event.ctrlKey && isMacOs() ? 10 : 1;\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * factor;\n};\n\nfunction createPanOnScrollHandler({ zoomPanValues, noWheelClassName, d3Selection, d3Zoom, panOnScrollMode, panOnScrollSpeed, zoomOnPinch, onPanZoomStart, onPanZoom, onPanZoomEnd, }) {\n return (event) => {\n if (isWrappedWithClass(event, noWheelClassName)) {\n if (event.ctrlKey) {\n event.preventDefault(); // stop native page zoom for pinch zooming\n }\n return false;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n const currentZoom = d3Selection.property('__zoom').k || 1;\n // macos sets ctrlKey=true for pinch gesture on a trackpad\n if (event.ctrlKey && zoomOnPinch) {\n const point = pointer(event);\n const pinchDelta = wheelDelta(event);\n const zoom = currentZoom * Math.pow(2, pinchDelta);\n // @ts-ignore\n d3Zoom.scaleTo(d3Selection, zoom, point, event);\n return;\n }\n /*\n * increase scroll speed in firefox\n * firefox: deltaMode === 1; chrome: deltaMode === 0\n */\n const deltaNormalize = event.deltaMode === 1 ? 20 : 1;\n let deltaX = panOnScrollMode === PanOnScrollMode.Vertical ? 0 : event.deltaX * deltaNormalize;\n let deltaY = panOnScrollMode === PanOnScrollMode.Horizontal ? 0 : event.deltaY * deltaNormalize;\n // this enables vertical scrolling with shift + scroll on windows\n if (!isMacOs() && event.shiftKey && panOnScrollMode !== PanOnScrollMode.Vertical) {\n deltaX = event.deltaY * deltaNormalize;\n deltaY = 0;\n }\n d3Zoom.translateBy(d3Selection, -(deltaX / currentZoom) * panOnScrollSpeed, -(deltaY / currentZoom) * panOnScrollSpeed, \n // @ts-ignore\n { internal: true });\n const nextViewport = transformToViewport(d3Selection.property('__zoom'));\n clearTimeout(zoomPanValues.panScrollTimeout);\n /*\n * for pan on scroll we need to handle the event calls on our own\n * we can't use the start, zoom and end events from d3-zoom\n * because start and move gets called on every scroll event and not once at the beginning\n */\n if (!zoomPanValues.isPanScrolling) {\n zoomPanValues.isPanScrolling = true;\n onPanZoomStart?.(event, nextViewport);\n }\n else {\n onPanZoom?.(event, nextViewport);\n zoomPanValues.panScrollTimeout = setTimeout(() => {\n onPanZoomEnd?.(event, nextViewport);\n zoomPanValues.isPanScrolling = false;\n }, 150);\n }\n };\n}\nfunction createZoomOnScrollHandler({ noWheelClassName, preventScrolling, d3ZoomHandler }) {\n return function (event, d) {\n const isWheel = event.type === 'wheel';\n // we still want to enable pinch zooming even if preventScrolling is set to false\n const preventZoom = !preventScrolling && isWheel && !event.ctrlKey;\n const hasNoWheelClass = isWrappedWithClass(event, noWheelClassName);\n // if user is pinch zooming above a nowheel element, we don't want the browser to zoom\n if (event.ctrlKey && isWheel && hasNoWheelClass) {\n event.preventDefault();\n }\n if (preventZoom || hasNoWheelClass) {\n return null;\n }\n event.preventDefault();\n d3ZoomHandler.call(this, event, d);\n };\n}\nfunction createPanZoomStartHandler({ zoomPanValues, onDraggingChange, onPanZoomStart }) {\n return (event) => {\n if (event.sourceEvent?.internal) {\n return;\n }\n const viewport = transformToViewport(event.transform);\n // we need to remember it here, because it's always 0 in the \"zoom\" event\n zoomPanValues.mouseButton = event.sourceEvent?.button || 0;\n zoomPanValues.isZoomingOrPanning = true;\n zoomPanValues.prevViewport = viewport;\n if (event.sourceEvent?.type === 'mousedown') {\n onDraggingChange(true);\n }\n if (onPanZoomStart) {\n onPanZoomStart?.(event.sourceEvent, viewport);\n }\n };\n}\nfunction createPanZoomHandler({ zoomPanValues, panOnDrag, onPaneContextMenu, onTransformChange, onPanZoom, }) {\n return (event) => {\n zoomPanValues.usedRightMouseButton = !!(onPaneContextMenu && isRightClickPan(panOnDrag, zoomPanValues.mouseButton ?? 0));\n if (!event.sourceEvent?.sync) {\n onTransformChange([event.transform.x, event.transform.y, event.transform.k]);\n }\n if (onPanZoom && !event.sourceEvent?.internal) {\n onPanZoom?.(event.sourceEvent, transformToViewport(event.transform));\n }\n };\n}\nfunction createPanZoomEndHandler({ zoomPanValues, panOnDrag, panOnScroll, onDraggingChange, onPanZoomEnd, onPaneContextMenu, }) {\n return (event) => {\n if (event.sourceEvent?.internal) {\n return;\n }\n zoomPanValues.isZoomingOrPanning = false;\n if (onPaneContextMenu &&\n isRightClickPan(panOnDrag, zoomPanValues.mouseButton ?? 0) &&\n !zoomPanValues.usedRightMouseButton &&\n event.sourceEvent) {\n onPaneContextMenu(event.sourceEvent);\n }\n zoomPanValues.usedRightMouseButton = false;\n onDraggingChange(false);\n if (onPanZoomEnd) {\n const viewport = transformToViewport(event.transform);\n zoomPanValues.prevViewport = viewport;\n clearTimeout(zoomPanValues.timerId);\n zoomPanValues.timerId = setTimeout(() => {\n onPanZoomEnd?.(event.sourceEvent, viewport);\n }, \n // we need a setTimeout for panOnScroll to suppress multiple end events fired during scroll\n panOnScroll ? 150 : 0);\n }\n };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction createFilter({ zoomActivationKeyPressed, zoomOnScroll, zoomOnPinch, panOnDrag, panOnScroll, zoomOnDoubleClick, userSelectionActive, noWheelClassName, noPanClassName, lib, connectionInProgress, }) {\n return (event) => {\n const zoomScroll = zoomActivationKeyPressed || zoomOnScroll;\n const pinchZoom = zoomOnPinch && event.ctrlKey;\n const isWheelEvent = event.type === 'wheel';\n if (event.button === 1 &&\n event.type === 'mousedown' &&\n (isWrappedWithClass(event, `${lib}-flow__node`) || isWrappedWithClass(event, `${lib}-flow__edge`))) {\n return true;\n }\n // if all interactions are disabled, we prevent all zoom events\n if (!panOnDrag && !zoomScroll && !panOnScroll && !zoomOnDoubleClick && !zoomOnPinch) {\n return false;\n }\n // during a selection we prevent all other interactions\n if (userSelectionActive) {\n return false;\n }\n // we want to disable pinch-zooming while making a connection\n if (connectionInProgress && !isWheelEvent) {\n return false;\n }\n // if the target element is inside an element with the nowheel class, we prevent zooming\n if (isWrappedWithClass(event, noWheelClassName) && isWheelEvent) {\n return false;\n }\n // if the target element is inside an element with the nopan class, we prevent panning\n if (isWrappedWithClass(event, noPanClassName) &&\n (!isWheelEvent || (panOnScroll && isWheelEvent && !zoomActivationKeyPressed))) {\n return false;\n }\n if (!zoomOnPinch && event.ctrlKey && isWheelEvent) {\n return false;\n }\n if (!zoomOnPinch && event.type === 'touchstart' && event.touches?.length > 1) {\n event.preventDefault(); // if you manage to start with 2 touches, we prevent native zoom\n return false;\n }\n // when there is no scroll handling enabled, we prevent all wheel events\n if (!zoomScroll && !panOnScroll && !pinchZoom && isWheelEvent) {\n return false;\n }\n // if the pane is not movable, we prevent dragging it with mousestart or touchstart\n if (!panOnDrag && (event.type === 'mousedown' || event.type === 'touchstart')) {\n return false;\n }\n // if the pane is only movable using allowed clicks\n if (Array.isArray(panOnDrag) && !panOnDrag.includes(event.button) && event.type === 'mousedown') {\n return false;\n }\n // We only allow right clicks if pan on drag is set to right click\n const buttonAllowed = (Array.isArray(panOnDrag) && panOnDrag.includes(event.button)) || !event.button || event.button <= 1;\n // default filter for d3-zoom\n return (!event.ctrlKey || isWheelEvent) && buttonAllowed;\n };\n}\n\nfunction XYPanZoom({ domNode, minZoom, maxZoom, translateExtent, viewport, onPanZoom, onPanZoomStart, onPanZoomEnd, onDraggingChange, }) {\n const zoomPanValues = {\n isZoomingOrPanning: false,\n usedRightMouseButton: false,\n prevViewport: { x: 0, y: 0, zoom: 0 },\n mouseButton: 0,\n timerId: undefined,\n panScrollTimeout: undefined,\n isPanScrolling: false,\n };\n const bbox = domNode.getBoundingClientRect();\n const d3ZoomInstance = zoom().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent);\n const d3Selection = select(domNode).call(d3ZoomInstance);\n setViewportConstrained({\n x: viewport.x,\n y: viewport.y,\n zoom: clamp(viewport.zoom, minZoom, maxZoom),\n }, [\n [0, 0],\n [bbox.width, bbox.height],\n ], translateExtent);\n const d3ZoomHandler = d3Selection.on('wheel.zoom');\n const d3DblClickZoomHandler = d3Selection.on('dblclick.zoom');\n d3ZoomInstance.wheelDelta(wheelDelta);\n function setTransform(transform, options) {\n if (d3Selection) {\n return new Promise((resolve) => {\n d3ZoomInstance?.interpolate(options?.interpolate === 'linear' ? interpolate : interpolateZoom).transform(getD3Transition(d3Selection, options?.duration, options?.ease, () => resolve(true)), transform);\n });\n }\n return Promise.resolve(false);\n }\n // public functions\n function update({ noWheelClassName, noPanClassName, onPaneContextMenu, userSelectionActive, panOnScroll, panOnDrag, panOnScrollMode, panOnScrollSpeed, preventScrolling, zoomOnPinch, zoomOnScroll, zoomOnDoubleClick, zoomActivationKeyPressed, lib, onTransformChange, connectionInProgress, paneClickDistance, selectionOnDrag, }) {\n if (userSelectionActive && !zoomPanValues.isZoomingOrPanning) {\n destroy();\n }\n const isPanOnScroll = panOnScroll && !zoomActivationKeyPressed && !userSelectionActive;\n d3ZoomInstance.clickDistance(selectionOnDrag ? Infinity : !isNumeric(paneClickDistance) || paneClickDistance < 0 ? 0 : paneClickDistance);\n const wheelHandler = isPanOnScroll\n ? createPanOnScrollHandler({\n zoomPanValues,\n noWheelClassName,\n d3Selection,\n d3Zoom: d3ZoomInstance,\n panOnScrollMode,\n panOnScrollSpeed,\n zoomOnPinch,\n onPanZoomStart,\n onPanZoom,\n onPanZoomEnd,\n })\n : createZoomOnScrollHandler({\n noWheelClassName,\n preventScrolling,\n d3ZoomHandler,\n });\n d3Selection.on('wheel.zoom', wheelHandler, { passive: false });\n if (!userSelectionActive) {\n // pan zoom start\n const startHandler = createPanZoomStartHandler({\n zoomPanValues,\n onDraggingChange,\n onPanZoomStart,\n });\n d3ZoomInstance.on('start', startHandler);\n // pan zoom\n const panZoomHandler = createPanZoomHandler({\n zoomPanValues,\n panOnDrag,\n onPaneContextMenu: !!onPaneContextMenu,\n onPanZoom,\n onTransformChange,\n });\n d3ZoomInstance.on('zoom', panZoomHandler);\n // pan zoom end\n const panZoomEndHandler = createPanZoomEndHandler({\n zoomPanValues,\n panOnDrag,\n panOnScroll,\n onPaneContextMenu,\n onPanZoomEnd,\n onDraggingChange,\n });\n d3ZoomInstance.on('end', panZoomEndHandler);\n }\n const filter = createFilter({\n zoomActivationKeyPressed,\n panOnDrag,\n zoomOnScroll,\n panOnScroll,\n zoomOnDoubleClick,\n zoomOnPinch,\n userSelectionActive,\n noPanClassName,\n noWheelClassName,\n lib,\n connectionInProgress,\n });\n d3ZoomInstance.filter(filter);\n /*\n * We cannot add zoomOnDoubleClick to the filter above because\n * double tapping on touch screens circumvents the filter and\n * dblclick.zoom is fired on the selection directly\n */\n if (zoomOnDoubleClick) {\n d3Selection.on('dblclick.zoom', d3DblClickZoomHandler);\n }\n else {\n d3Selection.on('dblclick.zoom', null);\n }\n }\n function destroy() {\n d3ZoomInstance.on('zoom', null);\n }\n async function setViewportConstrained(viewport, extent, translateExtent) {\n const nextTransform = viewportToTransform(viewport);\n const contrainedTransform = d3ZoomInstance?.constrain()(nextTransform, extent, translateExtent);\n if (contrainedTransform) {\n await setTransform(contrainedTransform);\n }\n return new Promise((resolve) => resolve(contrainedTransform));\n }\n async function setViewport(viewport, options) {\n const nextTransform = viewportToTransform(viewport);\n await setTransform(nextTransform, options);\n return new Promise((resolve) => resolve(nextTransform));\n }\n function syncViewport(viewport) {\n if (d3Selection) {\n const nextTransform = viewportToTransform(viewport);\n const currentTransform = d3Selection.property('__zoom');\n if (currentTransform.k !== viewport.zoom ||\n currentTransform.x !== viewport.x ||\n currentTransform.y !== viewport.y) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n d3ZoomInstance?.transform(d3Selection, nextTransform, null, { sync: true });\n }\n }\n }\n function getViewport() {\n const transform = d3Selection ? zoomTransform(d3Selection.node()) : { x: 0, y: 0, k: 1 };\n return { x: transform.x, y: transform.y, zoom: transform.k };\n }\n function scaleTo(zoom, options) {\n if (d3Selection) {\n return new Promise((resolve) => {\n d3ZoomInstance?.interpolate(options?.interpolate === 'linear' ? interpolate : interpolateZoom).scaleTo(getD3Transition(d3Selection, options?.duration, options?.ease, () => resolve(true)), zoom);\n });\n }\n return Promise.resolve(false);\n }\n function scaleBy(factor, options) {\n if (d3Selection) {\n return new Promise((resolve) => {\n d3ZoomInstance?.interpolate(options?.interpolate === 'linear' ? interpolate : interpolateZoom).scaleBy(getD3Transition(d3Selection, options?.duration, options?.ease, () => resolve(true)), factor);\n });\n }\n return Promise.resolve(false);\n }\n function setScaleExtent(scaleExtent) {\n d3ZoomInstance?.scaleExtent(scaleExtent);\n }\n function setTranslateExtent(translateExtent) {\n d3ZoomInstance?.translateExtent(translateExtent);\n }\n function setClickDistance(distance) {\n const validDistance = !isNumeric(distance) || distance < 0 ? 0 : distance;\n d3ZoomInstance?.clickDistance(validDistance);\n }\n return {\n update,\n destroy,\n setViewport,\n setViewportConstrained,\n getViewport,\n scaleTo,\n scaleBy,\n setScaleExtent,\n setTranslateExtent,\n syncViewport,\n setClickDistance,\n };\n}\n\n/**\n * Used to determine the variant of the resize control\n *\n * @public\n */\nvar ResizeControlVariant;\n(function (ResizeControlVariant) {\n ResizeControlVariant[\"Line\"] = \"line\";\n ResizeControlVariant[\"Handle\"] = \"handle\";\n})(ResizeControlVariant || (ResizeControlVariant = {}));\nconst XY_RESIZER_HANDLE_POSITIONS = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\nconst XY_RESIZER_LINE_POSITIONS = ['top', 'right', 'bottom', 'left'];\n\n/**\n * Get all connecting edges for a given set of nodes\n * @param width - new width of the node\n * @param prevWidth - previous width of the node\n * @param height - new height of the node\n * @param prevHeight - previous height of the node\n * @param affectsX - whether to invert the resize direction for the x axis\n * @param affectsY - whether to invert the resize direction for the y axis\n * @returns array of two numbers representing the direction of the resize for each axis, 0 = no change, 1 = increase, -1 = decrease\n */\nfunction getResizeDirection({ width, prevWidth, height, prevHeight, affectsX, affectsY, }) {\n const deltaWidth = width - prevWidth;\n const deltaHeight = height - prevHeight;\n const direction = [deltaWidth > 0 ? 1 : deltaWidth < 0 ? -1 : 0, deltaHeight > 0 ? 1 : deltaHeight < 0 ? -1 : 0];\n if (deltaWidth && affectsX) {\n direction[0] = direction[0] * -1;\n }\n if (deltaHeight && affectsY) {\n direction[1] = direction[1] * -1;\n }\n return direction;\n}\n/**\n * Parses the control position that is being dragged to dimensions that are being resized\n * @param controlPosition - position of the control that is being dragged\n * @returns isHorizontal, isVertical, affectsX, affectsY,\n */\nfunction getControlDirection(controlPosition) {\n const isHorizontal = controlPosition.includes('right') || controlPosition.includes('left');\n const isVertical = controlPosition.includes('bottom') || controlPosition.includes('top');\n const affectsX = controlPosition.includes('left');\n const affectsY = controlPosition.includes('top');\n return {\n isHorizontal,\n isVertical,\n affectsX,\n affectsY,\n };\n}\nfunction getLowerExtentClamp(lowerExtent, lowerBound) {\n return Math.max(0, lowerBound - lowerExtent);\n}\nfunction getUpperExtentClamp(upperExtent, upperBound) {\n return Math.max(0, upperExtent - upperBound);\n}\nfunction getSizeClamp(size, minSize, maxSize) {\n return Math.max(0, minSize - size, size - maxSize);\n}\nfunction xor(a, b) {\n return a ? !b : b;\n}\n/**\n * Calculates new width & height and x & y of node after resize based on pointer position\n * @description - Buckle up, this is a chunky one... If you want to determine the new dimensions of a node after a resize,\n * you have to account for all possible restrictions: min/max width/height of the node, the maximum extent the node is allowed\n * to move in (in this case: resize into) determined by the parent node, the minimal extent determined by child nodes\n * with expandParent or extent: 'parent' set and oh yeah, these things also have to work with keepAspectRatio!\n * The way this is done is by determining how much each of these restricting actually restricts the resize and then applying the\n * strongest restriction. Because the resize affects x, y and width, height and width, height of a opposing side with keepAspectRatio,\n * the resize amount is always kept in distX & distY amount (the distance in mouse movement)\n * Instead of clamping each value, we first calculate the biggest 'clamp' (for the lack of a better name) and then apply it to all values.\n * To complicate things nodeOrigin has to be taken into account as well. This is done by offsetting the nodes as if their origin is [0, 0],\n * then calculating the restrictions as usual\n * @param startValues - starting values of resize\n * @param controlDirection - dimensions affected by the resize\n * @param pointerPosition - the current pointer position corrected for snapping\n * @param boundaries - minimum and maximum dimensions of the node\n * @param keepAspectRatio - prevent changes of asprect ratio\n * @returns x, y, width and height of the node after resize\n */\nfunction getDimensionsAfterResize(startValues, controlDirection, pointerPosition, boundaries, keepAspectRatio, nodeOrigin, extent, childExtent) {\n let { affectsX, affectsY } = controlDirection;\n const { isHorizontal, isVertical } = controlDirection;\n const isDiagonal = isHorizontal && isVertical;\n const { xSnapped, ySnapped } = pointerPosition;\n const { minWidth, maxWidth, minHeight, maxHeight } = boundaries;\n const { x: startX, y: startY, width: startWidth, height: startHeight, aspectRatio } = startValues;\n let distX = Math.floor(isHorizontal ? xSnapped - startValues.pointerX : 0);\n let distY = Math.floor(isVertical ? ySnapped - startValues.pointerY : 0);\n const newWidth = startWidth + (affectsX ? -distX : distX);\n const newHeight = startHeight + (affectsY ? -distY : distY);\n const originOffsetX = -nodeOrigin[0] * startWidth;\n const originOffsetY = -nodeOrigin[1] * startHeight;\n // Check if maxWidth, minWWidth, maxHeight, minHeight are restricting the resize\n let clampX = getSizeClamp(newWidth, minWidth, maxWidth);\n let clampY = getSizeClamp(newHeight, minHeight, maxHeight);\n // Check if extent is restricting the resize\n if (extent) {\n let xExtentClamp = 0;\n let yExtentClamp = 0;\n if (affectsX && distX < 0) {\n xExtentClamp = getLowerExtentClamp(startX + distX + originOffsetX, extent[0][0]);\n }\n else if (!affectsX && distX > 0) {\n xExtentClamp = getUpperExtentClamp(startX + newWidth + originOffsetX, extent[1][0]);\n }\n if (affectsY && distY < 0) {\n yExtentClamp = getLowerExtentClamp(startY + distY + originOffsetY, extent[0][1]);\n }\n else if (!affectsY && distY > 0) {\n yExtentClamp = getUpperExtentClamp(startY + newHeight + originOffsetY, extent[1][1]);\n }\n clampX = Math.max(clampX, xExtentClamp);\n clampY = Math.max(clampY, yExtentClamp);\n }\n // Check if the child extent is restricting the resize\n if (childExtent) {\n let xExtentClamp = 0;\n let yExtentClamp = 0;\n if (affectsX && distX > 0) {\n xExtentClamp = getUpperExtentClamp(startX + distX, childExtent[0][0]);\n }\n else if (!affectsX && distX < 0) {\n xExtentClamp = getLowerExtentClamp(startX + newWidth, childExtent[1][0]);\n }\n if (affectsY && distY > 0) {\n yExtentClamp = getUpperExtentClamp(startY + distY, childExtent[0][1]);\n }\n else if (!affectsY && distY < 0) {\n yExtentClamp = getLowerExtentClamp(startY + newHeight, childExtent[1][1]);\n }\n clampX = Math.max(clampX, xExtentClamp);\n clampY = Math.max(clampY, yExtentClamp);\n }\n // Check if the aspect ratio resizing of the other side is restricting the resize\n if (keepAspectRatio) {\n if (isHorizontal) {\n // Check if the max dimensions might be restricting the resize\n const aspectHeightClamp = getSizeClamp(newWidth / aspectRatio, minHeight, maxHeight) * aspectRatio;\n clampX = Math.max(clampX, aspectHeightClamp);\n // Check if the extent is restricting the resize\n if (extent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsX && !affectsY && isDiagonal)) {\n aspectExtentClamp =\n getUpperExtentClamp(startY + originOffsetY + newWidth / aspectRatio, extent[1][1]) * aspectRatio;\n }\n else {\n aspectExtentClamp =\n getLowerExtentClamp(startY + originOffsetY + (affectsX ? distX : -distX) / aspectRatio, extent[0][1]) *\n aspectRatio;\n }\n clampX = Math.max(clampX, aspectExtentClamp);\n }\n // Check if the child extent is restricting the resize\n if (childExtent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsX && !affectsY && isDiagonal)) {\n aspectExtentClamp = getLowerExtentClamp(startY + newWidth / aspectRatio, childExtent[1][1]) * aspectRatio;\n }\n else {\n aspectExtentClamp =\n getUpperExtentClamp(startY + (affectsX ? distX : -distX) / aspectRatio, childExtent[0][1]) * aspectRatio;\n }\n clampX = Math.max(clampX, aspectExtentClamp);\n }\n }\n // Do the same thing for vertical resizing\n if (isVertical) {\n const aspectWidthClamp = getSizeClamp(newHeight * aspectRatio, minWidth, maxWidth) / aspectRatio;\n clampY = Math.max(clampY, aspectWidthClamp);\n if (extent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsY && !affectsX && isDiagonal)) {\n aspectExtentClamp =\n getUpperExtentClamp(startX + newHeight * aspectRatio + originOffsetX, extent[1][0]) / aspectRatio;\n }\n else {\n aspectExtentClamp =\n getLowerExtentClamp(startX + (affectsY ? distY : -distY) * aspectRatio + originOffsetX, extent[0][0]) /\n aspectRatio;\n }\n clampY = Math.max(clampY, aspectExtentClamp);\n }\n if (childExtent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsY && !affectsX && isDiagonal)) {\n aspectExtentClamp = getLowerExtentClamp(startX + newHeight * aspectRatio, childExtent[1][0]) / aspectRatio;\n }\n else {\n aspectExtentClamp =\n getUpperExtentClamp(startX + (affectsY ? distY : -distY) * aspectRatio, childExtent[0][0]) / aspectRatio;\n }\n clampY = Math.max(clampY, aspectExtentClamp);\n }\n }\n }\n distY = distY + (distY < 0 ? clampY : -clampY);\n distX = distX + (distX < 0 ? clampX : -clampX);\n if (keepAspectRatio) {\n if (isDiagonal) {\n if (newWidth > newHeight * aspectRatio) {\n distY = (xor(affectsX, affectsY) ? -distX : distX) / aspectRatio;\n }\n else {\n distX = (xor(affectsX, affectsY) ? -distY : distY) * aspectRatio;\n }\n }\n else {\n if (isHorizontal) {\n distY = distX / aspectRatio;\n affectsY = affectsX;\n }\n else {\n distX = distY * aspectRatio;\n affectsX = affectsY;\n }\n }\n }\n const x = affectsX ? startX + distX : startX;\n const y = affectsY ? startY + distY : startY;\n return {\n width: startWidth + (affectsX ? -distX : distX),\n height: startHeight + (affectsY ? -distY : distY),\n x: nodeOrigin[0] * distX * (!affectsX ? 1 : -1) + x,\n y: nodeOrigin[1] * distY * (!affectsY ? 1 : -1) + y,\n };\n}\n\nconst initPrevValues = { width: 0, height: 0, x: 0, y: 0 };\nconst initStartValues = {\n ...initPrevValues,\n pointerX: 0,\n pointerY: 0,\n aspectRatio: 1,\n};\nfunction nodeToParentExtent(node) {\n return [\n [0, 0],\n [node.measured.width, node.measured.height],\n ];\n}\nfunction nodeToChildExtent(child, parent, nodeOrigin) {\n const x = parent.position.x + child.position.x;\n const y = parent.position.y + child.position.y;\n const width = child.measured.width ?? 0;\n const height = child.measured.height ?? 0;\n const originOffsetX = nodeOrigin[0] * width;\n const originOffsetY = nodeOrigin[1] * height;\n return [\n [x - originOffsetX, y - originOffsetY],\n [x + width - originOffsetX, y + height - originOffsetY],\n ];\n}\nfunction XYResizer({ domNode, nodeId, getStoreItems, onChange, onEnd }) {\n const selection = select(domNode);\n let params = {\n controlDirection: getControlDirection('bottom-right'),\n boundaries: {\n minWidth: 0,\n minHeight: 0,\n maxWidth: Number.MAX_VALUE,\n maxHeight: Number.MAX_VALUE,\n },\n resizeDirection: undefined,\n keepAspectRatio: false,\n };\n function update({ controlPosition, boundaries, keepAspectRatio, resizeDirection, onResizeStart, onResize, onResizeEnd, shouldResize, }) {\n let prevValues = { ...initPrevValues };\n let startValues = { ...initStartValues };\n params = {\n boundaries,\n resizeDirection,\n keepAspectRatio,\n controlDirection: getControlDirection(controlPosition),\n };\n let node = undefined;\n let containerBounds = null;\n let childNodes = [];\n let parentNode = undefined; // Needed to fix expandParent\n let parentExtent = undefined;\n let childExtent = undefined;\n // we only want to trigger onResizeEnd if onResize was actually called\n let resizeDetected = false;\n const dragHandler = drag()\n .on('start', (event) => {\n const { nodeLookup, transform, snapGrid, snapToGrid, nodeOrigin, paneDomNode } = getStoreItems();\n node = nodeLookup.get(nodeId);\n if (!node) {\n return;\n }\n containerBounds = paneDomNode?.getBoundingClientRect() ?? null;\n const { xSnapped, ySnapped } = getPointerPosition(event.sourceEvent, {\n transform,\n snapGrid,\n snapToGrid,\n containerBounds,\n });\n prevValues = {\n width: node.measured.width ?? 0,\n height: node.measured.height ?? 0,\n x: node.position.x ?? 0,\n y: node.position.y ?? 0,\n };\n startValues = {\n ...prevValues,\n pointerX: xSnapped,\n pointerY: ySnapped,\n aspectRatio: prevValues.width / prevValues.height,\n };\n parentNode = undefined;\n if (node.parentId && (node.extent === 'parent' || node.expandParent)) {\n parentNode = nodeLookup.get(node.parentId);\n parentExtent = parentNode && node.extent === 'parent' ? nodeToParentExtent(parentNode) : undefined;\n }\n /*\n * Collect all child nodes to correct their relative positions when top/left changes\n * Determine largest minimal extent the parent node is allowed to resize to\n */\n childNodes = [];\n childExtent = undefined;\n for (const [childId, child] of nodeLookup) {\n if (child.parentId === nodeId) {\n childNodes.push({\n id: childId,\n position: { ...child.position },\n extent: child.extent,\n });\n if (child.extent === 'parent' || child.expandParent) {\n const extent = nodeToChildExtent(child, node, child.origin ?? nodeOrigin);\n if (childExtent) {\n childExtent = [\n [Math.min(extent[0][0], childExtent[0][0]), Math.min(extent[0][1], childExtent[0][1])],\n [Math.max(extent[1][0], childExtent[1][0]), Math.max(extent[1][1], childExtent[1][1])],\n ];\n }\n else {\n childExtent = extent;\n }\n }\n }\n }\n onResizeStart?.(event, { ...prevValues });\n })\n .on('drag', (event) => {\n const { transform, snapGrid, snapToGrid, nodeOrigin: storeNodeOrigin } = getStoreItems();\n const pointerPosition = getPointerPosition(event.sourceEvent, {\n transform,\n snapGrid,\n snapToGrid,\n containerBounds,\n });\n const childChanges = [];\n if (!node) {\n return;\n }\n const { x: prevX, y: prevY, width: prevWidth, height: prevHeight } = prevValues;\n const change = {};\n const nodeOrigin = node.origin ?? storeNodeOrigin;\n const { width, height, x, y } = getDimensionsAfterResize(startValues, params.controlDirection, pointerPosition, params.boundaries, params.keepAspectRatio, nodeOrigin, parentExtent, childExtent);\n const isWidthChange = width !== prevWidth;\n const isHeightChange = height !== prevHeight;\n const isXPosChange = x !== prevX && isWidthChange;\n const isYPosChange = y !== prevY && isHeightChange;\n if (!isXPosChange && !isYPosChange && !isWidthChange && !isHeightChange) {\n return;\n }\n if (isXPosChange || isYPosChange || nodeOrigin[0] === 1 || nodeOrigin[1] === 1) {\n change.x = isXPosChange ? x : prevValues.x;\n change.y = isYPosChange ? y : prevValues.y;\n prevValues.x = change.x;\n prevValues.y = change.y;\n /*\n * when top/left changes, correct the relative positions of child nodes\n * so that they stay in the same position\n */\n if (childNodes.length > 0) {\n const xChange = x - prevX;\n const yChange = y - prevY;\n for (const childNode of childNodes) {\n childNode.position = {\n x: childNode.position.x - xChange + nodeOrigin[0] * (width - prevWidth),\n y: childNode.position.y - yChange + nodeOrigin[1] * (height - prevHeight),\n };\n childChanges.push(childNode);\n }\n }\n }\n if (isWidthChange || isHeightChange) {\n change.width =\n isWidthChange && (!params.resizeDirection || params.resizeDirection === 'horizontal')\n ? width\n : prevValues.width;\n change.height =\n isHeightChange && (!params.resizeDirection || params.resizeDirection === 'vertical')\n ? height\n : prevValues.height;\n prevValues.width = change.width;\n prevValues.height = change.height;\n }\n // Fix expandParent when resizing from top/left\n if (parentNode && node.expandParent) {\n const xLimit = nodeOrigin[0] * (change.width ?? 0);\n if (change.x && change.x < xLimit) {\n prevValues.x = xLimit;\n startValues.x = startValues.x - (change.x - xLimit);\n }\n const yLimit = nodeOrigin[1] * (change.height ?? 0);\n if (change.y && change.y < yLimit) {\n prevValues.y = yLimit;\n startValues.y = startValues.y - (change.y - yLimit);\n }\n }\n const direction = getResizeDirection({\n width: prevValues.width,\n prevWidth,\n height: prevValues.height,\n prevHeight,\n affectsX: params.controlDirection.affectsX,\n affectsY: params.controlDirection.affectsY,\n });\n const nextValues = { ...prevValues, direction };\n const callResize = shouldResize?.(event, nextValues);\n if (callResize === false) {\n return;\n }\n resizeDetected = true;\n onResize?.(event, nextValues);\n onChange(change, childChanges);\n })\n .on('end', (event) => {\n if (!resizeDetected) {\n return;\n }\n onResizeEnd?.(event, { ...prevValues });\n onEnd?.({ ...prevValues });\n resizeDetected = false;\n });\n selection.call(dragHandler);\n }\n function destroy() {\n selection.on('.drag', null);\n }\n return {\n update,\n destroy,\n };\n}\n\nexport { ConnectionLineType, ConnectionMode, MarkerType, PanOnScrollMode, Position, ResizeControlVariant, SelectionMode, XYDrag, XYHandle, XYMinimap, XYPanZoom, XYResizer, XY_RESIZER_HANDLE_POSITIONS, XY_RESIZER_LINE_POSITIONS, addEdge, adoptUserNodes, areConnectionMapsEqual, areSetsEqual, boxToRect, calcAutoPan, calculateNodePosition, clamp, clampPosition, clampPositionToParent, createMarkerIds, defaultAriaLabelConfig, devWarn, elementSelectionKeys, errorMessages, evaluateAbsolutePosition, fitViewport, getBezierEdgeCenter, getBezierPath, getBoundsOfBoxes, getBoundsOfRects, getConnectedEdges, getConnectionStatus, getDimensions, getEdgeCenter, getEdgeId, getEdgePosition, getEdgeToolbarTransform, getElementsToRemove, getElevatedEdgeZIndex, getEventPosition, getHandleBounds, getHandlePosition, getHostForElement, getIncomers, getInternalNodesBounds, getMarkerId, getNodeDimensions, getNodePositionWithOrigin, getNodeToolbarTransform, getNodesBounds, getNodesInside, getOutgoers, getOverlappingArea, getPointerPosition, getSmoothStepPath, getStraightPath, getViewportForBounds, handleConnectionChange, handleExpandParent, infiniteExtent, initialConnection, isCoordinateExtent, isEdgeBase, isEdgeVisible, isInputDOMNode, isInternalNodeBase, isMacOs, isManualZIndexMode, isMouseEvent, isNodeBase, isNumeric, isRectObject, mergeAriaLabelConfig, nodeHasDimensions, nodeToBox, nodeToRect, oppositePosition, panBy, pointToRendererPoint, reconnectEdge, rectToBox, rendererPointToPoint, shallowNodeData, snapPosition, updateAbsolutePositions, updateConnectionLookup, updateNodeInternals, withResolvers };\n",
114
+ "import type { CoordinateExtent } from '@xyflow/system'\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg'\n\nexport const INFINITE_EXTENT: CoordinateExtent = [\n [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],\n [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],\n]\n",
115
+ "import { createContext } from '@barefootjs/client'\nimport type { FlowStore } from './types'\n\n/**\n * Context for sharing the flow store across child components.\n * Provided by initFlow, consumed by child init functions (e.g., handles, custom nodes).\n */\nexport const FlowContext = createContext<FlowStore>()\n",
116
+ "import { useContext } from '@barefootjs/client/runtime'\nimport { createMemo, untrack } from '@barefootjs/client/runtime'\nimport { pointToRendererPoint } from '@xyflow/system'\nimport { FlowContext } from './context'\nimport type { FlowStore, Viewport, NodeBase, EdgeBase, XYPosition } from './types'\nimport type { Signal, Memo } from '@barefootjs/client/runtime'\n\n/**\n * Access the flow store from any child component.\n * Must be called within a component rendered inside a Flow.\n */\nexport function useFlow<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(): FlowStore<NodeType, EdgeType> {\n return useContext(FlowContext) as unknown as FlowStore<NodeType, EdgeType>\n}\n\n/**\n * Access the current viewport (reactive getter).\n */\nexport function useViewport(): Signal<Viewport>[0] {\n return useFlow().viewport\n}\n\n/**\n * Access the nodes array (reactive getter).\n */\nexport function useNodes<NodeType extends NodeBase = NodeBase>(): Signal<NodeType[]>[0] {\n return useFlow<NodeType>().nodes\n}\n\n/**\n * Access the edges array (reactive getter).\n */\nexport function useEdges<EdgeType extends EdgeBase = EdgeBase>(): Signal<EdgeType[]>[0] {\n return useFlow<NodeBase, EdgeType>().edges\n}\n\n/**\n * Access whether nodes have been initialized (all measured).\n */\nexport function useNodesInitialized(): Memo<boolean> {\n return useFlow().nodesInitialized\n}\n\n/**\n * Select derived state from the flow store.\n * Similar to React Flow's useStore(selector).\n */\nexport function useStore<T>(selector: (store: FlowStore) => T): Memo<T> {\n const store = useFlow()\n return createMemo(() => selector(store))\n}\n\n/**\n * Convert a screen position to flow coordinates.\n * Accounts for viewport transform (pan/zoom) and container offset.\n */\nexport function screenToFlowPosition(position: XYPosition): XYPosition {\n const store = useFlow()\n const domNode = untrack(store.domNode)\n if (!domNode) return position\n\n const rect = domNode.getBoundingClientRect()\n const transform = store.getTransform()\n\n return pointToRendererPoint(\n { x: position.x - rect.left, y: position.y - rect.top },\n transform,\n )\n}\n",
117
+ "// Pure path-geometry helpers shared between the imperative edge renderer\n// (edge-renderer.ts) and the JSX-native simple-edge component (simple-edge.tsx).\n// Extracted in #1081 step 2 so the JSX path computes geometry the same way\n// the imperative path does, avoiding subtle divergence during the migration.\n\nimport {\n getBezierPath,\n getSmoothStepPath,\n getStraightPath,\n getEdgePosition,\n ConnectionMode,\n Position,\n} from '@xyflow/system'\nimport type { EdgeBase, EdgePosition, InternalNodeBase } from '@xyflow/system'\n\nexport type EdgePathTuple = [string, number, number, number, number]\n\n/**\n * Compute endpoint positions for an edge, falling back to a node-center\n * straight line when no handle bounds are available yet (e.g. before the\n * first measure has populated `nodeLookup`).\n */\nexport function computeEdgePosition(\n edge: EdgeBase,\n sourceNode: InternalNodeBase,\n targetNode: InternalNodeBase,\n): EdgePosition | null {\n const hasHandleIds = !!(edge.sourceHandle || edge.targetHandle)\n const edgePos = getEdgePosition({\n id: edge.id,\n sourceNode,\n sourceHandle: edge.sourceHandle ?? null,\n targetNode,\n targetHandle: edge.targetHandle ?? null,\n connectionMode: hasHandleIds ? ConnectionMode.Strict : ConnectionMode.Loose,\n })\n\n if (edgePos) return edgePos\n\n const sw = sourceNode.measured.width ?? 150\n const sh = sourceNode.measured.height ?? 40\n const tw = targetNode.measured.width ?? 150\n const sourcePos = sourceNode.internals.positionAbsolute\n const targetPos = targetNode.internals.positionAbsolute\n\n return {\n sourceX: sourcePos.x + sw / 2,\n sourceY: sourcePos.y + sh,\n targetX: targetPos.x + tw / 2,\n targetY: targetPos.y,\n sourcePosition: Position.Bottom,\n targetPosition: Position.Top,\n }\n}\n\n/**\n * Calculate edge path based on edge type. Returns\n * `[d, labelX, labelY, offsetX, offsetY]` or `null`.\n */\nexport function getEdgePath(\n edge: EdgeBase,\n pos: EdgePosition,\n): EdgePathTuple | null {\n const params = {\n sourceX: pos.sourceX,\n sourceY: pos.sourceY,\n sourcePosition: pos.sourcePosition,\n targetX: pos.targetX,\n targetY: pos.targetY,\n targetPosition: pos.targetPosition,\n }\n\n const edgeType = edge.type ?? 'default'\n\n switch (edgeType) {\n case 'straight':\n return getStraightPath(params) as EdgePathTuple\n case 'smoothstep':\n case 'step':\n return getSmoothStepPath({\n ...params,\n borderRadius: edgeType === 'step' ? 0 : undefined,\n }) as EdgePathTuple\n case 'default':\n case 'bezier':\n default:\n return getBezierPath(params)\n }\n}\n",
118
+ "// Flow imperative subsystems extracted from `flow.ts` (#1081 cutover step C4).\n//\n// Pointer-paced subsystems that the JSX-native `<Flow>` component\n// attaches via a `ref` callback. JSX gives these no leverage — pan/zoom\n// is owned by `XYPanZoom` (D3-zoom-derived), `setupKeyboardHandlers`\n// listens at document level, the selection rectangle owns global\n// pointer capture, and pane-click detection needs a `mousedown`/\n// `mouseup` pair to bypass D3's event suppression.\n//\n// Calling shape:\n//\n// <div ref={(el) => attachFlowSubsystems(el, store, props)} class=\"bf-flow\">\n// ...\n// </div>\n//\n// `injectDefaultStyles` runs idempotently on first call, so multiple\n// `<Flow>` instances on the same page share one `<style id=\"bf-flow-styles\">`.\n\nimport { createEffect, onCleanup, untrack } from '@barefootjs/client'\nimport { PanOnScrollMode, XYPanZoom } from '@xyflow/system'\nimport type { InternalNodeBase, NodeLookup, Transform, Viewport, XYPosition } from '@xyflow/system'\nimport { INFINITE_EXTENT } from './constants'\nimport { computeEdgePosition, getEdgePath } from './edge-path'\nimport { setupKeyboardHandlers, setupSelectionRectangle } from './selection'\nimport type { FlowProps, InternalFlowStore, NodeBase, EdgeBase } from './types'\n\n/**\n * Clamp a child node's drag position so the node's rect stays inside\n * its parent's rect — implements xyflow's `extent: 'parent'` contract\n * for the pointer-paced single-node drag handler.\n *\n * Operates on the **relative** coordinate the parent-relative model\n * stores in `userNode.position`: the constraint per axis is\n * `0 ≤ pos ≤ parentSize − childSize`. Returns the input unchanged when\n * the node has no `parentId`, isn't `extent: 'parent'`, the parent is\n * missing, or either node is unmeasured.\n *\n * Exposed (non-default-export) so the same primitive can be reused if\n * the C4 XYDrag integration replaces the inline drag handler — the\n * extent contract remains the same.\n */\nexport function clampDragPositionToParent(\n position: XYPosition,\n nodeId: string,\n lookup: NodeLookup<InternalNodeBase<NodeBase>>,\n): XYPosition {\n const internal = lookup.get(nodeId)\n if (!internal) return position\n const userNode = internal.internals.userNode as NodeBase & {\n parentId?: string\n extent?: 'parent' | unknown\n }\n if (!userNode.parentId || userNode.extent !== 'parent') return position\n const parent = lookup.get(userNode.parentId)\n if (!parent) return position\n const myW = internal.measured?.width\n const myH = internal.measured?.height\n const pw = parent.measured?.width\n const ph = parent.measured?.height\n if (myW == null || myH == null || pw == null || ph == null) return position\n const maxX = Math.max(0, pw - myW)\n const maxY = Math.max(0, ph - myH)\n return {\n x: Math.min(Math.max(position.x, 0), maxX),\n y: Math.min(Math.max(position.y, 0), maxY),\n }\n}\n\n/**\n * Attach all pointer-paced + ResizeObserver-based subsystems to the\n * outer `<div class=\"bf-flow\">` rendered by the JSX `<Flow>` component.\n *\n * Inside a reactive root (`createRoot`), this also registers\n * `onCleanup` callbacks for the panZoom destroy / ResizeObserver\n * disconnect / keyboard listener removal lifecycle.\n */\nexport function attachFlowSubsystems<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(\n el: HTMLElement,\n store: InternalFlowStore<NodeType, EdgeType>,\n props: FlowProps<NodeType, EdgeType>,\n): void {\n injectDefaultStyles()\n\n el.style.position = 'relative'\n el.style.overflow = 'hidden'\n\n store.setDomNode(el)\n // Expose the store on the host `<div class=\"bf-flow\">` element so\n // descendants that miss `FlowContext` — e.g. children passed through\n // `<Flow renderNode={Fn}>` whose returned JSX is hydrated as a\n // top-level scope outside of Flow's `FlowContext.Provider` — can\n // still locate the store via `el.closest('.bf-flow').__bfFlowStore`.\n // Always-set, even on hot remount, so callers can rely on a single\n // canonical reference.\n ;(el as HTMLElement & { __bfFlowStore?: typeof store }).__bfFlowStore = store\n store.setWidth(el.offsetWidth)\n store.setHeight(el.offsetHeight)\n\n const resizeObserver = new ResizeObserver(() => {\n store.setWidth(el.offsetWidth)\n store.setHeight(el.offsetHeight)\n })\n resizeObserver.observe(el)\n onCleanup(() => resizeObserver.disconnect())\n\n const panZoomInstance = XYPanZoom({\n domNode: el,\n minZoom: store.minZoom,\n maxZoom: store.maxZoom,\n viewport: untrack(store.viewport),\n translateExtent: INFINITE_EXTENT,\n onDraggingChange: (isDragging: boolean) => {\n store.setDragging(isDragging)\n },\n onPanZoom: (_event: MouseEvent | TouchEvent | null, vp: Viewport) => {\n store.setViewport(vp)\n },\n onPanZoomStart: undefined,\n onPanZoomEnd: (_event: MouseEvent | TouchEvent | null, vp: Viewport) => {\n if (store.onMoveEnd) {\n store.onMoveEnd(_event, vp)\n }\n },\n })\n\n store.setPanZoom(panZoomInstance)\n\n const baseUpdate = (zoomActivationKeyPressed: boolean) => ({\n noWheelClassName: 'nowheel',\n noPanClassName: 'nopan',\n preventScrolling: true,\n panOnScroll: props.panOnScroll ?? false,\n panOnDrag: props.panOnDrag ?? true,\n panOnScrollMode: PanOnScrollMode.Free,\n panOnScrollSpeed: 0.5,\n userSelectionActive: false,\n zoomOnPinch: true,\n zoomOnScroll: props.zoomOnScroll ?? true,\n zoomOnDoubleClick: props.zoomOnDoubleClick ?? true,\n zoomActivationKeyPressed,\n lib: 'bf' as const,\n onTransformChange: (transform: Transform) => {\n store.setViewport({ x: transform[0], y: transform[1], zoom: transform[2] })\n },\n connectionInProgress: false,\n paneClickDistance: 0,\n })\n\n panZoomInstance.update(baseUpdate(false))\n\n onCleanup(() => panZoomInstance.destroy())\n\n // Zoom activation key — held to convert scroll-pan into scroll-zoom.\n const zoomKeyCode = (props as { zoomActivationKeyCode?: string | null }).zoomActivationKeyCode\n if (zoomKeyCode) {\n let zoomKeyPressed = false\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === zoomKeyCode && !zoomKeyPressed) {\n zoomKeyPressed = true\n panZoomInstance.update(baseUpdate(true))\n }\n }\n const onKeyUp = (e: KeyboardEvent) => {\n if (e.key === zoomKeyCode && zoomKeyPressed) {\n zoomKeyPressed = false\n panZoomInstance.update(baseUpdate(false))\n }\n }\n document.addEventListener('keydown', onKeyDown)\n document.addEventListener('keyup', onKeyUp)\n onCleanup(() => {\n document.removeEventListener('keydown', onKeyDown)\n document.removeEventListener('keyup', onKeyUp)\n })\n }\n\n // Viewport transform sync — the JSX `<Flow>` component already binds\n // its `.bf-flow__viewport` transform reactively from `store.viewport()`,\n // so no DOM mutation here. The createEffect below is intentionally\n // omitted; the JSX layer owns the transform binding.\n\n setupKeyboardHandlers(store, el)\n setupSelectionRectangle(store, el, {\n selectionOnDrag: props.selectionOnDrag,\n selectionMode: props.selectionMode,\n })\n\n // Pane click + mousemove. D3 zoom captures `mousedown` and may\n // suppress click events; use a `mousedown` + `mouseup` pair so a\n // genuine click on empty pane (no node / handle / edge underneath)\n // still fires `onPaneClick`. Drag distance > 5px → not a click.\n let paneMouseDownPos: { x: number; y: number } | null = null\n const onMouseDown = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (\n !target.closest('.bf-flow__node') &&\n !target.closest('.bf-flow__handle') &&\n !target.closest('.bf-flow__edge, [data-hit-id]')\n ) {\n paneMouseDownPos = { x: event.clientX, y: event.clientY }\n } else {\n paneMouseDownPos = null\n }\n }\n const onMouseUp = (event: MouseEvent) => {\n if (!paneMouseDownPos) return\n const dx = event.clientX - paneMouseDownPos.x\n const dy = event.clientY - paneMouseDownPos.y\n paneMouseDownPos = null\n if (Math.abs(dx) > 5 || Math.abs(dy) > 5) return\n const target = event.target as HTMLElement\n if (\n target.closest('.bf-flow__node') ||\n target.closest('.bf-flow__handle') ||\n target.closest('.bf-flow__edge, [data-hit-id]')\n )\n return\n store.unselectNodesAndEdges()\n if (store.onPaneClick) {\n store.onPaneClick(event)\n }\n }\n const onMouseMove = (event: MouseEvent) => {\n if (store.onPaneMouseMove) {\n store.onPaneMouseMove(event)\n }\n }\n el.addEventListener('mousedown', onMouseDown, true)\n el.addEventListener('mouseup', onMouseUp, true)\n el.addEventListener('mousemove', onMouseMove)\n onCleanup(() => {\n el.removeEventListener('mousedown', onMouseDown, true)\n el.removeEventListener('mouseup', onMouseUp, true)\n el.removeEventListener('mousemove', onMouseMove)\n })\n\n // Delegated single-node drag. The cutover-step C4 XYDrag integration\n // will eventually replace this with multi-select / snap / extent\n // support, but a Flow that does not let users move nodes is a poor\n // default — wire a minimal pointer-paced handler so the JSX renderer\n // is interactive out of the box.\n let dragState: {\n nodeId: string\n pointerId: number\n startClientX: number\n startClientY: number\n startNodeX: number\n startNodeY: number\n captureEl: HTMLElement\n } | null = null\n\n const onNodePointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return\n if (!untrack(store.nodesDraggable)) return\n const target = event.target as HTMLElement | null\n if (!target) return\n if (target.closest('.bf-flow__handle')) return\n if (target.closest('.nodrag')) return\n const nodeEl = target.closest<HTMLElement>('.bf-flow__node')\n if (!nodeEl || !el.contains(nodeEl)) return\n const nodeId = nodeEl.dataset.id\n if (!nodeId) return\n const internal = untrack(store.nodeLookup).get(nodeId)\n if (!internal) return\n\n event.stopPropagation()\n\n dragState = {\n nodeId,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n startNodeX: internal.position.x,\n startNodeY: internal.position.y,\n captureEl: nodeEl,\n }\n nodeEl.setPointerCapture?.(event.pointerId)\n store.setDragging(true)\n }\n // Push the new position straight onto the nodes signal so JSX\n // consumers (NodeWrapper's `transform` memo, edge path memos) see a\n // fresh node object each frame. `updateNodePositions` alone only\n // mutates the `internals.positionAbsolute` reference and bumps\n // `positionEpoch`, but barefoot signals dedupe on Object.is — the\n // downstream `transform` memo therefore wouldn't re-render.\n const writeDragPosition = (nodeId: string, x: number, y: number, isDragging: boolean) => {\n const currentNodes = untrack(store.nodes)\n let changed = false\n const next = currentNodes.map((n) => {\n if (n.id !== nodeId) return n\n const prev = n.position\n if (prev.x === x && prev.y === y) return n\n changed = true\n return { ...n, position: { x, y } }\n })\n if (changed) store.setNodes(next)\n store.setDragging(isDragging)\n }\n\n const onNodePointerMove = (event: PointerEvent) => {\n if (!dragState || event.pointerId !== dragState.pointerId) return\n const zoom = untrack(store.viewport).zoom || 1\n const dx = (event.clientX - dragState.startClientX) / zoom\n const dy = (event.clientY - dragState.startClientY) / zoom\n // Clamp child nodes that opt in via `extent: 'parent'`. Done in the\n // relative coordinate the drag handler already manipulates, so the\n // commit shape (`writeDragPosition` → `setNodes` → `adoptUserNodes`)\n // stays unchanged.\n const clamped = clampDragPositionToParent(\n { x: dragState.startNodeX + dx, y: dragState.startNodeY + dy },\n dragState.nodeId,\n untrack(store.nodeLookup),\n )\n writeDragPosition(dragState.nodeId, clamped.x, clamped.y, true)\n }\n const onNodePointerUp = (event: PointerEvent) => {\n if (!dragState || event.pointerId !== dragState.pointerId) return\n const captureEl = dragState.captureEl\n captureEl.releasePointerCapture?.(event.pointerId)\n const finalNodeId = dragState.nodeId\n dragState = null\n // Final commit clears the dragging flag without changing the\n // position; reuse writeDragPosition for the same code path.\n const lookup = untrack(store.nodeLookup)\n const internal = lookup.get(finalNodeId)\n if (internal) {\n writeDragPosition(finalNodeId, internal.position.x, internal.position.y, false)\n } else {\n store.setDragging(false)\n }\n }\n el.addEventListener('pointerdown', onNodePointerDown)\n el.addEventListener('pointermove', onNodePointerMove)\n el.addEventListener('pointerup', onNodePointerUp)\n el.addEventListener('pointercancel', onNodePointerUp)\n onCleanup(() => {\n el.removeEventListener('pointerdown', onNodePointerDown)\n el.removeEventListener('pointermove', onNodePointerMove)\n el.removeEventListener('pointerup', onNodePointerUp)\n el.removeEventListener('pointercancel', onNodePointerUp)\n })\n\n // Edge path keep-in-sync. The SimpleEdge component owns a memo over\n // `pathD()` that should re-run on `positionEpoch()` / `nodes()`\n // changes, but barefoot's signal dedupe (Object.is on the cached\n // string) plus the fact that node measurement and drag mutate\n // `internal.measured` / `internal.positionAbsolute` *in place*\n // (without producing a fresh wrapper object the lookup signal\n // notices) means the edge's `d` attribute can stick at its first\n // computed value. Walk the SVG edges from a top-level effect that\n // tracks `positionEpoch` + `nodes` / `edges` and write `d`\n // directly — this is the load-bearing path for both initial measure\n // and drag.\n createEffect(() => {\n store.positionEpoch()\n const currentEdges = store.edges()\n // `nodeLookup()` now emits a fresh `Map` reference on every\n // setNodes-driven change (see #1270), so the previous\n // `store.nodes()` wake-up call is no longer needed here.\n const lookup = store.nodeLookup()\n const edgesSvg = el.querySelector('.bf-flow__edges')\n if (!edgesSvg) return\n for (const edge of currentEdges) {\n const sourceNode = lookup.get(edge.source)\n const targetNode = lookup.get(edge.target)\n if (!sourceNode || !targetNode) continue\n const pos = computeEdgePosition(edge, sourceNode, targetNode)\n if (!pos) continue\n const result = getEdgePath(edge, pos)\n if (!result) continue\n const d = result[0]\n const paths = edgesSvg.querySelectorAll<SVGPathElement>(\n `path[data-id=\"${edge.id}\"], path[data-hit-id=\"${edge.id}\"]`,\n )\n for (const p of paths) {\n if (p.getAttribute('d') !== d) p.setAttribute('d', d)\n }\n }\n })\n\n // onInit lifecycle callback fires once the subsystems are wired and\n // the store is ready. Mirrors initFlow's existing semantics.\n if (typeof props.onInit === 'function') {\n props.onInit(store)\n }\n}\n\n/**\n * Inject default CSS styles for xyflow components. Idempotent — first\n * call inserts a `<style id=\"bf-flow-styles\">`; subsequent calls\n * (e.g. multiple `<Flow>` instances on one page) early-return.\n */\nfunction injectDefaultStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById('bf-flow-styles')) return\n\n const style = document.createElement('style')\n style.id = 'bf-flow-styles'\n style.textContent = DEFAULT_STYLES\n document.head.appendChild(style)\n}\n\n// Default styles use design-system CSS variables (with hard-coded\n// fallbacks for environments that don't define them, e.g. raw <Flow>\n// usage outside a themed shell). Handle placement is driven by the\n// `data-handlepos` attribute the JSX <Handle> already emits, so the\n// `position` prop drives where each handle sits regardless of whether\n// the inline style on the element ever lands (the barefoot compiler\n// currently strips dynamic-string `style={memo()}` props on JSX\n// components, so attribute-driven CSS is the load-bearing path).\nconst DEFAULT_STYLES = `\n.bf-flow__node {\n padding: 10px 24px;\n border: 2px solid var(--foreground, #1a192b);\n border-radius: 6px;\n background-color: var(--card, #fff);\n color: var(--card-foreground, #222);\n font-size: 14px;\n font-weight: 600;\n text-align: center;\n cursor: grab;\n user-select: none;\n box-sizing: border-box;\n}\n.bf-flow__node--custom { border: none; background: transparent; padding: 0; border-radius: 0; }\n.bf-flow__node--custom.bf-flow__node--selected { box-shadow: none; }\n.bf-flow__node--selected { box-shadow: 0 0 0 1px var(--ring, #1a192b); }\n.bf-flow__handle {\n position: absolute;\n width: 8px; height: 8px;\n border-radius: 50%;\n background-color: var(--primary, #1a192b);\n cursor: crosshair;\n pointer-events: all;\n z-index: 1;\n}\n/* Negative offset compensates for the node's 2px border:\n .bf-flow__node uses border-box, but absolutely-positioned children\n resolve against the padding box, so top/left:0 lands inside the\n border. Pulling each side by -2px snaps the handle's transform-\n centred dot to the visible outer edge of the node. */\n.bf-flow__handle[data-handlepos=\"top\"] { top: -2px; left: 50%; transform: translate(-50%, -50%); }\n.bf-flow__handle[data-handlepos=\"bottom\"] { bottom: -2px; left: 50%; transform: translate(-50%, 50%); }\n.bf-flow__handle[data-handlepos=\"left\"] { left: -2px; top: 50%; transform: translate(-50%, -50%); }\n.bf-flow__handle[data-handlepos=\"right\"] { right: -2px; top: 50%; transform: translate(50%, -50%); }\n.bf-flow__handle:hover { width: 10px; height: 10px; }\n.bf-flow__handle.valid { background-color: #22c55e; }\n.bf-flow__handle.invalid { background-color: #ef4444; }\n.bf-flow__edge { fill: none; stroke: var(--muted-foreground, #b1b1b7); stroke-width: 1.5; pointer-events: none; }\n.bf-flow__edge--selected { stroke: var(--foreground, #555); stroke-width: 2; }\n.bf-flow__edge--animated { stroke-dasharray: 5; animation: bf-dashdraw 0.5s linear infinite; }\n@keyframes bf-dashdraw { from { stroke-dashoffset: 10; } }\n.bf-flow__edge-reconnect { fill: transparent; stroke: transparent; cursor: move; pointer-events: all; }\npath.bf-flow__edge.bf-flow__edge--reconnect-hover { stroke: var(--text-primary, #222); }\n.bf-flow__controls-button:hover { background: var(--accent, #f4f4f4) !important; }\n.bf-flow__controls-button:last-child { border-bottom: none !important; }\n.bf-flow__edge-label {\n position: absolute; top: 0; left: 0; background: #fff;\n padding: 2px 4px; font-size: 11px; color: #222;\n white-space: nowrap; cursor: default;\n}\n.bf-flow__edge-toolbar {\n position: absolute; top: 0; left: 0;\n display: flex; gap: 4px; z-index: 10;\n}\n.bf-flow__edge-toolbar-button {\n display: flex; align-items: center; justify-content: center;\n width: 20px; height: 20px; border-radius: 4px; border: 1px solid #e2e2e2;\n background: #fff; color: #666; font-size: 14px; line-height: 1;\n cursor: pointer; padding: 0;\n}\n.bf-flow__edge-toolbar-button:hover { background: #fee; color: #c00; border-color: #c00; }\n.bf-flow__selection {\n background: rgba(0, 89, 220, 0.08);\n border: 1px dashed rgba(0, 89, 220, 0.5);\n border-radius: 2px;\n pointer-events: none;\n}\n.bf-flow__node-resizer { position: absolute; inset: 0; pointer-events: none; }\n.bf-flow__resize-handle { position: absolute; pointer-events: all; z-index: 10; }\n.bf-flow__resize-handle--corner { width: 8px; height: 8px; background: var(--bf-resize-color, #4a90d9); border: none; border-radius: 0; }\n.bf-flow__resize-handle--top-left { top: -4px; left: -4px; cursor: nwse-resize; }\n.bf-flow__resize-handle--top-right { top: -4px; right: -4px; cursor: nesw-resize; }\n.bf-flow__resize-handle--bottom-left { bottom: -4px; left: -4px; cursor: nesw-resize; }\n.bf-flow__resize-handle--bottom-right { bottom: -4px; right: -4px; cursor: nwse-resize; }\n.bf-flow__resize-handle--line { background: transparent; }\n.bf-flow__resize-handle--line.bf-flow__resize-handle--top { top: -2px; left: 0; right: 0; height: 4px; cursor: ns-resize; }\n.bf-flow__resize-handle--line.bf-flow__resize-handle--bottom { bottom: -2px; left: 0; right: 0; height: 4px; cursor: ns-resize; }\n.bf-flow__resize-handle--line.bf-flow__resize-handle--left { left: -2px; top: 0; bottom: 0; width: 4px; cursor: ew-resize; }\n.bf-flow__resize-handle--line.bf-flow__resize-handle--right { right: -2px; top: 0; bottom: 0; width: 4px; cursor: ew-resize; }\n.bf-flow__resize-handle--line:hover { background: rgba(26, 25, 43, 0.1); }\n.bf-flow__resize-handle--corner:hover { background: var(--bf-resize-color, #3a7bd5); }\n.bf-flow__node--group {\n background-color: rgba(240, 240, 240, 0.7);\n border: 1px dashed #999;\n border-radius: 8px;\n padding: 40px 10px 10px 10px;\n}\n.bf-flow__node--child {\n /* Child nodes render above parents via z-index from @xyflow/system */\n}\n`\n\n",
119
+ "import { onCleanup, untrack } from '@barefootjs/client'\nimport type { NodeBase, EdgeBase, InternalNodeBase, Transform } from '@xyflow/system'\nimport type { FlowStore, InternalFlowStore, SelectionMode } from './types'\n\n/**\n * Set up keyboard handlers for the flow container.\n * Needs InternalFlowStore for setMultiSelectionActive (Shift key).\n */\nexport function setupKeyboardHandlers<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(\n store: InternalFlowStore<NodeType, EdgeType>,\n container: HTMLElement,\n): void {\n function handleKeyDown(event: KeyboardEvent) {\n const target = event.target as HTMLElement\n if (\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.isContentEditable\n ) {\n return\n }\n\n // Delete key handling (configurable, null disables)\n const deleteKeys = store.deleteKeyCode\n if (deleteKeys && deleteKeys.includes(event.key)) {\n if (!untrack(store.nodesDraggable)) return\n const selectedNodes = untrack(store.nodes).filter((n) => n.selected)\n const selectedEdges = untrack(store.edges).filter((e) => e.selected)\n\n if (selectedNodes.length > 0 || selectedEdges.length > 0) {\n // Fire deletion callbacks before deleting\n if (selectedNodes.length > 0 && store.onNodesDelete) {\n store.onNodesDelete(selectedNodes)\n }\n if (selectedEdges.length > 0 && store.onEdgesDelete) {\n store.onEdgesDelete(selectedEdges)\n }\n\n store.deleteElements({\n nodes: selectedNodes,\n edges: selectedEdges,\n })\n event.preventDefault()\n }\n }\n\n if (event.key === 'Escape') {\n store.unselectNodesAndEdges()\n }\n\n // Selection key handling (configurable)\n const selKey = store.selectionKeyCode\n if (selKey && event.key === selKey) {\n store.setMultiSelectionActive(true)\n }\n }\n\n function handleKeyUp(event: KeyboardEvent) {\n const selKey = store.selectionKeyCode\n if (selKey && event.key === selKey) {\n store.setMultiSelectionActive(false)\n }\n }\n\n container.setAttribute('tabindex', '0')\n container.style.outline = 'none'\n container.addEventListener('keydown', handleKeyDown)\n container.addEventListener('keyup', handleKeyUp)\n\n onCleanup(() => {\n container.removeEventListener('keydown', handleKeyDown)\n container.removeEventListener('keyup', handleKeyUp)\n })\n}\n\n/**\n * Set up click-to-select on node elements.\n * Called from node-wrapper when creating each node.\n */\nexport function setupNodeSelection<NodeType extends NodeBase>(\n nodeElement: HTMLElement,\n nodeId: string,\n store: FlowStore<NodeType>,\n): void {\n // Use mousedown instead of click — D3 zoom's mousedown handler on the\n // container calls stopImmediatePropagation, which prevents the native\n // click event from reaching the node element.\n nodeElement.addEventListener('mousedown', (event) => {\n if (event.button !== 0) return\n\n const multiSelect = untrack(store.multiSelectionActive) || event.shiftKey\n\n if (!multiSelect) {\n // Deselect all, then select this one\n store.unselectNodesAndEdges()\n }\n\n // Focus the container so keyboard events (Delete) work\n const container = untrack(store.domNode)\n if (container) container.focus()\n\n // Toggle this node's selection\n store.setNodes((prev) =>\n prev.map((n) =>\n n.id === nodeId\n ? { ...n, selected: multiSelect ? !n.selected : true }\n : n,\n ),\n )\n })\n}\n\n/**\n * Simple rect type for selection calculations.\n */\ntype SelectionRect = { x: number; y: number; width: number; height: number }\n\n/**\n * Find nodes whose absolute positions overlap a screen-space rectangle.\n *\n * Unlike @xyflow/system's getNodesInside, this does NOT require handleBounds\n * to be set — it works directly with positionAbsolute and measured dimensions.\n * This avoids the forceInitialRender fallback that returns ALL nodes.\n */\nfunction findNodesInRect<NodeType extends NodeBase>(\n nodeLookup: Map<string, InternalNodeBase<NodeType>>,\n rect: SelectionRect,\n [tx, ty, tScale]: Transform,\n partially: boolean,\n): InternalNodeBase<NodeType>[] {\n // Convert the screen-space rect to flow-space (undo viewport transform)\n const flowRect = {\n x: (rect.x - tx) / tScale,\n y: (rect.y - ty) / tScale,\n width: rect.width / tScale,\n height: rect.height / tScale,\n }\n\n const result: InternalNodeBase<NodeType>[] = []\n\n for (const node of nodeLookup.values()) {\n if (node.hidden) continue\n\n const nodeW = node.measured.width ?? 0\n const nodeH = node.measured.height ?? 0\n if (nodeW === 0 && nodeH === 0) continue\n\n const pos = node.internals.positionAbsolute\n\n // Calculate overlap between the flow-space selection rect and node rect\n const overlapX = Math.max(0,\n Math.min(flowRect.x + flowRect.width, pos.x + nodeW) -\n Math.max(flowRect.x, pos.x),\n )\n const overlapY = Math.max(0,\n Math.min(flowRect.y + flowRect.height, pos.y + nodeH) -\n Math.max(flowRect.y, pos.y),\n )\n const overlapArea = overlapX * overlapY\n const nodeArea = nodeW * nodeH\n\n if (partially) {\n // Partial mode: any overlap counts\n if (overlapArea > 0) result.push(node)\n } else {\n // Full mode: node must be fully contained\n if (overlapArea >= nodeArea) result.push(node)\n }\n }\n\n return result\n}\n\n/**\n * Compute screen-space bounding box around the given internal nodes.\n */\nfunction getSelectedNodesBBox<NodeType extends NodeBase>(\n nodes: InternalNodeBase<NodeType>[],\n [tx, ty, tScale]: Transform,\n): SelectionRect | null {\n if (nodes.length === 0) return null\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n\n for (const node of nodes) {\n const pos = node.internals.positionAbsolute\n const nw = node.measured.width ?? 0\n const nh = node.measured.height ?? 0\n // Convert flow-space to screen-space\n const sx = pos.x * tScale + tx\n const sy = pos.y * tScale + ty\n const sw = nw * tScale\n const sh = nh * tScale\n minX = Math.min(minX, sx)\n minY = Math.min(minY, sy)\n maxX = Math.max(maxX, sx + sw)\n maxY = Math.max(maxY, sy + sh)\n }\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n }\n}\n\n/**\n * Options for the selection rectangle behavior.\n */\nexport type SelectionRectOptions = {\n /** When true, drag on pane starts selection without Shift key */\n selectionOnDrag?: boolean\n /** 'partial' selects overlapping nodes; 'full' requires full containment */\n selectionMode?: SelectionMode\n}\n\n/**\n * Set up selection rectangle (rubber-band / lasso) on the flow container.\n *\n * The rectangle is drawn when:\n * - Shift+drag on empty pane, OR\n * - Drag on empty pane when `selectionOnDrag` is true\n *\n * Nodes inside the rectangle are selected on mouse up.\n */\nexport function setupSelectionRectangle<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(\n store: InternalFlowStore<NodeType, EdgeType>,\n container: HTMLElement,\n options: SelectionRectOptions = {},\n): void {\n const selectionOnDrag = options.selectionOnDrag ?? false\n const selectionMode: SelectionMode = options.selectionMode ?? 'partial'\n\n let selectionRect: HTMLDivElement | null = null\n let isSelecting = false\n let startX = 0\n let startY = 0\n\n function handleMouseDown(event: MouseEvent) {\n if (event.button !== 0) return\n\n // Remove any lingering selection bounding box from previous selection\n if (selectionRect) {\n selectionRect.remove()\n selectionRect = null\n }\n\n // Only start selection on the container or viewport (empty pane),\n // not on nodes, handles, controls, etc.\n const target = event.target as HTMLElement\n const isPane =\n target === container ||\n target.classList.contains('bf-flow__viewport') ||\n target.classList.contains('bf-flow__nodes') ||\n target.classList.contains('bf-flow__edges')\n\n if (!isPane) return\n\n // Determine if selection should activate:\n // - Shift+drag always triggers selection\n // - Plain drag triggers selection only if selectionOnDrag is true\n const shiftHeld = event.shiftKey\n if (!shiftHeld && !selectionOnDrag) return\n\n // Stop propagation so D3 pan/zoom doesn't compete with selection drag\n event.stopPropagation()\n event.preventDefault()\n\n isSelecting = true\n startX = event.clientX\n startY = event.clientY\n\n // Create the selection rectangle element\n selectionRect = document.createElement('div')\n selectionRect.className = 'bf-flow__selection'\n selectionRect.style.position = 'absolute'\n selectionRect.style.pointerEvents = 'none'\n selectionRect.style.left = '0'\n selectionRect.style.top = '0'\n selectionRect.style.width = '0'\n selectionRect.style.height = '0'\n selectionRect.style.zIndex = '5'\n container.appendChild(selectionRect)\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n }\n\n function handleMouseMove(event: MouseEvent) {\n if (!isSelecting || !selectionRect) return\n\n const containerRect = container.getBoundingClientRect()\n const currentX = event.clientX\n const currentY = event.clientY\n\n // Calculate rectangle bounds relative to the container\n const left = Math.min(startX, currentX) - containerRect.left\n const top = Math.min(startY, currentY) - containerRect.top\n const width = Math.abs(currentX - startX)\n const height = Math.abs(currentY - startY)\n\n selectionRect.style.left = `${left}px`\n selectionRect.style.top = `${top}px`\n selectionRect.style.width = `${width}px`\n selectionRect.style.height = `${height}px`\n }\n\n function handleMouseUp(event: MouseEvent) {\n if (!isSelecting) return\n\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n\n // Determine which nodes are inside the selection rectangle\n const containerRect = container.getBoundingClientRect()\n const currentX = event.clientX\n const currentY = event.clientY\n\n const left = Math.min(startX, currentX) - containerRect.left\n const top = Math.min(startY, currentY) - containerRect.top\n const width = Math.abs(currentX - startX)\n const height = Math.abs(currentY - startY)\n\n // Only process selection if the rectangle has meaningful size\n // (avoid accidental clicks registering as selection)\n if (width > 5 || height > 5) {\n const transform = store.getTransform()\n const nodeLookup = untrack(store.nodeLookup)\n const partially = selectionMode === 'partial'\n\n const nodesInside = findNodesInRect(\n nodeLookup,\n { x: left, y: top, width, height },\n transform,\n partially,\n )\n\n const selectedIds = new Set(nodesInside.map((n) => n.id))\n\n if (selectedIds.size > 0) {\n store.setNodes((prev) =>\n prev.map((n) =>\n selectedIds.has(n.id) ? { ...n, selected: true } : { ...n, selected: false },\n ),\n )\n\n // Reposition selection rect as bounding box around selected nodes\n if (selectionRect) {\n const transform = store.getTransform()\n const bbox = getSelectedNodesBBox(nodesInside, transform)\n if (bbox) {\n selectionRect.style.left = `${bbox.x}px`\n selectionRect.style.top = `${bbox.y}px`\n selectionRect.style.width = `${bbox.width}px`\n selectionRect.style.height = `${bbox.height}px`\n selectionRect.classList.add('bf-flow__selection--active')\n // Focus container so keyboard Delete/Escape works immediately\n container.focus()\n } else {\n selectionRect.remove()\n selectionRect = null\n }\n }\n } else {\n store.unselectNodesAndEdges()\n if (selectionRect) { selectionRect.remove(); selectionRect = null }\n }\n } else {\n // Small drag = click on empty pane, deselect all\n store.unselectNodesAndEdges()\n if (selectionRect) { selectionRect.remove(); selectionRect = null }\n }\n\n isSelecting = false\n }\n\n // Clean up selection rect when selected nodes are deleted\n function handleSelectionKeyDown(event: KeyboardEvent) {\n if (!selectionRect) return\n if (event.key === 'Delete' || event.key === 'Backspace') {\n selectionRect.remove()\n selectionRect = null\n }\n }\n\n // Use capture phase so we can intercept before D3 zoom when needed\n container.addEventListener('mousedown', handleMouseDown, true)\n container.addEventListener('keydown', handleSelectionKeyDown)\n\n onCleanup(() => {\n container.removeEventListener('mousedown', handleMouseDown, true)\n container.removeEventListener('keydown', handleSelectionKeyDown)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n if (selectionRect) {\n selectionRect.remove()\n selectionRect = null\n }\n })\n}\n",
120
+ "import { untrack } from '@barefootjs/client'\nimport { getSmoothStepPath, Position, reconnectEdge as reconnectEdgeUtil } from '@xyflow/system'\nimport type { FlowStore, NodeBase, EdgeBase, Connection } from './types'\nimport { SVG_NS } from './constants'\n\n/**\n * Build a connection object for the given source handle / target handle pair.\n * Used by both validation and edge creation.\n */\nfunction buildConnection(\n sourceNodeId: string,\n targetNodeId: string,\n handleType: 'source' | 'target',\n sourceHandleId?: string | null,\n targetHandleId?: string | null,\n): { source: string; target: string; sourceHandle: string | null; targetHandle: string | null } {\n let source = sourceNodeId\n let target = targetNodeId\n let sourceHandle = sourceHandleId ?? null\n let targetHandle = targetHandleId ?? null\n if (handleType === 'target') {\n source = targetNodeId\n target = sourceNodeId\n // Swap handle IDs when direction is reversed\n const tmp = sourceHandle\n sourceHandle = targetHandle\n targetHandle = tmp\n }\n return { source, target, sourceHandle, targetHandle }\n}\n\n/**\n * Check whether a proposed connection is valid according to the store's\n * isValidConnection callback. Returns true when no callback is configured.\n */\nfunction checkConnectionValidity<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(\n store: FlowStore<NodeType, EdgeType>,\n connection: { source: string; target: string; sourceHandle: string | null; targetHandle: string | null },\n): boolean {\n if (!store.isValidConnection) return true\n return store.isValidConnection(connection)\n}\n\n/**\n * Attach a connection drag handler to a handle element.\n * Called when creating each handle in node-wrapper.\n */\nexport function attachConnectionHandler<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(\n handleEl: HTMLElement,\n nodeId: string,\n handleType: 'source' | 'target',\n container: HTMLElement,\n _edgesSvg: SVGSVGElement,\n store: FlowStore<NodeType, EdgeType>,\n): void {\n handleEl.addEventListener('mousedown', (e) => {\n if (e.button !== 0) return\n if (!untrack(store.nodesDraggable)) return\n\n // Stop propagation to prevent node drag\n e.stopPropagation()\n e.preventDefault()\n\n // Compute source position in flow coordinates at mousedown time\n const handleRect = handleEl.getBoundingClientRect()\n const containerRect0 = container.getBoundingClientRect()\n const [, , scale0] = store.getTransform()\n const vp0 = untrack(store.viewport)\n\n const sourceX = (handleRect.left + handleRect.width / 2 - containerRect0.left - vp0.x) / scale0\n const sourceY = (handleRect.top + handleRect.height / 2 - containerRect0.top - vp0.y) / scale0\n\n // Create a temporary overlay SVG for the connection line, above nodes.\n // This makes the line visible on top of nodes during drag.\n // We hide it briefly before elementFromPoint calls so handles are detected.\n const overlaySvg = document.createElementNS(SVG_NS, 'svg')\n overlaySvg.style.position = 'absolute'\n overlaySvg.style.top = '0'\n overlaySvg.style.left = '0'\n overlaySvg.style.width = '100%'\n overlaySvg.style.height = '100%'\n overlaySvg.style.overflow = 'visible'\n overlaySvg.style.pointerEvents = 'none'\n overlaySvg.style.zIndex = '10'\n container.appendChild(overlaySvg)\n\n // The line is drawn in viewport-transformed coordinates\n const lineGroup = document.createElementNS(SVG_NS, 'g')\n overlaySvg.appendChild(lineGroup)\n\n const connectionLine = document.createElementNS(SVG_NS, 'path')\n connectionLine.setAttribute('fill', 'none')\n // Apply connectionLineStyle from store if available\n const lineStyle = store.connectionLineStyle\n connectionLine.setAttribute('stroke', lineStyle?.stroke ?? '#b1b1b7')\n connectionLine.setAttribute('stroke-width', lineStyle?.strokeWidth ?? '1')\n lineGroup.appendChild(connectionLine)\n\n // Track the currently highlighted handle for validation/snap feedback\n let lastHighlightedHandle: HTMLElement | null = null\n // Track the snapped handle so onMouseUp can use it without re-querying\n let snappedHandle: HTMLElement | null = null\n\n const SNAP_THRESHOLD = 30\n\n /**\n * Find the nearest valid target handle within SNAP_THRESHOLD pixels of\n * the cursor. Returns null when none is close enough.\n */\n function findNearestHandle(cursorX: number, cursorY: number): HTMLElement | null {\n const candidates = container.querySelectorAll<HTMLElement>('.bf-flow__handle')\n let nearest: HTMLElement | null = null\n let nearestDist = SNAP_THRESHOLD\n\n for (const candidate of candidates) {\n if (candidate === handleEl) continue\n if (!candidate.dataset.nodeId || candidate.dataset.nodeId === nodeId) continue\n // Skip same-type handles — source can only connect to target and vice versa.\n // When source+target handles overlap at the same position, without this\n // check the source handle (first in DOM) would always win and fail validation.\n const candidateType = candidate.classList.contains('bf-flow__handle--target') ? 'target' : 'source'\n if (candidateType === handleType) continue\n\n const rect = candidate.getBoundingClientRect()\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dist = Math.hypot(cursorX - cx, cursorY - cy)\n if (dist < nearestDist) {\n nearestDist = dist\n nearest = candidate\n }\n }\n return nearest\n }\n\n const onMouseMove = (e: MouseEvent) => {\n // Read fresh viewport and container rect each move — the user\n // may pan/zoom while drawing a connection.\n const containerRect = container.getBoundingClientRect()\n const [, , scale] = store.getTransform()\n const vp = untrack(store.viewport)\n\n // Determine if we should snap to a nearby handle\n const nearHandle = findNearestHandle(e.clientX, e.clientY)\n\n let targetX: number\n let targetY: number\n\n if (nearHandle) {\n const rect = nearHandle.getBoundingClientRect()\n targetX = (rect.left + rect.width / 2 - containerRect.left - vp.x) / scale\n targetY = (rect.top + rect.height / 2 - containerRect.top - vp.y) / scale\n } else {\n targetX = (e.clientX - containerRect.left - vp.x) / scale\n targetY = (e.clientY - containerRect.top - vp.y) / scale\n }\n\n const [path] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition: handleType === 'source' ? Position.Bottom : Position.Top,\n targetX,\n targetY,\n targetPosition: handleType === 'source' ? Position.Top : Position.Bottom,\n })\n\n connectionLine.setAttribute('d', path)\n\n // Sync overlay SVG transform with viewport\n const vpCurrent = untrack(store.viewport)\n lineGroup.setAttribute('transform', `translate(${vpCurrent.x}, ${vpCurrent.y}) scale(${vpCurrent.zoom})`)\n\n // Clear classes from the previously highlighted handle\n if (lastHighlightedHandle && lastHighlightedHandle !== nearHandle) {\n lastHighlightedHandle.classList.remove('valid', 'invalid')\n }\n\n snappedHandle = null\n\n if (nearHandle) {\n const nearHandleType = nearHandle.classList.contains('bf-flow__handle--target') ? 'target' : 'source'\n const isCompatibleType = handleType !== nearHandleType\n const srcHandleId = handleEl.getAttribute(\"data-handleid\") ?? null\n const tgtHandleId = nearHandle.getAttribute(\"data-handleid\") ?? null\n const conn = buildConnection(nodeId, nearHandle.dataset.nodeId!, handleType, srcHandleId, tgtHandleId)\n const isValid = isCompatibleType && checkConnectionValidity(store, conn)\n\n nearHandle.classList.remove('valid', 'invalid')\n nearHandle.classList.add(isValid ? 'valid' : 'invalid')\n lastHighlightedHandle = nearHandle\n\n if (isValid) snappedHandle = nearHandle\n } else {\n // Fall back to elementFromPoint for hover-only feedback (cursor directly on handle)\n overlaySvg.style.display = 'none'\n const hoverEl = document.elementFromPoint(e.clientX, e.clientY)\n overlaySvg.style.display = ''\n const hoveredHandle = hoverEl?.closest?.('.bf-flow__handle') as HTMLElement | null\n\n if (\n hoveredHandle &&\n hoveredHandle !== handleEl &&\n hoveredHandle.dataset.nodeId &&\n hoveredHandle.dataset.nodeId !== nodeId\n ) {\n const hoveredHandleType = hoveredHandle.classList.contains('bf-flow__handle--target') ? 'target' : 'source'\n const isCompatibleType = handleType !== hoveredHandleType\n const srcHandleId = handleEl.getAttribute(\"data-handleid\") ?? null\n const tgtHandleId = hoveredHandle.getAttribute(\"data-handleid\") ?? null\n const conn = buildConnection(nodeId, hoveredHandle.dataset.nodeId, handleType, srcHandleId, tgtHandleId)\n const isValid = isCompatibleType && checkConnectionValidity(store, conn)\n\n hoveredHandle.classList.remove('valid', 'invalid')\n if (!isValid) hoveredHandle.classList.add('invalid')\n lastHighlightedHandle = hoveredHandle\n } else {\n lastHighlightedHandle = null\n }\n }\n }\n\n const onMouseUp = (e: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onMouseUp)\n\n // Clean up validation/snap classes from any highlighted handle\n if (lastHighlightedHandle) {\n lastHighlightedHandle.classList.remove('valid', 'invalid')\n }\n\n // Prefer the snapped handle; fall back to direct hit-test\n let targetHandle = snappedHandle\n\n if (!targetHandle) {\n overlaySvg.style.display = 'none'\n const targetEl = document.elementFromPoint(e.clientX, e.clientY)\n overlaySvg.style.display = ''\n targetHandle = targetEl?.closest?.('.bf-flow__handle') as HTMLElement | null\n }\n\n if (\n targetHandle &&\n targetHandle.dataset.nodeId &&\n targetHandle.dataset.nodeId !== nodeId\n ) {\n const targetNodeId = targetHandle.dataset.nodeId\n const targetHandleType = targetHandle.classList.contains('bf-flow__handle--target') ? 'target' : 'source'\n const isCompatibleType = handleType !== targetHandleType\n const srcHandleId = handleEl.getAttribute(\"data-handleid\") ?? null\n const tgtHandleId = targetHandle.getAttribute(\"data-handleid\") ?? null\n const conn = buildConnection(nodeId, targetNodeId, handleType, srcHandleId, tgtHandleId)\n\n // Validate: handle type must be compatible + custom validation\n const isValid = isCompatibleType && checkConnectionValidity(store, conn)\n\n if (isValid) {\n if (store.onConnect) {\n // When onConnect is provided, the consumer is responsible for\n // creating the edge (matching React Flow behaviour).\n store.onConnect(conn)\n } else {\n // Default: auto-create a plain edge when no onConnect handler\n const edgeId = `e-${conn.source}-${conn.target}-${Date.now()}`\n const newEdge = {\n id: edgeId,\n source: conn.source,\n target: conn.target,\n sourceHandle: conn.sourceHandle ?? undefined,\n targetHandle: conn.targetHandle ?? undefined,\n } as EdgeType\n store.addEdge(newEdge)\n }\n }\n }\n\n // Remove connection line overlay\n overlaySvg.remove()\n }\n\n document.addEventListener('mousemove', onMouseMove)\n document.addEventListener('mouseup', onMouseUp)\n })\n}\n\n/**\n * Attach a reconnection drag handler to an edge endpoint handle.\n * Dragging this handle detaches the edge from its source/target and allows\n * reconnecting to a different handle.\n *\n * @param handleEl - The SVG circle element acting as the reconnection grip\n * @param edge - The edge being reconnected\n * @param endpointType - Which endpoint of the edge is being dragged ('source' | 'target')\n * @param container - The flow container element\n * @param edgesSvg - The SVG element containing edge paths\n * @param store - The flow store\n */\nexport function attachReconnectionHandler<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>(\n handleEl: SVGCircleElement,\n edge: EdgeType,\n endpointType: 'source' | 'target',\n container: HTMLElement,\n edgesSvg: SVGSVGElement,\n store: FlowStore<NodeType, EdgeType>,\n): void {\n handleEl.addEventListener('mousedown', (e) => {\n if (e.button !== 0) return\n e.stopPropagation()\n e.preventDefault()\n\n // The fixed anchor is the opposite endpoint of the edge\n const anchorNodeId = endpointType === 'source' ? edge.target : edge.source\n\n // Determine anchor position from the node\n const nodeLookup = untrack(store.nodeLookup)\n const anchorNode = nodeLookup.get(anchorNodeId)\n if (!anchorNode) return\n\n const anchorW = anchorNode.measured.width ?? 150\n const anchorH = anchorNode.measured.height ?? 40\n const anchorPos = anchorNode.internals.positionAbsolute\n\n // For the anchor, use the handle position appropriate for the fixed end:\n // If we're dragging the \"source\" end, the fixed anchor is the \"target\" end\n // (which has a handle at the top). If dragging \"target\", anchor is \"source\" (bottom).\n const anchorX = anchorPos.x + anchorW / 2\n const anchorY = endpointType === 'source'\n ? anchorPos.y // target handle is at top\n : anchorPos.y + anchorH // source handle is at bottom\n\n // Hide the original edge path while reconnecting\n const edgePathEl = edgesSvg.querySelector(`.bf-flow__edge[data-id=\"${edge.id}\"]`) as SVGPathElement | null\n const hitPathEl = edgesSvg.querySelector(`path[data-hit-id=\"${edge.id}\"]`) as SVGPathElement | null\n if (edgePathEl) edgePathEl.style.opacity = '0.2'\n if (hitPathEl) hitPathEl.style.display = 'none'\n\n // Create temporary connection line from anchor to cursor\n const connectionLine = document.createElementNS(SVG_NS, 'path')\n connectionLine.setAttribute('fill', 'none')\n const reconnectLineStyle = store.connectionLineStyle\n connectionLine.setAttribute('stroke', reconnectLineStyle?.stroke ?? '#b1b1b7')\n connectionLine.setAttribute('stroke-width', reconnectLineStyle?.strokeWidth ?? '1')\n connectionLine.setAttribute('pointer-events', 'none')\n edgesSvg.appendChild(connectionLine)\n\n let lastHoveredHandle: HTMLElement | null = null\n\n const onMouseMove = (ev: MouseEvent) => {\n const containerRect = container.getBoundingClientRect()\n const [, , scale] = store.getTransform()\n const vp = untrack(store.viewport)\n\n const cursorX = (ev.clientX - containerRect.left - vp.x) / scale\n const cursorY = (ev.clientY - containerRect.top - vp.y) / scale\n\n // Draw smoothstep path from anchor to cursor\n // sourcePosition/targetPosition depends on which endpoint is the anchor\n const sourcePosition = endpointType === 'source' ? Position.Top : Position.Bottom\n const targetPosition = endpointType === 'source' ? Position.Bottom : Position.Top\n\n const [path] = getSmoothStepPath({\n sourceX: anchorX,\n sourceY: anchorY,\n sourcePosition,\n targetX: cursorX,\n targetY: cursorY,\n targetPosition,\n })\n\n connectionLine.setAttribute('d', path)\n\n // Validate on hover over handles\n const hoverEl = document.elementFromPoint(ev.clientX, ev.clientY)\n const hoveredHandle = hoverEl?.closest?.('.bf-flow__handle') as HTMLElement | null\n\n if (lastHoveredHandle && lastHoveredHandle !== hoveredHandle) {\n lastHoveredHandle.classList.remove('invalid')\n }\n\n if (\n hoveredHandle &&\n hoveredHandle.dataset.nodeId &&\n hoveredHandle.dataset.nodeId !== anchorNodeId\n ) {\n // Build connection based on the hovered handle's type\n const hoveredNodeId = hoveredHandle.dataset.nodeId\n const hoveredHandleType = hoveredHandle.classList.contains('bf-flow__handle--target') ? 'target' : 'source'\n const conn: Connection = hoveredHandleType === 'target'\n ? { source: anchorNodeId, target: hoveredNodeId, sourceHandle: null, targetHandle: null }\n : { source: hoveredNodeId, target: anchorNodeId, sourceHandle: null, targetHandle: null }\n\n const isValid = checkConnectionValidity(store, conn)\n hoveredHandle.classList.remove('invalid')\n if (!isValid) hoveredHandle.classList.add('invalid')\n lastHoveredHandle = hoveredHandle\n } else {\n lastHoveredHandle = null\n }\n }\n\n const onMouseUp = (ev: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onMouseUp)\n\n if (lastHoveredHandle) {\n lastHoveredHandle.classList.remove('invalid')\n }\n\n // Restore the original edge appearance\n if (edgePathEl) edgePathEl.style.opacity = ''\n if (hitPathEl) hitPathEl.style.display = ''\n\n // Check if released on a valid handle\n const targetEl = document.elementFromPoint(ev.clientX, ev.clientY)\n const droppedHandle = targetEl?.closest?.('.bf-flow__handle') as HTMLElement | null\n\n if (\n droppedHandle &&\n droppedHandle.dataset.nodeId &&\n droppedHandle.dataset.nodeId !== anchorNodeId\n ) {\n const droppedNodeId = droppedHandle.dataset.nodeId\n // Determine connection direction from the dropped handle's type\n const droppedHandleType = droppedHandle.classList.contains('bf-flow__handle--target') ? 'target' : 'source'\n const newConnection: Connection = droppedHandleType === 'target'\n ? { source: anchorNodeId, target: droppedNodeId, sourceHandle: null, targetHandle: null }\n : { source: droppedNodeId, target: anchorNodeId, sourceHandle: null, targetHandle: null }\n\n const isValid = checkConnectionValidity(store, newConnection)\n\n if (isValid) {\n // Fire onReconnect callback\n if (store.onReconnect) {\n store.onReconnect(edge, newConnection)\n }\n\n // Update edges using reconnectEdge utility\n const currentEdges = untrack(store.edges)\n const updatedEdges = reconnectEdgeUtil(edge, newConnection, currentEdges)\n store.setEdges(updatedEdges as EdgeType[])\n }\n }\n // If not dropped on a valid handle, the edge reverts (appearance already restored)\n\n connectionLine.remove()\n }\n\n document.addEventListener('mousemove', onMouseMove)\n document.addEventListener('mouseup', onMouseUp)\n })\n}\n",
121
+ "/**\n * Node-type dispatch — the helper that funnels `<Flow nodeTypes={...}>`\n * entries into the host `<div>` produced by `FlowNodeTypeBridge`.\n *\n * `nodeTypes` accepts two entry shapes through the same map so projects\n * can migrate custom nodes from imperative to JSX one file at a time\n * without touching every `<Flow>` call site:\n *\n * 1. Imperative: `function MyNode(this: HTMLElement, props): void`\n * — mutates `this` (the host element) and returns nothing.\n * 2. JSX-component shim: post-`'use client'` `.tsx` compile output\n * — ignores `this` and returns a real DOM `Node`. The bridge\n * appends that returned node into the host so subsequent\n * wipe+rebuild cycles see it.\n *\n * See piconic-ai/barefootjs#1236 for the migration motivation.\n */\n\nimport type { NodeBase } from './types'\nimport type { NodeComponentProps } from './types'\n\n/**\n * Cross-shape `nodeTypes` entry. The return type covers both supported\n * shapes — imperative entries return `void`, JSX-component shim\n * entries return a `Node`.\n */\nexport type NodeInitFn<NodeType extends NodeBase = NodeBase> = (\n this: HTMLElement,\n props: NodeComponentProps<NodeType>,\n) => void | Node | undefined\n\n/**\n * Dispatch a `nodeTypes` entry into the host element. Invokes `initFn`\n * with `el` bound as `this` (imperative path) and appends its return\n * value when it is a `Node` (JSX-component shim path). The\n * `instanceof Node` guard is harmless on the imperative path: `void`\n * is not an instance of `Node`, so the branch is skipped.\n */\nexport function dispatchNodeType<NT extends NodeBase>(\n el: HTMLElement,\n initFn: NodeInitFn<NT>,\n props: NodeComponentProps<NT>,\n): void {\n const result = initFn.call(el, props)\n if (result instanceof Node) el.appendChild(result)\n}\n",
122
+ "import { onCleanup, untrack } from '@barefootjs/client'\nimport {\n XYResizer,\n XY_RESIZER_HANDLE_POSITIONS,\n XY_RESIZER_LINE_POSITIONS,\n ResizeControlVariant,\n updateNodeInternals,\n} from '@xyflow/system'\nimport type {\n NodeBase,\n InternalNodeUpdate,\n ControlPosition,\n ControlLinePosition,\n OnResize,\n OnResizeStart,\n OnResizeEnd,\n ShouldResize,\n ResizeControlDirection,\n} from '@xyflow/system'\nimport type { XYResizerChange, XYResizerChildChange, XYResizerInstance } from '@xyflow/system'\nimport type { FlowStore } from './types'\n\n/**\n * Options for initNodeResizer.\n */\nexport type NodeResizerOptions = {\n /** Minimum width the node can be resized to (default: 10) */\n minWidth?: number\n /** Minimum height the node can be resized to (default: 10) */\n minHeight?: number\n /** Maximum width the node can be resized to (default: Infinity) */\n maxWidth?: number\n /** Maximum height the node can be resized to (default: Infinity) */\n maxHeight?: number\n /** Whether to keep the aspect ratio during resize (default: false) */\n keepAspectRatio?: boolean\n /** Which variant of resize controls to use: 'handle' (corners) or 'line' (edges) */\n variant?: ResizeControlVariant | 'handle' | 'line'\n /** Callback fired when resize starts */\n onResizeStart?: OnResizeStart\n /** Callback fired during resize with new dimensions */\n onResize?: OnResize\n /** Callback fired when resize ends */\n onResizeEnd?: OnResizeEnd\n /** Callback to determine if resize should proceed */\n shouldResize?: ShouldResize\n /** Whether the node is resizable (default: true) */\n isVisible?: boolean\n /** CSS color for the resize handle lines/corners */\n color?: string\n}\n\n/**\n * Initialize resize handles on a node element.\n *\n * Creates resize handle elements (corners and/or lines) and attaches\n * XYResizer from @xyflow/system for the resize logic.\n *\n * Usage:\n * // Inside a custom node type function:\n * initNodeResizer(this.parentElement, {\n * nodeId: props.id,\n * store,\n * minWidth: 100,\n * minHeight: 50,\n * onResize: (event, params) => console.log('Resized:', params),\n * })\n */\nexport function initNodeResizer<NodeType extends NodeBase>(\n nodeEl: HTMLElement,\n nodeId: string,\n store: FlowStore<NodeType>,\n options: NodeResizerOptions = {},\n): () => void {\n const {\n minWidth = 10,\n minHeight = 10,\n maxWidth = Number.MAX_SAFE_INTEGER,\n maxHeight = Number.MAX_SAFE_INTEGER,\n keepAspectRatio = false,\n variant = ResizeControlVariant.Handle,\n onResizeStart,\n onResize,\n onResizeEnd,\n shouldResize,\n isVisible = true,\n color,\n } = options\n\n if (!isVisible) return () => {}\n\n const resolvedVariant =\n typeof variant === 'string'\n ? variant === 'line'\n ? ResizeControlVariant.Line\n : ResizeControlVariant.Handle\n : variant\n\n // Determine which positions to use based on variant\n const positions: ControlPosition[] =\n resolvedVariant === ResizeControlVariant.Line\n ? (XY_RESIZER_LINE_POSITIONS as ControlPosition[])\n : XY_RESIZER_HANDLE_POSITIONS\n\n // Mark node as resizable for CSS\n nodeEl.classList.add('bf-flow__node--resizable')\n\n // Container for resize handles\n const container = document.createElement('div')\n container.className = 'bf-flow__node-resizer'\n nodeEl.appendChild(container)\n\n const resizerInstances: XYResizerInstance[] = []\n\n for (const position of positions) {\n const handleEl = document.createElement('div')\n handleEl.className = `bf-flow__resize-handle bf-flow__resize-handle--${position}`\n\n if (resolvedVariant === ResizeControlVariant.Line) {\n handleEl.classList.add('bf-flow__resize-handle--line')\n } else {\n handleEl.classList.add('bf-flow__resize-handle--corner')\n }\n\n handleEl.dataset.position = position\n\n if (color) {\n handleEl.style.setProperty('--bf-resize-color', color)\n }\n\n container.appendChild(handleEl)\n\n // Create XYResizer instance for this handle\n const resizerInstance = XYResizer({\n domNode: handleEl as HTMLDivElement,\n nodeId,\n getStoreItems: () => {\n const nodeLookup = untrack(store.nodeLookup)\n const transform = store.getTransform()\n return {\n nodeLookup,\n transform,\n snapGrid: store.snapToGrid ? store.snapGrid : undefined,\n snapToGrid: store.snapToGrid,\n nodeOrigin: store.nodeOrigin,\n paneDomNode: untrack(store.domNode) as HTMLDivElement | null,\n }\n },\n onChange: (changes: XYResizerChange, childChanges: XYResizerChildChange[]) => {\n // Apply dimension and position changes to the node\n const lookup = untrack(store.nodeLookup)\n const node = lookup.get(nodeId)\n if (!node) return\n\n // Update measured dimensions\n if (changes.width != null) {\n node.measured.width = changes.width\n nodeEl.style.width = `${changes.width}px`\n }\n if (changes.height != null) {\n node.measured.height = changes.height\n nodeEl.style.height = `${changes.height}px`\n }\n\n // Update position if changed (e.g., resizing from top-left)\n if (changes.x != null || changes.y != null) {\n const newX = changes.x ?? node.internals.positionAbsolute.x\n const newY = changes.y ?? node.internals.positionAbsolute.y\n\n node.internals.positionAbsolute = { x: newX, y: newY }\n node.internals.userNode.position = { x: newX, y: newY }\n nodeEl.style.transform = `translate(${newX}px, ${newY}px)`\n }\n\n // Apply child position changes\n for (const childChange of childChanges) {\n const childNode = lookup.get(childChange.id)\n if (childNode) {\n childNode.internals.positionAbsolute = childChange.position\n childNode.internals.userNode.position = childChange.position\n }\n }\n\n // Update node internals for edge recalculation\n const updates = new Map<string, InternalNodeUpdate>()\n updates.set(nodeId, {\n id: nodeId,\n nodeElement: nodeEl as HTMLDivElement,\n force: true,\n })\n\n const parentLookup = untrack(store.parentLookup)\n updateNodeInternals(\n updates,\n lookup,\n parentLookup,\n untrack(store.domNode),\n store.nodeOrigin,\n store.nodeExtent,\n )\n\n // Notify position-dependent subscribers (edges etc.)\n store.triggerPositionUpdate()\n },\n onEnd: (change) => {\n // Commit final dimensions to the nodes array\n store.setNodes((prev) =>\n prev.map((n) =>\n n.id === nodeId\n ? {\n ...n,\n position: { x: change.x, y: change.y },\n measured: { width: change.width, height: change.height },\n style: {\n ...(n as any).style,\n width: change.width,\n height: change.height,\n },\n }\n : n,\n ),\n )\n },\n })\n\n // Determine resize direction for line handles\n const isLineHandle = resolvedVariant === ResizeControlVariant.Line\n let resizeDirection: ResizeControlDirection | undefined\n if (isLineHandle) {\n if (position === 'left' || position === 'right') {\n resizeDirection = 'horizontal'\n } else if (position === 'top' || position === 'bottom') {\n resizeDirection = 'vertical'\n }\n }\n\n // Configure the resizer instance\n resizerInstance.update({\n controlPosition: position,\n boundaries: { minWidth, minHeight, maxWidth, maxHeight },\n keepAspectRatio,\n resizeDirection,\n onResizeStart,\n onResize,\n onResizeEnd,\n shouldResize,\n })\n\n resizerInstances.push(resizerInstance)\n }\n\n // Cleanup function\n const cleanup = () => {\n for (const instance of resizerInstances) {\n instance.destroy()\n }\n container.remove()\n nodeEl.classList.remove('bf-flow__node--resizable')\n }\n\n onCleanup(cleanup)\n\n return cleanup\n}\n\n// Re-export types that consumers might need\nexport { ResizeControlVariant }\nexport type {\n ControlPosition,\n ControlLinePosition,\n OnResize,\n OnResizeStart,\n OnResizeEnd,\n ShouldResize,\n ResizeControlDirection,\n}\n",
123
+ "/**\n * Stable CSS class names for xyflow primitives.\n *\n * Exported as constants so the registry-side `<Flow>` / `<Background>` /\n * etc. can reference them via `className={BF_FLOW}` instead of\n * `className=\"bf-flow\"`. site/ui's `cssLayerPrefixer` only rewrites\n * locally-declared static `className` literals; imported identifiers are\n * left alone, which keeps `bf-flow*` un-prefixed for the e2e selectors\n * (the same trick chart uses with `CHART_CLASS_GRID` etc.).\n */\n\nexport const BF_FLOW = 'bf-flow'\nexport const BF_FLOW_VIEWPORT = 'bf-flow__viewport'\nexport const BF_FLOW_EDGES = 'bf-flow__edges'\nexport const BF_FLOW_NODES = 'bf-flow__nodes'\n\nexport const BF_FLOW_NODE = 'bf-flow__node'\nexport const BF_FLOW_NODE_GROUP = 'bf-flow__node--group'\nexport const BF_FLOW_NODE_CHILD = 'bf-flow__node--child'\nexport const BF_FLOW_NODE_SELECTED = 'bf-flow__node--selected'\n// Strips the default node card styling (padding / border / background)\n// so a `renderNode` / `nodeTypes` body provides its own visual.\nexport const BF_FLOW_NODE_CUSTOM = 'bf-flow__node--custom'\n\nexport const BF_FLOW_EDGE = 'bf-flow__edge'\nexport const BF_FLOW_EDGE_SELECTED = 'bf-flow__edge--selected'\nexport const BF_FLOW_EDGE_ANIMATED = 'bf-flow__edge--animated'\n\nexport const BF_FLOW_HANDLE = 'bf-flow__handle'\nexport const BF_FLOW_HANDLE_TARGET = 'bf-flow__handle--target'\nexport const BF_FLOW_HANDLE_SOURCE = 'bf-flow__handle--source'\n\nexport const BF_FLOW_CONTROLS = 'bf-flow__controls'\nexport const BF_FLOW_CONTROLS_BUTTON = 'bf-flow__controls-button'\n\nexport const BF_FLOW_MINIMAP = 'bf-flow__minimap'\nexport const BF_FLOW_MINIMAP_MASK = 'bf-flow__minimap-mask'\n\n// `xyflow__viewport` is a @xyflow/system compatibility class kept on the\n// viewport wrapper.\nexport const XYFLOW_VIEWPORT = 'xyflow__viewport'\n",
124
+ "/**\n * React Flow compatibility shims for desk migration.\n *\n * These functions mirror the React Flow hooks API so that\n * desk components can be ported with minimal changes.\n */\n\nimport { untrack } from '@barefootjs/client'\nimport { addEdge as addEdgeUtil, reconnectEdge as reconnectEdgeUtil, pointToRendererPoint } from '@xyflow/system'\nimport { useFlow } from './hooks'\nimport type { NodeBase, EdgeBase, Viewport, XYPosition } from './types'\nimport type { Connection, NodeChange, EdgeChange } from '@xyflow/system'\n\n/**\n * useNodesState — mirrors React Flow's useNodesState.\n * Returns [nodes getter, setNodes, onNodesChange handler].\n */\nexport function useNodesState<NodeType extends NodeBase = NodeBase>(\n initialNodes: NodeType[],\n): [() => NodeType[], (updater: NodeType[] | ((prev: NodeType[]) => NodeType[])) => void, (changes: NodeChange[]) => void] {\n const store = useFlow<NodeType>()\n store.setNodes(initialNodes)\n\n function onNodesChange(changes: NodeChange[]) {\n store.setNodes((prev) => applyNodeChanges(prev, changes))\n }\n\n return [store.nodes, store.setNodes, onNodesChange]\n}\n\n/**\n * useEdgesState — mirrors React Flow's useEdgesState.\n * Returns [edges getter, setEdges, onEdgesChange handler].\n */\nexport function useEdgesState<EdgeType extends EdgeBase = EdgeBase>(\n initialEdges: EdgeType[],\n): [() => EdgeType[], (updater: EdgeType[] | ((prev: EdgeType[]) => EdgeType[])) => void, (changes: EdgeChange[]) => void] {\n const store = useFlow<NodeBase, EdgeType>()\n store.setEdges(initialEdges)\n\n function onEdgesChange(changes: EdgeChange[]) {\n store.setEdges((prev) => applyEdgeChanges(prev, changes))\n }\n\n return [store.edges, store.setEdges, onEdgesChange]\n}\n\n/**\n * useReactFlow — mirrors React Flow's useReactFlow hook.\n * Returns an object with common flow manipulation methods.\n */\nexport function useReactFlow<\n NodeType extends NodeBase = NodeBase,\n EdgeType extends EdgeBase = EdgeBase,\n>() {\n const store = useFlow<NodeType, EdgeType>()\n\n return {\n // Getters\n getNodes: (): NodeType[] => untrack(store.nodes),\n getEdges: (): EdgeType[] => untrack(store.edges),\n getNode: (id: string): NodeType | undefined =>\n untrack(store.nodes).find((n) => n.id === id),\n getZoom: (): number => untrack(store.viewport).zoom,\n getViewport: (): Viewport => untrack(store.viewport),\n\n // Setters\n setNodes: store.setNodes,\n setEdges: store.setEdges,\n setViewport: (vp: Viewport) => {\n const pz = untrack(store.panZoom)\n if (pz) pz.setViewport(vp)\n },\n setCenter: (x: number, y: number, options?: { zoom?: number; duration?: number }) => {\n const pz = untrack(store.panZoom)\n if (!pz) return\n const w = untrack(store.width)\n const h = untrack(store.height)\n const zoom = options?.zoom ?? untrack(store.viewport).zoom\n pz.setViewport(\n { x: w / 2 - x * zoom, y: h / 2 - y * zoom, zoom },\n { duration: options?.duration },\n )\n },\n\n // Actions\n fitView: store.fitView,\n zoomIn: (options?: { duration?: number }) => {\n const pz = untrack(store.panZoom)\n pz?.scaleBy(1.2, options)\n },\n zoomOut: (options?: { duration?: number }) => {\n const pz = untrack(store.panZoom)\n pz?.scaleBy(1 / 1.2, options)\n },\n zoomTo: (zoom: number, options?: { duration?: number }) => {\n const pz = untrack(store.panZoom)\n pz?.scaleTo(zoom, options)\n },\n\n // Node mutations\n updateNode: (id: string, update: Partial<NodeType> | ((node: NodeType) => Partial<NodeType>)) => {\n store.setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== id) return n\n const patch = typeof update === 'function' ? update(n) : update\n return { ...n, ...patch }\n }),\n )\n },\n updateNodeData: (id: string, data: Partial<NodeType['data']> | ((prev: NodeType['data']) => Partial<NodeType['data']>)) => {\n store.setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== id) return n\n const newData = typeof data === 'function' ? data(n.data) : data\n return { ...n, data: { ...n.data, ...newData } }\n }),\n )\n },\n\n // Edge mutations\n addEdges: (newEdges: EdgeType[]) => {\n store.setEdges((prev) => [...prev, ...newEdges])\n },\n\n // Deletion\n deleteElements: store.deleteElements,\n\n // Coordinate conversion\n screenToFlowPosition: (position: XYPosition): XYPosition => {\n const domNode = untrack(store.domNode)\n if (!domNode) return position\n const rect = domNode.getBoundingClientRect()\n const transform = store.getTransform()\n return pointToRendererPoint(\n { x: position.x - rect.left, y: position.y - rect.top },\n transform,\n )\n },\n }\n}\n\n/**\n * useViewport — reactive viewport getter.\n */\nexport { useViewport } from './hooks'\n\n/**\n * addEdge utility — wraps @xyflow/system's addEdge.\n */\nexport function addEdge<EdgeType extends EdgeBase = EdgeBase>(\n connection: Connection,\n edges: EdgeType[],\n): EdgeType[] {\n return addEdgeUtil(connection, edges) as EdgeType[]\n}\n\n/**\n * reconnectEdge utility — wraps @xyflow/system's reconnectEdge.\n */\nexport function reconnectEdge<EdgeType extends EdgeBase = EdgeBase>(\n oldEdge: EdgeType,\n newConnection: Connection,\n edges: EdgeType[],\n): EdgeType[] {\n return reconnectEdgeUtil(oldEdge, newConnection, edges) as EdgeType[]\n}\n\n// --- Internal helpers ---\n\nfunction applyNodeChanges<NodeType extends NodeBase>(\n nodes: NodeType[],\n changes: NodeChange[],\n): NodeType[] {\n let result = [...nodes]\n\n for (const change of changes) {\n switch (change.type) {\n case 'position':\n result = result.map((n) =>\n n.id === change.id\n ? {\n ...n,\n ...(change.position ? { position: change.position } : {}),\n dragging: change.dragging ?? n.dragging,\n }\n : n,\n )\n break\n case 'dimensions':\n result = result.map((n) =>\n n.id === change.id && change.dimensions\n ? { ...n, width: change.dimensions.width, height: change.dimensions.height }\n : n,\n )\n break\n case 'select':\n result = result.map((n) =>\n n.id === change.id ? { ...n, selected: change.selected } : n,\n )\n break\n case 'remove':\n result = result.filter((n) => n.id !== change.id)\n break\n case 'add':\n result.push(change.item as NodeType)\n break\n }\n }\n\n return result\n}\n\nfunction applyEdgeChanges<EdgeType extends EdgeBase>(\n edges: EdgeType[],\n changes: EdgeChange[],\n): EdgeType[] {\n let result = [...edges]\n\n for (const change of changes) {\n switch (change.type) {\n case 'select':\n result = result.map((e) =>\n e.id === change.id ? { ...e, selected: change.selected } : e,\n )\n break\n case 'remove':\n result = result.filter((e) => e.id !== change.id)\n break\n case 'add':\n result.push(change.item as EdgeType)\n break\n }\n }\n\n return result\n}\n"
125
+ ],
126
+ "mappings": "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",
127
+ "debugId": "6CACF743F8DD910B64756E2164756E21",
128
+ "names": []
129
+ }