@dschz/solid-flow 0.1.4 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +38 -8
- package/dist/index/index.d.ts +94 -34
- package/dist/index/index.js +341 -88
- package/dist/index/index.jsx +368 -119
- package/package.json +66 -66
package/dist/index/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { delegateEvents, createComponent, Portal, template, spread, mergeProps as mergeProps$1, insert, effect, setAttribute, className, style, use, Dynamic,
|
|
2
|
-
import { createContext, Show, mergeProps, splitProps, createSignal, createMemo, For, createEffect, onCleanup, onMount, batch, Index, useContext, createComputed, mapArray
|
|
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,
|
|
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
|
|
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
|
|
1524
|
+
const onPointerDownCapture = (event) => {
|
|
1525
|
+
if (event.pointerType === "touch" && _panOnDrag() !== false && !store.selectionKeyPressed) {
|
|
1526
|
+
return;
|
|
1527
|
+
}
|
|
1514
1528
|
containerBounds = container?.getBoundingClientRect() ?? null;
|
|
1515
|
-
if (!
|
|
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
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
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
|
|
1536
|
-
|
|
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
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
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
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
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 (!
|
|
1684
|
+
if (!selectionInProgress && event.target === container) {
|
|
1598
1685
|
onClick(event);
|
|
1599
1686
|
}
|
|
1600
1687
|
batch(() => {
|
|
1601
1688
|
actions.setSelectionRect(void 0);
|
|
1602
|
-
if (
|
|
1603
|
-
actions.setSelectionRectMode("nodes");
|
|
1689
|
+
if (selectionInProgress) {
|
|
1690
|
+
actions.setSelectionRectMode(selectedNodeIds.size > 0 ? "nodes" : void 0);
|
|
1604
1691
|
}
|
|
1605
1692
|
});
|
|
1606
|
-
if (
|
|
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
|
|
1626
|
-
_el$.$$
|
|
1627
|
-
_el$.$$
|
|
1628
|
-
_el
|
|
1629
|
-
|
|
1630
|
-
|
|
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", "
|
|
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:
|
|
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(`<
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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:
|
|
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 ?
|
|
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(
|
|
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
|
-
|
|
3722
|
-
|
|
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
|
-
|
|
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
|
|
4187
|
+
return nodesMemo.get().filter((node) => node.selected);
|
|
3974
4188
|
},
|
|
3975
4189
|
get selectedEdges() {
|
|
3976
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
4129
|
-
|
|
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$
|
|
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$
|
|
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 };
|