@dschz/solid-flow 0.1.4 → 0.2.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.
@@ -1,7 +1,7 @@
1
- import { delegateEvents, createComponent, Portal, template, spread, mergeProps as mergeProps$1, insert, effect, setAttribute, className, style, use, Dynamic, memo, addEventListener } from 'solid-js/web';
2
- import { createContext, Show, mergeProps, splitProps, createSignal, createMemo, For, createEffect, onCleanup, onMount, batch, Index, useContext, createComputed, mapArray, untrack } from 'solid-js';
1
+ import { delegateEvents, createComponent, Portal, template, spread, mergeProps as mergeProps$1, insert, effect, setAttribute, className, style, use, Dynamic, addEventListener, memo } from 'solid-js/web';
2
+ import { createContext, Show, mergeProps, splitProps, createSignal, createMemo, For, createEffect, onCleanup, onMount, batch, Index, useContext, untrack, createComputed, mapArray } from 'solid-js';
3
3
  import clsx, { clsx as clsx$1 } from 'clsx';
4
- import { infiniteExtent, getMarkerId, getSmoothStepPath, getStraightPath, createMarkerIds, nodeHasDimensions, XYPanZoom, getConnectionStatus, XYMinimap, getNodeDimensions, XYResizer, XY_RESIZER_LINE_POSITIONS, XY_RESIZER_HANDLE_POSITIONS, areConnectionMapsEqual, shallowNodeData, getNodesBounds, rendererPointToPoint, pointToRendererPoint, getElementsToRemove, isRectObject, getOverlappingArea, nodeToRect, getViewportForBounds, isNumeric, devWarn, isMacOs, isNodeBase, evaluateAbsolutePosition, isEdgeBase, getBezierPath, XYHandle, elementSelectionKeys, getNodesInside, isInputDOMNode, getEventPosition, getHostForElement, getNodeToolbarTransform, getInternalNodesBounds, getBoundsOfRects, XYDrag, SelectionMode, handleConnectionChange, initialConnection, clampPosition, getNodePositionWithOrigin, isCoordinateExtent, isEdgeVisible, getEdgePosition, getElevatedEdgeZIndex, mergeAriaLabelConfig, panBy, snapPosition, calculateNodePosition, fitViewport, addEdge, updateNodeInternals, updateAbsolutePositions, clampPositionToParent } from '@xyflow/system';
4
+ import { infiniteExtent, getMarkerId, getSmoothStepPath, getStraightPath, createMarkerIds, nodeHasDimensions, XYPanZoom, getConnectionStatus, getEdgeToolbarTransform, XYMinimap, getNodeDimensions, XYResizer, XY_RESIZER_LINE_POSITIONS, XY_RESIZER_HANDLE_POSITIONS, areConnectionMapsEqual, shallowNodeData, getNodesBounds, rendererPointToPoint, pointToRendererPoint, getElementsToRemove, isRectObject, getOverlappingArea, nodeToRect, getViewportForBounds, isNumeric, createDevWarn, isMacOs, isNodeBase, evaluateAbsolutePosition, isEdgeBase, getBezierPath, XYHandle, elementSelectionKeys, getNodesInside, isInputDOMNode, getEventPosition, getHostForElement, getNodeToolbarTransform, getInternalNodesBounds, getBoundsOfRects, XYDrag, handleConnectionChange, initialConnection, clampPosition, getNodePositionWithOrigin, isCoordinateExtent, isEdgeVisible, getEdgePosition, getElevatedEdgeZIndex, calcAutoPan, SelectionMode, mergeAriaLabelConfig, panBy, snapPosition, calculateNodePosition, fitViewport, addEdge, updateNodeInternals, updateAbsolutePositions, clampPositionToParent } from '@xyflow/system';
5
5
  export { ConnectionLineType, ConnectionMode, MarkerType, PanOnScrollMode, Position, ResizeControlVariant, SelectionMode, addEdge, getBezierEdgeCenter, getBezierPath, getConnectedEdges, getEdgeCenter, getIncomers, getNodesBounds, getOutgoers, getSmoothStepPath, getStraightPath, getViewportForBounds } from '@xyflow/system';
6
6
  import { produce, unwrap, createStore } from 'solid-js/store';
7
7
  import { createResizeObserver } from '@solid-primitives/resize-observer';
@@ -1490,16 +1490,26 @@ var Pane = (props) => {
1490
1490
  } = useInternalSolidFlow();
1491
1491
  let container;
1492
1492
  let containerBounds = null;
1493
+ let connectionEndedOnPane = false;
1493
1494
  let selectionInProgress = false;
1494
1495
  let selectedNodeIds = /* @__PURE__ */ new Set();
1495
1496
  let selectedEdgeIds = /* @__PURE__ */ new Set();
1497
+ let autoPanId = 0;
1498
+ let position = {
1499
+ x: 0,
1500
+ y: 0
1501
+ };
1502
+ let autoPanStarted = false;
1503
+ const autoPanOnSelection = () => props.autoPanOnSelection ?? true;
1504
+ const paneClickDistance = () => props.paneClickDistance ?? 1;
1496
1505
  const _panOnDrag = () => store.panActivationKeyPressed || props.panOnDrag;
1497
- const isSelecting = () => store.selectionKeyPressed || store.selectionRect || props.selectionOnDrag && _panOnDrag() !== true;
1498
- const hasActiveSelection = () => store.elementsSelectable && (isSelecting() || store.selectionRectMode === "user");
1506
+ const isSelecting = () => store.selectionKeyPressed || !!store.selectionRect || props.selectionOnDrag && _panOnDrag() !== true;
1507
+ const isSelectionEnabled = () => store.elementsSelectable && (isSelecting() || store.selectionRectMode === "user");
1499
1508
  const onClick = (event) => {
1500
1509
  if (event.target !== container) return;
1501
- if (selectionInProgress) {
1510
+ if (selectionInProgress || store.connection.inProgress || connectionEndedOnPane) {
1502
1511
  selectionInProgress = false;
1512
+ connectionEndedOnPane = false;
1503
1513
  return;
1504
1514
  }
1505
1515
  props.onPaneClick?.({
@@ -1508,46 +1518,62 @@ var Pane = (props) => {
1508
1518
  batch(() => {
1509
1519
  actions.unselectNodesAndEdges();
1510
1520
  actions.setSelectionRectMode(void 0);
1521
+ actions.setSelectionRect(void 0);
1511
1522
  });
1512
1523
  };
1513
- const onPointerDown = (event) => {
1524
+ const onPointerDownCapture = (event) => {
1525
+ if (event.pointerType === "touch" && _panOnDrag() !== false && !store.selectionKeyPressed) {
1526
+ return;
1527
+ }
1514
1528
  containerBounds = container?.getBoundingClientRect() ?? null;
1515
- if (!store.elementsSelectable || !isSelecting() || event.button !== 0 || event.target !== container || !containerBounds) {
1529
+ if (!containerBounds) return;
1530
+ const eventTargetIsContainer = event.target === container;
1531
+ const isNoKeyEvent = !eventTargetIsContainer && !!event.target.closest(".nokey");
1532
+ const isSelectionActive = props.selectionOnDrag && eventTargetIsContainer || store.selectionKeyPressed;
1533
+ if (isNoKeyEvent || !isSelecting() || !isSelectionActive || event.button !== 0 || !event.isPrimary) {
1516
1534
  return;
1517
1535
  }
1518
1536
  event.target?.setPointerCapture?.(event.pointerId);
1537
+ selectionInProgress = false;
1538
+ autoPanStarted = false;
1519
1539
  const {
1520
1540
  x,
1521
1541
  y
1522
1542
  } = getEventPosition(event, containerBounds);
1523
- batch(() => {
1524
- actions.unselectNodesAndEdges();
1525
- actions.setSelectionRect({
1526
- width: 0,
1527
- height: 0,
1528
- startX: x,
1529
- startY: y,
1530
- x,
1531
- y
1532
- });
1543
+ const userSelectionFlowOrigin = pointToRendererPoint({
1544
+ x,
1545
+ y
1546
+ }, store.transform);
1547
+ actions.setSelectionRect({
1548
+ width: 0,
1549
+ height: 0,
1550
+ startX: userSelectionFlowOrigin.x,
1551
+ startY: userSelectionFlowOrigin.y,
1552
+ x,
1553
+ y
1533
1554
  });
1555
+ if (!eventTargetIsContainer) {
1556
+ event.stopPropagation();
1557
+ event.preventDefault();
1558
+ }
1534
1559
  };
1535
- const onPointerMove = (event) => {
1536
- if (!isSelecting() || !containerBounds || !store.selectionRect) {
1560
+ const commitUserSelectionRect = (mouseX, mouseY) => {
1561
+ const selectionRect = store.selectionRect;
1562
+ if (selectionRect?.startX === void 0 || selectionRect.startY === void 0) {
1537
1563
  return;
1538
1564
  }
1539
- selectionInProgress = true;
1540
- const mousePos = getEventPosition(event, containerBounds);
1541
- const {
1542
- startX = 0,
1543
- startY = 0
1544
- } = store.selectionRect;
1565
+ const userStartPosition = {
1566
+ x: selectionRect.startX,
1567
+ y: selectionRect.startY
1568
+ };
1569
+ const screenStart = rendererPointToPoint(userStartPosition, store.transform);
1545
1570
  const nextUserSelectRect = {
1546
- ...store.selectionRect,
1547
- x: mousePos.x < startX ? mousePos.x : startX,
1548
- y: mousePos.y < startY ? mousePos.y : startY,
1549
- width: Math.abs(mousePos.x - startX),
1550
- height: Math.abs(mousePos.y - startY)
1571
+ startX: userStartPosition.x,
1572
+ startY: userStartPosition.y,
1573
+ x: mouseX < screenStart.x ? mouseX : screenStart.x,
1574
+ y: mouseY < screenStart.y ? mouseY : screenStart.y,
1575
+ width: Math.abs(mouseX - screenStart.x),
1576
+ height: Math.abs(mouseY - screenStart.y)
1551
1577
  };
1552
1578
  const prevSelectedNodeIds = selectedNodeIds;
1553
1579
  const prevSelectedEdgeIds = selectedEdgeIds;
@@ -1591,22 +1617,93 @@ var Pane = (props) => {
1591
1617
  actions.setSelectionRect(nextUserSelectRect);
1592
1618
  });
1593
1619
  };
1620
+ const autoPan = () => {
1621
+ if (!autoPanOnSelection() || !containerBounds) {
1622
+ return;
1623
+ }
1624
+ const [x = 0, y = 0] = calcAutoPan(position, containerBounds, store.autoPanSpeed);
1625
+ void actions.panBy({
1626
+ x,
1627
+ y
1628
+ }).then((panned) => {
1629
+ if (!selectionInProgress || !panned) {
1630
+ autoPanId = requestAnimationFrame(autoPan);
1631
+ return;
1632
+ }
1633
+ commitUserSelectionRect(position.x, position.y);
1634
+ autoPanId = requestAnimationFrame(autoPan);
1635
+ });
1636
+ };
1637
+ const cleanupAutoPan = () => {
1638
+ cancelAnimationFrame(autoPanId);
1639
+ autoPanId = 0;
1640
+ autoPanStarted = false;
1641
+ };
1642
+ onCleanup(() => {
1643
+ cleanupAutoPan();
1644
+ });
1645
+ const onPointerMove = (event) => {
1646
+ if (!isSelecting() || !containerBounds || !store.selectionRect) {
1647
+ return;
1648
+ }
1649
+ const mousePos = getEventPosition(event, containerBounds);
1650
+ position = {
1651
+ x: mousePos.x,
1652
+ y: mousePos.y
1653
+ };
1654
+ const userStartPosition = {
1655
+ x: store.selectionRect.startX ?? 0,
1656
+ y: store.selectionRect.startY ?? 0
1657
+ };
1658
+ const screenStart = rendererPointToPoint(userStartPosition, store.transform);
1659
+ if (!selectionInProgress) {
1660
+ const requiredDistance = store.selectionKeyPressed ? 0 : paneClickDistance();
1661
+ const distance = Math.hypot(mousePos.x - screenStart.x, mousePos.y - screenStart.y);
1662
+ if (distance <= requiredDistance) {
1663
+ return;
1664
+ }
1665
+ actions.unselectNodesAndEdges();
1666
+ props.onSelectionStart?.(event);
1667
+ }
1668
+ selectionInProgress = true;
1669
+ if (!autoPanStarted) {
1670
+ autoPan();
1671
+ autoPanStarted = true;
1672
+ }
1673
+ commitUserSelectionRect(mousePos.x, mousePos.y);
1674
+ };
1594
1675
  const onPointerUp = (event) => {
1676
+ if (!isSelectionEnabled()) {
1677
+ if (event.target === container && store.connection.inProgress) {
1678
+ connectionEndedOnPane = true;
1679
+ }
1680
+ return;
1681
+ }
1595
1682
  if (event.button !== 0) return;
1596
1683
  event.target?.releasePointerCapture?.(event.pointerId);
1597
- if (!isSelecting() && store.selectionRectMode === "user" && event.target === container) {
1684
+ if (!selectionInProgress && event.target === container) {
1598
1685
  onClick(event);
1599
1686
  }
1600
1687
  batch(() => {
1601
1688
  actions.setSelectionRect(void 0);
1602
- if (selectedNodeIds.size > 0) {
1603
- actions.setSelectionRectMode("nodes");
1689
+ if (selectionInProgress) {
1690
+ actions.setSelectionRectMode(selectedNodeIds.size > 0 ? "nodes" : void 0);
1604
1691
  }
1605
1692
  });
1606
- if (store.selectionKeyPressed) {
1693
+ if (selectionInProgress) {
1694
+ props.onSelectionEnd?.(event);
1695
+ }
1696
+ cleanupAutoPan();
1697
+ };
1698
+ const onPointerCancel = (event) => {
1699
+ event.target?.releasePointerCapture?.(event.pointerId);
1700
+ cleanupAutoPan();
1701
+ };
1702
+ const onClickCapture = (event) => {
1703
+ if (selectionInProgress) {
1704
+ event.stopPropagation();
1607
1705
  selectionInProgress = false;
1608
1706
  }
1609
- props.onSelectionEnd?.(event);
1610
1707
  };
1611
1708
  const onContextMenu = (event) => {
1612
1709
  if (event.target !== container) return;
@@ -1622,12 +1719,24 @@ var Pane = (props) => {
1622
1719
  return (() => {
1623
1720
  var _el$ = _tmpl$11();
1624
1721
  _el$.$$contextmenu = onContextMenu;
1625
- _el$.$$pointerup = (e) => hasActiveSelection() ? onPointerUp(e) : void 0;
1626
- _el$.$$pointermove = (e) => hasActiveSelection() ? onPointerMove(e) : void 0;
1627
- _el$.$$pointerdown = (e) => hasActiveSelection() ? onPointerDown(e) : void 0;
1628
- _el$.$$click = (e) => hasActiveSelection() ? void 0 : onClick(e);
1629
- var _ref$ = container;
1630
- typeof _ref$ === "function" ? use(_ref$, _el$) : container = _el$;
1722
+ _el$.addEventListener("pointercancel", (e) => isSelectionEnabled() ? onPointerCancel(e) : void 0);
1723
+ _el$.$$pointerup = onPointerUp;
1724
+ _el$.$$pointermove = (e) => isSelectionEnabled() ? onPointerMove(e) : void 0;
1725
+ addEventListener(_el$, "pointerdown", {
1726
+ capture: true,
1727
+ handleEvent: (e) => {
1728
+ if (isSelectionEnabled()) onPointerDownCapture(e);
1729
+ }
1730
+ });
1731
+ _el$.$$click = (e) => isSelectionEnabled() ? void 0 : onClick(e);
1732
+ use((el) => {
1733
+ container = el;
1734
+ el.addEventListener("click", (e) => {
1735
+ if (isSelectionEnabled()) onClickCapture(e);
1736
+ }, {
1737
+ capture: true
1738
+ });
1739
+ }, _el$);
1631
1740
  insert(_el$, () => props.children);
1632
1741
  effect(() => className(_el$, clsx("solid-flow__container solid-flow__pane", {
1633
1742
  selection: isSelecting(),
@@ -1637,7 +1746,7 @@ var Pane = (props) => {
1637
1746
  return _el$;
1638
1747
  })();
1639
1748
  };
1640
- delegateEvents(["click", "pointerdown", "pointermove", "pointerup", "contextmenu"]);
1749
+ delegateEvents(["click", "pointermove", "pointerup", "contextmenu"]);
1641
1750
  var _tmpl$12 = /* @__PURE__ */ template(`<div>`);
1642
1751
  var Panel = (props) => {
1643
1752
  const {
@@ -1724,7 +1833,6 @@ var Zoom = (props) => {
1724
1833
  maxZoom: store.maxZoom,
1725
1834
  translateExtent: store.translateExtent,
1726
1835
  viewport: viewPort(),
1727
- paneClickDistance: props.paneClickDistance,
1728
1836
  onDraggingChange: actions.setDragging,
1729
1837
  onPanZoomStart: props.onMoveStart,
1730
1838
  onPanZoom: props.onMove,
@@ -1742,11 +1850,12 @@ var Zoom = (props) => {
1742
1850
  createEffect(() => {
1743
1851
  panZoomInstance.update({
1744
1852
  lib: store.lib,
1853
+ panActivationKeyPressed: store.panActivationKeyPressed,
1745
1854
  zoomActivationKeyPressed: store.zoomActivationKeyPressed,
1746
1855
  noPanClassName: store.noPanClass,
1747
1856
  noWheelClassName: store.noWheelClass,
1748
1857
  userSelectionActive: !!store.selectionRect,
1749
- panOnScrollSpeed: 0.5,
1858
+ panOnScrollSpeed: props.panOnScrollSpeed,
1750
1859
  panOnDrag: panOnDrag(),
1751
1860
  panOnScroll: panOnScroll(),
1752
1861
  zoomOnScroll: props.zoomOnScroll,
@@ -1754,6 +1863,9 @@ var Zoom = (props) => {
1754
1863
  zoomOnPinch: props.zoomOnPinch,
1755
1864
  panOnScrollMode: props.panOnScrollMode,
1756
1865
  preventScrolling: typeof props.preventScrolling === "boolean" ? props.preventScrolling : true,
1866
+ paneClickDistance: props.paneClickDistance,
1867
+ selectionOnDrag: props.selectionOnDrag,
1868
+ connectionInProgress: store.connection.inProgress,
1757
1869
  onTransformChange
1758
1870
  });
1759
1871
  });
@@ -2470,7 +2582,51 @@ var Controls = (props) => {
2470
2582
  }
2471
2583
  }));
2472
2584
  };
2473
- var _tmpl$31 = /* @__PURE__ */ template(`<svg><rect></svg>`, false, true, false);
2585
+ var _tmpl$31 = /* @__PURE__ */ template(`<div>`);
2586
+ var EdgeToolbar = (props) => {
2587
+ const [local, rest] = splitProps(props, ["x", "y", "alignX", "alignY", "isVisible", "selectEdgeOnClick", "class", "children"]);
2588
+ const {
2589
+ store,
2590
+ edgeLookup
2591
+ } = useInternalSolidFlow();
2592
+ const edgeId = useEdgeId();
2593
+ const isActive = () => typeof local.isVisible === "boolean" ? local.isVisible : !!edgeLookup.get(edgeId())?.selected;
2594
+ const transform = () => getEdgeToolbarTransform(local.x, local.y, store.viewport.zoom, local.alignX ?? "center", local.alignY ?? "center");
2595
+ return createComponent(Show, {
2596
+ get when() {
2597
+ return isActive();
2598
+ },
2599
+ get children() {
2600
+ return createComponent(EdgeLabel, {
2601
+ get selectEdgeOnClick() {
2602
+ return local.selectEdgeOnClick;
2603
+ },
2604
+ transparent: true,
2605
+ get children() {
2606
+ var _el$ = _tmpl$31();
2607
+ spread(_el$, mergeProps$1({
2608
+ get ["class"]() {
2609
+ return clsx("solid-flow__edge-toolbar", local.class);
2610
+ },
2611
+ get style() {
2612
+ return {
2613
+ position: "absolute",
2614
+ transform: transform(),
2615
+ "transform-origin": "0 0"
2616
+ };
2617
+ },
2618
+ get ["data-id"]() {
2619
+ return edgeId();
2620
+ }
2621
+ }, rest), false, true);
2622
+ insert(_el$, () => local.children);
2623
+ return _el$;
2624
+ }
2625
+ });
2626
+ }
2627
+ });
2628
+ };
2629
+ var _tmpl$33 = /* @__PURE__ */ template(`<svg><rect></svg>`, false, true, false);
2474
2630
  var MiniMapNode = (props) => {
2475
2631
  const _props = mergeProps({
2476
2632
  borderRadius: 5,
@@ -2486,7 +2642,7 @@ var MiniMapNode = (props) => {
2486
2642
  return acc;
2487
2643
  }, {});
2488
2644
  return (() => {
2489
- var _el$ = _tmpl$31();
2645
+ var _el$ = _tmpl$33();
2490
2646
  effect((_p$) => {
2491
2647
  var _v$ = clsx("solid-flow__minimap-node", {
2492
2648
  selected: _props.selected
@@ -2517,7 +2673,7 @@ var MiniMapNode = (props) => {
2517
2673
  };
2518
2674
 
2519
2675
  // src/components/graph/plugins/minimap/MiniMap.tsx
2520
- var _tmpl$33 = /* @__PURE__ */ template(`<svg class=solid-flow__minimap-svg role=img><title></title><path class=solid-flow__minimap-mask fill-rule=evenodd pointer-events=none>`);
2676
+ var _tmpl$34 = /* @__PURE__ */ template(`<svg class=solid-flow__minimap-svg role=img><title></title><path class=solid-flow__minimap-mask fill-rule=evenodd pointer-events=none>`);
2521
2677
  var getAttrFunction = (func) => func instanceof Function ? func : () => func;
2522
2678
  var MiniMap = (props) => {
2523
2679
  const {
@@ -2626,7 +2782,7 @@ var MiniMap = (props) => {
2626
2782
  });
2627
2783
  });
2628
2784
  return (() => {
2629
- var _el$ = _tmpl$33(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
2785
+ var _el$ = _tmpl$34(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
2630
2786
  use(setRef, _el$);
2631
2787
  insert(_el$2, () => store.ariaLabelConfig["minimap.ariaLabel"]);
2632
2788
  insert(_el$, createComponent(Index, {
@@ -2709,7 +2865,7 @@ var MiniMap = (props) => {
2709
2865
  }
2710
2866
  }));
2711
2867
  };
2712
- var _tmpl$34 = /* @__PURE__ */ template(`<div>`);
2868
+ var _tmpl$35 = /* @__PURE__ */ template(`<div>`);
2713
2869
  var ResizeControl = (props) => {
2714
2870
  const _props = mergeProps({
2715
2871
  variant: "handle",
@@ -2792,7 +2948,7 @@ var ResizeControl = (props) => {
2792
2948
  });
2793
2949
  });
2794
2950
  return (() => {
2795
- var _el$ = _tmpl$34();
2951
+ var _el$ = _tmpl$35();
2796
2952
  var _ref$ = resizeControlRef;
2797
2953
  typeof _ref$ === "function" ? use(_ref$, _el$) : resizeControlRef = _el$;
2798
2954
  spread(_el$, mergeProps$1({
@@ -2853,6 +3009,12 @@ var NodeResizer = (props) => {
2853
3009
  });
2854
3010
  };
2855
3011
 
3012
+ // src/hooks/useColorMode.ts
3013
+ function useColorMode() {
3014
+ const { store } = useInternalSolidFlow();
3015
+ return () => store.colorMode;
3016
+ }
3017
+
2856
3018
  // src/hooks/useConnection.tsx
2857
3019
  function useConnection() {
2858
3020
  const {
@@ -2904,6 +3066,16 @@ function useHandleEdgeSelect() {
2904
3066
  };
2905
3067
  }
2906
3068
 
3069
+ // src/hooks/useInitialized.ts
3070
+ function useNodesInitialized() {
3071
+ const { store } = useInternalSolidFlow();
3072
+ return () => store.nodesInitialized;
3073
+ }
3074
+ function useViewportInitialized() {
3075
+ const { store } = useInternalSolidFlow();
3076
+ return () => store.viewportInitialized;
3077
+ }
3078
+
2907
3079
  // src/hooks/useInternalNode.tsx
2908
3080
  function useInternalNode(id) {
2909
3081
  const {
@@ -3227,7 +3399,7 @@ function useUpdateNodeInternals() {
3227
3399
  }
3228
3400
 
3229
3401
  // src/components/graph/plugins/NodeToolbar.tsx
3230
- var _tmpl$35 = /* @__PURE__ */ template(`<div class=solid-flow__node-toolbar>`);
3402
+ var _tmpl$36 = /* @__PURE__ */ template(`<div class=solid-flow__node-toolbar>`);
3231
3403
  var NodeToolbar = (props) => {
3232
3404
  const {
3233
3405
  store
@@ -3280,7 +3452,7 @@ var NodeToolbar = (props) => {
3280
3452
  return store.domNode;
3281
3453
  },
3282
3454
  get children() {
3283
- var _el$ = _tmpl$35();
3455
+ var _el$ = _tmpl$36();
3284
3456
  spread(_el$, mergeProps$1({
3285
3457
  get ["data-id"]() {
3286
3458
  return toolbarNodes().reduce((acc, node) => `${acc}${node.id} `, "").trim();
@@ -3302,7 +3474,7 @@ var NodeToolbar = (props) => {
3302
3474
  }
3303
3475
  });
3304
3476
  };
3305
- var _tmpl$36 = /* @__PURE__ */ template(`<div class=solid-flow__selection>`);
3477
+ var _tmpl$37 = /* @__PURE__ */ template(`<div class=solid-flow__selection>`);
3306
3478
  var Selection = (props) => {
3307
3479
  const _props = mergeProps({
3308
3480
  isVisible: true
@@ -3323,7 +3495,7 @@ var Selection = (props) => {
3323
3495
  return _props.isVisible;
3324
3496
  },
3325
3497
  get children() {
3326
- var _el$ = _tmpl$36();
3498
+ var _el$ = _tmpl$37();
3327
3499
  effect((_$p) => style(_el$, styles(), _$p));
3328
3500
  return _el$;
3329
3501
  }
@@ -3331,7 +3503,7 @@ var Selection = (props) => {
3331
3503
  };
3332
3504
 
3333
3505
  // src/components/graph/selection/NodeSelection.tsx
3334
- var _tmpl$37 = /* @__PURE__ */ template(`<div>`);
3506
+ var _tmpl$38 = /* @__PURE__ */ template(`<div>`);
3335
3507
  var NodeSelection = (props) => {
3336
3508
  const {
3337
3509
  store,
@@ -3403,7 +3575,7 @@ var NodeSelection = (props) => {
3403
3575
  return memo(() => !!(store.selectionRectMode === "nodes" && bounds() && isNumeric(bounds()?.x)))() && isNumeric(bounds()?.y);
3404
3576
  },
3405
3577
  get children() {
3406
- var _el$ = _tmpl$37();
3578
+ var _el$ = _tmpl$38();
3407
3579
  addEventListener(_el$, "keydown", store.disableKeyboardA11y ? void 0 : onKeyDown, true);
3408
3580
  _el$.$$contextmenu = onContextMenu;
3409
3581
  _el$.$$click = onClick;
@@ -3436,7 +3608,7 @@ var NodeSelection = (props) => {
3436
3608
  });
3437
3609
  };
3438
3610
  delegateEvents(["click", "contextmenu", "keydown"]);
3439
- var _tmpl$38 = /* @__PURE__ */ template(`<a href=https://solidflow.dev target=_blank rel="noopener noreferrer"aria-label="Solid Flow attribution">Solid Flow`);
3611
+ var _tmpl$39 = /* @__PURE__ */ template(`<a href=https://solidflow.dev target=_blank rel="noopener noreferrer"aria-label="Solid Flow attribution">Solid Flow`);
3440
3612
  var Attribution = (props) => {
3441
3613
  return createComponent(Show, {
3442
3614
  get when() {
@@ -3450,7 +3622,7 @@ var Attribution = (props) => {
3450
3622
  "class": "solid-flow__attribution",
3451
3623
  "data-message": "Feel free to remove the attribution or check out how you could support us: https://solidflow.dev/support-us",
3452
3624
  get children() {
3453
- return _tmpl$38();
3625
+ return _tmpl$39();
3454
3626
  }
3455
3627
  });
3456
3628
  }
@@ -3618,6 +3790,7 @@ var getDefaultFlowStateProps = () => ({
3618
3790
  autoPanOnNodeDrag: true,
3619
3791
  autoPanOnConnect: true,
3620
3792
  autoPanOnNodeFocus: true,
3793
+ autoPanOnSelection: true,
3621
3794
  autoPanSpeed: 15,
3622
3795
  elevateEdgesOnSelect: true,
3623
3796
  nodesDraggable: true,
@@ -3627,20 +3800,27 @@ var getDefaultFlowStateProps = () => ({
3627
3800
  elementsSelectable: true,
3628
3801
  selectNodesOnDrag: true,
3629
3802
  elevateNodesOnSelect: true,
3803
+ zIndexMode: "basic",
3630
3804
  onlyRenderVisibleElements: false,
3631
3805
  disableKeyboardA11y: false,
3632
3806
  defaultMarkerColor: "#b1b1b7",
3633
3807
  ariaLiveMessage: "",
3634
3808
  style: {},
3635
- isValidConnection: () => true,
3636
- onFlowError: devWarn
3809
+ isValidConnection: (() => true),
3810
+ onFlowError: createDevWarn("Solid Flow", "https://solidflow.dev/")
3637
3811
  });
3812
+ var SELECTED_NODE_Z = 1e3;
3813
+ var ROOT_PARENT_Z_INCREMENT = 10;
3638
3814
  var defaultOptions = {
3639
3815
  nodeOrigin: [0, 0],
3640
3816
  nodeExtent: infiniteExtent,
3641
3817
  elevateNodesOnSelect: true,
3642
- defaults: {}
3818
+ defaults: {},
3819
+ zIndexMode: "basic"
3643
3820
  };
3821
+ function isManualZIndexMode(zIndexMode) {
3822
+ return zIndexMode === "manual";
3823
+ }
3644
3824
  var adoptUserNodesDefaultOptions = {
3645
3825
  ...defaultOptions,
3646
3826
  checkEquality: true
@@ -3657,8 +3837,9 @@ function mergeObjects(base, incoming) {
3657
3837
  function adoptUserNodes(nodes, nodeLookup, parentLookup, options) {
3658
3838
  const _options = mergeObjects(adoptUserNodesDefaultOptions, options);
3659
3839
  let nodesInitialized = nodes.length > 0;
3840
+ const rootParentIndex = { i: 0 };
3660
3841
  const tmpLookup = new Map(nodeLookup);
3661
- const selectedNodeZ = _options?.elevateNodesOnSelect ? 1e3 : 0;
3842
+ const selectedNodeZ = _options?.elevateNodesOnSelect && !isManualZIndexMode(_options.zIndexMode) ? SELECTED_NODE_Z : 0;
3662
3843
  nodeLookup.clear();
3663
3844
  parentLookup.clear();
3664
3845
  for (const userNode of nodes) {
@@ -3684,7 +3865,7 @@ function adoptUserNodes(nodes, nodeLookup, parentLookup, options) {
3684
3865
  positionAbsolute: clampedPosition,
3685
3866
  // if user re-initializes the node or removes `measured` for whatever reason, we reset the handleBounds so that the node gets re-measured
3686
3867
  handleBounds: !userNode.measured ? void 0 : internalNode?.internals.handleBounds,
3687
- z: calculateZ(userNode, selectedNodeZ),
3868
+ z: calculateZ(userNode, selectedNodeZ, _options.zIndexMode),
3688
3869
  userNode
3689
3870
  }
3690
3871
  };
@@ -3694,7 +3875,7 @@ function adoptUserNodes(nodes, nodeLookup, parentLookup, options) {
3694
3875
  nodesInitialized = false;
3695
3876
  }
3696
3877
  if (userNode.parentId) {
3697
- updateChildNode(internalNode, nodeLookup, parentLookup, options);
3878
+ updateChildNode(internalNode, nodeLookup, parentLookup, options, rootParentIndex);
3698
3879
  }
3699
3880
  }
3700
3881
  return nodesInitialized;
@@ -3710,16 +3891,33 @@ function updateParentLookup(node, parentLookup) {
3710
3891
  parentLookup.set(node.parentId, /* @__PURE__ */ new Map([[node.id, node]]));
3711
3892
  }
3712
3893
  }
3713
- function updateChildNode(node, nodeLookup, parentLookup, options) {
3714
- const { elevateNodesOnSelect, nodeOrigin, nodeExtent } = mergeObjects(defaultOptions, options);
3894
+ function updateChildNode(node, nodeLookup, parentLookup, options, rootParentIndex) {
3895
+ const { elevateNodesOnSelect, nodeOrigin, nodeExtent, zIndexMode } = mergeObjects(
3896
+ defaultOptions,
3897
+ options
3898
+ );
3715
3899
  const parentId = node.parentId;
3716
3900
  const parentNode = nodeLookup.get(parentId);
3717
3901
  if (!parentNode) {
3718
3902
  return;
3719
3903
  }
3720
3904
  updateParentLookup(node, parentLookup);
3721
- const selectedNodeZ = elevateNodesOnSelect ? 1e3 : 0;
3722
- const { x, y, z } = calculateChildXYZ(node, parentNode, nodeOrigin, nodeExtent, selectedNodeZ);
3905
+ if (rootParentIndex && !parentNode.parentId && parentNode.internals.rootParentIndex === void 0 && zIndexMode === "auto") {
3906
+ parentNode.internals.rootParentIndex = ++rootParentIndex.i;
3907
+ parentNode.internals.z = parentNode.internals.z + rootParentIndex.i * ROOT_PARENT_Z_INCREMENT;
3908
+ }
3909
+ if (rootParentIndex && parentNode.internals.rootParentIndex !== void 0) {
3910
+ rootParentIndex.i = parentNode.internals.rootParentIndex;
3911
+ }
3912
+ const selectedNodeZ = elevateNodesOnSelect && !isManualZIndexMode(zIndexMode) ? SELECTED_NODE_Z : 0;
3913
+ const { x, y, z } = calculateChildXYZ(
3914
+ node,
3915
+ parentNode,
3916
+ nodeOrigin,
3917
+ nodeExtent,
3918
+ selectedNodeZ,
3919
+ zIndexMode
3920
+ );
3723
3921
  const { positionAbsolute } = node.internals;
3724
3922
  const positionChanged = x !== positionAbsolute.x || y !== positionAbsolute.y;
3725
3923
  if (positionChanged || z !== node.internals.z) {
@@ -3733,10 +3931,14 @@ function updateChildNode(node, nodeLookup, parentLookup, options) {
3733
3931
  });
3734
3932
  }
3735
3933
  }
3736
- function calculateZ(node, selectedNodeZ) {
3737
- return (isNumeric(node.zIndex) ? node.zIndex : 0) + (node.selected ? selectedNodeZ : 0);
3934
+ function calculateZ(node, selectedNodeZ, zIndexMode) {
3935
+ const zIndex = isNumeric(node.zIndex) ? node.zIndex : 0;
3936
+ if (isManualZIndexMode(zIndexMode)) {
3937
+ return zIndex;
3938
+ }
3939
+ return zIndex + (node.selected ? selectedNodeZ : 0);
3738
3940
  }
3739
- function calculateChildXYZ(childNode, parentNode, nodeOrigin, nodeExtent, selectedNodeZ) {
3941
+ function calculateChildXYZ(childNode, parentNode, nodeOrigin, nodeExtent, selectedNodeZ, zIndexMode) {
3740
3942
  const { x: parentX, y: parentY } = parentNode.internals.positionAbsolute;
3741
3943
  const childDimensions = getNodeDimensions(childNode);
3742
3944
  const positionWithOrigin = getNodePositionWithOrigin(childNode, nodeOrigin);
@@ -3749,7 +3951,7 @@ function calculateChildXYZ(childNode, parentNode, nodeOrigin, nodeExtent, select
3749
3951
  if (childNode.extent === "parent") {
3750
3952
  absolutePosition = clampPositionToParent(absolutePosition, childDimensions, parentNode);
3751
3953
  }
3752
- const childZ = calculateZ(childNode, selectedNodeZ);
3954
+ const childZ = calculateZ(childNode, selectedNodeZ, zIndexMode);
3753
3955
  const parentZ = parentNode.internals.z ?? 0;
3754
3956
  return {
3755
3957
  x: absolutePosition.x,
@@ -3835,6 +4037,8 @@ var createSolidFlow = (props) => {
3835
4037
  nodeOrigin: _props.nodeOrigin,
3836
4038
  // eslint-disable-next-line solid/reactivity
3837
4039
  elevateNodesOnSelect: _props.elevateNodesOnSelect,
4040
+ // eslint-disable-next-line solid/reactivity
4041
+ zIndexMode: _props.zIndexMode,
3838
4042
  checkEquality: true
3839
4043
  });
3840
4044
  });
@@ -3882,6 +4086,17 @@ var createSolidFlow = (props) => {
3882
4086
  const edgesMemo = createWritableStore(() => config().edges);
3883
4087
  const viewportMemo = createWritableStore(() => config().viewport ?? initialViewport);
3884
4088
  const transform = createMemo(() => [viewportMemo.get().x, viewportMemo.get().y, viewportMemo.get().zoom]);
4089
+ const nodesInitialized = createMemo(() => {
4090
+ const nodes = nodesMemo.get();
4091
+ if (nodes.length === 0) return false;
4092
+ for (const node of nodes) {
4093
+ if (node.hidden) continue;
4094
+ if (node.measured?.width === void 0 || node.measured?.height === void 0) {
4095
+ return false;
4096
+ }
4097
+ }
4098
+ return true;
4099
+ });
3885
4100
  const store = mergeProps({
3886
4101
  width: 0,
3887
4102
  height: 0
@@ -3917,7 +4132,6 @@ var createSolidFlow = (props) => {
3917
4132
  const state = connection();
3918
4133
  return {
3919
4134
  ...state,
3920
- from: state.inProgress ? pointToRendererPoint(state.from, this.transform) : state.from,
3921
4135
  to: state.inProgress ? pointToRendererPoint(state.to, this.transform) : state.to
3922
4136
  };
3923
4137
  },
@@ -3970,10 +4184,10 @@ var createSolidFlow = (props) => {
3970
4184
  return panZoom();
3971
4185
  },
3972
4186
  get selectedNodes() {
3973
- return config().nodes.filter((node) => node.selected);
4187
+ return nodesMemo.get().filter((node) => node.selected);
3974
4188
  },
3975
4189
  get selectedEdges() {
3976
- return config().edges.filter((edge) => edge.selected);
4190
+ return edgesMemo.get().filter((edge) => edge.selected);
3977
4191
  },
3978
4192
  get selectionRect() {
3979
4193
  return selectionRect();
@@ -3990,6 +4204,9 @@ var createSolidFlow = (props) => {
3990
4204
  get viewportInitialized() {
3991
4205
  return panZoom() !== null;
3992
4206
  },
4207
+ get nodesInitialized() {
4208
+ return nodesInitialized();
4209
+ },
3993
4210
  get visibleEdgeIds() {
3994
4211
  return visibleEdgeIds();
3995
4212
  },
@@ -4037,7 +4254,7 @@ var createSolidFlow = (props) => {
4037
4254
  const getEdge = (id) => layoutedEdgesMap.get(id);
4038
4255
  const fitView = async (options) => {
4039
4256
  if (!store.panZoom) return false;
4040
- return fitViewport({
4257
+ const result = await fitViewport({
4041
4258
  nodes: nodeLookup,
4042
4259
  width: store.width,
4043
4260
  height: store.height,
@@ -4045,6 +4262,7 @@ var createSolidFlow = (props) => {
4045
4262
  minZoom: store.minZoom,
4046
4263
  maxZoom: store.maxZoom
4047
4264
  }, options ?? config().fitViewOptions);
4265
+ return result;
4048
4266
  };
4049
4267
  const resetStoreValues = () => {
4050
4268
  setDragging(false);
@@ -4071,9 +4289,16 @@ var createSolidFlow = (props) => {
4071
4289
  edgesMemo.set((edges) => addEdge(edgeParams, edges));
4072
4290
  };
4073
4291
  let initialFitViewApplied = false;
4292
+ let initialNodesMeasured = false;
4074
4293
  const applyInitialFitView = (initialFitView) => {
4075
4294
  initialFitViewApplied = !initialFitView;
4076
4295
  };
4296
+ const tryInitialFitView = () => {
4297
+ if (initialFitViewApplied || !initialNodesMeasured) return;
4298
+ if (!untrack(() => store.panZoom && store.width && store.height)) return;
4299
+ initialFitViewApplied = true;
4300
+ void untrack(() => fitView());
4301
+ };
4077
4302
  const updateNodePositions = (nodeDragItems, dragging2 = false) => {
4078
4303
  nodesMemo.set((node) => nodeDragItems.has(node.id), produce((node) => {
4079
4304
  node.dragging = dragging2;
@@ -4098,7 +4323,8 @@ var createSolidFlow = (props) => {
4098
4323
  if (!updatedInternals) return;
4099
4324
  updateAbsolutePositions(nodeLookup, parentLookup, {
4100
4325
  nodeOrigin: store.nodeOrigin,
4101
- nodeExtent: store.nodeExtent
4326
+ nodeExtent: store.nodeExtent,
4327
+ zIndexMode: store.zIndexMode
4102
4328
  });
4103
4329
  const nodeToChange = changes.reduce((acc, change) => {
4104
4330
  const node = nodeLookup.get(change.id)?.internals.userNode;
@@ -4125,10 +4351,8 @@ var createSolidFlow = (props) => {
4125
4351
  break;
4126
4352
  }
4127
4353
  }));
4128
- if (!initialFitViewApplied) {
4129
- initialFitViewApplied = true;
4130
- void fitView();
4131
- }
4354
+ initialNodesMeasured = true;
4355
+ tryInitialFitView();
4132
4356
  });
4133
4357
  });
4134
4358
  };
@@ -4307,6 +4531,9 @@ var createSolidFlow = (props) => {
4307
4531
  resetStoreValues();
4308
4532
  unselectNodesAndEdges();
4309
4533
  };
4534
+ createEffect(() => {
4535
+ if (width() && height() && panZoom()) tryInitialFitView();
4536
+ });
4310
4537
  createEffect(() => {
4311
4538
  store.panZoom?.syncViewport(store.viewport);
4312
4539
  });
@@ -4323,7 +4550,7 @@ var createSolidFlow = (props) => {
4323
4550
  createComputed(mapArray(() => store.nodes, (userNode) => {
4324
4551
  createComputed(() => {
4325
4552
  const internalNode = untrack(() => nodeLookup.get(userNode.id));
4326
- const selectedNodeZ = store.elevateNodesOnSelect ? 1e3 : 0;
4553
+ const selectedNodeZ = store.elevateNodesOnSelect && store.zIndexMode !== "manual" ? 1e3 : 0;
4327
4554
  const clampedPosition = clampPosition(getNodePositionWithOrigin(userNode, store.nodeOrigin), isCoordinateExtent(userNode.extent) ? userNode.extent : store.nodeExtent, getNodeDimensions(userNode));
4328
4555
  const preservedMeasured = {
4329
4556
  width: userNode.measured?.width ?? internalNode?.measured?.width,
@@ -4337,7 +4564,7 @@ var createSolidFlow = (props) => {
4337
4564
  // If there is neither a user-provided nor a previously measured size,
4338
4565
  // reset handleBounds so that the node gets re-measured.
4339
4566
  handleBounds: !userNode.measured && !internalNode?.measured ? void 0 : internalNode?.internals.handleBounds,
4340
- z: calculateZ(userNode, selectedNodeZ),
4567
+ z: calculateZ(userNode, selectedNodeZ, store.zIndexMode),
4341
4568
  userNode
4342
4569
  }
4343
4570
  };
@@ -4347,6 +4574,7 @@ var createSolidFlow = (props) => {
4347
4574
  nodeOrigin: store.nodeOrigin,
4348
4575
  nodeExtent: store.nodeExtent,
4349
4576
  elevateNodesOnSelect: store.elevateNodesOnSelect,
4577
+ zIndexMode: store.zIndexMode,
4350
4578
  checkEquality: true
4351
4579
  });
4352
4580
  }
@@ -4420,7 +4648,8 @@ var createSolidFlow = (props) => {
4420
4648
  zIndex: edge.zIndex ?? store.defaultEdgeOptions.zIndex,
4421
4649
  sourceNode,
4422
4650
  targetNode,
4423
- elevateOnSelect: store.elevateEdgesOnSelect
4651
+ elevateOnSelect: store.elevateEdgesOnSelect,
4652
+ zIndexMode: store.zIndexMode
4424
4653
  }),
4425
4654
  sourceNode,
4426
4655
  targetNode,
@@ -4508,7 +4737,7 @@ var createSolidFlow = (props) => {
4508
4737
  };
4509
4738
 
4510
4739
  // src/components/SolidFlow/component.tsx
4511
- var _tmpl$39 = /* @__PURE__ */ template(`<div class="solid-flow__container solid-flow__viewport-back">`);
4740
+ var _tmpl$40 = /* @__PURE__ */ template(`<div class="solid-flow__container solid-flow__viewport-back">`);
4512
4741
  var _tmpl$210 = /* @__PURE__ */ template(`<div class="solid-flow__container solid-flow__edge-labels">`);
4513
4742
  var _tmpl$310 = /* @__PURE__ */ template(`<div role=application data-testid=solid-flow__wrapper>`);
4514
4743
  var SolidFlow = (props) => {
@@ -4557,6 +4786,7 @@ var SolidFlow = (props) => {
4557
4786
  "nodeClickDistance",
4558
4787
  "minZoom",
4559
4788
  "maxZoom",
4789
+ "zIndexMode",
4560
4790
  "initialViewport",
4561
4791
  "viewport",
4562
4792
  "translateExtent",
@@ -4581,6 +4811,7 @@ var SolidFlow = (props) => {
4581
4811
  "autoPanOnConnect",
4582
4812
  "autoPanOnNodeDrag",
4583
4813
  "autoPanOnNodeFocus",
4814
+ "autoPanOnSelection",
4584
4815
  "autoPanSpeed",
4585
4816
  // Connection and validation
4586
4817
  "connectionRadius",
@@ -4697,6 +4928,16 @@ var SolidFlow = (props) => {
4697
4928
  actions.reset();
4698
4929
  });
4699
4930
  });
4931
+ const selectedElements = createMemo(() => ({
4932
+ nodes: store.selectedNodes,
4933
+ edges: store.selectedEdges
4934
+ }), void 0, {
4935
+ equals: (a, b) => a.nodes.length === b.nodes.length && a.edges.length === b.edges.length && a.nodes.every((node, i) => node.id === b.nodes[i].id) && a.edges.every((edge, i) => edge.id === b.edges[i].id)
4936
+ });
4937
+ createEffect(() => {
4938
+ const params = selectedElements();
4939
+ untrack(() => flowProps.onSelectionChange)?.(params);
4940
+ });
4700
4941
  const rootStyle = () => ({
4701
4942
  width: toPxString(flowProps.width),
4702
4943
  height: toPxString(flowProps.height),
@@ -4759,12 +5000,18 @@ var SolidFlow = (props) => {
4759
5000
  get panOnScroll() {
4760
5001
  return flowProps.panOnScroll;
4761
5002
  },
5003
+ get panOnScrollSpeed() {
5004
+ return flowProps.panOnScrollSpeed;
5005
+ },
4762
5006
  get panOnDrag() {
4763
5007
  return flowProps.panOnDrag;
4764
5008
  },
4765
5009
  get paneClickDistance() {
4766
5010
  return flowProps.paneClickDistance;
4767
5011
  },
5012
+ get selectionOnDrag() {
5013
+ return flowProps.selectionOnDrag;
5014
+ },
4768
5015
  get onMoveStart() {
4769
5016
  return flowProps.onMoveStart;
4770
5017
  },
@@ -4800,10 +5047,16 @@ var SolidFlow = (props) => {
4800
5047
  get selectionOnDrag() {
4801
5048
  return flowProps.selectionOnDrag;
4802
5049
  },
5050
+ get paneClickDistance() {
5051
+ return flowProps.paneClickDistance;
5052
+ },
5053
+ get autoPanOnSelection() {
5054
+ return flowProps.autoPanOnSelection;
5055
+ },
4803
5056
  get children() {
4804
5057
  return [createComponent(Viewport, {
4805
5058
  get children() {
4806
- return [_tmpl$39(), createComponent(EdgeRenderer, {
5059
+ return [_tmpl$40(), createComponent(EdgeRenderer, {
4807
5060
  get reconnectRadius() {
4808
5061
  return flowProps.reconnectRadius;
4809
5062
  },
@@ -4937,4 +5190,4 @@ var createNodeStore = (nodes) => {
4937
5190
  return [store, setStore];
4938
5191
  };
4939
5192
 
4940
- export { Background, BaseEdge, BezierEdge, BezierEdgeInternal, ConnectionLine_default as ConnectionLine, ControlButton, Controls, DefaultNode, EdgeLabel, EdgeLabelRenderer, EdgeReconnectAnchor, EdgeRenderer, EdgeWrapper, GroupNode, Handle, InputNode, Marker, MarkerDefinition, MiniMap, NodeRenderer, NodeResizer, NodeSelection, NodeToolbar, NodeWrapper, OutputNode, Pane, Panel, ResizeControl, Selection, SmoothStepEdge, SmoothStepEdgeInternal, SolidFlow, SolidFlowProvider, StepEdge, StepEdgeInternal, StraightEdge, StraightEdgeInternal, Viewport, ViewportPortal, Zoom, createEdgeStore, createNodeStore, useConnection, useEdges, useHandleEdgeSelect, useInternalNode, useNodeConnections, useNodes, useNodesData, useSolidFlow, useUpdateNodeInternals, useViewport };
5193
+ export { Background, BaseEdge, BezierEdge, BezierEdgeInternal, ConnectionLine_default as ConnectionLine, ControlButton, Controls, DefaultNode, EdgeLabel, EdgeLabelRenderer, EdgeReconnectAnchor, EdgeRenderer, EdgeToolbar, EdgeWrapper, GroupNode, Handle, InputNode, Marker, MarkerDefinition, MiniMap, NodeRenderer, NodeResizer, NodeSelection, NodeToolbar, NodeWrapper, OutputNode, Pane, Panel, ResizeControl, Selection, SmoothStepEdge, SmoothStepEdgeInternal, SolidFlow, SolidFlowProvider, StepEdge, StepEdgeInternal, StraightEdge, StraightEdgeInternal, Viewport, ViewportPortal, Zoom, createEdgeStore, createNodeStore, useColorMode, useConnection, useEdges, useHandleEdgeSelect, useInternalNode, useNodeConnections, useNodes, useNodesData, useNodesInitialized, useSolidFlow, useUpdateNodeInternals, useViewport, useViewportInitialized };